It is trivially easy to add new display modes to xscreensaver: any program
which can be invoked in such a way that it draws on the root window of the
-screen can be used as a screensaver. You just change a resource setting --
+screen can be used as a screensaver. You just change a config file --
there's no need to recompile or reinstall anything.
============
============
+Changes since 3.11: * Made it so that you can't scroll the screen while the
+ lock dialog is up (with XFree86 virtual viewports.)
+ * Fixed a bug in `flag' that caused bob's chin to get cut
+ off after a few iterations.
+Changes since 3.10: * Made `xjack' be black-on-white-ish, so that it looks
+ less like a computer screen and more like the
+ typewritten paper it's supposed to be.
+ * New version of `pulsar'.
+ * Fixed Solaris compilation problem in `phosphor'.
+ * Made xscreensaver notice XFree86's virtual root window
+ hack, so that if the X server's root window is larger
+ than the monitor's displayable resolution, the screen
+ saver will limit itself to the area that actually
+ appears on the screen.
+ * Made the xscreensaver daemon do a better job of
+ picking the visual class that should be used for GL
+ programs. Less user intervention should be needed
+ now: you can use the logical visual name `GL' instead
+ of having to figure out by hand which one to use.
+ * Oops, the visual was defaulting to "best" instead of
+ "default", because the .xscreensaver file was not being
+ loaded quite early enough.
+ * Made configure figure out how to build icmp ping
+ support into the `sonar' hack automatically.
+ * Made warnings about not being able to read shadow
+ passwords not be printed if compiled with PAM support.
+ * Improved PAM startup diagnostics.
+ * Worked around the Solaris PAM bug that was causing
+ crashes there, so now PAM is turned on by default.
+ * Made configure detect the number of arguments that
+ pam_strerror() takes, since on Linux, this apparently
+ changed between 2.0 and 2.2, sigh.
+ * Made the /proc/interrupts kludge look for "PS/2 Mouse"
+ as well as "keyboard".
+ * Made xscreensaver notice when there has been a sudden
+ large jump in wall-clock time, and if so, lock right
+ away, instead of waiting for "lockTimeout" to expire
+ first. (Laptops need this for safer recovery from
+ ``hibernation.'')
+ * Added `-throttle' option to `xscreensaver-command'.
Changes since 3.09: * Added `phosphor', `xmatrix', and `pulsar' hacks.
* Fixed a bug in the color allocator that sometimes
caused `starfish' to fall back to monochrome.
*/
#undef HAVE_DPMS_EXTENSION
+/* Define this if you have the functions XF86VidModeGetModeLine() and
+ * XF86VidModeGetViewPort(), in support of virtual desktops where the
+ * X server's root window is bigger than the actual screen. This is
+ * an XFree86 thing, and probably doesn't exist elsewhere. (It's
+ * available if the file /usr/include/X11/extensions/xf86vmode.h exists.)
+ */
+#undef HAVE_XF86VMODE
+
/* Define this if you have a Linux-like /proc/interrupts file which can be
* examined to determine when keyboard activity has occurred.
*/
*/
#undef HAVE_GLBINDTEXTURE
+/* Define this if the `xscreensaver' process itself (the driver process)
+ should be linked against GL. Most systems won't want this (in particular,
+ if you're using Linux and/or Mesa, you don't want this) but SGI systems
+ do want this. It may also be useful on other systems that have serious
+ GL support -- you only need this if you have a lot of different visuals,
+ not all of which work with GL programs.
+ */
+#undef DAEMON_USE_GL
+
/* Define this if you have the X Shared Memory Extension.
*/
#undef HAVE_XSHM_EXTENSION
*/
#define PAM_SERVICE_NAME "xscreensaver"
+/* Define if you have PAM and pam_strerror() requires two arguments. */
+#undef PAM_STRERROR_TWO_ARGS
+
/* Define this if your system uses `shadow' passwords, that is, the passwords
* live in /etc/shadow instead of /etc/passwd, and one reads them with
* getspnam() instead of getpwnam(). (Note that SCO systems do some random
- * other thing; others might as well. See the ifdefs in driver/passwd.c if
- * you're having trouble related to reading passwords.)
+ * other thing; others might as well. See the ifdefs in driver/passwd-pwent.c
+ * if you're having trouble related to reading passwords.)
*/
#undef HAVE_SHADOW_PASSWD
VT_UNLOCKSWITCH ioctls. If this is defined, then when the screen is
locked, switching to another virtual terminal will also be prevented.
That is, the whole console will be locked, rather than just the VT on
- which X is running.
+ which X is running. (Well, that's the theory anyway -- in practice,
+ I haven't yet figured out how to make that work.)
*/
#undef HAVE_VT_LOCKSWITCH
This is necessary at least on SCO OpenServer 5, due to a Unix kernel bug.
*/
#undef USE_SIGACTION
+
+/* Define this if you do pings with a `struct icmp' and a `icmp_id' slot.
+ */
+#undef HAVE_ICMP
+
+/* Define this if you do pings with a `struct icmphdr' and a `un.echo.id' slot.
+ */
+#undef HAVE_ICMPHDR
--with-dpms-ext Include support for the DPMS server extension,
if possible (this is the default).
--without-dpms-ext Do not compile in support for this extension."
+ac_help="$ac_help
+ --with-xf86vmode-ext Include support for XFree86 virtual screens, if
+ possible (this is the default).
+ --without-xf86vmode-ext Do not compile in support for this extension."
ac_help="$ac_help
--with-proc-interrupts Include support for consulting the /proc/interrupts
file to notice keyboard activity, if possible.
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:677: checking host system type" >&5
+echo "configure:681: checking host system type" >&5
host_alias=$host
case "$host_alias" in
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:701: checking for $ac_word" >&5
+echo "configure:705: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:731: checking for $ac_word" >&5
+echo "configure:735: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:782: checking for $ac_word" >&5
+echo "configure:786: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:814: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:818: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
cat > conftest.$ac_ext << EOF
-#line 825 "configure"
+#line 829 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
-if { (eval echo configure:830: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:834: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:856: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:860: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:861: checking whether we are using GNU C" >&5
+echo "configure:865: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:870: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:874: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:889: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:893: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -z "$GCC"; then
echo $ac_n "checking how to request ANSI compilation""... $ac_c" 1>&6
-echo "configure:923: checking how to request ANSI compilation" >&5
+echo "configure:927: checking how to request ANSI compilation" >&5
case "$host" in
*-hpux*)
echo "$ac_t""HPUX: adding -Ae" 1>&6
echo $ac_n "checking whether the compiler works on ANSI C""... $ac_c" 1>&6
-echo "configure:947: checking whether the compiler works on ANSI C" >&5
+echo "configure:951: checking whether the compiler works on ANSI C" >&5
if test "$cross_compiling" = yes; then
{ echo "configure: error: Couldn't build even a trivial ANSI C program: check CC." 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
-#line 952 "configure"
+#line 956 "configure"
#include "confdefs.h"
main(int ac, char **av) { return 0; }
EOF
-if { (eval echo configure:956: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:960: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
echo "$ac_t""yes" 1>&6
else
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1005: checking how to run the C preprocessor" >&5
+echo "configure:1009: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1020 "configure"
+#line 1024 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1026: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1030: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1037 "configure"
+#line 1041 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1043: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1047: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 1054 "configure"
+#line 1058 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1060: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1064: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1096: checking for a BSD compatible install" >&5
+echo "configure:1100: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
INSTALL_DIRS='${INSTALL} -d'
echo $ac_n "checking whether \"\${INSTALL} -d\" creates intermediate directories""... $ac_c" 1>&6
-echo "configure:1150: checking whether \"\${INSTALL} -d\" creates intermediate directories" >&5
+echo "configure:1154: checking whether \"\${INSTALL} -d\" creates intermediate directories" >&5
rm -rf conftestdir
if mkdir conftestdir; then
cd conftestdir >&-
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking whether \"mkdir -p\" creates intermediate directories""... $ac_c" 1>&6
-echo "configure:1161: checking whether \"mkdir -p\" creates intermediate directories" >&5
+echo "configure:1165: checking whether \"mkdir -p\" creates intermediate directories" >&5
rm -rf dir1
mkdir -p dir1/dir2 >&- 2>&-
if test -d dir1/dir2/. ; then
fi
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1176: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:1180: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:1204: checking for working const" >&5
+echo "configure:1208: checking for working const" >&5
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1209 "configure"
+#line 1213 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:1258: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1262: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_const=yes
else
fi
echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:1279: checking for inline" >&5
+echo "configure:1283: checking for inline" >&5
if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
cat > conftest.$ac_ext <<EOF
-#line 1286 "configure"
+#line 1290 "configure"
#include "confdefs.h"
int main() {
} $ac_kw foo() {
; return 0; }
EOF
-if { (eval echo configure:1293: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1297: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_inline=$ac_kw; break
else
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1320: checking for ANSI C header files" >&5
+echo "configure:1324: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1325 "configure"
+#line 1329 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1333: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1337: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 1350 "configure"
+#line 1354 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 1368 "configure"
+#line 1372 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
:
else
cat > conftest.$ac_ext <<EOF
-#line 1389 "configure"
+#line 1393 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
exit (0); }
EOF
-if { (eval echo configure:1400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1404: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
fi
echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:1424: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:1428: checking whether time.h and sys/time.h may both be included" >&5
if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1429 "configure"
+#line 1433 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
struct tm *tp;
; return 0; }
EOF
-if { (eval echo configure:1438: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1442: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_time=yes
else
fi
echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:1459: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:1463: checking for sys/wait.h that is POSIX.1 compatible" >&5
if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1464 "configure"
+#line 1468 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/wait.h>
s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
; return 0; }
EOF
-if { (eval echo configure:1480: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1484: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_sys_wait_h=yes
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
-echo "configure:1505: checking for $ac_hdr that defines DIR" >&5
+echo "configure:1509: checking for $ac_hdr that defines DIR" >&5
if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1510 "configure"
+#line 1514 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_hdr>
DIR *dirp = 0;
; return 0; }
EOF
-if { (eval echo configure:1518: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1522: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_header_dirent_$ac_safe=yes"
else
# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
if test $ac_header_dirent = dirent.h; then
echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
-echo "configure:1543: checking for opendir in -ldir" >&5
+echo "configure:1547: checking for opendir in -ldir" >&5
ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-ldir $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1551 "configure"
+#line 1555 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
opendir()
; return 0; }
EOF
-if { (eval echo configure:1562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
-echo "configure:1584: checking for opendir in -lx" >&5
+echo "configure:1588: checking for opendir in -lx" >&5
ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lx $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1592 "configure"
+#line 1596 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
opendir()
; return 0; }
EOF
-if { (eval echo configure:1603: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1607: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:1627: checking for mode_t" >&5
+echo "configure:1631: checking for mode_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1632 "configure"
+#line 1636 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
fi
echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:1660: checking for pid_t" >&5
+echo "configure:1664: checking for pid_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1665 "configure"
+#line 1669 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
fi
echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1693: checking for size_t" >&5
+echo "configure:1697: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1698 "configure"
+#line 1702 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
fi
echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:1726: checking return type of signal handlers" >&5
+echo "configure:1730: checking return type of signal handlers" >&5
if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1731 "configure"
+#line 1735 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <signal.h>
int i;
; return 0; }
EOF
-if { (eval echo configure:1748: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1752: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_type_signal=void
else
echo $ac_n "checking how to call gettimeofday""... $ac_c" 1>&6
-echo "configure:1768: checking how to call gettimeofday" >&5
+echo "configure:1772: checking how to call gettimeofday" >&5
if eval "test \"`echo '$''{'ac_cv_gettimeofday_args'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1773 "configure"
+#line 1777 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <sys/time.h>
gettimeofday(&tv, &tzp);
; return 0; }
EOF
-if { (eval echo configure:1782: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1786: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_gettimeofday_args=2
else
cat conftest.$ac_ext >&5
rm -rf conftest*
cat > conftest.$ac_ext <<EOF
-#line 1790 "configure"
+#line 1794 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <sys/time.h>
struct timeval tv; gettimeofday(&tv);
; return 0; }
EOF
-if { (eval echo configure:1798: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1802: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_gettimeofday_args=1
else
for ac_func in select fcntl uname nice setpriority getcwd getwd putenv
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1838: checking for $ac_func" >&5
+echo "configure:1842: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1843 "configure"
+#line 1847 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:1866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
for ac_func in sigaction syslog
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1893: checking for $ac_func" >&5
+echo "configure:1897: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1898 "configure"
+#line 1902 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:1921: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1950: checking for $ac_hdr" >&5
+echo "configure:1954: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1955 "configure"
+#line 1959 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1960: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1964: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
# Uses ac_ vars as temps to allow command line to override cache and checks.
# --without-x overrides everything else, but does not touch the cache.
echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:2022: checking for X" >&5
+echo "configure:2026: checking for X" >&5
# Check whether --with-x or --without-x was given.
if test "${with_x+set}" = set; then
# First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF
-#line 2084 "configure"
+#line 2088 "configure"
#include "confdefs.h"
#include <$x_direct_test_include>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2089: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2093: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
ac_save_LIBS="$LIBS"
LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2158 "configure"
+#line 2162 "configure"
#include "confdefs.h"
int main() {
${x_direct_test_function}()
; return 0; }
EOF
-if { (eval echo configure:2165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2169: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
LIBS="$ac_save_LIBS"
# We can link X programs with no special library path.
case "`(uname -sr) 2>/dev/null`" in
"SunOS 5"*)
echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:2271: checking whether -R must be followed by a space" >&5
+echo "configure:2275: checking whether -R must be followed by a space" >&5
ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
cat > conftest.$ac_ext <<EOF
-#line 2274 "configure"
+#line 2278 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:2281: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2285: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_R_nospace=yes
else
else
LIBS="$ac_xsave_LIBS -R $x_libraries"
cat > conftest.$ac_ext <<EOF
-#line 2297 "configure"
+#line 2301 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:2304: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_R_space=yes
else
# libraries were built with DECnet support. And karl@cs.umb.edu says
# the Alpha needs dnet_stub (dnet does not exist).
echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:2336: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:2340: checking for dnet_ntoa in -ldnet" >&5
ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-ldnet $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2344 "configure"
+#line 2348 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
dnet_ntoa()
; return 0; }
EOF
-if { (eval echo configure:2355: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2359: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:2377: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:2381: checking for dnet_ntoa in -ldnet_stub" >&5
ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-ldnet_stub $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2385 "configure"
+#line 2389 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
dnet_ntoa()
; return 0; }
EOF
-if { (eval echo configure:2396: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# The nsl library prevents programs from opening the X display
# on Irix 5.2, according to dickey@clark.net.
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:2425: checking for gethostbyname" >&5
+echo "configure:2429: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2430 "configure"
+#line 2434 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostbyname(); below. */
; return 0; }
EOF
-if { (eval echo configure:2453: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2457: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_gethostbyname=yes"
else
if test $ac_cv_func_gethostbyname = no; then
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:2474: checking for gethostbyname in -lnsl" >&5
+echo "configure:2478: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2482 "configure"
+#line 2486 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
gethostbyname()
; return 0; }
EOF
-if { (eval echo configure:2493: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2497: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# -lsocket must be given before -lnsl if both are needed.
# We assume that if connect needs -lnsl, so does gethostbyname.
echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:2523: checking for connect" >&5
+echo "configure:2527: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2528 "configure"
+#line 2532 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */
; return 0; }
EOF
-if { (eval echo configure:2551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2555: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_connect=yes"
else
if test $ac_cv_func_connect = no; then
echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:2572: checking for connect in -lsocket" >&5
+echo "configure:2576: checking for connect in -lsocket" >&5
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2580 "configure"
+#line 2584 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
connect()
; return 0; }
EOF
-if { (eval echo configure:2591: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2595: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:2615: checking for remove" >&5
+echo "configure:2619: checking for remove" >&5
if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2620 "configure"
+#line 2624 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char remove(); below. */
; return 0; }
EOF
-if { (eval echo configure:2643: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_remove=yes"
else
if test $ac_cv_func_remove = no; then
echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:2664: checking for remove in -lposix" >&5
+echo "configure:2668: checking for remove in -lposix" >&5
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lposix $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2672 "configure"
+#line 2676 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
remove()
; return 0; }
EOF
-if { (eval echo configure:2683: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:2707: checking for shmat" >&5
+echo "configure:2711: checking for shmat" >&5
if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2712 "configure"
+#line 2716 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char shmat(); below. */
; return 0; }
EOF
-if { (eval echo configure:2735: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_shmat=yes"
else
if test $ac_cv_func_shmat = no; then
echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:2756: checking for shmat in -lipc" >&5
+echo "configure:2760: checking for shmat in -lipc" >&5
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lipc $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2764 "configure"
+#line 2768 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
shmat()
; return 0; }
EOF
-if { (eval echo configure:2775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2779: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# libraries we check for below, so use a different variable.
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:2808: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:2812: checking for IceConnectionNumber in -lICE" >&5
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lICE $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2816 "configure"
+#line 2820 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
IceConnectionNumber()
; return 0; }
EOF
-if { (eval echo configure:2827: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2831: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for X app-defaults directory""... $ac_c" 1>&6
-echo "configure:2869: checking for X app-defaults directory" >&5
+echo "configure:2873: checking for X app-defaults directory" >&5
if eval "test \"`echo '$''{'ac_cv_x_app_defaults'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 3016 "configure"
+#line 3020 "configure"
#include "confdefs.h"
#include <X11/XHPlib.h>
EOF
# Check for the availability of the XPointer typedef, and define it otherwise.
#
echo $ac_n "checking for XPointer""... $ac_c" 1>&6
-echo "configure:3037: checking for XPointer" >&5
+echo "configure:3041: checking for XPointer" >&5
if eval "test \"`echo '$''{'ac_cv_xpointer'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 3048 "configure"
+#line 3052 "configure"
#include "confdefs.h"
#include <X11/Xlib.h>
int main() {
XPointer foo = (XPointer) 0;
; return 0; }
EOF
-if { (eval echo configure:3055: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3059: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_xpointer=yes
else
# Some versions of Slowlaris Motif require -lgen. But not all. Why?
echo $ac_n "checking for regcmp in -lgen""... $ac_c" 1>&6
-echo "configure:3189: checking for regcmp in -lgen" >&5
+echo "configure:3193: checking for regcmp in -lgen" >&5
ac_lib_var=`echo gen'_'regcmp | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lgen $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3197 "configure"
+#line 3201 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
regcmp()
; return 0; }
EOF
-if { (eval echo configure:3208: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3212: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/Xmu/Error.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/Xmu/Error.h""... $ac_c" 1>&6
-echo "configure:3245: checking for X11/Xmu/Error.h" >&5
+echo "configure:3249: checking for X11/Xmu/Error.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3250 "configure"
+#line 3254 "configure"
#include "confdefs.h"
#include <X11/Xmu/Error.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3255: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3259: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
case "$host" in
*-sunos4*)
echo $ac_n "checking for the SunOS 4.1.x _get_wmShellWidgetClass bug""... $ac_c" 1>&6
-echo "configure:3300: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5
+echo "configure:3304: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5
if eval "test \"`echo '$''{'ac_cv_sunos_xmu_bug'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# with X libraries because we know it's SunOS.
LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm"
cat > conftest.$ac_ext <<EOF
-#line 3313 "configure"
+#line 3317 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:3320: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3324: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_sunos_xmu_bug=no
else
echo "$ac_t""$ac_cv_sunos_xmu_bug" 1>&6
if test "$ac_cv_sunos_xmu_bug" = yes ; then
echo $ac_n "checking whether the compiler understands -static""... $ac_c" 1>&6
-echo "configure:3336: checking whether the compiler understands -static" >&5
+echo "configure:3340: checking whether the compiler understands -static" >&5
if eval "test \"`echo '$''{'ac_cv_ld_static'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS -static"
cat > conftest.$ac_ext <<EOF
-#line 3343 "configure"
+#line 3347 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:3350: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3354: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_ld_static=yes
else
/*)
echo $ac_n "checking for SGI SCREEN_SAVER headers""... $ac_c" 1>&6
-echo "configure:3395: checking for SGI SCREEN_SAVER headers" >&5
+echo "configure:3399: checking for SGI SCREEN_SAVER headers" >&5
d=$with_sgi/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for SGI SCREEN_SAVER libs""... $ac_c" 1>&6
-echo "configure:3405: checking for SGI SCREEN_SAVER libs" >&5
+echo "configure:3409: checking for SGI SCREEN_SAVER libs" >&5
d=$with_sgi/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/extensions/XScreenSaver.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/extensions/XScreenSaver.h""... $ac_c" 1>&6
-echo "configure:3443: checking for X11/extensions/XScreenSaver.h" >&5
+echo "configure:3447: checking for X11/extensions/XScreenSaver.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3448 "configure"
+#line 3452 "configure"
#include "confdefs.h"
#include <X11/extensions/XScreenSaver.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3453: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3457: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
/*)
echo $ac_n "checking for MIT-SCREEN-SAVER headers""... $ac_c" 1>&6
-echo "configure:3506: checking for MIT-SCREEN-SAVER headers" >&5
+echo "configure:3510: checking for MIT-SCREEN-SAVER headers" >&5
d=$with_mit/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for MIT-SCREEN-SAVER libs""... $ac_c" 1>&6
-echo "configure:3516: checking for MIT-SCREEN-SAVER libs" >&5
+echo "configure:3520: checking for MIT-SCREEN-SAVER libs" >&5
d=$with_mit/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/extensions/scrnsaver.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/extensions/scrnsaver.h""... $ac_c" 1>&6
-echo "configure:3555: checking for X11/extensions/scrnsaver.h" >&5
+echo "configure:3559: checking for X11/extensions/scrnsaver.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3560 "configure"
+#line 3564 "configure"
#include "confdefs.h"
#include <X11/extensions/scrnsaver.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3565: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3569: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for XScreenSaverRegister in -lXext""... $ac_c" 1>&6
-echo "configure:3609: checking for XScreenSaverRegister in -lXext" >&5
+echo "configure:3613: checking for XScreenSaverRegister in -lXext" >&5
ac_lib_var=`echo Xext'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXext -lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3617 "configure"
+#line 3621 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
XScreenSaverRegister()
; return 0; }
EOF
-if { (eval echo configure:3628: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for XScreenSaverRegister in -lXExExt""... $ac_c" 1>&6
-echo "configure:3679: checking for XScreenSaverRegister in -lXExExt" >&5
+echo "configure:3683: checking for XScreenSaverRegister in -lXExExt" >&5
ac_lib_var=`echo XExExt'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXExExt -lX11 -lXext -lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3687 "configure"
+#line 3691 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
XScreenSaverRegister()
; return 0; }
EOF
-if { (eval echo configure:3698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3702: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for XScreenSaverRegister in -lXss""... $ac_c" 1>&6
-echo "configure:3744: checking for XScreenSaverRegister in -lXss" >&5
+echo "configure:3748: checking for XScreenSaverRegister in -lXss" >&5
ac_lib_var=`echo Xss'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXss -lX11 -lXext -lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3752 "configure"
+#line 3756 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
XScreenSaverRegister()
; return 0; }
EOF
-if { (eval echo configure:3763: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3767: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
/*)
echo $ac_n "checking for XIDLE headers""... $ac_c" 1>&6
-echo "configure:3823: checking for XIDLE headers" >&5
+echo "configure:3827: checking for XIDLE headers" >&5
d=$with_xidle/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for XIDLE libs""... $ac_c" 1>&6
-echo "configure:3833: checking for XIDLE libs" >&5
+echo "configure:3837: checking for XIDLE libs" >&5
d=$with_xidle/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/extensions/xidle.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/extensions/xidle.h""... $ac_c" 1>&6
-echo "configure:3871: checking for X11/extensions/xidle.h" >&5
+echo "configure:3875: checking for X11/extensions/xidle.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3876 "configure"
+#line 3880 "configure"
#include "confdefs.h"
#include <X11/extensions/xidle.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3881: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3885: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
/*)
echo $ac_n "checking for XSHM headers""... $ac_c" 1>&6
-echo "configure:3933: checking for XSHM headers" >&5
+echo "configure:3937: checking for XSHM headers" >&5
d=$with_xshm/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for XSHM libs""... $ac_c" 1>&6
-echo "configure:3943: checking for XSHM libs" >&5
+echo "configure:3947: checking for XSHM libs" >&5
d=$with_xshm/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/extensions/XShm.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/extensions/XShm.h""... $ac_c" 1>&6
-echo "configure:3983: checking for X11/extensions/XShm.h" >&5
+echo "configure:3987: checking for X11/extensions/XShm.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3988 "configure"
+#line 3992 "configure"
#include "confdefs.h"
#include <X11/extensions/XShm.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3993: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3997: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "sys/ipc.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/ipc.h""... $ac_c" 1>&6
-echo "configure:4027: checking for sys/ipc.h" >&5
+echo "configure:4031: checking for sys/ipc.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4032 "configure"
+#line 4036 "configure"
#include "confdefs.h"
#include <sys/ipc.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4037: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4041: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "sys/shm.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/shm.h""... $ac_c" 1>&6
-echo "configure:4072: checking for sys/shm.h" >&5
+echo "configure:4076: checking for sys/shm.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4077 "configure"
+#line 4081 "configure"
#include "confdefs.h"
#include <sys/shm.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4082: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4086: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for XShmQueryExtension in -lXextSam""... $ac_c" 1>&6
-echo "configure:4131: checking for XShmQueryExtension in -lXextSam" >&5
+echo "configure:4135: checking for XShmQueryExtension in -lXextSam" >&5
ac_lib_var=`echo XextSam'_'XShmQueryExtension | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXextSam -lX11 -lXext -lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4139 "configure"
+#line 4143 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
XShmQueryExtension()
; return 0; }
EOF
-if { (eval echo configure:4150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4154: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
/*)
echo $ac_n "checking for DOUBLE-BUFFER headers""... $ac_c" 1>&6
-echo "configure:4209: checking for DOUBLE-BUFFER headers" >&5
+echo "configure:4213: checking for DOUBLE-BUFFER headers" >&5
d=$with_xdbe/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for DOUBLE-BUFFER libs""... $ac_c" 1>&6
-echo "configure:4219: checking for DOUBLE-BUFFER libs" >&5
+echo "configure:4223: checking for DOUBLE-BUFFER libs" >&5
d=$with_xdbe/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/extensions/Xdbe.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/extensions/Xdbe.h""... $ac_c" 1>&6
-echo "configure:4258: checking for X11/extensions/Xdbe.h" >&5
+echo "configure:4262: checking for X11/extensions/Xdbe.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4263 "configure"
+#line 4267 "configure"
#include "confdefs.h"
#include <X11/extensions/Xdbe.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4268: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4272: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
/*)
echo $ac_n "checking for SGI-VIDEO-CONTROL headers""... $ac_c" 1>&6
-echo "configure:4323: checking for SGI-VIDEO-CONTROL headers" >&5
+echo "configure:4327: checking for SGI-VIDEO-CONTROL headers" >&5
d=$with_sgivc/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for SGI-VIDEO-CONTROL libs""... $ac_c" 1>&6
-echo "configure:4333: checking for SGI-VIDEO-CONTROL libs" >&5
+echo "configure:4337: checking for SGI-VIDEO-CONTROL libs" >&5
d=$with_sgivc/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/extensions/XSGIvc.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/extensions/XSGIvc.h""... $ac_c" 1>&6
-echo "configure:4373: checking for X11/extensions/XSGIvc.h" >&5
+echo "configure:4377: checking for X11/extensions/XSGIvc.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4378 "configure"
+#line 4382 "configure"
#include "confdefs.h"
#include <X11/extensions/XSGIvc.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4387: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for XSGIvcQueryGammaMap in -lXsgivc""... $ac_c" 1>&6
-echo "configure:4426: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
+echo "configure:4430: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
ac_lib_var=`echo Xsgivc'_'XSGIvcQueryGammaMap | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXsgivc -lXext -lX11 $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4434 "configure"
+#line 4438 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
XSGIvcQueryGammaMap()
; return 0; }
EOF
-if { (eval echo configure:4445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4449: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
/*)
echo $ac_n "checking for DPMS headers""... $ac_c" 1>&6
-echo "configure:4503: checking for DPMS headers" >&5
+echo "configure:4507: checking for DPMS headers" >&5
d=$with_dpms/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for DPMS libs""... $ac_c" 1>&6
-echo "configure:4513: checking for DPMS libs" >&5
+echo "configure:4517: checking for DPMS libs" >&5
d=$with_dpms/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/extensions/dpms.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/extensions/dpms.h""... $ac_c" 1>&6
-echo "configure:4553: checking for X11/extensions/dpms.h" >&5
+echo "configure:4557: checking for X11/extensions/dpms.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4558 "configure"
+#line 4562 "configure"
#include "confdefs.h"
#include <X11/extensions/dpms.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4563: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for DPMSInfo in -lXdpms""... $ac_c" 1>&6
-echo "configure:4606: checking for DPMSInfo in -lXdpms" >&5
+echo "configure:4610: checking for DPMSInfo in -lXdpms" >&5
ac_lib_var=`echo Xdpms'_'DPMSInfo | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXdpms -lXext -lX11 $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4614 "configure"
+#line 4618 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
DPMSInfo()
; return 0; }
EOF
-if { (eval echo configure:4625: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4629: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
fi
+# Check for the XF86VMODE server extension header.
+#
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
+# Check whether --with-xf86vmode-ext or --without-xf86vmode-ext was given.
+if test "${with_xf86vmode_ext+set}" = set; then
+ withval="$with_xf86vmode_ext"
+ with_xf86vmode="$withval"; with_xf86vmode_req="$withval"
+else
+ with_xf86vmode=yes
+fi
+
+
+
+ case "$with_xf86vmode" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ echo $ac_n "checking for xf86vmode headers""... $ac_c" 1>&6
+echo "configure:4687: checking for xf86vmode headers" >&5
+ d=$with_xf86vmode/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ echo "$ac_t""$d" 1>&6
+ else
+ echo "$ac_t""not found ($d: no such directory)" 1>&6
+ fi
+
+ echo $ac_n "checking for xf86vmode libs""... $ac_c" 1>&6
+echo "configure:4697: checking for xf86vmode libs" >&5
+ d=$with_xf86vmode/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ echo "$ac_t""$d" 1>&6
+ else
+ echo "$ac_t""not found ($d: no such directory)" 1>&6
+ fi
+
+ # replace the directory string with "yes".
+ with_xf86vmode_req="yes"
+ with_xf86vmode=$with_xf86vmode_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xf86vmode-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+ # why is this necessary?
+ # if we don't do this, then "./configure --with-motif=/usr/local/lesstif"
+ # behaves as if "--with-zippy=/usr/local/lesstif" was also present!
+ withval=
+
+
+if test "$with_xf86vmode" = yes; then
+
+ # first check for xf86vmode.h
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ ac_safe=`echo "X11/extensions/xf86vmode.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/xf86vmode.h""... $ac_c" 1>&6
+echo "configure:4737: checking for X11/extensions/xf86vmode.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4742 "configure"
+#include "confdefs.h"
+#include <X11/extensions/xf86vmode.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:4747: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ have_xf86vmode=yes
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for the -lXxf86vm
+ if test "$have_xf86vmode" = yes; then
+ have_xf86vmode=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS"
+
+ echo $ac_n "checking for XF86VidModeGetViewPort in -lXxf86vm""... $ac_c" 1>&6
+echo "configure:4790: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
+ac_lib_var=`echo Xxf86vm'_'XF86VidModeGetViewPort | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lXxf86vm -lXext -lX11 $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4798 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XF86VidModeGetViewPort();
+
+int main() {
+XF86VidModeGetViewPort()
+; return 0; }
+EOF
+if { (eval echo configure:4809: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ have_xf86vmode=yes; SAVER_LIBS="$SAVER_LIBS -lXxf86vm"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xf86vmode" = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_XF86VMODE 1
+EOF
+
+ fi
+
+elif test "$with_xf86vmode" != no; then
+ echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+ exit 1
+fi
+
+
# Check for /proc/interrupts
#
have_proc_interrupts=no
if test "$with_proc_interrupts" = yes; then
echo $ac_n "checking whether /proc/interrupts contains keyboard data""... $ac_c" 1>&6
-echo "configure:4679: checking whether /proc/interrupts contains keyboard data" >&5
+echo "configure:4863: checking whether /proc/interrupts contains keyboard data" >&5
if eval "test \"`echo '$''{'ac_cv_have_proc_interrupts'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
/*)
echo $ac_n "checking for Motif headers""... $ac_c" 1>&6
-echo "configure:4732: checking for Motif headers" >&5
+echo "configure:4916: checking for Motif headers" >&5
d=$with_motif/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for Motif libs""... $ac_c" 1>&6
-echo "configure:4742: checking for Motif libs" >&5
+echo "configure:4926: checking for Motif libs" >&5
d=$with_motif/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
/*)
echo $ac_n "checking for Athena headers""... $ac_c" 1>&6
-echo "configure:4787: checking for Athena headers" >&5
+echo "configure:4971: checking for Athena headers" >&5
d=$with_athena/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for Athena libs""... $ac_c" 1>&6
-echo "configure:4797: checking for Athena libs" >&5
+echo "configure:4981: checking for Athena libs" >&5
d=$with_athena/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "Xm/Xm.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for Xm/Xm.h""... $ac_c" 1>&6
-echo "configure:4860: checking for Xm/Xm.h" >&5
+echo "configure:5044: checking for Xm/Xm.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4865 "configure"
+#line 5049 "configure"
#include "confdefs.h"
#include <Xm/Xm.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4870: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5054: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/Xaw/Dialog.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/Xaw/Dialog.h""... $ac_c" 1>&6
-echo "configure:4910: checking for X11/Xaw/Dialog.h" >&5
+echo "configure:5094: checking for X11/Xaw/Dialog.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4915 "configure"
+#line 5099 "configure"
#include "confdefs.h"
#include <X11/Xaw/Dialog.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4920: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5104: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for Xaw3dComputeTopShadowRGB in -lXaw3d""... $ac_c" 1>&6
-echo "configure:4960: checking for Xaw3dComputeTopShadowRGB in -lXaw3d" >&5
+echo "configure:5144: checking for Xaw3dComputeTopShadowRGB in -lXaw3d" >&5
ac_lib_var=`echo Xaw3d'_'Xaw3dComputeTopShadowRGB | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXaw3d -lXt -lXmu -lXext -lX11 $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4968 "configure"
+#line 5152 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
Xaw3dComputeTopShadowRGB()
; return 0; }
EOF
-if { (eval echo configure:4979: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5163: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# XawViewportSetCoordinates in Viewport.h (R3 (or R4?) don't.)
if test "$have_athena" = yes ; then
echo $ac_n "checking for XawViewportSetCoordinates in Viewport.h""... $ac_c" 1>&6
-echo "configure:5056: checking for XawViewportSetCoordinates in Viewport.h" >&5
+echo "configure:5240: checking for XawViewportSetCoordinates in Viewport.h" >&5
if eval "test \"`echo '$''{'ac_cv_have_XawViewportSetCoordinates'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 5068 "configure"
+#line 5252 "configure"
#include "confdefs.h"
#include <X11/Xaw/Viewport.h>
EOF
have_lesstif=no
if test "$have_motif" = yes ; then
echo $ac_n "checking whether Motif is really LessTif""... $ac_c" 1>&6
-echo "configure:5097: checking whether Motif is really LessTif" >&5
+echo "configure:5281: checking whether Motif is really LessTif" >&5
if eval "test \"`echo '$''{'ac_cv_have_lesstif'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 5108 "configure"
+#line 5292 "configure"
#include "confdefs.h"
#include <Xm/Xm.h>
int main() {
long vers = LesstifVersion;
; return 0; }
EOF
-if { (eval echo configure:5115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5299: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_have_lesstif=yes
else
ltv=unknown
echo unknown > conftest-lt
echo $ac_n "checking LessTif version number""... $ac_c" 1>&6
-echo "configure:5143: checking LessTif version number" >&5
+echo "configure:5327: checking LessTif version number" >&5
if eval "test \"`echo '$''{'ac_cv_lesstif_version_string'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_lesstif_version_string=unknown
else
cat > conftest.$ac_ext <<EOF
-#line 5158 "configure"
+#line 5342 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <Xm/Xm.h>
exit(0);
}
EOF
-if { (eval echo configure:5171: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5355: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ltv=`cat conftest-lt`
ac_cv_lesstif_version=`echo $ltv | sed 's/ .*//'`
mtv=unknown
echo unknown > conftest-mt
echo $ac_n "checking Motif version number""... $ac_c" 1>&6
-echo "configure:5201: checking Motif version number" >&5
+echo "configure:5385: checking Motif version number" >&5
if eval "test \"`echo '$''{'ac_cv_motif_version_string'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_motif_version_string=unknown
else
cat > conftest.$ac_ext <<EOF
-#line 5216 "configure"
+#line 5400 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <Xm/Xm.h>
exit(0);
}
EOF
-if { (eval echo configure:5229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5413: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
mtv=`cat conftest-mt`
ac_cv_motif_version=`echo $mtv | sed 's/ .*//'`
motif_requires_xpm=no
if test "$have_motif" = yes ; then
echo $ac_n "checking whether Motif requires XPM""... $ac_c" 1>&6
-echo "configure:5267: checking whether Motif requires XPM" >&5
+echo "configure:5451: checking whether Motif requires XPM" >&5
if test "$motif_version" -ge 2000; then
motif_requires_xpm=yes
echo "$ac_t""maybe" 1>&6
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for XpQueryExtension in -lXp""... $ac_c" 1>&6
-echo "configure:5302: checking for XpQueryExtension in -lXp" >&5
+echo "configure:5486: checking for XpQueryExtension in -lXp" >&5
ac_lib_var=`echo Xp'_'XpQueryExtension | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXp -lX11 -lXext -lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5310 "configure"
+#line 5494 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
XpQueryExtension()
; return 0; }
EOF
-if { (eval echo configure:5321: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5505: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for _Xsetlocale in -lXintl""... $ac_c" 1>&6
-echo "configure:5368: checking for _Xsetlocale in -lXintl" >&5
+echo "configure:5552: checking for _Xsetlocale in -lXintl" >&5
ac_lib_var=`echo Xintl'_'_Xsetlocale | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lXintl -lX11 -lXext -lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5376 "configure"
+#line 5560 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
_Xsetlocale()
; return 0; }
EOF
-if { (eval echo configure:5387: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
/*)
echo $ac_n "checking for XPM headers""... $ac_c" 1>&6
-echo "configure:5436: checking for XPM headers" >&5
+echo "configure:5620: checking for XPM headers" >&5
d=$with_xpm/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for XPM libs""... $ac_c" 1>&6
-echo "configure:5446: checking for XPM libs" >&5
+echo "configure:5630: checking for XPM libs" >&5
d=$with_xpm/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/xpm.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/xpm.h""... $ac_c" 1>&6
-echo "configure:5484: checking for X11/xpm.h" >&5
+echo "configure:5668: checking for X11/xpm.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5489 "configure"
+#line 5673 "configure"
#include "confdefs.h"
#include <X11/xpm.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5494: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5678: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
/*)
echo $ac_n "checking for GL headers""... $ac_c" 1>&6
-echo "configure:5557: checking for GL headers" >&5
+echo "configure:5741: checking for GL headers" >&5
d=$with_gl/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for GL libs""... $ac_c" 1>&6
-echo "configure:5567: checking for GL libs" >&5
+echo "configure:5751: checking for GL libs" >&5
d=$with_gl/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "GL/gl.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for GL/gl.h""... $ac_c" 1>&6
-echo "configure:5608: checking for GL/gl.h" >&5
+echo "configure:5792: checking for GL/gl.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5613 "configure"
+#line 5797 "configure"
#include "confdefs.h"
#include <GL/gl.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5618: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5802: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "GL/glx.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for GL/glx.h""... $ac_c" 1>&6
-echo "configure:5649: checking for GL/glx.h" >&5
+echo "configure:5833: checking for GL/glx.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5654 "configure"
+#line 5838 "configure"
#include "confdefs.h"
#include <GL/glx.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5659: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
# to link against.
#
echo $ac_n "checking whether GL is really MesaGL""... $ac_c" 1>&6
-echo "configure:5696: checking whether GL is really MesaGL" >&5
+echo "configure:5880: checking whether GL is really MesaGL" >&5
if eval "test \"`echo '$''{'ac_cv_have_mesa_gl'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 5708 "configure"
+#line 5892 "configure"
#include "confdefs.h"
#include <GL/glx.h>
EOF
unset ac_cv_mesagl_version_string
echo $ac_n "checking MesaGL version number""... $ac_c" 1>&6
-echo "configure:5749: checking MesaGL version number" >&5
+echo "configure:5933: checking MesaGL version number" >&5
if eval "test \"`echo '$''{'ac_cv_mesagl_version_string'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5754 "configure"
+#line 5938 "configure"
#include "confdefs.h"
#include <GL/gl.h>
configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION
if test "$ac_have_mesa_gl" = yes; then
echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6
-echo "configure:5807: checking for pthread_create in -lpthread" >&5
+echo "configure:5991: checking for pthread_create in -lpthread" >&5
ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lpthread $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5815 "configure"
+#line 5999 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
pthread_create()
; return 0; }
EOF
-if { (eval echo configure:5826: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for gl_get_thread_context in -l$gl_lib_1""... $ac_c" 1>&6
-echo "configure:5864: checking for gl_get_thread_context in -l$gl_lib_1" >&5
+echo "configure:6048: checking for gl_get_thread_context in -l$gl_lib_1" >&5
ac_lib_var=`echo $gl_lib_1'_'gl_get_thread_context | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-l$gl_lib_1 $GL_LIBS -lpthread -lX11 -lXext -lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5872 "configure"
+#line 6056 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
gl_get_thread_context()
; return 0; }
EOF
-if { (eval echo configure:5883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6067: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
LDFLAGS="$LDFLAGS $X_LIBS"
echo $ac_n "checking for glBindTexture in -l$gl_lib_1""... $ac_c" 1>&6
-echo "configure:5931: checking for glBindTexture in -l$gl_lib_1" >&5
+echo "configure:6115: checking for glBindTexture in -l$gl_lib_1" >&5
ac_lib_var=`echo $gl_lib_1'_'glBindTexture | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5939 "configure"
+#line 6123 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
glBindTexture()
; return 0; }
EOF
-if { (eval echo configure:5950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6134: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
CPPFLAGS="$ac_save_CPPFLAGS"
LDFLAGS="$ac_save_LDFLAGS"
+
+ # Check whether the `xscreensaver' executable should link against GL.
+ # See comments in utils/visual-gl.c for why this is sometimes necessary.
+ #
+ echo $ac_n "checking whether drastic GL measures must be taken""... $ac_c" 1>&6
+echo "configure:6165: checking whether drastic GL measures must be taken" >&5
+ case "$host" in
+ *-sgi*)
+ echo "$ac_t""yes -- hello, SGI." 1>&6
+ cat >> confdefs.h <<\EOF
+#define DAEMON_USE_GL 1
+EOF
+
+ SAVER_GL_SRCS='$(UTILS_SRC)/visual-gl.c'
+ SAVER_GL_OBJS='$(UTILS_BIN)/visual-gl.o'
+ SAVER_GL_LIBS="$GL_LIBS"
+ ;;
+ *)
+ echo "$ac_t""no -- non-SGI." 1>&6
+ SAVER_GL_SRCS=''
+ SAVER_GL_OBJS=''
+ SAVER_GL_LIBS=''
+ ;;
+ esac
+
fi
elif test "$with_gl" != no; then
/*)
echo $ac_n "checking for XReadDisplay headers""... $ac_c" 1>&6
-echo "configure:6004: checking for XReadDisplay headers" >&5
+echo "configure:6213: checking for XReadDisplay headers" >&5
d=$with_readdisplay/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for XReadDisplay libs""... $ac_c" 1>&6
-echo "configure:6014: checking for XReadDisplay libs" >&5
+echo "configure:6223: checking for XReadDisplay libs" >&5
d=$with_readdisplay/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "X11/extensions/readdisplay.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for X11/extensions/readdisplay.h""... $ac_c" 1>&6
-echo "configure:6052: checking for X11/extensions/readdisplay.h" >&5
+echo "configure:6261: checking for X11/extensions/readdisplay.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6057 "configure"
+#line 6266 "configure"
#include "confdefs.h"
#include <X11/extensions/readdisplay.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6062: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6271: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
/*)
echo $ac_n "checking for Iris Video headers""... $ac_c" 1>&6
-echo "configure:6113: checking for Iris Video headers" >&5
+echo "configure:6322: checking for Iris Video headers" >&5
d=$with_sgivideo/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for Iris Video libs""... $ac_c" 1>&6
-echo "configure:6123: checking for Iris Video libs" >&5
+echo "configure:6332: checking for Iris Video libs" >&5
d=$with_sgivideo/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
ac_safe=`echo "dmedia/vl.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dmedia/vl.h""... $ac_c" 1>&6
-echo "configure:6161: checking for dmedia/vl.h" >&5
+echo "configure:6370: checking for dmedia/vl.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6166 "configure"
+#line 6375 "configure"
#include "confdefs.h"
#include <dmedia/vl.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6171: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6380: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if test "$have_sgivideo" = yes; then
have_sgivideo=no
echo $ac_n "checking for vlOpenVideo in -lvl""... $ac_c" 1>&6
-echo "configure:6196: checking for vlOpenVideo in -lvl" >&5
+echo "configure:6405: checking for vlOpenVideo in -lvl" >&5
ac_lib_var=`echo vl'_'vlOpenVideo | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lvl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6204 "configure"
+#line 6413 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
vlOpenVideo()
; return 0; }
EOF
-if { (eval echo configure:6215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
case "$with_zippy_req" in
/*)
echo $ac_n "checking for $with_zippy_req""... $ac_c" 1>&6
-echo "configure:6283: checking for $with_zippy_req" >&5
+echo "configure:6492: checking for $with_zippy_req" >&5
if test -x "$with_zippy_req" ; then
echo "$ac_t""yes" 1>&6
else
# Extract the first word of "$with_zippy_req", so it can be a program name with args.
set dummy $with_zippy_req; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6297: checking for $ac_word" >&5
+echo "configure:6506: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_zip2'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6347: checking for $ac_word" >&5
+echo "configure:6556: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_emacs_exe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6381: checking for $ac_word" >&5
+echo "configure:6590: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_xemacs_exe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$emacs_exe" ; then
echo $ac_n "checking for emacs yow""... $ac_c" 1>&6
-echo "configure:6416: checking for emacs yow" >&5
+echo "configure:6625: checking for emacs yow" >&5
#
# get emacs to tell us where the libexec directory is.
#
if test -z "$ac_cv_zippy_program" ; then
echo $ac_n "checking for xemacs yow""... $ac_c" 1>&6
-echo "configure:6438: checking for xemacs yow" >&5
+echo "configure:6647: checking for xemacs yow" >&5
if test -n "$xemacs_exe" ; then
#
# get xemacs to tell us where the libexec directory is.
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6497: checking for $ac_word" >&5
+echo "configure:6706: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_fortune'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6533: checking for $ac_word" >&5
+echo "configure:6742: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_fortune'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test "$enable_vt_locking" = yes; then
echo $ac_n "checking for the VT_LOCKSWITCH ioctl""... $ac_c" 1>&6
-echo "configure:6632: checking for the VT_LOCKSWITCH ioctl" >&5
+echo "configure:6841: checking for the VT_LOCKSWITCH ioctl" >&5
if eval "test \"`echo '$''{'ac_cv_vt_lockswitch'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6637 "configure"
+#line 6846 "configure"
#include "confdefs.h"
#include <fcntl.h>
#include <sys/ioctl.h>
int x = VT_LOCKSWITCH; int y = VT_UNLOCKSWITCH;
; return 0; }
EOF
-if { (eval echo configure:6646: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6855: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_vt_lockswitch=yes
else
/*)
echo $ac_n "checking for Kerberos headers""... $ac_c" 1>&6
-echo "configure:6700: checking for Kerberos headers" >&5
+echo "configure:6909: checking for Kerberos headers" >&5
d=$with_kerberos/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for Kerberos libs""... $ac_c" 1>&6
-echo "configure:6710: checking for Kerberos libs" >&5
+echo "configure:6919: checking for Kerberos libs" >&5
d=$with_kerberos/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
if test "$with_kerberos" = yes; then
echo $ac_n "checking for Kerberos""... $ac_c" 1>&6
-echo "configure:6741: checking for Kerberos" >&5
+echo "configure:6950: checking for Kerberos" >&5
if eval "test \"`echo '$''{'ac_cv_kerberos'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 6752 "configure"
+#line 6961 "configure"
#include "confdefs.h"
#include <krb.h>
int main() {
; return 0; }
EOF
-if { (eval echo configure:6759: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6968: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_kerberos=yes
else
# from Tim Showalter <tjs+@andrew.cmu.edu>
PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes"
echo $ac_n "checking for res_search""... $ac_c" 1>&6
-echo "configure:6783: checking for res_search" >&5
+echo "configure:6992: checking for res_search" >&5
if eval "test \"`echo '$''{'ac_cv_func_res_search'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6788 "configure"
+#line 6997 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char res_search(); below. */
; return 0; }
EOF
-if { (eval echo configure:6811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7020: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_res_search=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for res_search in -lresolv""... $ac_c" 1>&6
-echo "configure:6829: checking for res_search in -lresolv" >&5
+echo "configure:7038: checking for res_search in -lresolv" >&5
ac_lib_var=`echo resolv'_'res_search | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lresolv $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6837 "configure"
+#line 7046 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
res_search()
; return 0; }
EOF
-if { (eval echo configure:6848: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7057: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
withval="$with_pam"
with_pam="$withval"; with_pam_req="$withval"
else
- with_pam=no
+ with_pam=yes
fi
-#### Leave PAM off by default for now, since it's buggy on Solaris
-#### (and probably Linux, but it's so hard to tell...)
case "$with_pam" in
/*)
echo $ac_n "checking for PAM headers""... $ac_c" 1>&6
-echo "configure:6898: checking for PAM headers" >&5
+echo "configure:7105: checking for PAM headers" >&5
d=$with_pam/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for PAM libs""... $ac_c" 1>&6
-echo "configure:6908: checking for PAM libs" >&5
+echo "configure:7115: checking for PAM libs" >&5
d=$with_pam/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
if test "$with_pam" = yes; then
echo $ac_n "checking for PAM""... $ac_c" 1>&6
-echo "configure:6939: checking for PAM" >&5
+echo "configure:7146: checking for PAM" >&5
if eval "test \"`echo '$''{'ac_cv_pam'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 6950 "configure"
+#line 7157 "configure"
#include "confdefs.h"
#include <security/pam_appl.h>
int main() {
; return 0; }
EOF
-if { (eval echo configure:6957: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7164: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_pam=yes
else
EOF
PASSWD_LIBS="${PASSWD_LIBS} -lpam -ldl"
+
+
+ echo $ac_n "checking how to call pam_strerror""... $ac_c" 1>&6
+echo "configure:7188: checking how to call pam_strerror" >&5
+ if eval "test \"`echo '$''{'ac_cv_pam_strerror_args'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7193 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+ #include <stdlib.h>
+ #include <security/pam_appl.h>
+int main() {
+pam_handle_t *pamh = 0;
+ char *s = pam_strerror(pamh, PAM_SUCCESS);
+; return 0; }
+EOF
+if { (eval echo configure:7203: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_pam_strerror_args=2
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat > conftest.$ac_ext <<EOF
+#line 7211 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+ #include <stdlib.h>
+ #include <security/pam_appl.h>
+int main() {
+char *s =
+ pam_strerror(PAM_SUCCESS);
+; return 0; }
+EOF
+if { (eval echo configure:7221: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_pam_strerror_args=1
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_pam_strerror_args=0
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_pam_strerror_args=$ac_pam_strerror_args
+fi
+
+ ac_pam_strerror_args=$ac_cv_pam_strerror_args
+ if test "$ac_pam_strerror_args" = 1 ; then
+ echo "$ac_t""one argument" 1>&6
+ elif test "$ac_pam_strerror_args" = 2 ; then
+ cat >> confdefs.h <<\EOF
+#define PAM_STRERROR_TWO_ARGS 1
+EOF
+
+ echo "$ac_t""two arguments" 1>&6
+ else
+ echo "$ac_t""unknown" 1>&6
+ fi
fi
elif test "$with_pam" != no; then
echo "error: must be yes or no: --with-pam=$with_pam"
/*)
echo $ac_n "checking for shadow password headers""... $ac_c" 1>&6
-echo "configure:7003: checking for shadow password headers" >&5
+echo "configure:7273: checking for shadow password headers" >&5
d=$with_shadow/include
if test -d $d; then
X_CFLAGS="-I$d $X_CFLAGS"
fi
echo $ac_n "checking for shadow password libs""... $ac_c" 1>&6
-echo "configure:7013: checking for shadow password libs" >&5
+echo "configure:7283: checking for shadow password libs" >&5
d=$with_shadow/lib
if test -d $d; then
X_LIBS="-L$d $X_LIBS"
#
if test "$pwent_cruft_done" = no ; then
echo $ac_n "checking for Sun-style shadow passwords""... $ac_c" 1>&6
-echo "configure:7054: checking for Sun-style shadow passwords" >&5
+echo "configure:7324: checking for Sun-style shadow passwords" >&5
if eval "test \"`echo '$''{'ac_cv_sun_adjunct'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 7065 "configure"
+#line 7335 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <unistd.h>
const char *pw = p->pwa_passwd;
; return 0; }
EOF
-if { (eval echo configure:7078: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7348: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sun_adjunct=yes
else
#
if test "$pwent_cruft_done" = no ; then
echo $ac_n "checking for DEC-style shadow passwords""... $ac_c" 1>&6
-echo "configure:7107: checking for DEC-style shadow passwords" >&5
+echo "configure:7377: checking for DEC-style shadow passwords" >&5
if eval "test \"`echo '$''{'ac_cv_enhanced_passwd'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 7118 "configure"
+#line 7388 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <unistd.h>
pw = p->ufld.fd_encrypt;
; return 0; }
EOF
-if { (eval echo configure:7135: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7405: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_enhanced_passwd=yes
else
# On SCO, getprpwnam() is in -lprot (which uses nap() from -lx)
# (I'm told it needs -lcurses too, but I don't understand why.)
echo $ac_n "checking for getprpwnam in -lprot""... $ac_c" 1>&6
-echo "configure:7161: checking for getprpwnam in -lprot" >&5
+echo "configure:7431: checking for getprpwnam in -lprot" >&5
ac_lib_var=`echo prot'_'getprpwnam | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lprot -lx $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7169 "configure"
+#line 7439 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
getprpwnam()
; return 0; }
EOF
-if { (eval echo configure:7180: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "$ac_t""no" 1>&6
# On DEC, getprpwnam() is in -lsecurity
echo $ac_n "checking for getprpwnam in -lsecurity""... $ac_c" 1>&6
-echo "configure:7200: checking for getprpwnam in -lsecurity" >&5
+echo "configure:7470: checking for getprpwnam in -lsecurity" >&5
ac_lib_var=`echo security'_'getprpwnam | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lsecurity $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7208 "configure"
+#line 7478 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
getprpwnam()
; return 0; }
EOF
-if { (eval echo configure:7219: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
#
if test "$pwent_cruft_done" = no ; then
echo $ac_n "checking for HP-style shadow passwords""... $ac_c" 1>&6
-echo "configure:7248: checking for HP-style shadow passwords" >&5
+echo "configure:7518: checking for HP-style shadow passwords" >&5
if eval "test \"`echo '$''{'ac_cv_hpux_passwd'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 7259 "configure"
+#line 7529 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <unistd.h>
const char *pw = p->pw_passwd;
; return 0; }
EOF
-if { (eval echo configure:7272: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7542: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_hpux_passwd=yes
else
# on HPUX, bigcrypt is in -lsec
echo $ac_n "checking for bigcrypt in -lsec""... $ac_c" 1>&6
-echo "configure:7297: checking for bigcrypt in -lsec" >&5
+echo "configure:7567: checking for bigcrypt in -lsec" >&5
ac_lib_var=`echo sec'_'bigcrypt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lsec $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7305 "configure"
+#line 7575 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
bigcrypt()
; return 0; }
EOF
-if { (eval echo configure:7316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7586: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
#
if test "$pwent_cruft_done" = no ; then
echo $ac_n "checking for generic shadow passwords""... $ac_c" 1>&6
-echo "configure:7343: checking for generic shadow passwords" >&5
+echo "configure:7613: checking for generic shadow passwords" >&5
if eval "test \"`echo '$''{'ac_cv_shadow'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
cat > conftest.$ac_ext <<EOF
-#line 7354 "configure"
+#line 7624 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <unistd.h>
const char *pw = p->sp_pwdp;
; return 0; }
EOF
-if { (eval echo configure:7366: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_shadow=yes
else
# On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
have_getspnam=no
echo $ac_n "checking for getspnam in -lc""... $ac_c" 1>&6
-echo "configure:7392: checking for getspnam in -lc" >&5
+echo "configure:7662: checking for getspnam in -lc" >&5
ac_lib_var=`echo c'_'getspnam | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lc $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7400 "configure"
+#line 7670 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
getspnam()
; return 0; }
EOF
-if { (eval echo configure:7411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7681: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$have_getspnam" = no ; then
echo $ac_n "checking for getspnam in -lgen""... $ac_c" 1>&6
-echo "configure:7433: checking for getspnam in -lgen" >&5
+echo "configure:7703: checking for getspnam in -lgen" >&5
ac_lib_var=`echo gen'_'getspnam | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lgen $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7441 "configure"
+#line 7711 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
getspnam()
; return 0; }
EOF
-if { (eval echo configure:7452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
#
if test "$pwent_cruft_done" = no ; then
echo $ac_n "checking for FreeBSD-style shadow passwords""... $ac_c" 1>&6
-echo "configure:7483: checking for FreeBSD-style shadow passwords" >&5
+echo "configure:7753: checking for FreeBSD-style shadow passwords" >&5
if eval "test \"`echo '$''{'ac_cv_master_passwd'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc.
have_crypt=no
echo $ac_n "checking for crypt in -lc""... $ac_c" 1>&6
-echo "configure:7504: checking for crypt in -lc" >&5
+echo "configure:7774: checking for crypt in -lc" >&5
ac_lib_var=`echo c'_'crypt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lc $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7512 "configure"
+#line 7782 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
crypt()
; return 0; }
EOF
-if { (eval echo configure:7523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$have_crypt" = no ; then
echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6
-echo "configure:7545: checking for crypt in -lcrypt" >&5
+echo "configure:7815: checking for crypt in -lcrypt" >&5
ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lcrypt $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7553 "configure"
+#line 7823 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
crypt()
; return 0; }
EOF
-if { (eval echo configure:7564: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7834: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
fi
+# for the "sonar" hack -- check how to ping.
+#
+echo $ac_n "checking for struct icmp""... $ac_c" 1>&6
+echo "configure:7875: checking for struct icmp" >&5
+if eval "test \"`echo '$''{'ac_cv_have_icmp'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7880 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <unistd.h>
+ #include <limits.h>
+ #include <signal.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+ #include <netinet/in_systm.h>
+ #include <netinet/in.h>
+ #include <netinet/ip.h>
+ #include <netinet/ip_icmp.h>
+ #include <netinet/udp.h>
+ #include <arpa/inet.h>
+ #include <netdb.h>
+int main() {
+struct icmp i;
+ struct sockaddr s;
+ struct sockaddr_in si;
+ struct ip ip;
+ i.icmp_type = ICMP_ECHO;
+ i.icmp_code = 0;
+ i.icmp_cksum = 0;
+ i.icmp_id = 0;
+ i.icmp_seq = 0;
+ si.sin_family = AF_INET;
+ ip.ip_hl = 0;
+; return 0; }
+EOF
+if { (eval echo configure:7915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_have_icmp=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_have_icmp=no
+fi
+rm -f conftest*
+fi
+
+ac_have_icmp=$ac_cv_have_icmp
+echo "$ac_t""$ac_cv_have_icmp" 1>&6
+
+echo $ac_n "checking for struct icmphdr""... $ac_c" 1>&6
+echo "configure:7931: checking for struct icmphdr" >&5
+if eval "test \"`echo '$''{'ac_cv_have_icmphdr'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7936 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <unistd.h>
+ #include <limits.h>
+ #include <signal.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+ #include <netinet/in_systm.h>
+ #include <netinet/in.h>
+ #include <netinet/ip.h>
+ #include <netinet/ip_icmp.h>
+ #include <netinet/udp.h>
+ #include <arpa/inet.h>
+ #include <netdb.h>
+int main() {
+struct icmphdr i;
+ struct sockaddr s;
+ struct sockaddr_in si;
+ struct ip ip;
+ i.type = ICMP_ECHO;
+ i.code = 0;
+ i.cksum = 0;
+ i.un.echo.id = 0;
+ i.un.echo.sequence = 0;
+ si.sin_family = AF_INET;
+ ip.ip_hl = 0;
+; return 0; }
+EOF
+if { (eval echo configure:7971: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_have_icmphdr=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_have_icmphdr=no
+fi
+rm -f conftest*
+fi
+
+ac_have_icmphdr=$ac_cv_have_icmphdr
+echo "$ac_t""$ac_cv_have_icmphdr" 1>&6
+
+if test "$ac_have_icmp" = yes ; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ICMP 1
+EOF
+
+fi
+if test "$ac_have_icmphdr" = yes ; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ICMPHDR 1
+EOF
+
+fi
+
+
+
+########################## end of tests.
+
+
if test \! -z "$includedir" ; then
INCLUDES="-I$includedir"
fi
tab=' '
if test "$have_gl" = yes; then
GL_EXES='$(GL_EXES)'
- GL_KLUDGE=${tab}
+ GL_MEN='$(GL_MEN)'
+ GL_KLUDGE="${tab} "
else
- GL_KLUDGE=' -'${tab}
+ GL_KLUDGE=" -${tab} "
fi
+
+
+
+
warn 'The DPMS extension was requested, but was not found.'
fi
+if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
+ warn 'The XF86VMODE extension was requested, but was not found.'
+fi
+
if test "$have_motif" = no -a "$have_athena" = no ; then
warnL "Neither Motif nor Athena widgets seem to be available;"
warn2 "the \`xscreensaver-demo' program requires one or the"
s%@PASSWD_OBJS@%$PASSWD_OBJS%g
s%@XMU_SRCS@%$XMU_SRCS%g
s%@XMU_OBJS@%$XMU_OBJS%g
+s%@SAVER_GL_SRCS@%$SAVER_GL_SRCS%g
+s%@SAVER_GL_OBJS@%$SAVER_GL_OBJS%g
+s%@SAVER_GL_LIBS@%$SAVER_GL_LIBS%g
s%@LOCK_SRCS@%$LOCK_SRCS%g
s%@LOCK_OBJS@%$LOCK_OBJS%g
s%@GL_EXES@%$GL_EXES%g
+s%@GL_MEN@%$GL_MEN%g
s%@GL_KLUDGE@%$GL_KLUDGE%g
s%@HACKDIR@%$HACKDIR%g
s%@APPDEFAULTS@%$APPDEFAULTS%g
fi
+# Check for the XF86VMODE server extension header.
+#
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
+AC_ARG_WITH(xf86vmode-ext,
+[ --with-xf86vmode-ext Include support for XFree86 virtual screens, if
+ possible (this is the default).
+ --without-xf86vmode-ext Do not compile in support for this extension.],
+ [with_xf86vmode="$withval"; with_xf86vmode_req="$withval"],
+ [with_xf86vmode=yes])
+
+HANDLE_X_PATH_ARG(with_xf86vmode, --with-xf86vmode-ext, xf86vmode)
+
+if test "$with_xf86vmode" = yes; then
+
+ # first check for xf86vmode.h
+ AC_CHECK_X_HEADER(X11/extensions/xf86vmode.h, [have_xf86vmode=yes])
+
+ # if that succeeded, then check for the -lXxf86vm
+ if test "$have_xf86vmode" = yes; then
+ have_xf86vmode=no
+ AC_CHECK_X_LIB(Xxf86vm, XF86VidModeGetViewPort,
+ [have_xf86vmode=yes; SAVER_LIBS="$SAVER_LIBS -lXxf86vm"], [],
+ -lXext -lX11)
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xf86vmode" = yes; then
+ AC_DEFINE(HAVE_XF86VMODE)
+ fi
+
+elif test "$with_xf86vmode" != no; then
+ echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+ exit 1
+fi
+
+
# Check for /proc/interrupts
#
have_proc_interrupts=no
AC_CHECK_X_LIB($gl_lib_1, glBindTexture, [AC_DEFINE(HAVE_GLBINDTEXTURE)],
[], $GL_LIBS -lX11 -lXext -lm)
+
+ # Check whether the `xscreensaver' executable should link against GL.
+ # See comments in utils/visual-gl.c for why this is sometimes necessary.
+ #
+ AC_MSG_CHECKING(whether drastic GL measures must be taken)
+ case "$host" in
+ *-sgi*)
+ AC_MSG_RESULT([yes -- hello, SGI.])
+ AC_DEFINE(DAEMON_USE_GL)
+ SAVER_GL_SRCS='$(UTILS_SRC)/visual-gl.c'
+ SAVER_GL_OBJS='$(UTILS_BIN)/visual-gl.o'
+ SAVER_GL_LIBS="$GL_LIBS"
+ ;;
+ *)
+ AC_MSG_RESULT([no -- non-SGI.])
+ SAVER_GL_SRCS=''
+ SAVER_GL_OBJS=''
+ SAVER_GL_LIBS=''
+ ;;
+ esac
+
fi
elif test "$with_gl" != no; then
[ --with-pam Include support for PAM (Pluggable Authentication
Modules) if possible (this is the default.)
--without-pam Do not compile in support for PAM.],
- [with_pam="$withval"; with_pam_req="$withval"],[with_pam=no])
-#### Leave PAM off by default for now, since it's buggy on Solaris
-#### (and probably Linux, but it's so hard to tell...)
+ [with_pam="$withval"; with_pam_req="$withval"],[with_pam=yes])
HANDLE_X_PATH_ARG(with_pam, --with-pam, PAM)
have_pam=yes
AC_DEFINE(HAVE_PAM)
PASSWD_LIBS="${PASSWD_LIBS} -lpam -ldl"
+
+
+ AC_MSG_CHECKING(how to call pam_strerror)
+ AC_CACHE_VAL(ac_cv_pam_strerror_args,
+ [AC_TRY_COMPILE([#include <stdio.h>
+ #include <stdlib.h>
+ #include <security/pam_appl.h>],
+ [pam_handle_t *pamh = 0;
+ char *s = pam_strerror(pamh, PAM_SUCCESS);],
+ [ac_pam_strerror_args=2],
+ [AC_TRY_COMPILE([#include <stdio.h>
+ #include <stdlib.h>
+ #include <security/pam_appl.h>],
+ [char *s =
+ pam_strerror(PAM_SUCCESS);],
+ [ac_pam_strerror_args=1],
+ [ac_pam_strerror_args=0])])
+ ac_cv_pam_strerror_args=$ac_pam_strerror_args])
+ ac_pam_strerror_args=$ac_cv_pam_strerror_args
+ if test "$ac_pam_strerror_args" = 1 ; then
+ AC_MSG_RESULT(one argument)
+ elif test "$ac_pam_strerror_args" = 2 ; then
+ AC_DEFINE(PAM_STRERROR_TWO_ARGS)
+ AC_MSG_RESULT(two arguments)
+ else
+ AC_MSG_RESULT(unknown)
+ fi
fi
elif test "$with_pam" != no; then
echo "error: must be yes or no: --with-pam=$with_pam"
fi
+# for the "sonar" hack -- check how to ping.
+#
+AC_MSG_CHECKING(for struct icmp)
+AC_CACHE_VAL(ac_cv_have_icmp,
+ [AC_TRY_COMPILE([#include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <unistd.h>
+ #include <limits.h>
+ #include <signal.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+ #include <netinet/in_systm.h>
+ #include <netinet/in.h>
+ #include <netinet/ip.h>
+ #include <netinet/ip_icmp.h>
+ #include <netinet/udp.h>
+ #include <arpa/inet.h>
+ #include <netdb.h>],
+ [struct icmp i;
+ struct sockaddr s;
+ struct sockaddr_in si;
+ struct ip ip;
+ i.icmp_type = ICMP_ECHO;
+ i.icmp_code = 0;
+ i.icmp_cksum = 0;
+ i.icmp_id = 0;
+ i.icmp_seq = 0;
+ si.sin_family = AF_INET;
+ ip.ip_hl = 0;],
+ [ac_cv_have_icmp=yes],
+ [ac_cv_have_icmp=no])])
+ac_have_icmp=$ac_cv_have_icmp
+AC_MSG_RESULT($ac_cv_have_icmp)
+
+AC_MSG_CHECKING(for struct icmphdr)
+AC_CACHE_VAL(ac_cv_have_icmphdr,
+ [AC_TRY_COMPILE([#include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <unistd.h>
+ #include <limits.h>
+ #include <signal.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+ #include <netinet/in_systm.h>
+ #include <netinet/in.h>
+ #include <netinet/ip.h>
+ #include <netinet/ip_icmp.h>
+ #include <netinet/udp.h>
+ #include <arpa/inet.h>
+ #include <netdb.h>],
+ [struct icmphdr i;
+ struct sockaddr s;
+ struct sockaddr_in si;
+ struct ip ip;
+ i.type = ICMP_ECHO;
+ i.code = 0;
+ i.cksum = 0;
+ i.un.echo.id = 0;
+ i.un.echo.sequence = 0;
+ si.sin_family = AF_INET;
+ ip.ip_hl = 0;],
+ [ac_cv_have_icmphdr=yes],
+ [ac_cv_have_icmphdr=no])])
+ac_have_icmphdr=$ac_cv_have_icmphdr
+AC_MSG_RESULT($ac_cv_have_icmphdr)
+
+if test "$ac_have_icmp" = yes ; then
+ AC_DEFINE(HAVE_ICMP)
+fi
+if test "$ac_have_icmphdr" = yes ; then
+ AC_DEFINE(HAVE_ICMPHDR)
+fi
+
+
+
+########################## end of tests.
+
+
if test \! -z "$includedir" ; then
INCLUDES="-I$includedir"
fi
tab=' '
if test "$have_gl" = yes; then
GL_EXES='$(GL_EXES)'
- GL_KLUDGE=${tab}
+ GL_MEN='$(GL_MEN)'
+ GL_KLUDGE="${tab} "
else
- GL_KLUDGE=' -'${tab}
+ GL_KLUDGE=" -${tab} "
fi
AC_SUBST(INCLUDES)
AC_SUBST(PASSWD_OBJS)
AC_SUBST(XMU_SRCS)
AC_SUBST(XMU_OBJS)
+AC_SUBST(SAVER_GL_SRCS)
+AC_SUBST(SAVER_GL_OBJS)
+AC_SUBST(SAVER_GL_LIBS)
AC_SUBST(LOCK_SRCS)
AC_SUBST(LOCK_OBJS)
AC_SUBST(GL_EXES)
+AC_SUBST(GL_MEN)
AC_SUBST(GL_KLUDGE)
AC_SUBST(HACKDIR)
AC_SUBST(APPDEFAULTS)
warn 'The DPMS extension was requested, but was not found.'
fi
+if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
+ warn 'The XF86VMODE extension was requested, but was not found.'
+fi
+
if test "$have_motif" = no -a "$have_athena" = no ; then
warnL "Neither Motif nor Athena widgets seem to be available;"
warn2 "the \`xscreensaver-demo' program requires one or the"
LOCK_SRCS = @LOCK_SRCS@
LOCK_OBJS = @LOCK_OBJS@
+XMU_SRCS = @XMU_SRCS@
+XMU_OBJS = @XMU_OBJS@
+
+GL_SRCS = @SAVER_GL_SRCS@
+GL_OBJS = @SAVER_GL_OBJS@
+GL_LIBS = @SAVER_GL_LIBS@
+
DEMO_UTIL_SRCS = $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
$(UTILS_SRC)/visual.c
DEMO_UTIL_OBJS = $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \
xset.o splash.o setuid.o stderr.o
SAVER_SRCS = $(SAVER_SRCS_1) prefs.c $(LOCK_SRCS) \
- $(SAVER_UTIL_SRCS) @XMU_SRCS@
+ $(SAVER_UTIL_SRCS) $(GL_SRCS) $(XMU_SRCS)
SAVER_OBJS = $(SAVER_OBJS_1) prefs.o $(LOCK_OBJS) \
- $(SAVER_UTIL_OBJS) @XMU_OBJS@
+ $(SAVER_UTIL_OBJS) $(GL_OBJS) $(XMU_OBJS)
CMD_SRCS = remote.c xscreensaver-command.c
CMD_OBJS = remote.o xscreensaver-command.o
DEMO_OBJS = $(DEMO_OBJS_1) remote.o \
$(TOOLKIT_OBJS) $(DEMO_UTIL_OBJS)
-SAVER_LIBS = $(LIBS) $(X_LIBS) @SAVER_LIBS@ \
+SAVER_LIBS = $(LIBS) $(X_LIBS) @SAVER_LIBS@ $(GL_LIBS) \
$(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) \
$(PASSWD_LIBS)
! a screen saver and locker for the X window system
! by Jamie Zawinski
!
-! version 3.10
-! 27-Apr-99
+! version 3.12
+! 10-May-99
!
! See "man xscreensaver" for more info. The latest version is always
! available at http://www.jwz.org/xscreensaver/
*fadeTicks: 20
*splash: True
*splashDuration: 5
+*visualID: default
*captureStderr: True
*overlayTextForeground: #FFFF00
! colormaps, but others prefer 24-bit windows, that also can be arranged
! (in this case, by using "PseudoColor:" versus "TrueColor:".)
!
+! Some of the screenhacks are written using OpenGL. OpenGL programs are
+! a bit different than normal X programs, in that they prefer visuals that
+! are *half* as deep as the screen. You can tell xscreensaver to select a
+! good visual for a GL program by using the magic visual name "GL".
+!
! All programs must be launched in such a way that they draw on the root
! window; they should not be spawned in the background with "&". If shell
! metacharacters are used, they must be understandable to `sh', not `csh'
! (the $SHELL variable is not consulted, for unfortunate but good reasons.)
!
-! Be sure to check out Demo Mode: run the command `xscreensaver-command -demo'
-! and it will cause the running XScreenSaver program to pop up a dialog box
-! that lets you try out the following programs interactively. See the man
-! pages for details.
+! Be sure to check out Demo Mode: run the `xscreensaver-demo' program to
+! edit the current list of programs interactively, try out the various modes,
+! and change other parameters. See the man page for details.
!
*programs: qix -root -solid -delay 0 -segments 100 \n\
attraction -root -mode balls \n\
PseudoColor: qix -root -count 5 -solid -transparent -linear \
-segments 250 -size 100 \n\
\
-@GL_KLUDGE@ gears -root \n\
-@GL_KLUDGE@ superquadrics -root \n\
-@GL_KLUDGE@ morph3d -root \n\
-@GL_KLUDGE@ cage -root \n\
-@GL_KLUDGE@ moebius -root \n\
-@GL_KLUDGE@ stairs -root \n\
-@GL_KLUDGE@ pipes -root \n\
-@GL_KLUDGE@ sproingies -root \n\
-@GL_KLUDGE@ rubik -root \n\
-@GL_KLUDGE@ atlantis -root \n\
-@GL_KLUDGE@ lament -root \n\
-@GL_KLUDGE@ bubble3d -root \n\
-@GL_KLUDGE@ glplanet -root \n\
-@GL_KLUDGE@ pulsar -root \n
+@GL_KLUDGE@ GL: gears -root \n\
+@GL_KLUDGE@ GL: superquadrics -root \n\
+@GL_KLUDGE@ GL: morph3d -root \n\
+@GL_KLUDGE@ GL: cage -root \n\
+@GL_KLUDGE@ GL: moebius -root \n\
+@GL_KLUDGE@ GL: stairs -root \n\
+@GL_KLUDGE@ GL: pipes -root \n\
+@GL_KLUDGE@ GL: sproingies -root \n\
+@GL_KLUDGE@ GL: rubik -root \n\
+@GL_KLUDGE@ GL: atlantis -root \n\
+@GL_KLUDGE@ GL: lament -root \n\
+@GL_KLUDGE@ GL: bubble3d -root \n\
+@GL_KLUDGE@ GL: glplanet -root \n\
+@GL_KLUDGE@ GL: pulsar -root \n\
+ - GL: pulsar -root -texture -mipmap -texture_quality \
+ -light -fog \n
-! A few of the hacks require OpenGL, and will only be built if you have it.
-! If your vendor doesn't provide real OpenGL, you might want to consider
-! building MesaGL, which is a free implementation -- GL is way cool.
-!
-! Note that those hacks (gears, superquadratics, morph3d, cage, moebius,
-! stairs, pipes, sproingies, and rubik) tend to work best on a visual *half*
-! as deep as the depth of the screen, since that way, they can do
-! double-buffering -- try it and see, but you will probably find that you
-! should specify the deepest visual that is half as deep as the screen.
-!
-! For example, on a screen that supports both 24-bit TrueColor and 12-bit
-! PseudoColor, the 12-bit visual will probably work best (this is true of
-! base-model SGI Indys: the 0x29 visual is the one you want.) Oddly, on SGI
-! O2s, (machines that have serious hardware support for GL) the 12-bit
-! PseudoColor visual looks awful (you get a black and white, flickery image.)
-! On these machines, the visual you want turns out to be 0x31 -- this is but
-! one of the eight 15-bit TrueColor visuals (yes, 8, and yes, 15) that O2s
-! provide. This is the only visual that works properly -- as far as xdpyinfo
-! is concerned, all of the 15-bit TrueColor visuals are identical, but some
-! flicker like mad, and some have deeply weird artifacts (hidden surfaces
-! show through!) I suppose these other visuals must be tied to some arcane
-! hardware feature... Your mileage, therefore, may vary dramatically.
-!
! Some other programs that you might want to track down (these work as
! XScreenSaver helpers, but are not distributed with it):
!
"*fadeTicks: 20",
"*splash: True",
"*splashDuration: 5",
+"*visualID: default",
"*captureStderr: True",
"*overlayTextForeground: #FFFF00",
"*overlayTextBackground: #000000",
PseudoColor: qix -root -count 5 -solid -transparent -linear \
-segments 250 -size 100 \\n\
\
- gears -root \\n\
- superquadrics -root \\n\
- morph3d -root \\n\
- cage -root \\n\
- moebius -root \\n\
- stairs -root \\n\
- pipes -root \\n\
- sproingies -root \\n\
- rubik -root \\n\
- atlantis -root \\n\
- lament -root \\n\
- bubble3d -root \\n\
- glplanet -root \\n\
- pulsar -root \\n",
+ GL: gears -root \\n\
+ GL: superquadrics -root \\n\
+ GL: morph3d -root \\n\
+ GL: cage -root \\n\
+ GL: moebius -root \\n\
+ GL: stairs -root \\n\
+ GL: pipes -root \\n\
+ GL: sproingies -root \\n\
+ GL: rubik -root \\n\
+ GL: atlantis -root \\n\
+ GL: lament -root \\n\
+ GL: bubble3d -root \\n\
+ GL: glplanet -root \\n\
+ GL: pulsar -root \\n\
+ - GL: pulsar -root -texture -mipmap -texture_quality \
+ -light -fog \\n",
" ",
"XScreenSaver.pointerPollTime: 5",
"XScreenSaver.initialDelay: 0",
short_version [4] = 0;
p->db = db;
- p->fading_possible_p = True;
load_init_file (p);
*p2 = *p;
# include <syslog.h>
#endif /* HAVE_SYSLOG */
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+#endif /* HAVE_XF86VMODE */
+
#ifdef _VROOT_H_
ERROR! You must not include vroot.h in this file.
#endif
Pixmap save_under;
};
+static void draw_passwd_window (saver_info *si);
+static void update_passwd_window (saver_info *si, const char *printed_passwd,
+ float ratio);
+static void destroy_passwd_window (saver_info *si);
+static void undo_vp_motion (saver_info *si);
+static void set_vp_mode_switch_locked (saver_info *si, Bool locked_p);
-void
+
+static void
make_passwd_window (saver_info *si)
{
struct passwd *p = getpwuid (getuid ());
attrmask |= CWEventMask; attrs.event_mask = ExposureMask|KeyPressMask;
{
- Dimension w = WidthOfScreen(screen);
- Dimension h = HeightOfScreen(screen);
+ int x, y, w, h;
+ get_screen_viewport (si->default_screen, &x, &y, &w, &h, False);
if (si->prefs.debug_p) w /= 2;
- pw->x = ((w + pw->width) / 2) - pw->width;
- pw->y = ((h + pw->height) / 2) - pw->height;
- if (pw->x < 0) pw->x = 0;
- if (pw->y < 0) pw->y = 0;
+ pw->x = x + ((w + pw->width) / 2) - pw->width;
+ pw->y = y + ((h + pw->height) / 2) - pw->height;
+ if (pw->x < x) pw->x = x;
+ if (pw->y < y) pw->y = y;
}
pw->border_width = get_integer_resource ("passwd.borderWidth",
XMapRaised (si->dpy, si->passwd_dialog);
XSync (si->dpy, False);
+ move_mouse_grab (si, si->passwd_dialog, si->screens[0].cursor);
+ undo_vp_motion (si);
+ set_vp_mode_switch_locked (si, True);
+
si->pw_data = pw;
draw_passwd_window (si);
XGCValues gcv;
GC gc1, gc2;
int x, y;
+ XRectangle rects[1];
pw->ratio = ratio;
gcv.foreground = pw->passwd_foreground;
/* the "password" text field
*/
+ rects[0].x = pw->passwd_field_x;
+ rects[0].y = pw->passwd_field_y;
+ rects[0].width = pw->passwd_field_width;
+ rects[0].height = pw->passwd_field_height;
+
XFillRectangle (si->dpy, si->passwd_dialog, gc2,
- pw->passwd_field_x, pw->passwd_field_y,
- pw->passwd_field_width, pw->passwd_field_height);
+ rects[0].x, rects[0].y, rects[0].width, rects[0].height);
+
+ XSetClipRectangles (si->dpy, gc1, 0, 0, rects, 1, Unsorted);
+
XDrawString (si->dpy, si->passwd_dialog, gc1,
- pw->passwd_field_x + pw->shadow_width,
- pw->passwd_field_y + (pw->passwd_font->ascent +
- pw->passwd_font->descent),
- pw->passwd_string, strlen(pw->passwd_string));
+ rects[0].x + pw->shadow_width,
+ rects[0].y + (pw->passwd_font->ascent +
+ pw->passwd_font->descent),
+ pw->passwd_string, strlen(pw->passwd_string));
+
+ XSetClipMask (si->dpy, gc1, None);
/* The I-beam
*/
if (pw->i_beam != 0)
{
- x = (pw->passwd_field_x + pw->shadow_width +
+ x = (rects[0].x + pw->shadow_width +
string_width (pw->passwd_font, pw->passwd_string));
- y = pw->passwd_field_y + pw->shadow_width;
+ y = rects[0].y + pw->shadow_width;
+
+ if (x > rects[0].x + rects[0].width - 1)
+ x = rects[0].x + rects[0].width - 1;
XDrawLine (si->dpy, si->passwd_dialog, gc1,
x, y, x, y + pw->passwd_font->ascent);
}
if (pw->timer)
XtRemoveTimeOut (pw->timer);
+ move_mouse_grab (si, RootWindowOfScreen(si->screens[0].screen),
+ si->screens[0].cursor);
+ set_vp_mode_switch_locked (si, False);
+
if (si->passwd_dialog)
{
XDestroyWindow (si->dpy, si->passwd_dialog);
si->pw_data = 0;
}
+static void
+undo_vp_motion (saver_info *si)
+{
+#ifdef HAVE_XF86VMODE
+ saver_preferences *p = &si->prefs;
+ int screen = 0; /* always screen 0 */
+ saver_screen_info *ssi = &si->screens[screen];
+ int event, error, x, y;
+ Bool status;
+
+ if (ssi->blank_vp_x == -1 && ssi->blank_vp_y == -1)
+ return;
+ if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
+ return;
+ if (!XF86VidModeGetViewPort (si->dpy, 0, &x, &y))
+ return;
+ if (ssi->blank_vp_x == x && ssi->blank_vp_y == y)
+ return;
+
+ /* We're going to move the viewport. The mouse has just been grabbed on
+ (and constrained to, thus warped to) the password window, so it is no
+ longer near the edge of the screen. However, wait a bit anyway, just
+ to make sure the server drains its last motion event, so that the
+ screen doesn't continue to scroll after we've reset the viewport.
+ */
+ XSync (si->dpy, False);
+ usleep (250); /* 1/4 second */
+ XSync (si->dpy, False);
+
+ status = XF86VidModeSetViewPort (si->dpy, screen,
+ ssi->blank_vp_x, ssi->blank_vp_y);
+
+ if (!status)
+ fprintf (stderr, "%s: unable to move vp from (%d,%d) back to (%d,%d)!\n",
+ blurb(), x, y, ssi->blank_vp_x, ssi->blank_vp_y);
+ else if (p->verbose_p)
+ fprintf (stderr, "%s: vp moved to (%d,%d); moved it back to (%d,%d).\n",
+ blurb(), x, y, ssi->blank_vp_x, ssi->blank_vp_y);
+
+#endif /* HAVE_XF86VMODE */
+}
+
+
+static void
+set_vp_mode_switch_locked (saver_info *si, Bool locked_p)
+{
+#ifdef HAVE_XF86VMODE
+ saver_preferences *p = &si->prefs;
+ int screen = 0; /* always screen 0 */
+ int event, error;
+ Bool status;
+
+ if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
+ return;
+ status = XF86VidModeLockModeSwitch (si->dpy, screen, locked_p);
+
+ if (!status)
+ fprintf (stderr, "%s: unable to %s vp switching!\n",
+ blurb(), (locked_p ? "lock" : "unlock"));
+ else if (p->verbose_p)
+ fprintf (stderr, "%s: %s vp switching.\n",
+ blurb(), (locked_p ? "locked" : "unlocked"));
+#endif /* HAVE_XF86VMODE */
+}
+
+
\f
/* Interactions
*/
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
+ *
+ * Some PAM resources:
+ *
+ * PAM home page:
+ * http://www.us.kernel.org/pub/linux/libs/pam/
+ *
+ * PAM FAQ:
+ * http://www.us.kernel.org/pub/linux/libs/pam/FAQ
+ *
+ * PAM Application Developers' Guide:
+ * http://www.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam_appl.html
+ *
+ * PAM Mailing list archives:
+ * http://www.linuxhq.com/lnxlists/linux-pam/
+ *
+ * Compatibility notes, especially between Linux and Solaris:
+ * http://www.contrib.andrew.cmu.edu/u/shadow/pam.html
+ *
+ * The Open Group's PAM API documentation:
+ * http://www.opengroup.org/onlinepubs/8329799/pam_start.htm
*/
#ifdef HAVE_CONFIG_H
/* We handle delays ourself.*/
/* Don't set this to 0 (Linux bug workaround.) */
# define PAM_NO_DELAY(pamh) pam_fail_delay ((pamh), 1)
-# else /* !HAVE_PAM_FAIL_DELAY */
+#else /* !HAVE_PAM_FAIL_DELAY */
# define PAM_NO_DELAY(pamh) /* */
-# endif /* !HAVE_PAM_FAIL_DELAY */
+#endif /* !HAVE_PAM_FAIL_DELAY */
+
+
+/* On SunOS 5.6, and on Linux with PAM 0.64, pam_strerror() takes two args.
+ On some other Linux systems with some other version of PAM (e.g.,
+ whichever Debian release comes with a 2.2.5 kernel) it takes one arg.
+ I can't tell which is more "recent" or "correct" behavior, so configure
+ figures out which is in use for us. Shoot me!
+ */
+#ifdef PAM_STRERROR_TWO_ARGS
+# define PAM_STRERROR(pamh, status) pam_strerror((pamh), (status))
+#else /* !PAM_STRERROR_TWO_ARGS */
+# define PAM_STRERROR(pamh, status) pam_strerror((status))
+#endif /* !PAM_STRERROR_TWO_ARGS */
+
/* PAM sucks in that there is no way to tell whether a particular service
is configured at all. That is, there is no way to tell the difference
*/
+/* On SunOS 5.6, the `pam_conv.appdata_ptr' slot seems to be ignored, and
+ the `closure' argument to pc.conv always comes in as random garbage.
+ So we get around this by using a global variable instead. Shoot me!
+ */
+static void *suns_pam_implementation_blows = 0;
+
+
/* This can be called at any time, and says whether the typed password
belongs to either the logged in user (real uid, not effective); or
to root.
pc.conv = &pam_conversation;
pc.appdata_ptr = (void *) &c;
+ /* On SunOS 5.6, the `appdata_ptr' slot seems to be ignored, and the
+ `closure' argument to pc.conv always comes in as random garbage. */
+ suns_pam_implementation_blows = (void *) &c;
+
/* Initialize PAM.
*/
if (verbose_p)
fprintf (stderr, "%s: pam_start (\"%s\", \"%s\", ...) ==> %d (%s)\n",
blurb(), service, c.user,
- status, pam_strerror (pamh, status));
+ status, PAM_STRERROR (pamh, status));
if (status != PAM_SUCCESS) goto DONE;
/* #### We should set PAM_TTY to the display we're using, but we
status = pam_set_item (pamh, PAM_TTY, strdup(tty));
if (verbose_p)
fprintf (stderr, "%s: pam_set_item (p, PAM_TTY, \"%s\") ==> %d (%s)\n",
- blurb(), tty, status, pam_strerror(pamh, status));
+ blurb(), tty, status, PAM_STRERROR(pamh, status));
}
/* Try to authenticate as the current user.
status = pam_authenticate (pamh, 0);
if (verbose_p)
fprintf (stderr, "%s: pam_authenticate (...) ==> %d (%s)\n",
- blurb(), status, pam_strerror(pamh, status));
+ blurb(), status, PAM_STRERROR(pamh, status));
if (status == PAM_SUCCESS) /* Win! */
goto DONE;
status = pam_set_item (pamh, PAM_USER, strdup(c.user));
if (verbose_p)
fprintf (stderr, "%s: pam_set_item(p, PAM_USER, \"%s\") ==> %d (%s)\n",
- blurb(), c.user, status, pam_strerror(pamh, status));
+ blurb(), c.user, status, PAM_STRERROR(pamh, status));
if (status != PAM_SUCCESS) goto DONE;
PAM_NO_DELAY(pamh);
status = pam_authenticate (pamh, 0);
if (verbose_p)
fprintf (stderr, "%s: pam_authenticate (...) ==> %d (%s)\n",
- blurb(), status, pam_strerror(pamh, status));
+ blurb(), status, PAM_STRERROR(pamh, status));
DONE:
if (user) free (user);
Bool
-pam_lock_init (int argc, char **argv, Bool verbose_p)
+pam_priv_init (int argc, char **argv, Bool verbose_p)
{
/* We have nothing to do at init-time.
However, we might as well do some error checking.
If "/etc/pam.d" exists and is a directory, but "/etc/pam.d/xlock"
does not exist, warn that PAM probably isn't going to work.
+
+ This is a priv-init instead of a non-priv init in case the directory
+ is unreadable or something (don't know if that actually happens.)
*/
- const char dir[] = "/etc/pam.d";
- const char file[] = "/etc/pam.d/" PAM_SERVICE_NAME;
+ const char dir[] = "/etc/pam.d";
+ const char file[] = "/etc/pam.d/" PAM_SERVICE_NAME;
+ const char file2[] = "/etc/pam.conf";
struct stat st;
+
if (stat (dir, &st) == 0 && st.st_mode & S_IFDIR)
- if (stat (file, &st) != 0)
+ {
+ if (stat (file, &st) != 0)
+ fprintf (stderr,
+ "%s: warning: %s does not exist.\n"
+ "%s: password authentication via PAM is unlikely to work.\n",
+ blurb(), file, blurb());
+ }
+ else if (stat (file2, &st) == 0)
+ {
+ FILE *f = fopen (file2, "r");
+ if (f)
+ {
+ Bool ok = False;
+ char buf[255];
+ while (fgets (buf, sizeof(buf), f))
+ if (strstr (buf, PAM_SERVICE_NAME))
+ {
+ ok = True;
+ break;
+ }
+ fclose (f);
+ if (!ok)
+ {
+ fprintf (stderr,
+ "%s: warning: %s does not list the `%s' service.\n"
+ "%s: password authentication via PAM is unlikely to work.\n",
+ blurb(), file2, PAM_SERVICE_NAME, blurb());
+ }
+ }
+ /* else warn about file2 existing but being unreadable? */
+ }
+ else
+ {
fprintf (stderr,
- "%s: warning: %s does not exist.\n"
+ "%s: warning: neither %s nor %s exist.\n"
"%s: password authentication via PAM is unlikely to work.\n",
- blurb(), file, blurb());
+ blurb(), file2, file, blurb());
+ }
/* Return true anyway, just in case. */
return True;
struct pam_response *reply = 0;
struct pam_closure *c = (struct pam_closure *) closure;
+ /* On SunOS 5.6, the `closure' argument always comes in as random garbage. */
+ c = (struct pam_closure *) suns_pam_implementation_blows;
+
+
reply = (struct pam_response *) calloc (nmsgs, sizeof (*reply));
if (!reply) return PAM_CONV_ERR;
*s = 0;
}
+#ifndef HAVE_PAM
+ /* We only issue this warning if not compiled with support for PAM.
+ If we're using PAM, it's not unheard of that normal pwent passwords
+ would be unavailable. */
+
if (!result)
fprintf (stderr, "%s: couldn't get password of \"%s\"\n",
blurb(), (user ? user : "(null)"));
+#endif /* !HAVE_PAM */
return result;
}
extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
#endif
#ifdef HAVE_PAM
-extern Bool pam_lock_init (int argc, char **argv, Bool verbose_p);
+extern Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
extern Bool pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
#endif
extern Bool pwent_lock_init (int argc, char **argv, Bool verbose_p);
False, False },
# endif
# ifdef HAVE_PAM
- { "PAM", pam_lock_init, 0, pam_passwd_valid_p,
+ { "PAM", 0, pam_priv_init, pam_passwd_valid_p,
False, False },
# endif
{ "normal", pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p,
if (!methods[i].priv_initted_p) /* Bail if lock_priv_init failed. */
continue;
- methods[i].initted_p = methods[i].init (argc, argv, verbose_p);
+ if (!methods[i].init)
+ methods[i].initted_p = True;
+ else
+ methods[i].initted_p = methods[i].init (argc, argv, verbose_p);
+
if (methods[i].initted_p)
any_ok = True;
else if (verbose_p)
an earlier authentication method fails and a later one succeeds,
something screwy is probably going on.)
*/
- if (verbose_p)
+ if (verbose_p && i > 0)
{
for (j = 0; j < i; j++)
if (methods[j].initted_p)
p->fade_p = False;
if (! p->fade_p) p->unfade_p = False;
- if (p->verbose_p && !p->fading_possible_p && (p->fade_p || p->unfade_p))
- {
- fprintf (stderr, "%s: there are no PseudoColor or GrayScale visuals.\n",
- blurb());
- fprintf (stderr, "%s: ignoring the request for fading/unfading.\n",
- blurb());
- }
-
- p->watchdog_timeout = p->cycle;
+ p->watchdog_timeout = p->cycle * 0.6;
if (p->watchdog_timeout < 30000) p->watchdog_timeout = 30000; /* 30 secs */
if (p->watchdog_timeout > 3600000) p->watchdog_timeout = 3600000; /* 1 hr */
Bool unfade_p; /* whether to fade from black, if possible */
int fade_seconds; /* how long that should take */
int fade_ticks; /* how many ticks should be used */
- Bool fading_possible_p; /* Whether fading to/from black is possible.
- (This isn't strictly a preference, as it
- can only be known by querying the display;
- the caller of the prefs code may fill this
- in if it knows/cares, and warnings will be
- issued.) */
Bool install_cmap_p; /* whether we should use our own colormap
when using the screen's default visual. */
# include "config.h"
#endif
-#ifndef NO_SETUID /* whole file */
-
#include <X11/Xlib.h> /* not used for much... */
/* This file doesn't need the Xt headers, so stub these types out... */
#include <pwd.h> /* for getpwnam() and struct passwd */
#include <grp.h> /* for getgrgid() and struct group */
-
static const char *
uid_gid_string (uid_t uid, gid_t gid)
{
}
}
}
-
-#else /* !NO_SETUID */
-
-void hack_uid (saver_info *si) { }
-void describe_uids (saver_info *si, FILE *out) { }
-
-#endif /* NO_SETUID */
attrs.event_mask = (ExposureMask | ButtonPressMask | ButtonReleaseMask);
{
- Dimension w = WidthOfScreen(screen);
- Dimension h = HeightOfScreen(screen);
+ int sx, sy, w, h;
+ get_screen_viewport (si->default_screen, &sx, &sy, &w, &h, False);
if (si->prefs.debug_p) w /= 2;
- x = ((w + sp->width) / 2) - sp->width;
- y = ((h + sp->height) / 2) - sp->height;
- if (x < 0) x = 0;
- if (y < 0) y = 0;
+ x = sx + (((w + sp->width) / 2) - sp->width);
+ y = sy + (((h + sp->height) / 2) - sp->height);
+ if (x < sx) x = sx;
+ if (y < sy) y = sy;
}
bw = get_integer_resource ("splash.borderWidth", "Dialog.BorderWidth");
ssi->stderr_text_y = 0;
#else
int offset = ssi->stderr_line_height * 5;
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (dpy, window, &xgwa);
+
XCopyArea (dpy, window, window, ssi->stderr_gc,
0, v_border + offset,
- WidthOfScreen (screen),
- (HeightOfScreen (screen) - v_border - v_border
- - offset),
+ xgwa.width,
+ (xgwa.height - v_border - v_border - offset),
0, v_border);
XClearArea (dpy, window,
- 0, HeightOfScreen (screen) - v_border - offset,
- WidthOfScreen (screen), offset, False);
+ 0, xgwa.height - v_border - offset,
+ xgwa.width, offset, False);
ssi->stderr_text_y -= offset;
#endif
}
{
int depth = visual_depth (ssi->screen, visual);
XSetWindowAttributes attrs;
+ XWindowAttributes xgwa;
unsigned long attrmask;
+ XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
if (si->prefs.debug_p)
fprintf(real_stderr,
ssi->stderr_overlay_window =
XCreateWindow(si->dpy, ssi->screensaver_window, 0, 0,
- WidthOfScreen(ssi->screen), HeightOfScreen(ssi->screen),
+ xgwa.width, xgwa.height,
0, depth, InputOutput, visual, attrmask, &attrs);
XMapRaised(si->dpy, ssi->stderr_overlay_window);
}
Bool hairy_p = !!strpbrk (command, "*?$&!<>[];`'\\\"=");
/* note: = is in the above because of the sh syntax "FOO=bar cmd". */
+ if (getuid() == (uid_t) 0 || geteuid() == (uid_t) 0)
+ {
+ /* If you're thinking of commenting this out, think again.
+ If you do so, you will open a security hole. Mail jwz
+ so that he may enlighten you as to the error of your ways.
+ */
+ fprintf (stderr, "%s: we're still running as root! Disaster!\n",
+ blurb());
+ saver_exit (si, 1, 0);
+ }
+
if (p->verbose_p)
fprintf (stderr, "%s: spawning \"%s\" in pid %lu%s.\n",
blurb(), command, (unsigned long) getpid (),
#include <stdio.h>
#include <ctype.h>
+#include <pwd.h>
+
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Intrinsic.h>
Bool monitor_powered_on_p (saver_info *si) { return True; }
void initialize_screensaver_window (saver_info *si) {}
void raise_window (saver_info *si, Bool i, Bool b, Bool d) {}
-void blank_screen (saver_info *si) {}
+Bool blank_screen (saver_info *si) {return False;}
void unblank_screen (saver_info *si) {}
Bool select_visual (saver_screen_info *ssi, const char *v) { return False; }
Bool window_exists_p (Display *dpy, Window window) {return True;}
-void start_notice_events_timer (saver_info *si, Window w, Bool) {}
+void start_notice_events_timer (saver_info *si, Window w, Bool b) {}
Bool handle_clientmessage (saver_info *si, XEvent *e, Bool u) { return False; }
int BadWindow_ehandler (Display *dpy, XErrorEvent *error) { exit(1); }
const char *signal_name(int signal) { return "???"; }
const char *blurb(void) { return progname; }
Atom XA_SCREENSAVER, XA_DEMO, XA_PREFS;
+void
+get_screen_viewport (saver_screen_info *ssi,
+ int *x_ret, int *y_ret,
+ int *w_ret, int *h_ret,
+ Bool verbose_p)
+{
+ *x_ret = 0;
+ *y_ret = 0;
+ *w_ret = WidthOfScreen (ssi->screen);
+ *h_ret = HeightOfScreen (ssi->screen);
+}
+
void
idle_timer (XtPointer closure, XtIntervalId *id)
int
main (int argc, char **argv)
{
- Widget toplevel_shell;
+ Widget toplevel_shell = 0;
saver_screen_info ssip;
saver_info sip;
saver_info *si = &sip;
si->version = (char *) malloc (5);
memcpy (si->version, screensaver_id + 17, 4);
progname = argv[0];
-
-# ifdef SCO
- set_auth_parameters(argc, argv);
-# endif /* SCO */
+ {
+ char *s = strrchr(progname, '/');
+ if (*s) strcpy (progname, s+1);
+ }
/* before hack_uid() for proper permissions */
- if (! lock_init (argc, argv, True))
+ lock_priv_init (argc, argv, True);
+
+ hack_uid (si);
+
+ if (! lock_init (argc, argv, si->prefs.verbose_p))
{
si->locking_disabled_p = True;
si->nolock_reason = "error getting password";
}
- hack_uid (si);
-
progclass = "XScreenSaver";
+#if (WHICH != 2)
toplevel_shell = XtAppInitialize (&si->app, progclass, 0, 0,
&argc, argv, fallback,
0, 0);
load_init_file (&si->prefs);
+#endif /* (WHICH != 2) */
+
+ p->verbose_p = True;
+
while (1)
{
#if WHICH == 0
XSync (si->dpy, False);
sleep (1);
}
+#elif WHICH == 2
+ {
+ char *pass;
+ char buf[255];
+ struct passwd *p = getpwuid (getuid ());
+ printf ("\n%s: %s's password: ", progname, p->pw_name);
+
+ pass = fgets (buf, sizeof(buf)-1, stdin);
+ if (!pass || !*pass)
+ exit (0);
+ if (pass[strlen(pass)-1] == '\n')
+ pass[strlen(pass)-1] = 0;
+
+ if (passwd_valid_p (pass, True))
+ printf ("%s: Ok!\n", progname);
+ else
+ printf ("%s: Wrong!\n", progname);
+ }
#endif
}
}
static Bool proc_interrupts_activity_p (saver_info *si);
#endif /* HAVE_PROC_INTERRUPTS */
+static void check_for_clock_skew (saver_info *si);
+
void
idle_timer (XtPointer closure, XtIntervalId *id)
saver_info *si = (saver_info *) closure;
saver_preferences *p = &si->prefs;
Time how_long = p->cycle;
+
+ if (si->selection_mode > 0 &&
+ screenhack_running_p (si))
+ /* If we're in "SELECT n" mode, the cycle timer going off will just
+ restart this same hack again. There's not much point in doing this
+ every 5 or 10 minutes, but on the other hand, leaving one hack running
+ for days is probably not a great idea, since they tend to leak and/or
+ crash. So, restart the thing once an hour. */
+ how_long = 1000 * 60 * 60;
+
if (si->dbox_up_p)
{
if (p->verbose_p)
if (p->verbose_p)
fprintf (stderr, "%s: changing graphics hacks.\n", blurb());
kill_screenhack (si);
- spawn_screenhack (si, False);
+
+ if (!si->throttled_p)
+ spawn_screenhack (si, False);
+ else
+ {
+ raise_window (si, True, True, False);
+ if (p->verbose_p)
+ fprintf (stderr, "%s: not launching new hack (throttled.)\n",
+ blurb());
+ }
}
+
si->cycle_id = XtAppAddTimeOut (si->app, how_long, cycle_timer,
(XtPointer) si);
saver_preferences *p = &si->prefs;
if (p->verbose_p)
- fprintf (stderr, "%s: timed out; activating lock\n", blurb());
+ fprintf (stderr, "%s: timed out; activating lock.\n", blurb());
si->locked_p = True;
#ifdef HAVE_XHPDISABLERESET
}
#endif /* HAVE_PROC_INTERRUPTS */
+
if (active_p)
reset_timers (si);
+
+ check_for_clock_skew (si);
+}
+
+
+/* An unfortunate situation is this: the saver is not active, because the
+ user has been typing. The machine is a laptop. The user closes the lid
+ and suspends it. The CPU halts. Some hours later, the user opens the
+ lid. At this point, Xt's timers will fire, and xscreensaver will blank
+ the screen.
+
+ So far so good -- well, not really, but it's the best that we can do,
+ since the OS doesn't send us a signal *before* shutdown -- but if the
+ user had delayed locking (lockTimeout > 0) then we should start off
+ in the locked state, rather than only locking N minutes from when the
+ lid was opened. Also, eschewing fading is probably a good idea, to
+ clamp down as soon as possible.
+
+ We only do this when we'd be polling the mouse position anyway.
+ This amounts to an assumption that machines with APM support also
+ have /proc/interrupts.
+ */
+static void
+check_for_clock_skew (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ time_t now = time ((time_t *) 0);
+ long shift = now - si->last_wall_clock_time;
+
+#ifdef DEBUG_TIMERS
+ if (p->verbose_p)
+ fprintf (stderr, "%s: checking wall clock (%d).\n", blurb(),
+ (si->last_wall_clock_time == 0 ? 0 : shift));
+#endif /* DEBUG_TIMERS */
+
+ if (si->last_wall_clock_time != 0 &&
+ shift > (p->timeout / 1000))
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: wall clock has jumped by %d:%02d:%02d!\n",
+ blurb(),
+ (shift / (60 * 60)), ((shift / 60) % 60), (shift % 60));
+
+ si->emergency_lock_p = True;
+ idle_timer ((XtPointer) si, 0);
+ }
+
+ si->last_wall_clock_time = now;
}
+
static void
dispatch_event (saver_info *si, XEvent *event)
{
/* Look, we've been idle long enough. We're done. */
goto DONE;
}
+ else if (si->emergency_lock_p)
+ {
+ /* Oops, the wall clock has jumped far into the future, so
+ we need to lock down in a hurry! */
+ goto DONE;
+ }
else
{
/* The event went off, but it turns out that the user has not
Thanks to Nat Friedman <nat@nat.org> for figuring out all of this crap.
- Note that this only checks for lines with "keyboard" in them. Perhaps we
- should also be checking for lines with "PS/2 Mouse" in them. But that
- would obviously fail to work for regular serial mice, and obviously just
- using COM1 would be bad news (turn off the screensaver because the modem
- is active, yum.)
+ Note that this only checks for lines with "keyboard" or "PS/2 Mouse" in
+ them. If you have a serial mouse, it won't detect that, it will only detect
+ keyboard activity. That's because there's no way to tell the difference
+ between a serial mouse and a general serial port, and it would be somewhat
+ unfortunate to have the screensaver turn off when the modem on COM1 burped.
*/
static FILE *f0 = 0;
FILE *f1 = 0;
int fd;
- static char last_line[255] = { 0, };
- char new_line[sizeof(last_line)];
+ static char last_kbd_line[255] = { 0, };
+ static char last_ptr_line[255] = { 0, };
+ char new_line[sizeof(last_kbd_line)];
+ Bool got_kbd = False, kbd_diff = False;
+ Bool got_ptr = False, ptr_diff = False;
if (!f0)
{
/* Now read through the pseudo-file until we find the "keyboard" line. */
while (fgets (new_line, sizeof(new_line)-1, f1))
- if (strstr (new_line, "keyboard"))
- {
- Bool diff = (*last_line &&
- !!strcmp (new_line, last_line));
- strcpy (last_line, new_line); /* save this line for next time */
- fclose (f1);
- return diff;
- }
+ {
+ if (!got_kbd && strstr (new_line, "keyboard"))
+ {
+ kbd_diff = (*last_kbd_line && !!strcmp (new_line, last_kbd_line));
+ strcpy (last_kbd_line, new_line);
+ got_kbd = True;
+ }
+ else if (!got_ptr && strstr (new_line, "PS/2 Mouse"))
+ {
+ ptr_diff = (*last_ptr_line && !!strcmp (new_line, last_ptr_line));
+ strcpy (last_ptr_line, new_line);
+ got_ptr = True;
+ }
+
+ if (got_kbd && got_ptr)
+ break;
+ }
+
+ if (got_kbd || got_ptr)
+ {
+ fclose (f1);
+ return (kbd_diff || ptr_diff);
+ }
- /* If we got here, we didn't find a "keyboard" line in the file at all. */
- fprintf (stderr, "%s: no keyboard data in %s?\n", blurb(), PROC_INTERRUPTS);
+
+ /* If we got here, we didn't find either a "keyboard" or a "PS/2 Mouse"
+ line in the file at all. */
+ fprintf (stderr, "%s: no keyboard or mouse data in %s?\n",
+ blurb(), PROC_INTERRUPTS);
FAIL:
if (f1)
if (si->screen_blanked_p)
{
- Bool running_p = screenhack_running_p(si);
+ Bool running_p = screenhack_running_p (si);
+ if (si->dbox_up_p)
+ {
#ifdef DEBUG_TIMERS
- if (si->prefs.verbose_p)
- fprintf (stderr, "%s: watchdog timer raising %sscreen.\n",
- blurb(), (running_p ? "" : "and clearing "));
+ if (si->prefs.verbose_p)
+ fprintf (stderr, "%s: dialog box is up: not raising screen.\n",
+ blurb());
+#endif /* DEBUG_TIMERS */
+ }
+ else
+ {
+#ifdef DEBUG_TIMERS
+ if (si->prefs.verbose_p)
+ fprintf (stderr, "%s: watchdog timer raising %sscreen.\n",
+ blurb(), (running_p ? "" : "and clearing "));
#endif /* DEBUG_TIMERS */
- raise_window (si, True, True, running_p);
+ raise_window (si, True, True, running_p);
+ }
if (!monitor_powered_on_p (si))
{
"killing running hacks.\n", blurb());
kill_screenhack (si);
}
+
+ /* Re-schedule this timer. The watchdog timer defaults to a bit less
+ than the hack cycle period, but is never longer than one hour.
+ */
+ si->watchdog_id = 0;
+ reset_watchdog_timer (si, True);
}
}
# include <X11/extensions/scrnsaver.h>
#endif /* HAVE_MIT_SAVER_EXTENSION */
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+#endif /* HAVE_XF86VMODE */
#ifdef HAVE_XHPDISABLERESET
# include <X11/XHPlib.h>
{
saver_preferences *p = &si->prefs;
int status = XGrabPointer (si->dpy, w, True, ALL_POINTER_EVENTS,
- GrabModeAsync, GrabModeAsync, None,
+ GrabModeAsync, GrabModeAsync, w,
cursor, CurrentTime);
if (status == GrabSuccess)
si->mouse_grab_window = w;
}
+int
+move_mouse_grab (saver_info *si, Window to, Cursor cursor)
+{
+ Window old = si->mouse_grab_window;
+
+ if (old == 0)
+ return grab_mouse (si, to, cursor);
+ else
+ {
+ saver_preferences *p = &si->prefs;
+ int status;
+
+ XSync (si->dpy, False);
+ XGrabServer (si->dpy); /* ############ DANGER! */
+ XSync (si->dpy, False);
+
+ if (p->verbose_p)
+ fprintf(stderr, "%s: grabbing server...\n", blurb());
+
+ ungrab_mouse (si);
+ status = grab_mouse (si, to, cursor);
+
+ if (status != GrabSuccess) /* Augh! */
+ {
+ sleep (1); /* Note dramatic evil of sleeping
+ with server grabbed. */
+ XSync (si->dpy, False);
+ status = grab_mouse (si, to, cursor);
+ }
+
+ if (status != GrabSuccess) /* Augh! Try to get the old one back... */
+ grab_mouse (si, to, cursor);
+
+ XUngrabServer (si->dpy);
+ XSync (si->dpy, False); /* ###### (danger over) */
+
+ if (p->verbose_p)
+ fprintf(stderr, "%s: ungrabbing server.\n", blurb());
+
+ return status;
+ }
+}
+
+
/* Prints an error message to stderr and returns True if there is another
xscreensaver running already. Silently returns False otherwise. */
Bool
}
+/* Returns the area of the screen which the xscreensaver window should cover.
+ Normally this is the whole screen, but if the X server's root window is
+ actually larger than the monitor's displayable area, then we want to
+ operate in the currently-visible portion of the desktop instead.
+ */
+void
+get_screen_viewport (saver_screen_info *ssi,
+ int *x_ret, int *y_ret,
+ int *w_ret, int *h_ret,
+ Bool verbose_p)
+{
+ int w = WidthOfScreen (ssi->screen);
+ int h = HeightOfScreen (ssi->screen);
+
+#ifdef HAVE_XF86VMODE
+ saver_info *si = ssi->global;
+ int screen_no = screen_number (ssi->screen);
+ int event, error;
+ int dot;
+ XF86VidModeModeLine ml;
+ int x, y;
+
+ if (XF86VidModeQueryExtension (si->dpy, &event, &error) &&
+ XF86VidModeGetModeLine (si->dpy, screen_no, &dot, &ml) &&
+ XF86VidModeGetViewPort (si->dpy, screen_no, &x, &y))
+ {
+ char msg[512];
+ *x_ret = x;
+ *y_ret = y;
+ *w_ret = ml.hdisplay;
+ *h_ret = ml.vdisplay;
+
+ if (*x_ret == 0 && *y_ret == 0 && *w_ret == w && *h_ret == h)
+ /* There is no viewport -- the screen does not scroll. */
+ return;
+
+ sprintf (msg, "%s: vp is %dx%d+%d+%d",
+ blurb(), *w_ret, *h_ret, *x_ret, *y_ret);
+
+
+ /* Apparently, though the server stores the X position in increments of
+ 1 pixel, it will only make changes to the *display* in some other
+ increment. With XF86_SVGA on a Thinkpad, the display only updates
+ in multiples of 8 pixels when in 8-bit mode, and in multiples of 4
+ pixels in 16-bit mode. I don't know what it does in 24- and 32-bit
+ mode, because I don't have enough video memory to find out.
+
+ I consider it a bug that XF86VidModeGetViewPort() is telling me the
+ server's *target* scroll position rather than the server's *actual*
+ scroll position. David Dawes agrees, and says they may fix this in
+ XFree86 4.0, but it's notrivial.
+
+ He also confirms that this behavior is server-dependent, so the
+ actual scroll position cannot be reliably determined by the client.
+ So... that means the only solution is to provide a ``sandbox''
+ around the blackout window -- we make the window be up to N pixels
+ larger than the viewport on both the left and right sides. That
+ means some part of the outer edges of each hack might not be
+ visible, but screw it.
+
+ I'm going to guess that 16 pixels is enough, and that the Y dimension
+ doesn't have this problem.
+
+ The drawback of doing this, of course, is that some of the screenhacks
+ will still look pretty stupid -- for example, "slidescreen" will cut
+ off the left and right edges of the grid, etc.
+ */
+# define FUDGE 16
+ if (x > 0 && x < w - ml.hdisplay) /* not at left edge or right edge */
+ {
+ /* Round X position down to next lower multiple of FUDGE.
+ Increase width by 2*FUDGE in case some server rounds up.
+ */
+ *x_ret = ((x - 1) / FUDGE) * FUDGE;
+ *w_ret += (FUDGE * 2);
+ }
+# undef FUDGE
+
+ if (*x_ret != x ||
+ *y_ret != y ||
+ *w_ret != ml.hdisplay ||
+ *h_ret != ml.vdisplay)
+ sprintf (msg + strlen(msg), "; fudged to %dx%d+%d+%d",
+ *w_ret, *h_ret, *x_ret, *y_ret);
+
+ if (verbose_p)
+ fprintf (stderr, "%s.\n", msg);
+
+ return;
+ }
+
+#endif /* HAVE_XF86VMODE */
+
+ *x_ret = 0;
+ *y_ret = 0;
+ *w_ret = w;
+ *h_ret = h;
+}
+
+
static void
initialize_screensaver_window_1 (saver_screen_info *ssi)
{
XColor black;
XSetWindowAttributes attrs;
unsigned long attrmask;
- int width = WidthOfScreen (ssi->screen);
- int height = HeightOfScreen (ssi->screen);
+ int x, y, width, height;
static Bool printed_visual_info = False; /* only print the message once. */
+ get_screen_viewport (si->default_screen, &x, &y, &width, &height,
+ (p->verbose_p && !si->screen_blanked_p));
+
black.red = black.green = black.blue = 0;
if (ssi->cmap == DefaultColormapOfScreen (ssi->screen))
{
XWindowChanges changes;
unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth;
- changes.x = 0;
- changes.y = 0;
+ changes.x = x;
+ changes.y = y;
changes.width = width;
changes.height = height;
changes.border_width = 0;
else
{
ssi->screensaver_window =
- XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen), 0, 0,
- width, height, 0, ssi->current_depth, InputOutput,
+ XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen),
+ x, y, width, height,
+ 0, ssi->current_depth, InputOutput,
ssi->current_visual, attrmask, &attrs);
+
reset_stderr (ssi);
store_activate_time(si, True);
if (p->verbose_p)
if (si->demoing_p)
inhibit_fade = True;
- initialize_screensaver_window (si);
+ if (si->emergency_lock_p)
+ inhibit_fade = True;
+
+ if (!dont_clear)
+ initialize_screensaver_window (si);
+
reset_watchdog_timer (si, True);
- if (p->fade_p && p->fading_possible_p && !inhibit_fade)
+ if (p->fade_p && si->fading_possible_p && !inhibit_fade)
{
Window *current_windows = (Window *)
calloc(sizeof(Window), si->nscreens);
store_vroot_property (si->dpy,
ssi->screensaver_window,
ssi->screensaver_window);
+
+#ifdef HAVE_XF86VMODE
+ {
+ int ev, er;
+ if (!XF86VidModeQueryExtension (si->dpy, &ev, &er) ||
+ !XF86VidModeGetViewPort (si->dpy, i,
+ &ssi->blank_vp_x,
+ &ssi->blank_vp_y))
+ ssi->blank_vp_x = ssi->blank_vp_y = -1;
+ }
+#endif /* HAVE_XF86VMODE */
}
store_activate_time (si, si->screen_blanked_p);
raise_window (si, False, False, False);
#endif
si->screen_blanked_p = True;
+ si->last_wall_clock_time = 0;
return True;
}
unblank_screen (saver_info *si)
{
saver_preferences *p = &si->prefs;
- Bool unfade_p = (p->fading_possible_p && p->unfade_p);
+ Bool unfade_p = (si->fading_possible_p && p->unfade_p);
int i;
monitor_power_on (si);
XUnmapWindow (si->dpy, si->screens[i].screensaver_window);
si->screen_blanked_p = False;
+ si->last_wall_clock_time = 0;
}
saver_preferences *p = &si->prefs;
Bool install_cmap_p = p->install_cmap_p;
Bool was_installed_p = (ssi->cmap != DefaultColormapOfScreen(ssi->screen));
- Visual *new_v;
+ Visual *new_v = 0;
Bool got_it;
if (visual_name && *visual_name)
visual_name = "default";
install_cmap_p = False;
}
- new_v = get_visual (ssi->screen, visual_name, True, False);
+#ifdef DAEMON_USE_GL
+ else if (!strcmp(visual_name, "gl") ||
+ !strcmp(visual_name, "GL"))
+ {
+ new_v = get_gl_visual (ssi->screen);
+ if (!new_v && p->verbose_p)
+ fprintf (stderr, "%s: no GL visuals.\n", progname);
+ }
+#endif /* DAEMON_USE_GL */
+
+ if (!new_v)
+ new_v = get_visual (ssi->screen, visual_name, True, False);
}
else
{
Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE;
Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_TIME, XA_SELECT, XA_DEMO;
static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV, XA_EXIT;
-static Atom XA_RESTART, XA_PREFS, XA_LOCK;
+static Atom XA_RESTART, XA_PREFS, XA_LOCK, XA_THROTTLE, XA_UNTHROTTLE;
static char *screensaver_version;
static char *usage = "\n\
\n\
-lock Tells the running xscreensaver process to lock the screen\n\
immediately. This is like -activate, but forces locking as\n\
- well, even if locking is not the default.\n\
+ well, even if locking is not the default. If the saver is\n\
+ already active, this causes it to be locked as well.\n\
+\n\
+ -throttle Temporarily switch to ``blank screen'' mode, and don't run\n\
+ any display modes at all, until the screensaver is next\n\
+ de-activated. This is useful if you're using a machine\n\
+ remotely, and you find that some display modes are using too\n\
+ much CPU.\n\
+\n\
+ -unthrottle Turn `-throttle' off and resume normal behavior.\n\
\n\
-version Prints the version of xscreensaver that is currently running\n\
on the display -- that is, the actual version number of the\n\
else if (!strncmp (s, "-preferences",L)) cmd = &XA_PREFS;
else if (!strncmp (s, "-prefs",L)) cmd = &XA_PREFS;
else if (!strncmp (s, "-lock", L)) cmd = &XA_LOCK;
+ else if (!strncmp (s, "-throttle", L)) cmd = &XA_THROTTLE;
+ else if (!strncmp (s, "-unthrottle", L)) cmd = &XA_UNTHROTTLE;
else if (!strncmp (s, "-version", L)) cmd = &XA_SCREENSAVER_VERSION;
else if (!strncmp (s, "-time", L)) cmd = &XA_SCREENSAVER_TIME;
else USAGE ();
XA_DEMO = XInternAtom (dpy, "DEMO", False);
XA_PREFS = XInternAtom (dpy, "PREFS", False);
XA_LOCK = XInternAtom (dpy, "LOCK", False);
+ XA_THROTTLE = XInternAtom (dpy, "THROTTLE", False);
+ XA_UNTHROTTLE = XInternAtom (dpy, "UNTHROTTLE", False);
XSync (dpy, 0);
.if n .sp 1
.if t .sp .5
..
-.TH XScreenSaver 1 "27-Apr-99 (3.10)" "X Version 11"
+.TH XScreenSaver 1 "10-May-99 (3.12)" "X Version 11"
.SH NAME
xscreensaver-command - control a running xscreensaver process
.SH SYNOPSIS
[\-exit] \
[\-restart] \
[\-lock] \
+[\-throttle] \
+[\-unthrottle] \
[\-version] \
[\-time]
.SH DESCRIPTION
.BR xscreensaver (1)
for details.
.TP 8
+.B \-throttle
+Temporarily switch to ``blank screen'' mode, and don't run any display modes
+at all, until the screensaver is next de-activated. This is useful if you're
+using a machine remotely, and you find that some display modes are using too
+much CPU.
+
+(If you want to do this \fIpermanently\fP, that is, you want the screen saver
+to only blank the screen and not run demos at all, then set the \fIprograms\fP
+resource to an empty list: See
+.BR xscreensaver (1)
+for details.)
+.TP 8
+.B \-unthrottle
+Turn `-throttle' mode off and resume normal behavior.
+.TP 8
.B \-version
Prints the version of xscreensaver that is currently running on the display:
that is, the actual version number of the running xscreensaver background
.if n .sp 1
.if t .sp .5
..
-.TH XScreenSaver 1 "27-Apr-99 (3.10)" "X Version 11"
+.TH XScreenSaver 1 "10-May-99 (3.12)" "X Version 11"
.SH NAME
xscreensaver-demo - interactively control the background xscreensaver daemon
.SH SYNOPSIS
static Atom XA_SCREENSAVER_RESPONSE;
static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV;
static Atom XA_EXIT, XA_RESTART, XA_LOCK, XA_SELECT;
+static Atom XA_THROTTLE, XA_UNTHROTTLE;
Atom XA_DEMO, XA_PREFS;
\f
lock_priv_init (*argc, argv, si->prefs.verbose_p);
#endif /* NO_LOCKING */
-#ifndef NO_SETUID
hack_uid (si);
-#endif /* NO_SETUID */
}
}
#endif /* NO_LOCKING */
-#ifndef NO_SETUID
hack_uid (si);
-#endif /* NO_SETUID */
}
XA_DEMO = XInternAtom (si->dpy, "DEMO", False);
XA_PREFS = XInternAtom (si->dpy, "PREFS", False);
XA_LOCK = XInternAtom (si->dpy, "LOCK", False);
+ XA_THROTTLE = XInternAtom (si->dpy, "THROTTLE", False);
+ XA_UNTHROTTLE = XInternAtom (si->dpy, "UNTHROTTLE", False);
return toplevel_shell;
}
}
}
- si->prefs.fading_possible_p = found_any_writable_cells;
+ si->fading_possible_p = found_any_writable_cells;
}
while (1)
{
+ Bool was_locked = False;
sleep_until_idle (si, True);
if (p->verbose_p)
}
kill_screenhack (si);
- spawn_screenhack (si, True);
+
+ if (!si->throttled_p)
+ spawn_screenhack (si, True);
+ else if (p->verbose_p)
+ fprintf (stderr, "%s: not launching hack (throttled.)\n", blurb());
/* Don't start the cycle timer in demo mode. */
if (!si->demoing_p && p->cycle)
- si->cycle_id = XtAppAddTimeOut (si->app, p->cycle, cycle_timer,
+ si->cycle_id = XtAppAddTimeOut (si->app,
+ (si->selection_mode
+ /* see comment in cycle_timer() */
+ ? 1000 * 60 * 60
+ : p->cycle),
+ cycle_timer,
(XtPointer) si);
#ifndef NO_LOCKING
- if (!si->demoing_p && /* if not going into demo mode */
- p->lock_p && /* and locking is enabled */
- !si->locking_disabled_p && /* and locking is possible */
- p->lock_timeout == 0) /* and locking is not timer-deferred */
- si->locked_p = True; /* then lock right now. */
-
- /* locked_p might be true already because of the above, or because of
- the LOCK ClientMessage. But if not, and if we're supposed to lock
- after some time, set up a timer to do so.
- */
- if (p->lock_p &&
- !si->locked_p &&
- p->lock_timeout > 0)
- si->lock_id = XtAppAddTimeOut (si->app, p->lock_timeout,
- activate_lock_timer,
- (XtPointer) si);
+ {
+ Time lock_timeout = p->lock_timeout;
+
+ if (si->emergency_lock_p && p->lock_p && lock_timeout)
+ {
+ int secs = p->lock_timeout / 1000;
+ if (p->verbose_p)
+ fprintf (stderr,
+ "%s: locking now, instead of waiting for %d:%02d:%02d.\n",
+ blurb(),
+ (secs / (60 * 60)), ((secs / 60) % 60), (secs % 60));
+ lock_timeout = 0;
+ }
+
+ si->emergency_lock_p = False;
+
+ if (!si->demoing_p && /* if not going into demo mode */
+ p->lock_p && /* and locking is enabled */
+ !si->locking_disabled_p && /* and locking is possible */
+ lock_timeout == 0) /* and locking is not timer-deferred */
+ si->locked_p = True; /* then lock right now. */
+
+ /* locked_p might be true already because of the above, or because of
+ the LOCK ClientMessage. But if not, and if we're supposed to lock
+ after some time, set up a timer to do so.
+ */
+ if (p->lock_p &&
+ !si->locked_p &&
+ lock_timeout > 0)
+ si->lock_id = XtAppAddTimeOut (si->app, lock_timeout,
+ activate_lock_timer,
+ (XtPointer) si);
+ }
#endif /* !NO_LOCKING */
saver_screen_info *ssi = si->default_screen;
if (si->locking_disabled_p) abort ();
+ was_locked = True;
si->dbox_up_p = True;
suspend_screenhack (si, True);
XUndefineCursor (si->dpy, ssi->screensaver_window);
unblank_screen (si);
si->locked_p = False;
+ si->emergency_lock_p = False;
si->demoing_p = 0;
si->selection_mode = 0;
+ /* If we're throttled, and the user has explicitly unlocked the screen,
+ then unthrottle. If we weren't locked, then don't unthrottle
+ automatically, because someone might have just bumped the desk... */
+ if (was_locked)
+ {
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+ }
+
if (si->cycle_id)
{
XtRemoveTimeOut (si->cycle_id);
process_command_line (si, &argc, argv);
print_banner (si);
- initialize_per_screen_info (si, shell); /* also sets p->fading_possible_p */
+ load_init_file (p); /* must be before initialize_per_screen_info() */
+ initialize_per_screen_info (si, shell); /* also sets si->fading_possible_p */
+
+ /* We can only issue this warnings now. */
+ if (p->verbose_p && !si->fading_possible_p && (p->fade_p || p->unfade_p))
+ fprintf (stderr,
+ "%s: there are no PseudoColor or GrayScale visuals.\n"
+ "%s: ignoring the request for fading/unfading.\n",
+ blurb(), blurb());
for (i = 0; i < si->nscreens; i++)
if (ensure_no_screensaver_running (si->dpy, si->screens[i].screen))
exit (1);
- load_init_file (p);
lock_initialization (si, &argc, argv);
if (p->xsync_p) XSynchronize (si->dpy, True);
Bool
handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
{
+ saver_preferences *p = &si->prefs;
Atom type = 0;
Window window = event->xclient.window;
"activating.");
si->selection_mode = 0;
si->demoing_p = False;
+
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
{
XForceScreenSaver (si->dpy, ScreenSaverActive);
{
if (! until_idle_p)
{
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
clientmessage_response(si, window, False,
"DEACTIVATE ClientMessage received.",
"deactivating.");
"cycling.");
si->selection_mode = 0; /* 0 means randomize when its time. */
si->demoing_p = False;
+
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
if (si->cycle_id)
XtRemoveTimeOut (si->cycle_id);
si->cycle_id = 0;
si->selection_mode = (type == XA_NEXT ? -1 : -2);
si->demoing_p = False;
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
if (! until_idle_p)
{
if (si->cycle_id)
si->selection_mode = which;
si->demoing_p = False;
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
if (! until_idle_p)
{
if (si->cycle_id)
XSync (si->dpy, False);
}
+ fflush (stdout);
+ fflush (stderr);
+ if (real_stdout) fflush (real_stdout);
+ if (real_stderr) fflush (real_stderr);
/* make sure error message shows up before exit. */
if (real_stderr && stderr != real_stderr)
dup2 (fileno(real_stderr), fileno(stderr));
si->selection_mode = which;
si->demoing_p = True;
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
return True;
}
}
#endif /* !NO_LOCKING */
}
+ else if (type == XA_THROTTLE)
+ {
+ if (si->throttled_p)
+ clientmessage_response (si, window, True,
+ "THROTTLE ClientMessage received, but "
+ "already throttled.",
+ "already throttled.");
+ else
+ {
+ char buf [255];
+ char *response = "throttled.";
+ si->throttled_p = True;
+ si->selection_mode = 0;
+ si->demoing_p = False;
+ sprintf (buf, "THROTTLE ClientMessage received; %s", response);
+ clientmessage_response (si, window, False, buf, response);
+
+ if (! until_idle_p)
+ {
+ if (si->cycle_id)
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ cycle_timer ((XtPointer) si, 0);
+ }
+ }
+ }
+ else if (type == XA_UNTHROTTLE)
+ {
+ if (! si->throttled_p)
+ clientmessage_response (si, window, True,
+ "UNTHROTTLE ClientMessage received, but "
+ "not throttled.",
+ "not throttled.");
+ else
+ {
+ char buf [255];
+ char *response = "unthrottled.";
+ si->throttled_p = False;
+ si->selection_mode = 0;
+ si->demoing_p = False;
+ sprintf (buf, "UNTHROTTLE ClientMessage received; %s", response);
+ clientmessage_response (si, window, False, buf, response);
+
+ if (! until_idle_p)
+ {
+ if (si->cycle_id)
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ cycle_timer ((XtPointer) si, 0);
+ }
+ }
+ }
else
{
char buf [1024];
{
int i, j;
static const char *exts[][2] = {
- { "SCREEN_SAVER", "SGI Screen-Saver" },
- { "SCREEN-SAVER", "SGI Screen-Saver" },
- { "MIT-SCREEN-SAVER", "MIT Screen-Saver" },
- { "XIDLE", "XIdle" },
- { "SGI-VIDEO-CONTROL", "SGI Video-Control" },
- { "READDISPLAY", "SGI Read-Display" },
- { "MIT-SHM", "Shared Memory" },
- { "DOUBLE-BUFFER", "Double-Buffering" },
- { "DPMS", "Power Management" },
- { "GLX", "GLX" }
+ { "SCREEN_SAVER", "SGI Screen-Saver" },
+ { "SCREEN-SAVER", "SGI Screen-Saver" },
+ { "MIT-SCREEN-SAVER", "MIT Screen-Saver" },
+ { "XIDLE", "XIdle" },
+ { "SGI-VIDEO-CONTROL", "SGI Video-Control" },
+ { "READDISPLAY", "SGI Read-Display" },
+ { "MIT-SHM", "Shared Memory" },
+ { "DOUBLE-BUFFER", "Double-Buffering" },
+ { "DPMS", "Power Management" },
+ { "GLX", "GLX" },
+ { "XFree86-VidModeExtension", "XF86 Video-Mode" }
};
fprintf (stderr, "%s: running on display \"%s\"\n", blurb(),
Bool screen_blanked_p; /* Whether the saver is currently active. */
Window mouse_grab_window; /* Window holding our mouse grab */
Window keyboard_grab_window; /* Window holding our keyboard grab */
+ Bool fading_possible_p; /* Whether fading to/from black is possible. */
+ Bool throttled_p; /* Whether we should temporarily just blank
+ the screen, not run hacks. */
/* =======================================================================
XtIntervalId check_pointer_timer_id; /* `prefs.pointer_timeout' */
time_t last_activity_time; /* Used only when no server exts. */
+ time_t last_wall_clock_time; /* Used to detect laptop suspend. */
saver_screen_info *last_activity_screen;
+ Bool emergency_lock_p; /* Set when the wall clock has jumped
+ (presumably due to laptop suspend) and we
+ need to lock down right away instead of
+ waiting for the lock timer to go off. */
+
/* =======================================================================
remote control
real root window. */
unsigned long black_pixel; /* Black, allocated from `cmap'. */
+ int blank_vp_x, blank_vp_y; /* Where the virtual-scrolling viewport was
+ when the screen went blank. We need to
+ prevent the X server from letting the mouse
+ bump the edges to scroll while the screen
+ is locked, so we reset to this when it has
+ moved, and the lock dialog is up... */
+
# ifdef HAVE_MIT_SAVER_EXTENSION
Window server_mit_saver_window;
# endif
extern Bool blank_screen (saver_info *si);
extern void unblank_screen (saver_info *si);
+extern void get_screen_viewport (saver_screen_info *ssi,
+ int *x_ret, int *y_ret,
+ int *w_ret, int *h_ret,
+ Bool verbose_p);
+
+
/* =======================================================================
locking
======================================================================= */
extern Bool lock_priv_init (int argc, char **argv, Bool verbose_p);
extern Bool lock_init (int argc, char **argv, Bool verbose_p);
extern Bool passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+#endif /* NO_LOCKING */
-extern void make_passwd_window (saver_info *si);
-extern void draw_passwd_window (saver_info *si);
-extern void update_passwd_window (saver_info *si, const char *printed_passwd,
- float ratio);
-extern void destroy_passwd_window (saver_info *si);
+extern int move_mouse_grab (saver_info *si, Window to, Cursor cursor);
-#endif /* NO_LOCKING */
/* =======================================================================
runtime privileges
.if n .sp 1
.if t .sp .5
..
-.TH XScreenSaver 1 "27-Apr-99 (3.10)" "X Version 11"
+.TH XScreenSaver 1 "10-May-99 (3.12)" "X Version 11"
.SH NAME
xscreensaver - graphics hack and screen locker, launched when the user is idle
.SH SYNOPSIS
.B color
Use the best of the color visuals, if there are any.
.TP 8
+.B GL
+Use the visual that is best for OpenGL programs. (OpenGL programs have
+somewhat different requirements than other X programs.)
+.TP 8
.I class
where \fIclass\fP is one of \fBStaticGray\fP, \fBStaticColor\fP,
\fBTrueColor\fP, \fBGrayScale\fP, \fBPseudoColor\fP, or \fBDirectColor\fP.
after an hour or two even if you've told it not to. This is fixed by SGI
patches 2447 and 2537.
.TP 8
-.B OpenGL Programs and Visuals
-Some of the graphics demos included with xscreensaver make use of the
-OpenGL (or MesaGL) 3D library, if it is available. It is possible (even
-likely) that \fIxscreensaver\fP's notion of the ``\fIbest\fP'' visual is
-not quite right for these GL programs.
-
-The odd thing about GL programs is that, unlike normal X11 programs, they
-tend to work best on a visual \fIhalf\fP as deep as the depth of the screen,
-since that way, they can do double-buffering. Try it and see, but you will
-probably find that, for these particular programs, you should specify the
-deepest visual that is half as deep as the screen. (See the discussion
-of the \fBprograms\fP resource in the \fIConfiguration\fP section, above.)
-
-For example, on a screen that supports both 24-bit TrueColor and 12-bit
-PseudoColor visuals, the 12-bit visual will probably work best (this is true
-of base-model SGI Indys: the 0x29 visual is the one you want.)
-
-Oddly, on SGI O2s (machines that have serious hardware support for GL), the
-12-bit PseudoColor visual looks awful (you get a black and white, flickery
-image.) On these machines, the visual you want turns out to be 0x31.
-However, 0x31 is but \fIone\fP of the \fIeight\fP 15-bit TrueColor visuals
-(yes, 8, and yes, 15) that the O2 X server provides. This is the only visual
-that works properly: as far as
-.BR xdpyinfo (1)
-is concerned, all of the 15-bit TrueColor visuals are identical, but some
-flicker like mad, and some have deeply weird artifacts (such as hidden
-surfaces that show through, as if depth worked backwards!)
-
-I suppose these other visuals must be tied to some arcane hardware feature...
-If anyone would care to explain it to me, that would be great.
-
-Your mileage, therefore, may vary dramatically.
-.TP 8
.B MesaGL and Voodoo Cards
If you have a 3Dfx/Voodoo card, the default settings for xscreensaver will
run the GL-based graphics demos in such a way that they will not take
.BR bouboule (1),
.BR braid (1),
.BR bsod (1),
+.BR bubble3d (1),
.BR bubbles (1),
.BR cage (1),
+.BR compass (1),
.BR coral (1),
+.BR critical (1),
+.BR crystal (1),
.BR cynosure (1),
.BR decayscreen (1),
.BR deco (1),
+.BR deluxe (1),
+.BR demon (1),
+.BR discrete (1),
+.BR distort (1),
.BR drift (1),
.BR epicycle (1),
.BR fadeplot (1),
.BR flag (1),
.BR flame (1),
+.BR flow (1),
.BR forest (1),
.BR galaxy (1),
.BR gears (1),
+.BR glplanet (1),
.BR goop (1),
.BR grav (1),
.BR greynetic (1),
.BR jigsaw (1),
.BR julia (1),
.BR kaleidescope (1),
+.BR kumppa (1),
+.BR lament (1),
.BR laser (1),
.BR lightning (1),
.BR lisa (1),
.BR lissie (1),
.BR lmorph (1),
+.BR loop (1),
.BR maze (1),
.BR moebius (1),
.BR moire (1),
.BR munch (1),
.BR noseguy (1),
.BR pedal (1),
+.BR penetrate (1),
.BR penrose (1),
+.BR phosphor (1),
.BR pipes (1),
+.BR pulsar (1),
.BR pyro (1),
.BR qix (1),
.BR rd-bomb (1),
.BR sierpinski (1),
.BR slidescreen (1),
.BR slip (1),
+.BR sonar (1),
.BR sphere (1),
.BR spiral (1),
+.BR spotlight (1),
.BR sproingies (1),
+.BR squiral (1),
.BR stairs (1),
.BR starfish (1),
.BR strange (1),
.BR superquadrics (1),
.BR swirl (1),
+.BR t3d (1),
.BR triangle (1),
.BR truchet (1),
.BR vines (1),
+.BR wander (1),
.BR worm (1),
+.BR xflame (1),
.BR xjack (1),
.BR xlyap (1),
+.BR xmatrix (1),
.BR xroger (1),
.BR bongo (1),
.BR ico (1),
}
else
{
+ char *bits = (char *) malloc (sizeof(bob_bits));
+ memcpy (bits, bob_bits, sizeof(bob_bits));
fp->image = XCreateImage (dpy, MI_VISUAL(mi), 1, XYBitmap, 0,
- (char *) bob_bits, bob_width, bob_height,
+ bits, bob_width, bob_height,
8, 0);
fp->image->byte_order = LSBFirst;
fp->image->bitmap_bit_order = LSBFirst;
XClearWindow(display, MI_WINDOW(mi));
}
+void release_flag(ModeInfo * mi);
+
+
void
draw_flag(ModeInfo * mi)
{
XFlush(display);
fp->timer++;
if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi)))
+ {
+ release_flag(mi);
init_flag(mi);
+ }
}
void
UTIL_SRCS = $(UTILS_SRC)/colors.c $(UTILS_SRC)/hsv.c \
$(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
- $(UTILS_SRC)/visual.c $(UTILS_SRC)/yarandom.c
+ $(UTILS_SRC)/visual.c $(UTILS_SRC)/visual-gl.c \
+ $(UTILS_SRC)/yarandom.c
UTIL_OBJS = $(UTILS_SRC)/colors.o $(UTILS_SRC)/hsv.o \
$(UTILS_SRC)/resources.o $(UTILS_SRC)/usleep.o \
- $(UTILS_SRC)/visual.o $(UTILS_SRC)/yarandom.o
+ $(UTILS_SRC)/visual.o $(UTILS_SRC)/visual-gl.o \
+ $(UTILS_SRC)/yarandom.o
SRCS = atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
buildlwo.c cage.c dolphin.c gears.c lament.c moebius.c \
HACK_OBJS = screenhack-gl.o xlock-gl.o $(HACK_BIN)/xlockmore.o \
$(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
- $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o \
- $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o
+ $(UTILS_BIN)/visual-gl.o $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/hsv.o \
+ $(UTILS_BIN)/colors.o
HDRS = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h
-MEN = lament.man
+GL_MEN = lament.man
+MEN = @GL_MEN@
EXTRAS = README Makefile.in
TARFILES = $(SRCS) $(HDRS) $(MEN) $(EXTRAS)
$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c
$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c
$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/visual-gl.o: $(UTILS_SRC)/visual-gl.c
$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c
$(UTIL_OBJS):
"*size: 500 \n" \
"*fisheye: True \n" \
"*tightturns: False \n" \
- "*rotatepipes: True \n" \
- "*noBuffer: True \n"
+ "*rotatepipes: True \n"
# include "xlockmore.h" /* from the xscreensaver distribution */
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
* Revision History:
* 4-Apr-1999: dek@cgl.ucsf.edu Created module "pulsar"
+ * 27-Apr-1999: dek@cgl.ucsf.edu Submitted module "pulsar"
+ * 4-May-1999: jwz@jwz.org Added module "pulsar"
+ * 4-May-1999: dek@cgl.ucsf.edu Submitted module "pulsar" updates
*
+ * Notes:
+ * The pulsar screensaver draws a number of rotating, pulsing rectangles
+ * on your screen. Depending on the options you choose, you can set a number
+ * of interesting OpenGL parameters, including alpha blending, depth testing, fog,
+ * lighting, texturing, mipmapping, bilinear filtering, and line antialiasing.
+ * Additionally, there is a "frames per second" meter which gives an estimate of
+ * the speed of your graphics card.
+ *
+ * Example command-line switches:
+ * Only draw a single quad, and don't fill it (boring but fast)
+ * pulsar -wire -quads 1 -fps
+ *
+ * Only try this with hardware graphics acceleration (PPro 200 w/ a Voodoo 2 runs great)
+ * pulsar -quads 10 -texture -mipmap -texture_quality -light -fog -fps
+ *
*/
#include <math.h>
# define screensaver_opts xlockmore_opts
#define DEFAULTS "*light: False \n" \
"*wire: False \n" \
+ "*quads: 5 \n" \
"*blend: True \n" \
"*fog: False \n" \
"*antialias: False \n" \
"*mipmap: False \n" \
"*fps: False \n" \
"*doDepth: False \n" \
+ "*image: BUILTIN \n"
# include "xlockmore.h" /* from the xscreensaver distribution */
#else /* !STANDALONE */
#define checkImageWidth 64
#define checkImageHeight 64
-char *Textures[] = {
- "./test.ppm4",
-};
-
-typedef struct {
- int sizeX, sizeY;
- GLubyte *data;
-} PPMImage;
-
/* Functions for handling the frames per second timer */
#include "GL/glx.h"
#define SAMPLE_FRAMES 10
#endif
-static GLint base;
-static int FrameCounter = 0;
-static double oldtime=-1., newtime=-1.;
-static char FPSstring[1024]="FPS: NONE";
-
-static float x_pos=0, y_pos=0;
-
-#define FONT "-*-courier-medium-r-normal-*-240-*"
-
-
-
-#define NUM_TRIANGLES 5
-static float scale_x=1, scale_y=1, scale_z=1;
-static int frame = 0;
-struct triangle
-{
- GLfloat tx, ty, tz;
- GLfloat rx, ry, rz;
-
- GLfloat dtx, dty, dtz;
- GLfloat drx, dry, drz;
-
-};
-struct triangle triangles[NUM_TRIANGLES];
-GLint tri_list;
-
-
#undef countof
#define countof(x) (sizeof((x))/sizeof((*x)))
#define WIDTH 800
#define HEIGHT 600
-int global_width=WIDTH, global_height=HEIGHT;
+#define NUM_QUADS 5
+#define DEF_NUM_QUADS "5"
+#define DEF_LIGHT "False"
+#define DEF_WIRE "False"
+#define DEF_BLEND "True"
+#define DEF_FOG "False"
+#define DEF_ANTIALIAS "False"
+#define DEF_TEXTURE "False"
+#define DEF_TEXTURE_QUALITY "False"
+#define DEF_MIPMAP "False"
+#define DEF_FPS "False"
+#define DEF_DO_DEPTH "False"
+#define DEF_IMAGE "BUILTIN"
+
+static int num_quads;
+static int do_light;
+static int do_wire;
+static int do_blend;
+static int do_fog;
+static int do_antialias;
+static int do_texture;
+static int do_texture_quality;
+static int do_mipmap;
+static int do_fps;
+static int do_depth;
+static char *which_image;
static XrmOptionDescRec opts[] = {
+ {"-quads", ".pulsar.quads", XrmoptionSepArg, (caddr_t) NULL },
{"-light", ".pulsar.light", XrmoptionNoArg, (caddr_t) "true" },
{"+light", ".pulsar.light", XrmoptionNoArg, (caddr_t) "false" },
{"-wire", ".pulsar.wire", XrmoptionNoArg, (caddr_t) "true" },
{"+fps", ".pulsar.fps", XrmoptionNoArg, (caddr_t) "false" },
{"-do_depth", ".pulsar.doDepth", XrmoptionNoArg, (caddr_t) "true" },
{"+do_depth", ".pulsar.doDepth", XrmoptionNoArg, (caddr_t) "false" },
+ {"-image", ".pulsar.image", XrmoptionSepArg, (caddr_t) NULL },
};
-#define DEF_LIGHT "False"
-#define DEF_WIRE "False"
-#define DEF_BLEND "True"
-#define DEF_FOG "False"
-#define DEF_ANTIALIAS "False"
-#define DEF_TEXTURE "False"
-#define DEF_TEXTURE_QUALITY "False"
-#define DEF_MIPMAP "False"
-#define DEF_FPS "False"
-#define DEF_DO_DEPTH "False"
-
-static int do_light;
-static int do_wire;
-static int do_blend;
-static int do_fog;
-static int do_antialias;
-static int do_texture;
-static int do_texture_quality;
-static int do_mipmap;
-static int do_fps;
-static int do_depth;
static argtype vars[] = {
+ {(caddr_t *) &num_quads, "quads", "Quads", DEF_NUM_QUADS, t_Int},
{(caddr_t *) &do_light, "light", "Light", DEF_LIGHT, t_Bool},
{(caddr_t *) &do_wire, "wire", "Wire", DEF_WIRE, t_Bool},
{(caddr_t *) &do_blend, "blend", "Blend", DEF_BLEND, t_Bool},
{(caddr_t *) &do_mipmap, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
{(caddr_t *) &do_fps, "fps", "fps", DEF_FPS, t_Bool},
{(caddr_t *) &do_depth, "doDepth", "DoDepth", DEF_DO_DEPTH, t_Bool},
+ {(caddr_t *) &which_image, "image", "Image", DEF_IMAGE, t_String},
};
-ModeSpecOpt screensaver_opts = {countof(opts), opts, countof(vars), vars, NULL};
+static OptionStruct desc[] =
+{
+ {"-quads num", "how many quads to draw"},
+ {"-/+ light", "whether to do enable lighting (slower)"},
+ {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
+ {"-/+ blend", "whether to do enable blending (slower)"},
+ {"-/+ fog", "whether to do enable fog (?)"},
+ {"-/+ antialias", "whether to do enable antialiased lines (slower)"},
+ {"-/+ texture", "whether to do enable texturing (much slower)"},
+ {"-/+ texture_quality", "whether to do enable linear/mipmap filtering (much much slower)"},
+ {"-/+ mipmap", "whether to do enable mipmaps (much slower)"},
+ {"-/+ fps", "whether to do enable frames per second meter (?)"},
+ {"-/+ depth", "whether to do enable depth buffer checking (slower)"},
+ {"-image <filename>", "texture image to load (PPM, PPM4, TIFF(?), XPM(?))"},
+};
+
+ModeSpecOpt screensaver_opts = {countof(opts), opts, countof(vars), vars, desc};
#ifdef USE_MODULES
ModStruct screensaver_description =
static screensaverstruct *Screensaver = NULL;
+struct quad
+{
+ GLfloat tx, ty, tz;
+ GLfloat rx, ry, rz;
+
+ GLfloat dtx, dty, dtz;
+ GLfloat drx, dry, drz;
+
+};
+
+int global_width=WIDTH, global_height=HEIGHT;
+
+
+static GLint base;
+static int FrameCounter = 0;
+static double oldtime=-1., newtime=-1.;
+static char FPSstring[1024]="FPS: NONE";
+
+static float x_pos=0, y_pos=0;
+
+#define FONT "-*-courier-medium-r-normal-*-240-*"
+GLint quad_list;
+
+static float scale_x=1, scale_y=1, scale_z=1;
+static int frame = 0;
+
+static GLenum errCode;
+static const GLubyte *errString;
+
+struct quad *quads;
+
+int checkError(int line, char *file)
+{
+ if((errCode = glGetError()) != GL_NO_ERROR) {
+ errString = (char *)gluErrorString(errCode);
+ fprintf(stderr, "OpenGL error: %s detected at line %d in file %s\n", errString, line, file);
+ exit(1);
+ }
+ return 0;
+}
+
void FPS_Setup(void)
{
glRasterPos2f( x, y);
len = (int) strlen(string);
for (i = 0; i < len; i++) {
- glCallList(base+string[i]);
+ if (glIsList(base+string[i]))
+ glCallList(base+string[i]);
+ else
+ fprintf(stderr, "%d+string[%d] is not a display list!\n", base, i);
}
/* clean up after our state changes */
}
#endif
-
/* Load a modified version of PPM format with an extra byte for alpha */
GLubyte *LoadPPM4(const char *filename, int *width, int *height, int *format)
{
char buff[1024];
- PPMImage *result;
+ GLubyte *data;
+ int sizeX, sizeY;
FILE *fp;
int maxval;
if (!fgets(buff, sizeof(buff), fp))
{
- perror(filename);
+ perror("Unable to read header filename\n");
return Generate_Image(width, height, format);
}
return Generate_Image(width, height, format);
}
- result = malloc(sizeof(PPMImage));
- if (!result)
- {
- fprintf(stderr, "Unable to allocate memory\n");
- return Generate_Image(width, height, format);
- }
-
do
{
fgets(buff, sizeof(buff), fp);
}
while (buff[0] == '#');
- if (sscanf(buff, "%d %d", &result->sizeX, &result->sizeY) != 2)
+ if (sscanf(buff, "%d %d", &sizeX, &sizeY) != 2)
{
fprintf(stderr, "Error loading image `%s'\n", filename);
return Generate_Image(width, height, format);
while (fgetc(fp) != '\n')
;
- result->data = (GLubyte *)malloc(4 * result->sizeX * result->sizeY);
- if (!result)
+ data = (GLubyte *)malloc(4 * sizeX * sizeY);
+ if (data == NULL)
{
fprintf(stderr, "Unable to allocate memory\n");
- exit(1);
+ exit(1);
}
- if (fread(result->data, 4 * result->sizeX, result->sizeY, fp) != result->sizeY)
+ if (fread(data, 4 * sizeX, sizeY, fp) != sizeY)
{
fprintf(stderr, "Error loading image `%s'\n", filename);
return Generate_Image(width, height, format);
fclose(fp);
- *width = result->sizeX;
- *height = result->sizeY;
+ *width = sizeX;
+ *height = sizeY;
*format = GL_RGBA;
- return result->data;
+ return data;
}
/* Load a plain PPM image */
GLubyte *LoadPPM(const char *filename, int *width, int *height, int *format)
{
char buff[1024];
- PPMImage *result;
+ GLubyte *data;
+ GLint sizeX, sizeY;
FILE *fp;
int maxval;
return Generate_Image(width, height, format);
}
- result = malloc(sizeof(PPMImage));
- if (!result)
- {
- fprintf(stderr, "Unable to allocate memory\n");
- return Generate_Image(width, height, format);
- }
-
do
{
fgets(buff, sizeof(buff), fp);
}
while (buff[0] == '#');
- if (sscanf(buff, "%d %d", &result->sizeX, &result->sizeY) != 2)
+ if (sscanf(buff, "%d %d", &sizeX, &sizeY) != 2)
{
fprintf(stderr, "Error loading image `%s'\n", filename);
return Generate_Image(width, height, format);
while (fgetc(fp) != '\n')
;
- result->data = (GLubyte *)malloc(3 * result->sizeX * result->sizeY);
- if (!result)
+ data = (GLubyte *)malloc(3 * sizeX * sizeY);
+ if (data == NULL)
{
fprintf(stderr, "Unable to allocate memory\n");
- return Generate_Image(width, height, format);
+ exit(1);
}
- if (fread(result->data, 3 * result->sizeX, result->sizeY, fp) != result->sizeY)
+ if (fread(data, 3 * sizeX, sizeY, fp) != sizeY)
{
fprintf(stderr, "Error loading image `%s'\n", filename);
return Generate_Image(width, height, format);
fclose(fp);
- *width = result->sizeX;
- *height = result->sizeY;
+ *width = sizeX;
+ *height = sizeY;
*format = GL_RGB;
- return result->data;
+ return data;
}
/* Create a texture in OpenGL. First an image is loaded
GLint a;
int format;
- fprintf(stdout, "Loading texture '%s'\n", filename);
-
- if ( !strncmp((filename+strlen(filename)-3), "ppm", 3))
+ if ( !strncmp(filename, "BUILTIN", 7))
+ image = Generate_Image(&width, &height, &format);
+ else if ( !strncmp((filename+strlen(filename)-3), "ppm", 3))
image = LoadPPM(filename, &width, &height, &format);
else if ( !strncmp((filename+strlen(filename)-4), "ppm4", 4))
image = LoadPPM4(filename, &width, &height, &format);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ /* perhaps we can edge a bit more speed at the expense of quality */
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
if (do_texture_quality) {
+ /* with texture_quality, the min and mag filters look *much* nice but are *much* slower */
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
else {
+ /* default is to do it quick and dirty */
+ /* if you have mipmaps turned on, but not texture quality, nothing will happen! */
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
}
+ /* mipmaps make the image look much nicer */
if (do_mipmap)
a=gluBuild2DMipmaps(GL_TEXTURE_2D, format, width, height, format, GL_UNSIGNED_BYTE, image);
else
}
-void GenerateTriangle(void)
+void GenerateQuad(void)
{
int i;
- tri_list = glGenLists(1);
- glNewList(tri_list,GL_COMPILE);
-/* glBegin(GL_TRIANGLES); */
+ quad_list = glGenLists(1);
+ glNewList(quad_list,GL_COMPILE);
glBegin(GL_QUADS);
glColor4f(1,0,0,.4); glNormal3f(0,0,1); glTexCoord2f(0,0); glVertex2f(-1, -1);
glColor4f(0,1,0,.4); glNormal3f(0,0,1); glTexCoord2f(0,1); glVertex2f(-1, 1);
glEnd();
glEndList();
- for (i=0; i < NUM_TRIANGLES; i++)
+
+ quads = (struct quad *) malloc(sizeof(struct quad) * num_quads);
+ for (i=0; i < num_quads; i++)
{
- triangles[i].rx = 0.;
- triangles[i].ry = 0.;
- triangles[i].rz = 0.;
- triangles[i].tx = 0.;
- triangles[i].ty = 0.;
- triangles[i].tz = -10;
-
- triangles[i].drx = drand48() * 5.;
- triangles[i].dry = drand48() * 5.;
- triangles[i].drz = 0;
+ quads[i].rx = 0.;
+ quads[i].ry = 0.;
+ quads[i].rz = 0.;
+ quads[i].tx = 0.;
+ quads[i].ty = 0.;
+ quads[i].tz = -10;
+
+ quads[i].drx = drand48() * 5.;
+ quads[i].dry = drand48() * 5.;
+ quads[i].drz = 0;
}
}
if (do_texture)
- {
- Create_Texture(Textures[0]);
- }
+ Create_Texture(which_image);
- GenerateTriangle();
+ GenerateQuad();
}
-void drawTriangles(void) {
+void drawQuads(void) {
int i;
- for (i=0; i < NUM_TRIANGLES; i++)
+ for (i=0; i < num_quads; i++)
{
glPushMatrix();
- glTranslatef(triangles[i].tx,0,0);
- glTranslatef(0,triangles[i].ty,0);
- glTranslatef(0,0,triangles[i].tz);
- glRotatef(triangles[i].rx, 1,0,0);
- glRotatef(triangles[i].ry, 0,1,0);
- glRotatef(triangles[i].rz, 0,0,1);
- glCallList(tri_list);
+ glTranslatef(quads[i].tx,0,0);
+ glTranslatef(0,quads[i].ty,0);
+ glTranslatef(0,0,quads[i].tz);
+ glRotatef(quads[i].rx, 1,0,0);
+ glRotatef(quads[i].ry, 0,1,0);
+ glRotatef(quads[i].rz, 0,0,1);
+ glCallList(quad_list);
glPopMatrix();
- triangles[i].rx += triangles[i].drx;
- triangles[i].ry += triangles[i].dry;
- triangles[i].rz += triangles[i].drz;
+ quads[i].rx += quads[i].drx;
+ quads[i].ry += quads[i].dry;
+ quads[i].rz += quads[i].drz;
}
}
GLvoid drawScene(GLvoid)
{
+ checkError(__LINE__, __FILE__);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* we have to do this here because the FPS meter turns these 3 features off!! */
}
resetProjection();
+
+ /* use XYZ scaling factors to change the size of the pulsar */
glScalef(scale_x, scale_y, scale_z);
- drawTriangles();
-
+ drawQuads();
+
+ /* update the scaling factors- cyclic */
scale_x = cos(frame/360.)*10.;
scale_y = sin(frame/360.)*10.;
scale_z = 1;
+ /* increment frame-counter */
frame++;
- DoFPS();
+
+ if (do_fps)
+ DoFPS();
+ checkError(__LINE__, __FILE__);
}
(void) free((void *) Screensaver);
Screensaver = NULL;
}
+ free(quads);
FreeAllGL(mi);
}
#endif
-/* xlock-gc.c --- xscreensaver compatibility layer for xlockmore GL modules.
- * xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+/* xlock-gl.c --- xscreensaver compatibility layer for xlockmore GL modules.
+ * xscreensaver, Copyright (c) 1997, 1998, 1999 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
return ptr;
}
}
-
-
-Visual *
-get_gl_visual (Screen *screen, char *name, char *class)
-{
- char *string = get_string_resource (name, class);
- XVisualInfo *vi = 0;
- Bool done_once = False;
-
- AGAIN:
- if (!string || !*string ||
- !strcmp (string, "best") ||
- !strcmp (string, "color") ||
- !strcmp (string, "default"))
- {
- Display *dpy = DisplayOfScreen (screen);
- int screen_num = screen_number (screen);
- int attrs[20];
- int i = 0;
- Bool dbuf_p = !get_boolean_resource ("noBuffer", "NoBuffer");
-
- done_once = True;
-
- attrs[i++] = GLX_RGBA;
- attrs[i++] = GLX_RED_SIZE; attrs[i++] = 1;
- attrs[i++] = GLX_GREEN_SIZE; attrs[i++] = 1;
- attrs[i++] = GLX_BLUE_SIZE; attrs[i++] = 1;
- attrs[i++] = GLX_DEPTH_SIZE; attrs[i++] = 1;
- if (dbuf_p)
- attrs[i++] = GLX_DOUBLEBUFFER;
- attrs[i++] = 0;
-
- vi = glXChooseVisual (dpy, screen_num, attrs);
- if (vi) goto DONE;
-
- /* Try without double-buffering. */
- attrs[i - 1] = 0;
- vi = glXChooseVisual (dpy, screen_num, attrs);
- if (vi) goto DONE;
-
- /* Try mono. */
- i = 0;
- if (dbuf_p)
- attrs[i++] = GLX_DOUBLEBUFFER;
- attrs[i++] = 0;
- vi = glXChooseVisual (dpy, screen_num, attrs);
- if (vi) goto DONE;
-
- /* Try mono without double-buffering. */
- attrs[0] = 0;
- vi = glXChooseVisual (dpy, screen_num, attrs);
- }
-
- DONE:
- {
- Visual *v;
- if (vi)
- {
- v = vi->visual;
- XFree (vi);
- }
- else
- {
- v = get_visual (screen, string, False, True);
- if (!v)
- {
- if (done_once)
- v = DefaultVisualOfScreen (screen);
- else
- {
- free (string);
- string = 0;
- goto AGAIN;
- }
- }
- }
-
- free (string);
- return v;
- }
-}
static char * matrix[] = {
"56 837 64 1",
". c #000000",
-"+ c #178618",
-"@ c #26C227",
-"# c #114410",
-"$ c #7AEB7A",
-"% c #5AC254",
-"& c #136314",
-"* c #1AA614",
-"= c #52DB51",
-"- c #127410",
-"; c #169614",
-"> c #062604",
-", c #32D634",
-"' c #145417",
-") c #B2F6B0",
-"! c #42A244",
-"~ c #62E75C",
-"{ c #2F832F",
-"] c #3AC237",
-"^ c #246624",
-"/ c #2B7729",
-"( c #0C360E",
-"_ c #92F294",
-": c #4CB34A",
-"< c #298B27",
-"[ c #0E4E0C",
-"} c #62DE64",
-"| c #3B9439",
-"1 c #1D5E1D",
-"2 c #26B529",
-"3 c #CCFDD1",
-"4 c #73E774",
-"5 c #32CB34",
-"6 c #021804",
-"7 c #4ED64C",
-"8 c #7AF67C",
-"9 c #2E9A34",
-"0 c #26CB24",
-"a c #166E14",
+"+ c #020E04",
+"@ c #021804",
+"# c #062604",
+"$ c #0B3008",
+"% c #021E04",
+"& c #114410",
+"* c #0C360E",
+"= c #0D3E0E",
+"- c #0E4E0C",
+"; c #1F561E",
+"> c #145417",
+", c #136314",
+"' c #1D5E1D",
+") c #1C4E1C",
+"! c #127410",
+"~ c #269624",
+"{ c #1AA614",
+"] c #169614",
+"^ c #26B529",
+"/ c #178618",
+"( c #246624",
+"_ c #2F832F",
+": c #2B7729",
+"< c #368B34",
+"[ c #3B9439",
+"} c #298B27",
+"| c #3AC237",
+"1 c #42D73C",
+"2 c #62DA61",
+"3 c #32D634",
+"4 c #88E688",
+"5 c #1E751C",
+"6 c #4CB34A",
+"7 c #44AB42",
+"8 c #42A244",
+"9 c #26C227",
+"0 c #FFFFFF",
+"a c #40CC44",
"b c #52BB54",
-"c c #5ED05C",
-"d c #36B634",
-"e c #0B3008",
-"f c #44AB42",
-"g c #020E04",
-"h c #8AEC8C",
-"i c #1E751C",
-"j c #2AA62C",
-"k c #42D73C",
-"l c #286E26",
-"m c #1F561E",
-"n c #368B34",
-"o c #40CC44",
-"p c #3E9C3C",
-"q c #0D3E0E",
-"r c #66E264",
-"s c #76EE74",
-"t c #269624",
-"u c #A1F2A1",
-"v c #1C4E1C",
-"w c #3EDE3C",
-"x c #5ACA5C",
-"y c #52E24C",
-"z c #021E04",
-"........................................................",
-"...........gggggg......................gggggg...........",
-"........gggg6gggggg.................g6g6>6666gg.........",
-".......g666>>>e>z66gg..............g66>eee#e>z66g.......",
-"......g6>>>>(>((ezz6g.............66eeeq[q[[#e>66.......",
-".....g6e#m'''&&1[v#e>gg..........6z[-t*;;**2;+-[e6g.....",
-"....g6>v^{{///n|{^1#(6g.........g>e<]k7,]===7]*i[6g.....",
-"...gzze^|:f!|!::!n/^q>6g.......g>zq@}h44rrhh4=o2&ezg....",
-"...g>>[/|b!|nnp!p|n/m>6g.......6e#-o}_4}==r44}=kt#z6....",
-"..g6e[m{:%!{^l/{n!:|1(>6g.....gz[+t7hu4k@5]k=4h}2[ezg...",
-".ggzqml|fxp/''''{!c:/q>gg....gg>&j]}hur5;;;;k4)ho&e6g...",
-"..g6#^/pbx|a[[[[/f}:/#>>g.....6>i2]4hur@++++]4)$o-qe6...",
-".gz>m/npfbnl[#[#l!x:{'(e6....gzqto=44_=@++++54uh7;[q6...",
-".g6em{|!!f{a[[[#/|xf{1#>6g...gzqjk}444w@+++-]}u$7ji#>g..",
-".gze^n!fff{1q#[#l|%:{^v(6g...6z#2=r4$4k2--+-]ruh72+[zg..",
-".g6e^n!!!p{&[[qq/|b:n^m(zg...g>#d=444r,2++--5}uh=2t[>g..",
-".g6(l|:!!p{'q##ql!%:|^1q6g...gz[]}h44r,*----]4uh}]j&>g..",
-".66e^|f!pp/&[[##/|%:|lmq6g...6>#dr44~r0*++--]}uh}]t&>g..",
-".66(mnpf!fn&[[##/|%:{mv(6g...6z[j=r44$=2++--5ru$=j+[>g..",
-".g6e1/n!:bn^[[[[lpbf{mq>6g...gzqjo=44_w@++++]}u47t&q6g..",
-".ggemln!:b9^[[#[l|%!/v(>g....gzqt]=4h_=@++++@ru4o+'e6...",
-".gg>#ml|:x!i['''/!%:/#e>6....g6e-j]}huy0+;;;54uh,-[ez...",
-"..g6([mp%}f/''1^{fx!/q>gg.....g>[+jy_)$,;;2274u4o&e6g...",
-"..g6e(v{%cfi'&&lnfc:/e>6g.....g6q&+7u)40;22@=4)h][e6g...",
-"...g>(#l!bp{a//{n|!/1e6g.......6e[-o4h~k@@0k7}47jq>6....",
-"...g6ze1/nn{<{n|n/l1#66g.......g6eqjo==7k=y}=kbj-z6g....",
-"....gz>q1l{npp!pn^#(e6g.........g>e&j]k=rr4472-'q>g.....",
-"....gg6(#mm^ll//^vq>6gg.........g66'-tjd]]]od+&q>gg.....",
-".....gg6e(##vvvvq(>6g............gg>q[--<<+<-[e6z.......",
-".......g666>>zz>z6g6...............g6>zeeeee>z6z........",
-"........ggg66zg66gg.................ggz6z>66zgg.........",
-"........................................................",
-"............g.g.........................g.g.............",
-"..........gg66g6gg....................g6>z666g..........",
-".........g6z>e>z6gg..................gzze#q>z6g.........",
-"........g6>(qe(e>zgg................g>e[&[[qe>6g........",
-".......g66vlnll^mv#eg..............g6>+]=5]2t+i[6.......",
-".......g6>^|%:|{/l^ve..............6>edruhr7k]d<#.......",
-".......66>{%8}%!nn/^q..............6zq7u3)u4}7]d&.......",
-"......g6>(/x8c!{/^mqe.............gze#ou3)4oodjiq.......",
-"......g6>({b8%|mmvve6.............g>e[7u3u}j9<iq>.......",
-"......g6een%8b/#q>>6g.............g>q[7u3_o-&qe>g.......",
-"......g6>(nb_:/qee6gg.............gzq[7u3ho&[qz6g.......",
-"......gz>(nb8:{q(>z6..............g>e'7u3hk&[e>z........",
-"......g6een%8b/qe>g6..............g>q[=u3ho&[e66........",
-"......g6een%8b/q>>zg..............gzq[7u3h5&qe>g........",
-"......66>enb8:/ee6gg..............zze[=u3ho[qzzg........",
-"......g6e(n%8:/q>>6...............g>qv7u3ho&qe6.........",
-".....g6>>enb_:/qe66..............g6eq[=u3$]&q>6.........",
-"......g6eqnx8b/(>>gg..............z>q&7u3hk[qe6g........",
-".....g6>eenb8b/qe>6g.............g6eq[=u3hk&qe6g........",
-".....g6>eqnx8b/qe>gg.............g>e[&7u3h0&[e6g........",
-".....gg>eq{%8b/(ee6g.............g6e[&=u3_o[[q>g........",
-".....gzzeqnx8:/(e>6g.............g>eq&cu3ho&q(zg........",
-".....gzee#{%sb{((>6g.............g>q[-=u3_k&[e>6........",
-".....6ge#mn:c!{&#q>6.............66[-97h)4k*-&e6........",
-".....g6qv^{f%!{^'q>zg............gz&<d=4u47];&qzg.......",
-".....ggqmln|f|{lm#e6g............g6&j]7}4}7]ji#>g.......",
-"......geqvm^/^mvqe66..............gq&<jdo]9{&q>6........",
-".......gze(q#qqee6g................6eqv&i&&q#>g.........",
-"........gg6g6gg6g...................g6666666g...........",
-".........gggggg......................ggg6gg.............",
-"...........ggggg.......................ggggg............",
-"........ggg6zgg6gg..................gg6z>zz66g..........",
-".......g6z>e(e>e>6gg...............g>>eq[q#qez6g........",
-".....gg6>eeqqqqqeezgg............g6>e[[&&&&&[q>6g.......",
-".....g6>##vv#v[[#q(>6g...........g6q&-++++++-&[qzg......",
-"....gz>m/n{ll^^^^^/1qg..........g>eto=7@]@22@]oj'6......",
-"...gg>el|%!|{{{{n||{v>g........g6e[]ru4}kk7k7}r7<eg.....",
-"...gzeq{bc%pn{nn|!b|m>g........g>q&7h)u4==7=r4h}jeg.....",
-"...g>qv{bc:|/l^l{|fnm>g........gq&+=h)$=55@]7}h=9e6.....",
-"...gev^|bcp{&&'m^np{m>g........6[+d}_u4k2**;]=r7teg.....",
-"..g6qm^|bx|l'[[#m/|{v6g.......gz&t]}hu}5;++-jo}7<>g.....",
-"..ggev^|bc!i[[##vm^me6g.......g6'+d}_u4@++a-+jd9'zg.....",
-"..g6e#m|:c!/[[#(####>g........g6[ij}h)45++-&-ii&eg......",
-"...g(#m|bc!i[[#q(e>6gg.........6[ij}h)40;+-&[qe>zg......",
-"...6e(v{!%p<a'[qee>zg..........6q[+74ur,@*+&[(ezz.......",
-"...g6e(/|f!n{a1(qe>6gg.........gz[&]}$r=,@*&&qe>gg......",
-"..g6zee^n|!!p{&#q>>66g........gz>q[2=r44r,*-&qe>6g......",
-"...g6>e'l{n9!{i'vq>>gg.........g>e[;@ky=~,0*+&qe6g......",
-"...66>e[1l{|f|</&[(e6g.........6>e[+j@kr~rw02+[q>6......",
-"...gz>(#['itpp9|/1q>>6g........gzq[-+;5w4~=y0*&qe6g.....",
-"..g6eeq['1lt|ppp{^'#e6g.......gzq[-+;*5wy~~~k@;-[z6.....",
-"...ge#m1&-{{{t9!p<{^#>6........6#-;*20,,kwy~~=,2-ez.....",
-"...6qv1ll{iii<pffp|/m>zg.......z&<2]@,500wr4~r}ktqzg....",
-"...6(m1i{{<{{tpf!f!<megg.......z'tj5k=wk,wr$$44=tqzg....",
-"...ge#m/np9||!f:ff!n'egg.......6qit]=ryyr~4$$44=tq6g....",
-"...ge(v/n!f!ff:f:!p{m>6........g#&<o}444$4hhh447tqz.....",
-"...g>(q^n!!!!p!!p||lv>g........ge[-d=4444444r}}o+e6.....",
-"....g>evm^lll/ll^^^v(6g.........6eq+9d]]d5]]]dd<'zg.....",
-".....g6>e(q(#q#qq((e6g...........6>e[v&&-&-&&[[(zg......",
-"......gg66>>>>>>66ggg.............g66zeeeeeezz6zg.......",
-"........gg.6gg6g6gg.................ggg6666zzgg.........",
-"..........gg6ggg......................gg6ggg............",
-"........g666>>>6gg..................6z>>eeezzg..........",
-"......g6z>e(qee(ezgg..............g6>e#[&[[[(>6g........",
-".....gg6eeq#####ee6gg............gz>q[&-----[qz6g.......",
-"....ggzqm1mmm11mvq(>g...........gzz&;jjtjjjj+&[e6.......",
-"....gz>m{pn/l//n/^m#>g..........g>q97~=o5ok=odtiqg......",
-"...g6>(/fx:p{n|!|{/mqg.........g6e[o4uhrk=}4r759v6......",
-"...g6e#nbc:|{||!|n/^q6.........g>#-=_)hr,=r4r=kd&6......",
-"...ge(vn:cfnl/{n{//mq6.........gq&{7h)47@o777o]9&>......",
-"...gevm|:c!/11lllllm(g.........6[+j}h)45*2@]o]]9'6......",
-"..g6qv^|:x|l'1mm^^^m(g........gz&<2}hur5;jjjdddt[g......",
-"..gg(#vnfxfn^a1mvv#(>g........g6[-t=hu4=@@*t+<i'eg......",
-"..g6>ev{fxf|</m#qeezg.........g6e[+74u$}k5j-a[qeg.......",
-"..g6>e#{!xbpn{m#ee6gg.........g>q[-k$u$4=5j-[qz6g.......",
-"..gzeqvn!x:f|{^#qe66g.........gzq&+k4uh~rk2-&qzzg.......",
-"..g6e#'n!%:f9{^mq>gg..........z>[-t=$uh4yk@t&q6g........",
-"..gzq[mnfx:!|{lm#(zgg.........g>&+j=$uh4r7]t-[>zg.......",
-".g66v^/|!:pn/^1[qez6g........g6z+20}4h~75@j+&q>6g.......",
-"..g>m/n|ppn/&'vqe>>ggg........ze9]=}rr=,2;+&[(e66g......",
-"..6>mnpp!9{&'[qq(>ez6g........zej=r~~y,2;+-&[qq>6g......",
-"..g>m/nppp{a[[[['1mveg........getorrrr,@++++;jj+[6......",
-"..g6vl{n!!{^'1'1l{n/v6g.......6>+]7}r4k@;***@k}o+>g.....",
-"..gzqml|p:n-''&l{!b|1>g.......g>&j]=4hk@;*2]74_rjeg.....",
-"...gq#m/n!n/&ll{{np{m6g........6[ito=~=02@@k7}}79zg.....",
-"...g>e#1/{{{/{{{n{{^q6g........ge[ijo=k,ok77777d&>g.....",
-"....66e#1ll{nnn|nlmv(gg.........6>#-j]]7===r=]j+[zg.....",
-"....g6gqvm^^///llmvq>6..........g66&+jd@]oo]]j<&e6......",
-".....g6>(q#vvvmmvq(egg...........g6e[&i++ttt{&[#6g......",
-".......gg6>>>e>>>6ggg..............g6>eeqqqeez6gg.......",
-"........ggg6g66666g.................gg66zz>>zzg.........",
-"...........gggggg.g....................gggggg.g.........",
-"..........g.g.........................g.g...............",
-"........g6g66gg.....................66zz66g.............",
-"......g66e>>e66gg.................g6>qe#q>zgg...........",
-"......g6e>((ee>6g.................g>qq[[[qe>6...........",
-".....g6>#[milmq>66...............g6q-+*@5t&ez6..........",
-".....66qvm{n!{1(e6gg.............6>&+jo}r,j[q>6g........",
-"....g6>v^l!%c!l((e6g............g6e+25~u)$5&[qzg........",
-"....g6z[^{p:cfn&[ezzg...........g>e+dk4h)4k2+[>>6.......",
-"....6z>'a{!:xfp{a[>z6g..........6>q;@krhusrk@+q>6g......",
-"....6>em^{|:b:!p{1(e6g..........zeqt2kr$_h4r,*[q>6......",
-"....g>>ml<|fbbf!n^[qe6g.........6eqt5ky4h$$$=@+&qzg.....",
-"...gzz(&/<9fffffp{im(>6g.......g>e[*5w=~$s4~rk5;&e>g....",
-"...gz>('/<9pfff!f9{/[e6g.......g>q[*0wy~~~$$~==5+qz6....",
-"...gzeq1/t|jffj:ppp{1(>6g......gzq&j5wyr~s~44~}7j&ezg...",
-"...g>e[a{|!!dfp!p!f|l'(zg......ge[+@ky~~4~~r~~4y];&eg...",
-"...g>q[^|!j::j!<!f:p{1#e6......zq&+@y~~ss~~wr$$4,j-qz...",
-"..g6e#&i9f:::f!<9:%!n^v(6g....gz#-*5=~sss~~w=sh4=2+[>g..",
-"..ggq'1n!b]xxdj!f!f!{^'ez.....g6&t2=~__uus~~~4h47@t[z...",
-"...6q1l!bcxccb:j::dp{lm(6......6&j]~huuuu_s~$$$r7]9'z...",
-"..g6qm/pbxcxcx:d!!p|{lmqz.....g>&jo~_uu)uuss~4r}7]t&>...",
-"...gq[1{!dbdbj|<{{llmvq>g......z[+*k~$$s$~ykw,]@j+&qg...",
-"...6>e#l{ppp!<{&1''[qe>6g......6e[-]kr~~4w52*;;+&[q6g...",
-"...g6>>'^{{n|i1#((e>>z6g.......g>eq;@kk==52-&'qqe>zg....",
-"....6ze[^i{{{^[e(>>z6g..........6eq+25ok=@+[[qqzzg......",
-"....g6zqm^a//1#e>zzggg..........g6z19d@o]j-qe>>6gg......",
-".....g6qvm^^lmq666g..............6>&+jdd]t&>z6g.........",
-".....gge(##vvqe6gg...............g6#'ii++&qzgg..........",
-".......g>e>e>>gg...................6eqqq#egg............",
-".........6ggg........................6ggg...............",
-"........................................................",
-"........................................................",
-"........gg6g6g6ggg..................gg666666gg..........",
-"......g6>>ee(e(e>6g...............g>e#q[[[[[qz6.........",
-".....ggeq#vvv'vvq(z6g............g6q&i++<t++&[>zg.......",
-".....6>(vm111m1^v#e6g............6e'<tj2jjjd<i#>6.......",
-"....gzevmll{{nnn{^v#>g..........6e#+joook==}kd+&eg......",
-"....6>q1/nnnn!fb|{mveg..........6q&j]===r4$hr7j+[g......",
-"....zeq^{|p!pbxcb|/m(6..........>q&d7r~4rhu)_}o9'z......",
-"....ge(v^/{n{|:bfn/m#6g.........6q[td]k=krhh$=oj&>g.....",
-"....6ze#m1aii<|f|n/1q6g.........ze#-;2@00w=$rk]j&6g.....",
-"...g6>e(#['1&i{|n{lm#gg........g6eq&-+;**0kyykoj-6g.....",
-"...gg>>#'1ai/|9fp{/1qzg........gzeq-;2@0,wy4rkoj&>g.....",
-"...g6>('a{{|t!fbfn/mqgg........gze[;@,,=y$$h$=oj&6g.....",
-"...g>>(m/n!f:bxx:|/mqzg........6>q[jo=4sshuuh}o9&>g.....",
-"..g6e([/|!!!f!f:|{^veg........g6q&+0=$4~~4$hrk2+[6......",
-"..ggev1<!%fp{nnn/1vq>g........gz[+j=$h4r=k==o2+&eg......",
-"..6z#1l!bxftii^1mvee6g........6>-*5r_)4w5@@2t{[#zg......",
-"..g>#l{!:x!{a&1'#q>6gg........gei]74hu4,@2*;-&q>6g......",
-"..6>'/n!:fnl1''[q(ezgg........6et]=4$hy5*;;+&[q>6g......",
-"..gzm{pp|!{&[##qe>>z6.........ze97~rrr,2+--&[qezz.......",
-"..g>m/np||{&[q##qqe>g.........geto}rr=k*+---&&[e6.......",
-"..gg#m/{|p{a'&&^^m^m(g........g6ij],r4,@;**22jdt'g......",
-"..66(#m{|p{^'1l/{{{l#g........z6'-jo}r7@;*]o777]i6......",
-"...geq[ln!{^'^/nn{|/#6.........zq&+]=4w@;@0===}oi6......",
-"...g6e(ml{/ial{n/{lm(g.........g>q&*]7o5@o7=77]j'g......",
-"....66>#'^l//{{n/^m#eg..........6>e-t2]oo777odjiqg......",
-"....ggze#'^/{{/{/m#(6g..........g6z[-;2o7o77]9iv>g......",
-".....g6>eq#vmm^mv#e>6............gzeq&i;tjjj<iqe6.......",
-"......gg6>eeqq((ee6...............g6>eq[&&v'qq>g........",
-"........gg66g666ggg.................g666zz>>6gg.........",
-"..........ggggggg.....................ggggggg...........",
-"........................................................",
-".......gg>>>ezg6gg.................g6eqeqe66gg..........",
-".......eq#vmmvq>6gg................q&i<9j+&#>6g.........",
-"......gqml//{^vqe>6gg.............g&9]5o7d+&qezgg.......",
-"......g#ml/{n/^[#e66g.............6&j]o7=]2+-[>>g.......",
-".....gg(vm^//{{/^'(>6g...........gg'{tdo7k7,2;[qzg......",
-".....ggz(#m^/{p!n&#(>6g..........g6e[-j25k}4=2-[e>g.....",
-".....gz>e(mm^n!:p/'#(6g..........gzeq[;j@74hr5;-[z6.....",
-".....66>eq['&/<!|nn^[ezg.........z>e[&+;25wrr==@+q>6....",
-"....g66eeq['&^{t|pf{^(z6........g6>q[&+;*@,wy~$=2[>6....",
-"....gg>>e([''aa{9fb!^q>6g.......gzeq[&+;;@@ky4h4]&q>g...",
-"....6zev^liii<<pf%c:/qe6g.......6>q+2@000wwr4_)h5&qzg...",
-"...g6>q^n!p||pffbx4b{[>>g......g>q&d=4rryr~$_u)_,+qe6...",
-"..gg>e#{!x:f!f:bxrsxn[e>6.....gge[-,4uh4~4shu)3u=+qe6...",
-"..g6(v1nf:f9+|9pdxrb{[e>gg....gz[+27$h4ywyy~$))u,+[e6g..",
-"..g6#^l|f:|{aii{|fc:{q(>6g....g>i2o}$hrk205,=$)hk-[e6g..",
-"..6>m/||f!na1''&/!%!i#(>gg....zeto}r4$k@****,4_4@-[#zg..",
-"..g>m/p|!!{&'''&+p%!{qe>gg....gejorr44k2;;;*,ru$o-qe6g..",
-"..g>m{|p|p{a['''/pxfi#ez6.....6e97}r}~,@+;;;5ru40-[z6...",
-"..g>m{p|||l&'[[[{9x!/qe6g.....6ej7rr}}52;+;+,ru$]&q>6...",
-"..g>vln|||{&[''&{!%!iq>zg.....ge<o==rr02+;**,4u40&q>g...",
-"..ggqmlnp!na'&&^{!%!l(>zg.....g6&t]=~$=@;*2@k4u4][e>g...",
-"..g6e(v/!b|l'&//|!b|1ezg......g6q&+o4h=0*25o=4hr2[z6....",
-"...g>(#l|!n/'li{{|!n1>6g.......6e[i]}$=5*@5k7r4=j#6g....",
-"...g6eevl{lill{{{/lmqz6g.......gzq[<]ko@]5k77o]9&zzg....",
-"....g6>(v1^///{{lm#(>gg.........g6e&+jdoooo7]j-[e6g.....",
-"....gggeq#1^//l/mv>66gg.........g66(&-jdo]ooj-q>>gg.....",
-".....gg6>(q#vvvvqez6g............gg>q[&-<++{&q>6g.......",
-".......g66>e>>e>>6gg...............g6>eqqqqqe66g........",
-".........ggg6g6ggg...................gg66666zg..........",
-"...........ggg.g.......................ggg.g............",
-"........................................................",
-"......g6>e>eee(e>e>>6g............gze(#[[[[[#qqezg......",
-".....g6eqvmmmvvmvvvq>6g..........g>[&+<tt<+t+++&qzg.....",
-"....g6e#m1^lll^l1^mmqe6g........g>#ij22]@]@]ddjt&#>g....",
-"....6>(m/n/{{//{l{l^vq>g........6e[9o=77oooooood<&e6....",
-"....g>q/!%f|nnnnn||n^vq>........6e&oru4r=====rr=d+&e....",
-"....>e#nb4xf||nn|!:|/m#e........e#i=u3u4ry==r4hr]jiq....",
-"....6e#|%4x:|||n||p|/m#>........zqi}u)uhy}y=}r4}o9iq....",
-"....g>(/!x:p<{/l///^mv(>........6ev74uh~wko@]oo]ji'e....",
-"....66(^|:p|{aa'vmm##(eg........zz[d}h~},@@;;tti^'q6....",
-"....66e1n!n{{l1#qq((ee>g........z>qj=4==k@*-&&&[[qe6....",
-"....g66v^/n9p{&q#eee>66.........g6>+do==r,2-a[qqe>6.....",
-".....66qv^{|:{^qqe>66g...........6>&<27rh72&&[ez6g......",
-".....g6>q#/|b|&qee>6g............g6(&+or_w@&[qe>z.......",
-"......g>e#ln!nl[qe>66.............geq-]7$7@+&[e66.......",
-"......ggzem{|n^1ve>6g.............g6e(j7}=@*+[e>g.......",
-".......66>m/|{l1vq>6g..............6>eto}7]j+&e>g.......",
-".......gz>qm^//{^#>zg..............g>e&j]]kk@-e>6.......",
-"........g6eqvln|/m>z6g..............g>q&+]7rote>6g......",
-"........g6zee1n:nm>>gg..............g6eq[2=h=*qe6g......",
-".........g6>emn!n/q(>g...............gzeqj=$=]-[eg......",
-".........g6>>m/!n/^veg...............gzeeto4y]d<#6......",
-"..........g6>vl|n//mq6................gze+]}=7]j&6......",
-"..........gg6qm///{lqg................gg>^9ooo7]&6......",
-"...........ggeqv^/{lvg.................g6q&<do7]i6......",
-"............gg>evl|/#6..................g6eq<]}ki6......",
-".............gg6qmlm(g...................g6>^9]jmg......",
-"...............ge(#(>......................gqvive.......",
-".................gg..........................gg.........",
-"........................................................",
-"........................................................",
-"........................................................",
-"...........ggggggg.....................ggg6ggg..........",
-".........ggg66z6g6gg.................g66z>z>666g........",
-".......ggze(qqq#eez6g..............g6>#[&&&-[qez6.......",
-"......g6>e#v11m1m#(ezgg...........g6eq-<jjjjt-[q>6g.....",
-".....gg6eqm^////l1qqe6g..........g6>#&t2ook5]j-&qz6.....",
-".....g6qm^ll////ii/1#>6g.........gz&j]]oo55o00oj-ez6....",
-"....gg>m{|n{l/il{np{1(z6........g6et7}=k@555k=~7j[>6....",
-"....gz>l|%p{laiinfx!iq>6g.......g>e]}_rk@@@@=4u45&q>g...",
-"....g6e/fx!{iiii<fx!l#e6g.......gzqo$u4k0000w4u$]&qz6...",
-"....g>e/:cf<^aaa|fx:{q>>6.......6e#oh)4k@@@@w$u4,-qez...",
-"....6>e{:}ftaaa&<fcf{[ez6g......6e[7h)sw@@@@,$uh,+qe6g..",
-"...gg>(lfx!9/{{{pb%:{[e>6g.....gze[]$u4w,0,,~su4,+[e>g..",
-"...gg>(l|:f!fjfd:]x!i'e>gg.....g6e[]}$$~~~4$s_u45+[e6g..",
-"...g6e(m/|fdbxcccxxf/[#>zg.....g>q[jor~s_uu)uuu$0+&q>g..",
-"...g6>em{n:%cxcccxbf+#(e6g.....g>e[j5}$_uuuuuu_~,+[q>g..",
-"...gz>(l{ff:xbb::bx!{'(>zg.....gzq[@=~4su__$$_u$,;&qz6..",
-"...gzee/pb]b%dfjfdx!{'#e66.....g>q[5~s___$~~~$u~,;&qz6..",
-"...gz>qipb:]bf9<p:bf{1#e6g.....g>q&5rh$_s~yw~$_4k*-[zg..",
-"...gze(/!xfp9<{i<9fp{&[(6g.....g>q&5$u$ryw,0k=$rk2+[>g..",
-"...g6zq/fxf<iia-/<!9{^m(>g.....gze&o4u~w00@@,w4rk@;&e6..",
-"...gz>q{:x!{''&'i<|n{^&qz6.....g>e&7hu4,****0,==k]j&>6..",
-"...gz>e/!cpia'&'in:!{^m(6g.....gzq[]4)r02**;5yh472;'zg..",
-"....6ze/!x!{&1&'ip%:{mv(gg......6>[o$u4,2**;0ruh7j+'6g..",
-"....66e/!%!/&''[/px:n1#e6.......z>q]4u~02*;+54uh=jiqz...",
-"....ggzm/|{/aa&&/n!n^#e6g.......g6>to}7o@@22574=di[>g...",
-"....gg6qm^ll/ll^///lve>6........gg>&9d@]0]@]5oo]<[e6....",
-"......g>e(m^l///l^mv(66g..........ge[&td]o]o]dj+[>6g....",
-"......ggz>qv1mmmm#v(>6g...........gzzq&+jt9jtii'e6g.....",
-".......g66>eq((((e>>.g.............gz>e#&''[[qqegg......",
-"...........6g6g6gggg..................g66>6>66gg........",
-"............gggggg......................gggggg..........",
-"..........gg6666ggg...................gg666zggg.........",
-"........gggg66666ggg................ggz6>>>>>z6g........",
-".......gg6eqv#vv#(e>gg.............g6>q&ii++-[qe6g......",
-"......g6z>#m^^^^1#q(z6g...........66>e-t@dddji&[e6g.....",
-".....g66eevl////l1[q(6gg.........g6>q[+@oooo]*+&[>6g....",
-"....g6zqm^ll///lll/^v(z6........gz>&t@]]o5o@5oo2+[e6....",
-"....g6>v{|{{/l^^/n|n1qe6g.......gzqtk==k55@@]=r=2&q>g...",
-"...g6z(^|:!nii&&{!:!lv(>g......gzz[drhr=5@22k~h4o+[q6...",
-"...g6>(lp:|{l^&1lnf|{'#e6g.....g6q[5rhr,@2**5=4rot-q6g..",
-"...gze(/pb|i&&''anpn/^'e6g.....g>q[o~_}52*;;@=r=o2t[>g..",
-"...g6e(l!b|i''''^/n|/^mqzg.....z>q&54_=0;;;;25}=k]j&z6..",
-"..g6>(#{!xpi'&'[a{||{l1qz6....g6e[-o4ur0**;;@kr=k]j&>6..",
-"...6z>q{fxp+'&''a{!|{l1q>g.....6eqak$uy,;**;@k~rk@j&eg..",
-"..g6eeq<:x!/'&1&i{!p{lmq6g....g6qq-kh)~,****0krr7]j&>6..",
-"...6ze#{:c:ti-ia{p:p{^vezg.....ze[a7$usw000@krh4k2+[>g..",
-"...6>>q<bc%dp|t|pfb!/m#e6g.....6eq-k_)_s~ywyr4h4oj-q6g..",
-"...gzeq{b}cbf::fbbx!{v(zg......g>q&kh)u_4s_4__u$k+[eg...",
-"...g6>q/fxx%b::p!ff|^qe6g......gzq&o$uu_hhs44$$}d&#>g...",
-"...g6>>^n!fbbf|{{{/^ve66.......gzeq2=44h_~},o7o]+[z6....",
-"....6>e'inpf:p+''mv#e>gg........6eq;5=~4hr,*;;+-#ezg....",
-"....gg>#1i|!b9{1'q(e>66g........g6eij5=4h=k*;-&qq>6g....",
-".....66(#'{t!|{i^[(e>ggg.........6>[-tky$rw52+&(e6gg....",
-".....g6>e(^nf!pni'(>zzg..........g6e[&d=44r=5;[q>>g.....",
-"......g6>>m/p|||{1qe6gg...........g6eq*or}r}o*&q>zg.....",
-".......66>qml/{n/1m#e6.............z>e^t]o7=o2;iq6......",
-"........gzeeqm^//llmeg..............gzq[&t2oo]]9[6......",
-".........gg6zqml^/lm#6...............gzze&9]]o]j&6......",
-"..........g66eqvvvvq>g................g6>q1<{<{&eg......",
-"...........ggg6>>e>6g..................gg6>e(qe>g.......",
-"..............ggg.g.......................6gggg.........",
-"........................................................",
-"........................................................",
-"........................................................",
-"........................................................",
-".............gggg........................gg6g...........",
-"...........gg6ee>g.....................g6z#qe6..........",
-"..........6>(#ml'#gg..................6q[ij]t&6g........",
-"..........>(v^{|/v6g..................e'+d7ro<z6........",
-".........geqv/|:n1>6g................g#&<orh=jez6.......",
-".........g>(vlp%|mez6................gevi]ru}jq>6.......",
-".........g6>(l|%|le>zg...............gzq'b}ur][e>6......",
-"........g66>e^px|lq>z6..............zz>e#]rur]&(>6......",
-"........ggz>(^|:|l'q>6g.............g6>q[d}$}5;&q66.....",
-"......ggzz>eem{!n/^v(z6...........gg>zeq[*747o2+&>6.....",
-"......g66>>((1l|{{l1qzgg..........gzzeq[[jo}=7]j&z6g....",
-".....g6ee##vvml//{/lv>6g.........66#[--++*]ook7]+e6g....",
-"....666qm1m111m^/{|/'>6gg.......6zz&tj**j*j257}ot#>6g...",
-"...g6z>v^/l^l&'[l{!{1(>6g......g>>q+2k5@]2;+@k47j[e6g...",
-"..g6>q#m/{i^m''#^{!n^q>6gg....g6q&-joo]2*;;+274=2&e>6g..",
-".ggzqm^l/{/&''[[a/!n1qe>6g...gzz&t2]ok52;;++@kr=2&qez6..",
-".gz>vl/{{{^1[[[v^{!n^q(>z6g..gze+]]kk7@*++++2k4=2-[q>zg.",
-".g6em{||n</&1''&{|:p<^m[qe>..g>[j7r}=k52***2,}hrk@t+&[e.",
-".geq/pb!|{{/^i{{|:%b!pnl^v(g.zq&o4h4y=k0@@,krhuh4r=o2+[6",
-"g6e#nbcb!{{{{npf:%cxxxb|/^#zg>qi=_)h~k7,k=r$hu)uuuhrodi>",
-".6e#/:xp{{/ii{n|!!::::p|/mqz.>q-7hu4=o55]k7}r4hhhh4}oj&z",
-".g>q^n!{^m1''m^1l/////l^1v(g.6e&d747@tj;tj2d]]oooo]dj<'6",
-".6>evl/m'(eee(e(qq#q#####qeg.zeqt]]j+&[[['[[^&i&iiiii&#g",
-".g6>qm1#(ee>>e>z>>e>e>e((e6..g>e19ji[qqeeqeeeq#eq(q''q>.",
-"..g6e(qe>66z6g6z6z666z66666...g>#'&[e>>>z6>z>zz>z>>z>>6.",
-"....g6zg66gggggggg6ggg6g........g>zz66gggggggg6gzg6g....",
-".......................g...........................g....",
-"........................................................",
-"........................................................",
-"..........g66gg.......................66>6g.............",
-"........g6>eqe6g....................g6e[&q>g............",
-".......ggz(#mq>gg..................g6>'it&q6g...........",
-".......6(qvm^vq6gg.................>[&+jd<'66g..........",
-"......gev1l/{^#>6gg...............g[<j]k72-ez6g.........",
-"......gvl{n||/'>>zgg..............gi]c7}}o;qe>6g........",
-"......g(^/n||/^vqe6gg.............g&d7=}}od+&qz6g.......",
-"......g(#ml/nn{/&#ezgg............g'i9]o==kk2-q>6g......",
-".......g>(ml/np!{1>>6g.............6evt]7=}47jqe66......",
-".......gg6#m/{!fn^#(>zg............g6>ijo74h=d-[q>6.....",
-".......g66(#m^/n/{/^#e>g...........g6>[itd]=kko2iqeg....",
-"........g6>(qvm^/n!{^q>6............66e[^+j2o74=2&qz....",
-"........gg6>e(#v/|:!/#(>g...........g6zeq[-<o}hroi[eg...",
-"........gg6zeeq#l|bp/ve6g...........ggzeq[&+]}h4]+[>g...",
-".........g6>eeq[l|:!/vq>g............66eq[&+@}_4o<&eg...",
-".........g66>e##^|:p/ve>g............g>zq[a-]}h4]+[eg...",
-"........gg>e(vml//n/mq>g............ggeq[+*]]7=o9&q6....",
-"........g6>e[^/n{lmmq>zg............g>([+2o=7]jt&q>g....",
-"........66(#vlnp{^qe>66.............6z[-+]=47d&'e6z.....",
-".......g6ev^{{/{^v(>zgg............6>q<d7777]+[e>6g.....",
-".......ze(^npn/mvee66g.............>#&d=47oj{[qzzg......",
-"......g>(v/!%p^(e>ggg.............ge&i74urd[qe6gg.......",
-"......g(v^/|p/m(zz6g..............g'<do}}o9[e>zg........",
-"......gq^{/llmq66gg...............g&d7ob]t&>zgg.........",
-".....ggv/|/m((e6g................gg<o}k9&'qzz...........",
-".......qm/m#(>ggg..................&j]9i'e6gg...........",
-".......>(vee6zg....................e'<[qz>g.............",
-"........gggggg......................g6gggg..............",
-"..........g...........................g.................",
-"........................................................",
-"........................................................",
-"........................................................",
-".........ggg6g6g6g...................gg666666g..........",
-".......gg6gz6z>z6g6gg..............g666>>>e>>666g.......",
-".....ggz>((q#####(e>6g...........gg>#[[&-----&#ezg......",
-".....g6eqmmm1^^l^m#(eggg........gg6[&ttjj2@b2t-gg....",
-"...g66>qm^ll/{nn{l1vqzgg.......g6>e&t]]]o7==7]j+&e6g....",
-"..gg>e#m^llll{npn{l1vq(>g.....gge[-t2@]]]k=4=k]j+&[e6...",
-"..g6qml^l/^&1/p:pn{ll1v(6g....6>&9]]b5@2*or$4=,]]j+[zg..",
-".g6>mln{/l^'[/|bf|{{/l^#>6g..gzeto77k]2;+5}_4r=koodie>g.",
-"gg6e1{|{/l1'[/p%:p{{{{lv(>g.gg>#j7}75@j;+5ru$}kkkko<[e6.",
-".6e(^n|{1''#ql|bp{all//1#(eg.zq&d=}k2;;a-5}h4k@5]o@j-&qg",
-"g>e#l||{mqq##a|bp{1&/{/^1#ezgeq-]}roj----@=_}k*257k@ti[>",
-"g>e#/|!l'qqq#^n!|/&al//l^mq6ze[io}$];&&&&@=4r5*@55o]dj&z",
-"6eqvlpf{'q(qq'/|n{/{/ll//lv>6q&{5}$o;&&&&*o==koo5@]oo]<e",
-".e#m{|!l&(q(([^l{{|{ill{|nm>g#-97r$5*'&&[+2ok=yk5@@7y=9#",
-"6e#v/pf/1q(qe['1/{p|i&^{|n1(6qito}$k*&[&[+;25=~y52@xr=j[",
-".zev/|f{'#qeq(['lnp|{ll/n{vegeqior47*--[&&+;574}75]k77<q",
-".g>(lp:n^[#(((q#anf!nl//{/v>.6e'brh=2+-[[[&-@7$475@o7o<e",
-".6ge^|!{l'#q(e(qmn!!n{l//l#>.z6qd}47];--[[[&j=44=oooo]ie",
-".gg>v^{ll^1''#qq'l{{nn{l^v(g.g6e<do]]2*t;-&&;]77==7]2t'6",
-"..gge#vm^l^1^'#e#m1/{pnl##>6..gzqi<9d]djd;-[-;25=rybi&e6",
-"...gg>eqm//ll1[e(##m{!|^(>gg...g6eqij]o]]j+[&-ij74}d&ezg",
-"...ggg>(#vvvvq(ee((vm^^#>gg....gg6e[i<<<+&vqq[[ij]die6g.",
-".....g66eeeeeeee>>>e(qqe6g.......g6>(#[q[[#qeqeqv&&q6g..",
-".......gggg6g6z>6666gggg...........gg66666eez6>66zgg....",
-"..........ggggg6gggggg................gggg6zgggggg......",
-"...............g...........................g............",
-"........................................................",
-"........................................................",
-"........................................................",
-".........gg.g........................gg.g...............",
-"..ggg6g66g6g6g6ggg............gg666z66z6666ggg..........",
-".gg>>>ez6zzz>z6666gg.........g6eeqq>>>>>e>>>z66g........",
-".z>eeeq(ee>>e>e>>z6ggg.......>e[#[&[qqqqqqqee>z6gg......",
-"g>#vmm''['1^^^'[###(>6g.....gq-<tt;;;;*2@2;+---[qzg.....",
-"6qm^^/ll^i{||{ll111vq>6g....6&td]oo]@5k=}=o]2jj+&qzg....",
-"6#^/{{nn{{pf%fp/{/l^#e>g....>id]777=7krhu4roooodi#e6....",
-"g(vm^l^lal|f%!{^^11vqez6....6'<*2@@525=4u4k@2jj<&q>6....",
-"6ee#['&&1&{!bp{1''[#e>6g....zq[i+;**22k$h~k*;;+-[q>g....",
-"g>>ee(#[[&{fbpi[#q((e>6gg...6eeq[&-++*,~_r0;-&&[qe>6g...",
-">ev'''['1&<!x!/''[#qeee6g...e[+;;;+;*2k$ur,;;+-&[qq6g...",
-"(vll^''&1a<:%j<&'&[[q((6g...[<]o2***2@,4u~w2**;+-&[>g...",
-"(^np{l&a-ipfcf<a&'1'[#ee6...']7},@2@@@~hu4,@2**;+-[qz...",
-"em/{ll11^-p:cfna^11'v#(>g...q9o7]@*2@@ysu$=@2**;+-&e6...",
-"e#ml111^al|:xf<^&1[m[#(>g...#ij]jj*2@@~hu4,22j;t+i'eg...",
-"6(#vv['1&ln:x!{&&m'v##(>g...>vi<+;t*2@=hu$k22;;+i-[eg...",
-"g>eq#v['m&n!x!{1''##q(egg...ge[1-++;j*=$u4,*;;i-&[#zg...",
-".66>e((q['{!%|/##qee>>6g.....6>e#'&&+;,4u}]--&[qeezg....",
-"..gg66>ee(/|b|1q(>>6gg........g6>ze[[&o}_}2&[qe>6g......",
-"....66z>eelpb|1e(>>6g...........6zzeq[]}_=2[[ee66.......",
-".....g6>>(l|:n&(>>g6g............gzeq[]}h=2[qe6zg.......",
-".....g.>>>l|:n1(>>6g.............ggzeq@}_=j[qe6g........",
-"......g6>e^|bn1(ezgg..............g>eqdrhk2[q>zg........",
-"......gg6>^|%|lqe>6g..............g6zedrur@&[ezg........",
-".......gz>^|%|/vq>g................g>edrur5<&eg.........",
-".......gg61|%|/vq>g................g6>jru}]<&qg.........",
-"........g6vm{^v(e6g.................g6ij7d<&q6g.........",
-".........ge(q(e>6g...................gqv^&qe>g..........",
-"...........6g6gg......................g6666g............",
-"............gg.g........................gg.g............",
-"........................................................",
-"...........gg..........................gz...............",
-"........g6e(qeg.....................6zq'.............",
-".......6>e#vm#>....................ze'i{j&e.............",
-".......ge(v^lme....................6#v<d]9v.............",
-".......6>em/|^(g...................6eq9orj&g............",
-".......g6em{!/#g...................gz#974kig............",
-".......ggem|:/vgg..................g6#j}ho<6g...........",
-".......gz6mn:{v6g..................g>>9=h7<6g...........",
-".......gzem|:/vgg..................gz#j}ho<66...........",
-".......6g>mn:{mzgg.................6ze9}$7t>gg..........",
-".......66>m|:/m66g.................6>ej}h79>6g..........",
-".......66e^{b{v>gg.................6>qj=h7<e6g..........",
-".......66em|:{m>6g.................6>qj}h7te>g..........",
-".......g6em|:nm>zg.................6>#j}h=tez6..........",
-".......66em|:{m>>6g................6>qj}h=jee6g.........",
-".......66>^nb{1>>6g................6>ed}h7*qe>g.........",
-".......g6>m|:{me>6g................g>ej}h7jqe>6.........",
-".......g6>^/:n1e>z6g...............g>ej7h=j[qz6g........",
-".......gg6mnp{^q(>gg...............g6>j=472&[(6g........",
-"........6zvl|{l^vezg................6>{]}7]2+[>6........",
-"........6g#m^//{l#e6g...............6z&9]o77]iq6g.......",
-".........geqv/|:{1>6g................6#&+]}h7jq>6.......",
-".........g6e(m/|/1#e6................g>q^joroj&qz.......",
-"..........g6e#m^1mvq>.................6z#&9dj9<&e.......",
-"...........gg>e(#mmv>..................g6eq'itj<q.......",
-"............gg6>(#m#e...................gz>e'i9i#.......",
-"..............gg6e(eg.....................g6z#'q6.......",
-".................gg..........................g6.........",
-"........................................................",
-"........................................................",
-"........................................................",
-"............g.ggg.g.....................g.ggg.g.........",
-"........ggg6g6gg66g6ggg.............gg666z666z666gg.....",
-".......gggz6z>>>>z>6z6gg...........gg6>>>eeee>e>>z6g....",
-"......g>eqqq#q#(#q##qqez6g........ge[&&&-&-&----&&[e6g..",
-".....ggqm^^^1^&^&&^&1'v(6g.......g6&t2d222222222*t+[>g..",
-"....g66v^{{{{{{{{{{{//1#>6g.....gz>+]7,7k,ko,7okk52-qzg.",
-"....g6>m{nn/{/{/{/{{<{{'ezg.....6>et7}77ook,okkkk=5;q>6.",
-"....66>^|!p{aiiaiii{||n1(>6g....6zqd=4=k@@@0@00,=~=j&e6g",
-"...gz>(l|bt{aaaaaiii9fp^#e6g...g>e[]r_y,@@@@@00,y4r@-q>g",
-"...gz>q/!:p{ai&iii+npdpaqe6g...6>q&]4hrw0@@0@00w~4~@-q>6",
-"..g6>(#/p:!9n<<<<<<9f:fi#ez6..g6e[a,~$~=,w,wwwwy~s4@-[>z",
-"..g6>([{|f!p!|9p!f!j::p+[>>g..g6q&+5r$~~~yyy~~~~ss~0+qe6",
-"..g6(v'{!:dfjf!jfjf:fd!/[(>6..gz[+;k~4s~~~~~~~~s$$4,+[ez",
-"..g>v^{np!p!!!f!fd:::!pl&q>6..6e+]7}~~~~~~~~~s$444r5*-(z",
-"..gzmnp!!!jppj9ffd:d!f9i1[(6..gej74~4~~}~~~~~sss~~y@*+[z",
-"..6>^|f!p!9!!p!jf:bd!9{l1v(g..zed}44~~y~~y~~~$ss~yk5j+[z",
-"..6zv^{n9p9|99p9!dxdf<{&[(e6..6>+dk==~yy=yyy~sus~w,2+",
-"..gge#'ltp9||<|9fbcb!i&'q>6g..g6[i;5w~=yywyy48u_~52;&q6g",
-"...6zeq&{p|<t<t<f:cb9/'#e>gg...zzq&2k~ywwwww~$)sy0;-qe6g",
-"...gz>(l|f9<n{/+t!ffn/1#ezg....z>q[@=syww,,,wr$4=52-q>g.",
-"...gg>(a|bp<i+ii{<9n{/^#>6g....g6e[@~4~w0000,wy=k]2-q>g.",
-"...gz>>l|b|/-iaaii{///lv>g.....gzeq]rh=,00@@0@,oko]+eg..",
-"....66e^|!9{iaaa&^&111v(6g......z>(2=$y,0@@@@222jj+[>g..",
-"....g6>1{!n{{/il1'v##qe>g.......g>ej74=k,0@@2;+--&[eg...",
-".....66vl{n{{{la^[e(>66g.........zz<]==kkk5@2+[[#>6g....",
-".....g6#^l{{|n{l1#e>z6g..........g>-jo7=r=ko*-qez>6.....",
-".....g6eq'/|fn{l1#>66g...........g6#&;]}4}o]j-ezzg......",
-"......g6eelp%fnl'(>gg.............g>q']ru$=]t&e6g.......",
-"......gg6em/n{^'#e66..............gg>q9o}7dt-qz6........",
-".......ggz(vmmq(e6g................g6>v{jti[q>g.........",
-".........g6z>>z6gg...................6z>eezz6g..........",
-"........................................................",
-"........................................................",
-"...............g.g.........................g.g..........",
-".............gg>ze>>g....................g6eeqqe6.......",
-"...........gg>>(qqvq>g.................g6eq[&&+&eg......",
-".........gg6ze(qvmmveg...............g66>q[&<9j<[6......",
-"......gggz6>>q'^^^lm(6g...........gg6>>eq&;22d]t'6g.....",
-"....gg6gz>>>('l/{//1#6g.........gg66>eeq[;]oko]j->6.....",
-"...gg6z>>e(qq1{pn{l1#>66.......gg>>eqq[&&*kr=7oj-ez6....",
-"..g6e#'m'1''1l{p|nn/mezg......6>[it;;*;**57rr==otq>6....",
-".6z(m/n{{n{//{<pp!fn1(z6g....6z'9o====kookwy~44=2[>6g...",
-".6e#/!%:::!p9|nnp:bpl(>6g....>#io4uh$h4~y==wrh_4@&e>g...",
-".6>q^|f!::!f!p|<p!bpl#(6g....ze&d}44hh4~~~=wrrh}]-[>6...",
-".66>v^/n|!fpp9<{|np|l1#e6....zzq<do=}444~y=,w}~}ojiq6...",
-"..g6eqvln|!!f9{-{<n{/l1q6g....gzq&<]=r~~4yk0kk=ko]j&zg..",
-"..g6zeqm/np!:|{ail////m#6g....gzeq&jo=}4syw@55koo]ji>g..",
-"...gg>evm^nj:p/1&11^l/lv>6g....g6eq+j@=~h}5***j2]o]+#zg.",
-"...ggg>eq[/pb|i[[[#v^/lm(>g....gg6e[&+]~hr0+++-;do]t'eg.",
-"....ggz>>ql|:nl[#((#m/lv(>g.....g6>eq&]rh}@+-&[ij]]{'e6.",
-".....g6z>>m{nnl1'#((#vq(>g.......g6zeqto}=]2;-[[/<&'e6..",
-"......g6z>v^//{/^[>ee>>6g.........gz>e+2oookd+qqq#e>g...",
-".......gg6e#^^/{lve>6zgg...........g6z'+2]ok]+qe>z6g....",
-"........g6ee#ml/lv#(>6g.............g6q[ij]o]t-'ezg.....",
-".........g6>emm/lmm#egg..............g6e({jo]jti#6g.....",
-"..........gggqm/l^m#e6g...............gz6&jo]djiq6g.....",
-"...........gg>#vvmmv(g.................gge&<<99{'z......",
-"............gg>eq#m#(>g.................g6eq&i9ive6.....",
-"...............ge(v#(66...................ggq'<i'>6.....",
-"................ge(e>6......................6q[qez......",
-".................6ggg........................z66g.......",
-"........................................................",
-"........................................................",
-"...........gggggg......................gggggg...........",
-"........ggggggg6gg..................g6g6666>6g..........",
-".......6eqee>(vm#e6g...............z#&qqe[+9i[zg........",
-"......ge#m#qev^{^q>6g.............6#iti&q+d72&e>g.......",
-".....g6qm^mqq1{|/me66g...........g6&t];-&*7}otqz>g......",
-"....g66vl{l'qln:{1ee>gg.........66><]7];-@=h=*[qe6g.....",
-"...g66>mnp{^[lnb|a#>>6gg.......gz>(j=472+5}hr@-qez6g....",
-"...g6>e^|:ni1{!b|iqqe>6g.......gze#d}h=5*k4_r@-&qezg....",
-".g6z>ee/|:ni1{!xp+[q(>z6g....g>>eq[5rh=@*kru~0+-[qe6g...",
-".g>e>eq/!:p/at!xp{'[qeegg....6eqq[&]rhr,@w~uy,;+&qq6g...",
-"g6e((eq/p:9/a<fx!+'[(eezgg..g>[[[[&5~hy,@wsu~,*+&[qe6g..",
-"6(v111mnfxft/!dx:<i&&[q(zg..z[<jj*j=4u~,,~sus,02*+&[>g..",
-"6#l{/llpbxf!tf%}%p/ia1&(>6g.6i]7o55r_us~w~_)_~,0@2*&qzg.",
-">mn||n|!bcbfpdxcx:9t{{^vezg.ej=r}==4_)h4rsu)u4www5]+#>g.",
-"6v^////!:x:f<!%xd!{{i^1q>6g.6<dooo]~hus~w~_us~k,52j&q>g.",
-"ge#vmmmndbp<+9:x:9i^&'#ez6..gqi<ttj=$_4w,y4usy@@2;-[z6..",
-".gg>>(q/pb9{a<pdp<a1#qe>gg...g6eq[&o4hy,@w~s~k@*-&qezg..",
-".ggg>>(lpbn-1i9f9{a'[(>66g...gg6e#&]rh=@*0y~y,@*+[q>6g..",
-"..g6ze>l|:ni&a{|n{/^[(e6g.....g6zq(]rhy0*0kr==]@+[q>6...",
-"...g66e^|:{^[^i{{<ni'e>z6......gzzqd}h7@+25,kk=@;[ezz...",
-"....g6>^{:{^['&l/{nl'e>6g.......g>ed=$72+;2@,7=o;[e>g...",
-"....g66mn:{m##''^{|{1qezg.......gzzj=h7j--;t@7r7*&qz6...",
-".....gzmn!/mqqqqm{|n^(e>6g.......g>j=4oj&&&&j,}=2&qe6g..",
-".....g6m{!/meee(vl|{^#e>gg.......gz974ot[[[[{]r7d-[e6g..",
-"......gvl|^#>>>>qmmm1m#(6g........g<]}d-eeee&tjjj;i[>6..",
-".......#^{mq>6>6>(q#m^mq>6........gid79&eze>e[&itd9&e6..",
-".......(mlv(6g6g66ze#^mqegg........v9]<vz666zz>#idjg.",
-".......>(#(66gggggg>eqqe6g.........e'i[>6ggggg6e#&g..",
-"........g66g....g.gg6>6g............666g....g.gg>e>6....",
-"........................................................",
-"........................................................",
-"...........ggg.........................ggg..............",
-"........gg6>>>6gg...................gg>eqezgg...........",
-".......gg6ev^#(ggg.................g66[<di[66g..........",
-".....gg66>m/nlv>6g6g.............g6z>eto=]+ez66g........",
-"....g6z>>em{!/meez6gg...........g6>eeqj=rktq#>>6g.......",
-"...g66>>eql|:{&qee>6gg.........6>zeq[&]}h=2&[qez6g......",
-"..66>eeqqq/pb|^(qeeezgg.......66eq[&&a5rh}@&&[qq>6g.....",
-".g6>e###['{p%p/'[qq(ez6g.....6ze[---+;k4u}5;+--[qe6g....",
-"gz>q1/{{i^|:c!{aa/i1mqe6....g>e&*o,,0@=hu$,@@002t&[z....",
-"g>(v/f:p|{pb}bp{{|p{lm#>g...ge&+k4hr=wrh)hr,7=r=]tiqg...",
-"6e(1|b}bpt:%cbf<pp:!{^vqg...>q&j=u)h~w$_)_~wr4h47d<[6...",
-"ge([n:%!<{9%cdp/<|!|{^m(g...6q&+=hu4w,~_)sr5krrr7dt'6...",
-"6e(#n:%!{i9fxf<a/n|n/^me6...6q[+7hu~k@=$u4w@,=r=odt[6...",
-"g>(#{!%9i&|fxf{'a{|n/^m(g...6e[-k4_y02w4u~k*@,}=odt'6...",
-"6>eq{fxp{a9bcf<i{n!n/^m(6...6e[ak$uyw0=su$,5,=4=kdt'6...",
-"6>eq{f%dn{!bcbp{npf|{^v(g...zeq-ohu$=w~_)h~,=r4r7d<'6...",
-"g>>({:x:ptfx}bf{pf:!{^v(6...6eq&khu$r=$u)_4=r$hr=d+v6...",
-"gz>e^n!|{/p:cf|/{{!n/mveg...g>e[@}$}k5~hu$}57=4=oj+#g...",
-"g6>em/nl^&nfxf{1l///mv(>g...g6e(t5752*7$u4k*@]7oj<&eg...",
-".g6>(v1[[#l!bn^[v1^^vv(z.....6ze&<j++-]4_}@+<jdjtive....",
-".gg6eqv#((l|:|^qqvv#q(>z.....g6zq&+-&&]}h}2&-+ti&'ez....",
-"..gg>>e(((lpb{^qeq((e6g.......ggeq[[[']r_72&[&v'q>z.....",
-"....g66z>e^nb{mee>6gg...........g6z>e(d}_7jq(e>66.......",
-".....gg66>m{!{vz6z6g.............g6>>e9747<ez>6g........",
-".......666v/|l#>6gg................z6z<]}b-ez6g.........",
-"........gg#m{m#g6g..................ggij7j&66g..........",
-"..........(v^veg.g...................g'<d<#g.g..........",
-"..........6eqeg.......................z#&qz.............",
-"...........ggg.........................g6g..............",
-"........................................................",
-"........................................................",
-"...............gggggg......................gggggg.......",
-".............g6>>>666gg..................gzqqez>z6g.....",
-"............g>(#qe(e>66g................ge'i&[[#ez>g....",
-"............ge#mm#q((eeg................6#ijt-&&[#q6....",
-"...........6g#1/l1[##(e6g..............z6&jk]j+--&qzg...",
-"..........g6>v/pn/1'[#q>g.............g>e+or752;+-&eg...",
-"..........66>mnf|n^^1'q>g.............6zej7hrk@@jt...",
-".........g6>>^n:!|{/1'qe6............g6eq2=h4}k5j;&q6...",
-".........gg>em{p||n{^#e>g............gze[j,rrr=k2-[e6...",
-".........gze('ln9!fn^#e66............zzq[;5==r4=@-q>6...",
-"........g6>(#&l<9pf|&#ez6g..........gzq[-25wy~$=2-qe6g..",
-"........gge#m/n!!ffn^[e>gg..........g6q-t5=~~~4=@+[e6g..",
-"........g6e'^{pdfp!<l[qegg..........g6[;2krs44~=]+&q6g..",
-"........66q'l{!%ffp{i'qezg..........6>&;d=4_$~rw@;&[>g..",
-".......g66e[1{pbf!9{l'[e6g.........g6z[+*,rh4~=w5;+[>6..",
-".......g6>eq[{!bdp<<i1[q>6.........g>eq-+k~_s~wk5*+&e6..",
-"......g66z(([a9::!n{i1'qz6g.......gz>e[&+@yh4~=,52;&e6g.",
-".....6g6>e(q#/|bfj!n{l1#egg......6zzeq[&-5yhs~~=,]*-q6g.",
-"...gg6z>>e(q[-<f:!f!<{^#e6g....gg6>eqq&-+@w$44~~=k@-#zg.",
-"...gg6>z(eqq[it!ffd!9{iv>6g....gz>ee[[&-+0w~$$sryk5+qzg.",
-".g6>(q#[''&aln|!f!!pn/1#z6g..g>e[&-+;;2@@=y4~~$~=]j-e>g.",
-".g>evml^l/{{p|9|p!!|l^[qz6g..6e[+j@]@@k=r~y}~~4=52+&z6g.",
-".z(q1/{{{n|!:f!9p||n^[(e6g...z[&jo777=}$h44=rrr=@+&q>6..",
-".6>(v^////{nn{/li/{i^1#e66...ze'<doooo7777o555o52j-[6z..",
-".g6ev1lllll^^m&m'1'1^mm(zg...6>q+j]]]]@2dj*t;j;j2jt&zg..",
-".g66qmm1mmv(e(e(eee(1l1#g....g6>&tjjjj+&[[[[q[[&j]j&z...",
-"..gge#vvv[q(e>>>ez>e#vveg.....g6'&+<<+&[qe(eqee[i<<qg...",
-"...g6>ee((>>6z6g6z6zee>6.......g>e[q[[qe>>zz>>6>q[e>....",
-".....ggg6666g6g6gggg.g...........gg66666zzg6gggg.g......",
-"........................................................",
-"........................................................",
-"...........gggg........................gggg.............",
-".........g6>e>>6gg...................gzq[qez6g..........",
-".......g6ge#vvq(>6g................g66#i<+&[ezg.........",
-"......ggz>#mlmvq(>gg..............g6>ei9]j+&[e6g........",
-"....gg6z>>m/n/1qe>z6g...........g6>>eq;o=oja[e>zg.......",
-"...g6>>>qe^|:n1#eee6g6.........g6eeq[[2}h=2-[[q>66......",
-"..gg6eeeq#/px|/qq(eezgg.......g6>q[[&-]4ur5-&[[q>6g.....",
-".g6>#1l^11nbc:na&'[#qe>6.....gzeij]2*2}h)h7@**+-&[qz....",
-".geq^n!n{{f%rbp{{/l^1mqeg....6q&d=4}kk$u)h4,k5]d*<&#g...",
-".>evn:xb!|bc4xbj||{{l^meg....e[+=huh4r_))uh~r==7]dt[6...",
-"g6eqnbx:p|f%cx:ppnn/lmveg...g>#i=_uhr=4u)uh~r==o]j<#g...",
-".6eq/f%!{in!b!!p|{ll1vq>g....zq&74u4k0=~s$~~yw5]j+&qg...",
-".6>(/!%n/'-<|9nt{{^mv(>6.....ze']4u=o*0ky==wko2j+[q6....",
-"g66(/!:ni1a/{t|9{i1'q(>6....g>>'o4h=@*@5kwy=k52;&[ez....",
-".66el!:n^&&ai{9!{^'#e>66.....6z[]4$=@*2@0ky~7@;-[e>z....",
-".66e^|!ni'&'&/|:|a#q>>6g.....6>qd}$=0*2**,}h=@-&qe6g....",
-".66e^|!na1&'&/n:na#(ez6g.....6>qd}4k@*2**0=h=@-[q>>g....",
-".g6>m/|/{/aa&{n!nl[q>>gg.....g6q9o}7o0@@2k=~=]+&qe6g....",
-".g66v^/{{{{/l{nn{1'#(6zg.....g6><do7kk,05,=},2;-[z>g....",
-"..g6q^l/nn{{i{{n/^'v(>gg......gz&j]o=}7k5kk7]];+[e66....",
-"..g6eqv/|fnn/i^1^/l^mqezg.....gz'i{o}4}7]5@d2]]dt&#>g...",
-"...g6eqlpb!n/^m[mlnl^m#>g......g>q&orh4=o2t+j]=o2tiqg...",
-"....66>l|%pn/m#ev^n{lm#eg.......6>e]ru4=oj-[+]=7]9iqg...",
-"....ggzv^{lmm#(>qv^mmvq>g.......g6>i]7bjt-'e&<djt+&q6...",
-".....ggz###((e>6ze(qqq(>g........g6e&iiv'qezeq[^&&'eg...",
-".......gg6g6gg6z6gg6eeezg..........6g>6666zz6z66#v#>g...",
-".........gggg6gggggg6>6g.............gggg6gggggg>ezg....",
-"....................ggg.........................ggg.....",
-"........................................................",
-"........................................................",
-"........................................................",
-"........................................................",
-"......gg6g6g6g6g6ggg..............g66666666666gg........",
-"....gg66z6>>z>z6z666gg..........g666>>ee>e>>>z>z6g......",
-"...g6z>>>e>>>>>e>e>>z6g........g6>qeqqeqeqqqeqee>zg.....",
-"..gg(v1'#(#e(ee>q#'v#e>6......g6[+j;-&&[[q[q&-;+-[qz....",
-"..g>vl{/&'[qqeqq[1/^m#q>g.....ge<]752;+&&[&&+jo]ti&eg...",
-".gg>^np{^&'[q#(('/n{l1#>6....gze2=47@*;+&-&&*5=7]j-q6...",
-".g6>^|!ni''[(###&lnnlmv(g....g6qd}4=@*;+&---*5==]j<[6...",
-".gz>^|!nl'[[##qq&lnn/^m(6g...gz#d}4=@*++-a&-*@==]2t'zg..",
-".g6e^|!{^&[[##q#'/{n/^mqzg...g>qd}4,@*++----*o=7,dt&>g..",
-".g6e^|!na[[q####1/n{/^1q6g...gz#d}$7@;+--a--*5==k@j&>g..",
-".g6(^|fn^&[#qq##'i|n{lmqzg...g>[]}4=@*+a&&--*5=7o@j&z6..",
-".66e^|!<a[[qq#q#'/n{/lmqzg...6zqd}4k@;+-&a&-*,==o]ja>g..",
-".6ze^|!n^&[[qqq#&i|n{l1q6g...z>[d}4k@*++&-&-*5y=5]j&zg..",
-".g6e^|f{a[[qqqqq1in{/^1q>g...g>q]}$k2;+-'&-a*5==o@j&e6..",
-".g6e^|!{^[[#q(qq&/|n{l1q66...g>qd}4k@;+-&&&a*,y=k]j&>6..",
-".g6e^|fni&&[[['[a{|n{^m#6g...g>q]}4=@2*;++;+@,}=k]*&>g..",
-".g6e^|!|{l-a&&&^/nf|{l1qzg...g6qd}$},0@@*222o=4r7@j&>6..",
-".g6>^|f||{{/{//{n!:!nlmqzg...g>ed}$r==k,o5ok=4h47]t&>g..",
-"..g>mn!pn{//lllln|!p{lmq6g....6ej=4r=ko555]5=r4rk]t&zg..",
-"..g>mn|{l^11m'1&l{pn/1m(gg....6ej=r752j*tt**@7r=o2t'6g..",
-"..gzm/|/1[#(qeq('^n//mm(6.....g>9or]j+-&&[&&;]=7ojtvz...",
-"...6vl{^v(((e>ee#mll1m#eg......6<]7d+&[[qqq[-j]]jjiqg...",
-"...ge#v#ee>>z>>e(#vv#ve>g......gqi<i[qeeeeeq[-{+ii[eg...",
-"....g>>>666zz66zz>ee>>>.........6eqezz>zz>zz>q(#qeeg....",
-"......ggggggggg6g6666g6...........gggggggggz66>6>z6.....",
-"........g.g......ggg................g.g......ggg........",
-"........................................................",
-"........................................................",
-"........................................................",
-".......gggggggggg..................gggg6ggggg...........",
-".....ggg666z66ggg6ggg............gg6>>>>>z66666gg.......",
-"....g6>>>>>ee>e>>z6gg6g.........6>eeeeeq#eqee>z666g.....",
-"...gze(ee(ee((e(>>e>z6zg.......g>q[[[[[[&[[[qq#e>>z6....",
-"...6>#[[[[[[[#[##qqq(e>66g.....6q-+++++++-+---&&[[ez6g..",
-"...6#l{{{{/iaa-iiii^&^mq>6g....>-]7k,,0@@@00@@5@22t&#zg.",
-"..g>^nf!ff|n{nn9||||n{lmq>6...ged=h4$$~w,k=yy}}}=7o9.",
-"..g>^|b:bbf!n9!f!!!!||{1qeg...ged}hhh_4~=y~$~444r}7j&q6.",
-"..g6v^{n!!p!9p!:pn{//l^ve>6...gz<d7}r4r~y4~4r=k5o]di#e6.",
-"...geqvl{99pp!ff9{1mmvvq6g.....g#1<]7=y~~r~s=,2*jt+&>g..",
-"...gg>evl{|<|j::|i'###q>gg.....g6e(;5k==y~4_y@;---&e6g..",
-"....66>#'^i{{9!bpi[#qee6g.......z>e&t255ky$hr0+-&[#zg...",
-"....gg6e([''&npb|i[(e>>gg.......gz>q&+;*2,~_r5+&[qezg...",
-".....g66>e([[{9%pl((ezzg.........g6>eq&++krhr@&[qz>g....",
-"......g66eeq#^p:naqee66g..........g6>q[&-@rh=@&[q>6g....",
-".......g66>eq1n:n^(e>zg............g6>e[&2=hk2&qqzz.....",
-"........g6>>(1{p{&ee>6g.............gzee[j747*[qe6g.....",
-".........g6z>[/|{1#eezg..............g>zq;]}7*-[q>6.....",
-"..........gz>vl{l^[q>66...............g>e+]7]2+&qz6.....",
-"..........g66qm/lmm#(6g...............g6>^j]]jj-[66.....",
-"...........ggevm1^^mqe6g...............g6#+jj2dt&#zg....",
-"............6>(#v^l^vqe6................6e[i<2od<&#>....",
-".............ggz#^{lm#(6.................g6>id7]jivz....",
-".............g6g(ml^mq(z.................g66vt]dt&'>....",
-"..............g6>(#v((e6..................g6e'ii&v#z....",
-"................gg6>>>>6....................g6>eeeez....",
-"..................gg66gg......................gg>z6g....",
-"....................g6g.........................gzg.....",
-"........................................................",
-"........................................................",
-"........................................................",
-".........gg6g66gzg66ggg..............6g66z66z6z66gg.....",
-".......g66>#v((>(q##(>6g...........g6z#&+&[e[&i-&qzg....",
-"......gg>evm/1#>#^l^1v(>g.........g6e#+joj-qi2odji&eg...",
-"......g6eq^n!/1qm{pnl1#>g.........g>q&d=4oj&*or}ojiq6...",
-".....66eeql|f{1#m{!|{^'(zg.......6>q[&]}4=*-j74}od;[>g..",
-"....gz>(q#lnbn^#^{|n{^mq6g......6>#[&i]}_=@-2kr=kdt&z6..",
-"....ze(qqv/|%ni'1{|n{lm#>6g.....>qv&-<oru}5;*k}=,]j-ezg.",
-"....6(#vvm{f%!/'/{p|n{^ve6g.....>[i-+t74u45*5k~==k@+[zg.",
-"....eqvm^^|:xf|i{p!!|{{m#e6.....q&{j2]}hu4y5kr$$y=oj-#>.",
-"....e#ml/np%x:!<|fb:fp|lvq>g....#ij]]=4u)h~ky4sh44y]{&eg",
-"....e#mll{pbcbp{9!::!!nl'q>....gqi9]ox4h)h4ky4$h44=];&e.",
-"....6eq#m^n:xf|l<9!fpn/mqe6.....>q&itd=hu4y5ky4$}=oj&q>.",
-"....gg>e(#/!%p/&/n!|n/lve66.....g6qq&io4ur,*,k~=yo]+'>6.",
-".....6g>eel|%pi&a{9|{l^#>6g......66eq[]}u}5*@ky=k52-e>g.",
-".....g66e(lp:|l[a{pn{/^#>6g......gz>q[]rhr5;@kryk5d-e6g.",
-"......g6e>l|%|/[^{9|{im#>gg.......gzqq]}u}5+2k=rk5jie6g.",
-"......g6zel|bni[a/|n{l1q>6.......ggze(]}h}@;@,y=k@j&ez..",
-"......gg>>^|%|i[&{|{{/m#6g........gzeqdrur0+2,}=k5j-z6..",
-"......g66e^|b|l'&{9n/l1qz6........g6>qd}hr@;2,==o]j&>6..",
-".......66>^nb|l[&{n|{^mq6g.........6zed}hr@+*k}=,@j&>g..",
-".......g6>^|%|{&lnpn{l1qzg.........g>edrur,25=~}7]j&>g..",
-".......gg>^!%!nl{pf|{lme6g.........g6e24u475kr$r7]t[>g..",
-".......g66^px:|{n!:!{^m(6..........gz>d4uhr7=rh47dt'6...",
-"........ggv/|{l^//|{lm#eg...........g6<o}7]2o7=7]j-q6...",
-"........gg(m^mvqm^l^mvq>g...........ggv9dj{-td]29+&eg...",
-".........gg>eeez(qvvq(>6.............g6eq#(e[&{+^'q6....",
-"..........gg6666eeqee>>g..............g6>z>>q[&[qeeg....",
-"...........g6gggg6>>6gg................gzgg66>eezzg.....",
-".................g.g.........................g.g........",
-"........................................................",
-"........................................................",
-"...g6>>>e>>6gzg6g6ggg..........gzeqqqeez6z6666ggg.......",
-"..6>qm1m##q(>>eee>6gggg.......ze&;j;+-&[eq#[qq>66gg.....",
-".6>em/{/l1[q(qq#q(eez6g6g....ze[jo7]]*+&[&&-&[q#ez66g...",
-".6eql|!n{l1[(#vm'v((e>zggg...z#^]}4}752+&-+;;+&[qe>66g..",
-".g>(m/|{{/^i&^^il//^^mv#(>6..6e'jor7k5@@2@@5]5o]2;<-'q6.",
-".g6evl////{{{<{{{|fpn{/1m#>g.g>q{]o]o5k,7k7k=r$r=7]jti#g",
-".g6>#m^l/i{!!!|pfbxxf!|{l1(6.g>e-;d@55k~44}}4huuh4r7]j'6",
-"..z6qv'^i{||!|{{|!::!nn/mveg..z>&+*@5k==rrkk}$hh4}7oj{qg",
-".g66e#'&/{tn!n/&{|!!n{lmvqzg.gzz#-;25wwrrk52k=4r=7bj+^eg",
-"..gz>e[1+nn|9/a[1{nn{lmve>6g..6>q[-2,=y=yk@+2k==7]ji[e>g",
-"..6zeq[^{|9n|/1[1^////^v>>g...6zq&+@7=y==5*+*@ko552+qez.",
-"..66(v1/n!||{i1q[m^1/llvez6g..z>&+j0=~yyk5*-+t22o]]+q>6g",
-"..6zq'^{|!pn{l&q##[ml{lme6g...6>&;2kr4~==5*a-a+j@7ot[>6.",
-"..66#^/{9|9|{a'q((qml{/mez6...zzi@okyry=k@;&&&&;]=]tqzz.",
-"..g>1{pn{/{{{^'qq((m/|{m(6g...gej7r=,5kkk@;&&&&;or=j[66.",
-"..6>lpf|i&^l{^'qq((m/!|1e66...zq]rh}5*@]72;&&[[t7rrj[z6.",
-"..g>^p:{1'&/{a[(((qm{!|^e6g...gedrh72;2o72+&[&&;74rd[>g.",
-"..gg#^/mv#^n|/'q(qqm/fp1(zg...g6idoj<-2k}k;&[&&t74~j'>g.",
-"...geqv#qq^nf{1(qeqm{f|^egg....6q&i-&&d=47*&&[&97$rd(zg.",
-"....gze>>e^|!n&####^/!|^e6g.....6eqq([2}4=*--a-2x4}d#6g.",
-"....ggzz>>m/|n/^//{{||/v>g......g6z>eq9or=o@]o77}}o<q6..",
-"......g6z>vln||p|!!p|/l#>6........gz>e<]=rrrr444}7]iez..",
-".......gg6qm/n|!::%!|lmq6g.........g66&jo=r4h$u4}]9&zg..",
-"........ggeqvm//{/{{mvq>g...........g6#^<jooo777j{&eg...",
-"..........ze(qvmmmmm#(e6g.............z#[&<99jj<i'#>g...",
-"...........gzze((((e>gg................6>e#''vvqe6g.....",
-"............g66>>>>z6g..................g6>eeeee6gg.....",
-".............gg6ggggg....................g6666zgg.......",
-"................g...........................g...........",
-"........................................................",
-"........................................................",
-".........gggg........................gggg...............",
-".......6eqqee>ggggg666gg...........z[&&[qe6ggg66zz6g....",
-"......gevmvv#qe6666>eqeg..........g#<jt<i&#z>z>e#'#6....",
-"......gq1l^mm#(zz>>eeq(>g.........g&j]djj-[>>eq[[&'(g...",
-"......g(^llllm#e(q#m^l1#>g........6^j]b]]t-q[&itd]jieg..",
-"......6qml/{{^'e#v1^/|{meg........6&9]oc7];[-+jdo}79q6..",
-".....ggqml{{|/1q[m^/|!|^ezg......g6^j]k=}5*&+;2kr$}d[>g.",
-".....gg(#m/|!{1#ml{{nnlm(6g......gz[i9o}4k2-t]7x==ot'zg.",
-"......6e(v/|:n^[1/nn//1#(6g.......6q&+]rh=@+20}=ooji'>g.",
-".....ggze(/|%pi'^{!|lmvqe>g......gzz#&5r_r@;@74}]j<&qe6.",
-".....g6zeql|:p<i{{n{^vqe>g.......g6eq&@}h~w0kk}7d+&[e6..",
-".....g6>>elnff|||{{lm#(>6g.......gzeq[@=4$r==w,]t-[ezg..",
-".....g6>eq&{p!f:|nl^qe>ggg.......g6q[&2k~44sr752-qezgg..",
-".....gz>eqln!f:%!nlm#>>6g........6ze[&@7~$s_$k@t-qezg...",
-"....g66e(q&{|dbx:{1'#e6zg.......gz>q[&2kr4hu4k2;-qz>g...",
-"...ggz>>q#a{p:xc:t1[ee>gg......gg>eq&-@,~hu)h=*+[q(zg...",
-"...g6eq['1/{9!:%!nlm[>>6g......g>[&+;25ky4s_4=5*+qe6g...",
-"..gzqvm/n|p|p9|9ppp{1e>6g.....g>&+j57}rrr=ry~rr7j[e>6...",
-"..g>#m/|:%!!nn/ln!:!l#>z6g....zeij]rhu$~==o@=4h4]-qz6g..",
-"..6evl{|!:!|{/1m/n:|/#(>6g....6q<]7r4h4==52j]yh}5i[(zg..",
-"..g>vl{{nnllm'[#m^ll^mvq>>g...6e<]77==]]j;+-9d]]dj<&#eg.",
-"..g>vl{/l^m#(qeeqqvmm^mvqe6...ge{]7]]dt-[&[[&&<t9dj+&qz.",
-"...6#^/mm#qe>>>>>zeqvmmvqe6....zid7jti&[eeeeeeq&<jp+&#>.",
-"...ge#m#((e66z6g666>(#qezzg....gqi<i'[#>z>>66z>e'&&#e>g.",
-"....g6z>66gggggggg6g66666g......6>eez66ggggggg6gz>>>6g..",
-"........gggg.........g..............gggg.........g......",
-"........................................................",
-"........................................................",
-"........................................................",
-"........................................................",
-"........................................................",
-"...g66>6ggg....................gzzez6gg.................",
-"..gg>(ee>6g...................g6([[qe66.................",
-".g>eq#vqeez6g................6eq&i+-[qe6g...............",
-"6e#'^lll1'q>gg..............6#it2]o]j;&q6g..............",
-"g#^/{n|{/lm(6gg.............6ido7=}kkdt[>6g.............",
-"6v1/n|!nn/1q>6gg............6id]=r4}=7*&e6gg............",
-"ge#mln|nnn^[>>6ggggg6>>g6...g#i9]=}===d+qez6ggggzee66...",
-"g6eq^/|||nl[(>zzggg6>e>>zg..gz#&do}r}}]+[e>>666>eqqe>6..",
-".g6em//||p/'e>>zzzz>e#qe>6g..6>#to7=r~o;[qe>>>zq'-&[e6g.",
-".66z#^/|f:n^q(e>e(qmm/m#>g...66ei2]}4h=2&[qqq[&+j]jie6..",
-".g66#vl|fx|&qee>(vm^/n/veg...g6>-t@}hur2&[qq[+tdo=]<qg..",
-"..gze#m|bc!^#qe((m^ln|{m>g....6z[-jrhuy@-&[[&tdo=r=teg..",
-"..g6eqv/p%pi'[q([m///l^(6g....g6#&+k4ur5;+&[+jooo]d&>6..",
-"....>>q/|!n/&'#em^{/^m#e6g.....geq&]}$}52;-[;d7od9i#6g..",
-"...g66>1{!|{l&[(mln/mqe>g......g6zq*7ryk02+&;]=]j&qeg...",
-"....gzev^{n|pi'q#m^m#e>gg.......z>q<d77}r@;&itd9i'ezg...",
-"....ggzq'^{p:n&q##v#e>6g........g6z&;2k4$y2&--<-qe6z....",
-".....66>e#{!cplq((>e666g.........z>q[ik4)r@&&[qq>>6g....",
-"......gzeq^n!nl1[qe>>g6g..........g>[&d=4=5*+&qeez6g....",
-"......gg6ev^//{{l#(>>6gg..........g6>q+d]o7,@+[ee66g....",
-".......g66>qvl{p/m>e6zgg...........g>>q&+]7ro;qq>>6g....",
-"........6z>eqml{/^m#e>6g............6ze[&j]7o2;-[ezg....",
-".........g6>>#m^lll^#>66.............g>eqit]]]]2-q>z....",
-"..........g66eq#^/|/1q>z..............g6zq&a27}oj&e>....",
-"...........gg>e(v^/lmq(6g..............g6e#&{dkb;&[zg...",
-"............gg6e(#mvmv#eg...............g6z('it<t<i#g...",
-"..............ggz>eq#mv>g.................g6ze#&it+#6...",
-"...............gggg>(v#eg..................gg66#[<iqg...",
-"................g.gg>e>g....................g.g6eqe6....",
-".....................gg..........................gg.....",
+"c c #3E9C3C",
+"d c #5AC254",
+"e c #286E26",
+"f c #32CB34",
+"g c #5ACA5C",
+"h c #5ED05C",
+"i c #2AA62C",
+"j c #166E14",
+"k c #62DE64",
+"l c #3EDE3C",
+"m c #36B634",
+"n c #D9F9D8",
+"o c #26CB24",
+"p c #2E9A34",
+"q c #66E561",
+"r c #9DD89F",
+"s c #7AF67C",
+"t c #E8FEEA",
+"u c #92F294",
+"v c #D8F3D8",
+"w c #76EE74",
+"x c #73E774",
+"y c #66E264",
+"z c #D7F2D8",
+"........................................................",
+"...........++++++......................++++++...........",
+"........++++@++++++.................+@+@#@@@@++.........",
+".......+@@@###$#%@@++..............+@@#$$$&$#%@@+.......",
+"......+@####*#**$%%@+.............@@$$$=-=--&$#@@.......",
+".....+@$&;>>>,,'-)&$#++..........@%-!~{]]{{^]/!-$@+.....",
+"....+@#)(__:::<[_('&*@+.........+#$}|123|4442|{5-@+.....",
+"...+%%$([678[8668<:(=#@+.......+#%=90000000004a^,$%+....",
+"...+##-:[b8[<<c8c[<:;#@+.......@$&!a000044000041~&%@....",
+"..+@$-;_6d8_(e:_<86['*#@+.....+%-/~200019f|14000^-$%+...",
+".++%=;e[7gc:>>>>_8h6:=#++....++#,i|0000f]]]]1000a,$@+...",
+"..+@&(:cbg[j----:7k6:&##+.....@#5^|00009////|000a!=$@...",
+".+%#;:<c7b<e-&-&e8g6_>*$@....+%=~a400049////f0002]-=@...",
+".+@$;_[887_j---&:[g7_'&#@+...+%=i10000l9///!|0002i5&#+..",
+".+%$(<8777_'=&-&e[d6_()*@+...@%&^400001^!!/!|0002^/-%+..",
+".+@$(<888c_,--==:[b6<(;*%+...+#&m400003^//!!f0004^~-#+..",
+".+@*e[688c_>=&&=e8d6[('=@+...+%-|000003{!!!!|0000|i,#+..",
+".@@$([78cc:,--&&:[d6[e;=@+...@#&m000n0o{//!!|0000|~,#+..",
+".@@*;<c787<,--&&:[d6_;)*@+...@%-i400004^//!!f0004i/-#+..",
+".+@$':<86b<(----ecb7_;=#@+...+%=ia4000l9////|0002~,=@+..",
+".++$;e<86bp(--&-e[d8:)*#+....+%=~|400049////9000a/>$@...",
+".++#&;e[6g85->>>:8d6:&$#@....+@$!i|000qo/]]]f0003!-$%...",
+"..+@*-;cdk7:>>'(_7g8:=#++.....+#-/iq0003]]^^2000a,$@+...",
+"..+@$*)_dh75>,,e<7h6:$#@+.....+@=,/2000o]^^94000|-$@+...",
+"...+#*&e8bc_j::_<[8:'$@+.......@$-!a00n199o12002i=#@....",
+"...+@%$':<<_}_<[<:e'&@@+.......+@$=ia44214q041ri!%@+....",
+"....+%#='e_<cc8c<(&*$@+.........+#$,i|1400002^!>=#+.....",
+"....++@*&;;(ee::()=#@++.........+@@>!~im|||am/,=#++.....",
+".....++@$*&&))))=*#@+............++#=-!!}}/}!-$@%.......",
+".......+@@@##%%#%@+@...............+@#%$$$$$#%@%........",
+"........+++@@%+@@++.................++%@%#@@%++.........",
+"........................................................",
+"............+.+.........................+.+.............",
+"..........++@@+@++....................+@#%@@@+..........",
+".........+@%#$#%@++..................+%%$&=#%@+.........",
+"........+@#*=$*$#%++................+#$-,--=$#@+........",
+".......+@@)e<ee(;)&$+..............+@#/|4f|^~/5-@.......",
+".......+@#([d6[_:e()$..............@#$m000021|m}&.......",
+".......@@#_dskd8<<:(=..............@%=20t00002|m,.......",
+"......+@#*:gsh8_:(;=$.............+%$&a0t00aami5=.......",
+"......+@#*_bsd[;;))$@.............+#$-20t00ip}5=#.......",
+"......+@$$<dsb:&=##@+.............+#=-20t0a!,=$#+.......",
+"......+@#*<bu6:=$$@++.............+%=-20t0a,-=%@+.......",
+"......+%#*<bs6_=*#%@..............+#$>20t01,-$#%........",
+"......+@$$<dsb:=$#+@..............+#=-40t0a,-$@@........",
+"......+@$$<dsb:=##%+..............+%=-20t0f,=$#+........",
+"......@@#$<bs6:$$@++..............%%$-40t0a-=%%+........",
+"......+@$*<ds6:=##@...............+#=)20t0a,=$@.........",
+".....+@##$<bu6:=$@@..............+@$=-40t0|,=#@.........",
+"......+@$=<gsb:*##++..............%#=,20t01-=$@+........",
+".....+@#$$<bsb:=$#@+.............+@$=-40t01,=$@+........",
+".....+@#$=<gsb:=$#++.............+#$-,20t0o,-$@+........",
+".....++#$=_dsb:*$$@+.............+@$-,40t0a--=#+........",
+".....+%%$=<gs6:*$#@+.............+#$=,v0t0a,=*%+........",
+".....+%$$&_dwb_**#@+.............+#=-!40t01,-$#@........",
+".....@+$&;<6h8_,&=#@.............@@-!p20001{!,$@........",
+".....+@=)(_7d8_(>=#%+............+%,}m40002|],=%+.......",
+".....++=;e<[7[_e;&$@+............+@,i|20002|i5&#+.......",
+"......+$=);(:(;)=$@@..............+=,}ima|p_,=#@........",
+".......+%$*=&==$$@+................@$=),5,,=&#+.........",
+"........++@+@++@+...................+@@@@@@@+...........",
+".........++++++......................+++@++.............",
+"...........+++++.......................+++++............",
+"........+++@%++@++..................++@%#%%@@+..........",
+".......+@%#$*$#$#@++...............+##$=-=&=$%@+........",
+".....++@#$$=====$$%++............+@#$--,,,,,-=#@+.......",
+".....+@#&&))&)--&=*#@+...........+@=,!//////!,-=%+......",
+"....+%#;:<_ee(((((:'=+..........+#$~a429|9^^9|ai>@......",
+"...++#$e[d8[____<[[_)#+........+@$-|000011212002}$+.....",
+"...+%$=_bhdc<_<<[8b[;#+........+#=,2000044240000i$+.....",
+"...+#=)_bh6[:e(e_[7<;#+........+=,/40004ff9|2004p$@.....",
+"...+$)([bhc_,,>;(<c_;#+........@-/m00001^{{]|402~$+.....",
+"..+@=;([bg[e>--&;:[_)@+.......+%,~|0000f]//!ia02}#+.....",
+"..++$)([bh85--&&);(;$@+.......+@>/m00009//j!/imp>%+.....",
+"..+@$&;[6h8:--&*&&&&#+........+@-5i0000f//!,!55,$+......",
+"...+*&;[bh85--&=*$#@++.........@-5i0000o]/!,-=$#%+......",
+"...@$*)_8dc}j>-=$$#%+..........@=-/200039{/,-*$%%.......",
+"...+@$*:[78<_j'*=$#@++.........+%-,|000439{,,=$#++......",
+"..+@%$$(<[88c_,&=##@@+........+%#=-^400003{!,=$#@+......",
+"...+@#$>e_<p8_5>)=##++.........+#$-]91q4n3o{/,=$@+......",
+"...@@#$-'e_[7[}:,-*$@+.........@#$-/i910n0lo^/-=#@......",
+"...+%#*&->5~ccp[:'=##@+........+%=-!/]fl0n4qo{,=$@+.....",
+"..+@$$=->'e~[ccc_(>&$@+.......+%=-!/]{flqnnn19]!-%@.....",
+"...+$&;',!___~p8c}_(&#@........@&!]{^o331lqnn43^!$%.....",
+"...@=)'ee_555}c77c[:;#%+.......%,}^|93fool00n001~=%+....",
+"...@*;'5__}__~c7878};$++.......%>~if14l13l000004~=%+....",
+"...+$&;:<cp[[876778<>$++.......@=5~|40qq0n000004~=@+....",
+"...+$*):<878776768c_;#@........+&,}a000000000002~=%.....",
+"...+#*=(<8888c88c[[e)#+........+$-!m40000000000a/$@.....",
+"....+#$);(eee:ee((()*@+.........@$=/pm||mf|||mm}>%+.....",
+".....+@#$*=*&=&==**$@+...........@#$-),,!,!,,--*%+......",
+"......++@@######@@+++.............+@@%$$$$$$%%@%+.......",
+"........++.@++@+@++.................+++@@@@%%++.........",
+"..........++@+++......................++@+++............",
+"........+@@@###@++..................@%##$$$%%+..........",
+"......+@%#$*=$$*$%++..............+@#$&-,---*#@+........",
+".....++@$$=&&&&&$$@++............+%#=-,!!!!!-=%@+.......",
+"....++%=;';;;'';)=*#+...........+%%,]ii~iiii/,-$@.......",
+"....+%#;_c<:e::<:(;&#+..........+#=p2n4afa14am~5=+......",
+"...+@#*:7g6c_<[8[_:;=+.........+@$-a0000140002fp)@......",
+"...+@$&<bh6[_[[8[<:(=@.........+#&!400003400041m,@......",
+"...+$*)<6h7<e:_<_::;=@.........+=,_200029a222a|p,#......",
+"...+$);[6h8:''eeeee;*+.........@-/i0000f{^9|a||p>@......",
+"..+@=)([6g[e>';;(((;*+........+%,}^0000f]iiimmm~-+......",
+"..++*&)<7g7<(j';))&*#+........+@-!~4000499{~/}5>$+......",
+"..+@#$)_7g7[}:;&=$$%+.........+@$-/200001fi!j-=$+.......",
+"..+@#$&_8gbc<_;&$$@++.........+#=-!100004fi!-=%@+.......",
+"..+%$=)<8g67[_(&=$@@+.........+%=,/1000n01^!,=%%+.......",
+"..+@$&><8d67p_(;=#++..........%#-!~40000q19~,=@+........",
+"..+%=-;<7g68[_e;&*%++.........+#,/i4000002|~!-#%+.......",
+".+@@)(:[86c<:('-=$%@+........+@%/^o000n2f9i/,=#@+.......",
+"..+#;:<[cc<:,>)=$##+++........%$p|400043^]/,-*$@@+......",
+"..@#;<cc8p_,>-==*#$%@+........%$i40nnq3^]/!,-==#@+......",
+"..+#;:<ccc_j---->';)$+........+$~a000039////]ii/-@......",
+"..+@)e_<88_(>'>'e_<:)@+.......@#/|200019]{{{910a/#+.....",
+"..+%=;e[c6<!>>,e_8b['#+.......+#,i|40019]{^|2000i$+.....",
+"...+=&;:<8<:,ee__<c_;@+........@-5~a4n4o^9912002p%+.....",
+"...+#$&':___:___<__(=@+........+$-5ia413a122222m,#+.....",
+"....@@$&'ee_<<<[<e;)*++.........@#&!i||244404|i/-%+.....",
+"....+@+=);((:::ee;)=#@..........+@@,/im9|aa||i},$@......",
+".....+@#*=&)));;)=*$++...........+@$-,5//~~~_,-&@+......",
+".......++@###$###@+++..............+@#$$===$$%@++.......",
+"........+++@+@@@@@+.................++@@%%##%%+.........",
+"...........++++++.+....................++++++.+.........",
+"..........+.+.........................+.+...............",
+"........+@+@@++.....................@@%%@@+.............",
+"......+@@$##$@@++.................+@#=$&=#%++...........",
+"......+@$#**$$#@+.................+#==---=$#@...........",
+".....+@#&-;5e;=#@@...............+@=!/{9f~,$%@..........",
+".....@@=);_<8_'*$@++.............@#,/ia003i-=#@+........",
+"....+@#)(e8dh8e**$@+............+@$/^fn000f,-=%+........",
+"....+@%-(_c6h7<,-$%%+...........+#$/m100001^/-##@.......",
+"....@%#>j_86g7c_j-#%@+..........@#=]910000019/=#@+......",
+"....@#$;(_[6b68c_'*$@+..........%$=~^10000003{-=#@......",
+"....+##;e}[7bb78<(-=$@+.........@$=~f1q0000049/,=%+.....",
+"...+%%*,:}p77777c_5;*#@+.......+#$-{fl4n000n01f],$#+....",
+"...+%#*>:}pc77787p_:-$@+.......+#=-{olqnnn00n44f/=%@....",
+"...+%$=':~[i77i6ccc_'*#@+......+%=,iflq0n0n00n02i,$%+...",
+"...+#$-j_[88m7c8c87[e>*%+......+$-/91qnn0nn0nn0q|],$+...",
+"...+#=-([8i66i8}876c_'&$@......%=,/9qnn00nnl00003i!=%...",
+"..+@$&,5p766678}p6d8<()*@+....+%&!{f4n000nnl40004^/-#+..",
+"..++=>'<8b|ggmi87878_(>$%.....+@,~^4n00000nnn00029~-%...",
+"...@='e8bhghhb6i66mc_e;*@......@,i|n0000000n00002|p>%...",
+"..+@=;:cbghghg6m88c[_e;=%.....+#,ian00000000n0002|~,#...",
+"...+=-'_8mbmbi[}__ee;)=#+......%-/{1n0000nq1l3|9i/,=+...",
+"...@#$&e_ccc8}_,'>>-=$#@+......@$-!|10nn0lf^{]]/,-=@+...",
+"...+@##>(__<[5'&**$##%@+.......+#$=]91144f^!,>==$#%+....",
+"....@%$-(5___(-$*##%@+..........@$=/^fa149/--==%%+......",
+"....+@%=;(j::'&$#%%+++..........+@%'pm9a|i!=$##@++......",
+".....+@=);((e;=@@@+..............@#,/imm|~,#%@+.........",
+".....++$*&&))=$@++...............+@&>55//,=%++..........",
+".......+#$#$##++...................@$===&$++............",
+".........@+++........................@+++...............",
+"........................................................",
+"........................................................",
+"........++@+@+@+++..................++@@@@@@++..........",
+"......+@##$$*$*$#@+...............+#$&=-----=%@.........",
+".....++$=&)))>))=*%@+............+@=,5//}~//,-#%+.......",
+".....@#*);''';'()&$@+............@$>}~i^iiim}5&#@.......",
+"....+%$);ee__<<<_()&#+..........@$&/iaaa14401m/,$+......",
+"....@#=':<<<<87b[_;)$+..........@=,i|444000002i/-+......",
+"....%$=(_[c8cbghb[:;*@..........#=,m20n0000000ap>%......",
+"....+$*)(:_<_[6b7<:;&@+.........@=-~m|14100004ai,#+.....",
+"....@%$&;'j55}[7[<:'=@+.........%$&!]^9ool4001|i,@+.....",
+"...+@#$*&->',5_[<_e;&++........+@$=,!/]{{o1qq1ai!@+.....",
+"...++##&>'j5:[p7c_:'=%+........+%$=!]^9o3lq001ai,#+.....",
+"...+@#*>j__[~87b7<:;=++........+%$-]9334q00004ai,@+.....",
+"...+##*;:<876bgg6[:;=%+........@#=-ia400000000ap,#+.....",
+"..+@$*-:[8887876[_()$+........+@=,/o400nn00001^/-@......",
+"..++$)'}8d7c_<<<:')=#+........+%-/i400004144a^/,$+......",
+"..@%&'e8bg7~55(';)$$@+........@#!{f0000lf99^~_-&%+......",
+"..+#&e_86g8_j,'>&=#@++........+$5|2000039^{]!,=#@+......",
+"..@#>:<867<e'>>-=*$%++........@$~|4000qf{]]/,-=#@+......",
+"..+%;_cc[8_,-&&=$##%@.........%$p2n0003^/!!,-=$%%.......",
+"..+#;:<c[[_,-=&&==$#+.........+$~a00041{/!!!,,-$@.......",
+"..++&;:_[c_j>,,((;(;*+........+@5i|30039]{{^^im~>+......",
+"..@@*&;_[c_(>'e:___e&+........%@>!ia0029]{|a222|5@......",
+"...+$=-e<8_(>(:<<_[:&@.........%=,/|40l9]9o4440a5@......",
+"...+@$*;e_:5je_<:_e;*+.........+#=,{|2af9a2422|i>+......",
+"....@@#&>(e::__<:(;&$+..........@#$!~^|aa222ami5=+......",
+"....++%$&>(:__:_:;&*@+..........+@%-!]^a2a22|p5)#+......",
+".....+@#$=&);;(;)&$#@............+%$=,5]~iii}5=$@.......",
+"......++@#$$==**$$@...............+@#$=-,,)>==#+........",
+"........++@@+@@@+++.................+@@@%%##@++.........",
+"..........+++++++.....................+++++++...........",
+"........................................................",
+".......++###$%+@++.................+@$=$=$@@++..........",
+".......$=&);;)=#@++................=,5}pi/,&#@+.........",
+"......+=;e::_()=$#@++.............+,p|fa2m/,=$%++.......",
+"......+&;e:_<:(-&$@@+.............@,i|a24|^/!-##+.......",
+".....++*);(::__:(>*#@+...........++>_~ma2123^]-=%+......",
+".....++%*&;(:_c8<,&*#@+..........+@$-!i^f1004^!-$#+.....",
+".....+%#$*;;(<86c:>&*@+..........+%$=-]i92000f]!-%@.....",
+".....@@#$=->,:}8[<<(-$%+.........%#$-,/]^fl00449/=#@....",
+"....+@@$$=->,(_~[c7_(*%@........+@#=-,/]{93lqn04^-#@....",
+"....++##$*->>jj_p7b8(=#@+.......+%$=-,/]]991q000|,=#+...",
+"....@%$)(e555}}c7dh6:=$@+.......@#=/^9oooll00000f,=%+...",
+"...+@#=(<8c[[c77bgxb_-##+......+#=,m4000q0n000003/=$@...",
+"..++#$&_8g67876bgywg<-$#@.....++$-!30000n00000t04/=$@...",
+"..+@*)'<767p/[pcmgyb_-$#++....+%-/^2000qlqqn00003/-$@+..",
+"..+@&(e[76[_j55_[7h6_=*#@+....+#5^a00001^of340001!-$@+..",
+"..@#;:[[78<j'>>,:8d85&*#++....%$~a000019{{{{30009!-&%+..",
+"..+#;:c[88_,>>>,/cd8_=$#++....+$ia00001^]]]{3000a!=$@+..",
+"..+#;_[c[c_j->>>:cg75&$%@.....@$p2000n39/]]]f000o!-%@...",
+"..+#;_c[[[e,>---_pg8:=$@+.....@$i20000f^]/]/3000|,=#@...",
+"..+#)e<[[[_,->>,_8d85=#%+.....+$}a4400o^/]{{3000o,=#+...",
+"..++=;e<c8<j>,,(_8d8e*#%+.....+@,~|4n049]{^91000|-$#+...",
+"..+@$*):8b[e>,::[8b['$%+......+@=,/a004o{^fa4000^-%@....",
+"...+#*&e[8<:>e5__[8<'#@+.......@$-5|004f{9f12004i&@+....",
+"...+@$$)e_e5ee___:e;=%@+.......+%=-}|1a9|f122a|p,%%+....",
+"....+@#*)'(:::__e;&*#++.........+@$,/imaaaa2|i!-$@+.....",
+"....+++$=&'(::e:;)#@@++.........+@@*,!ima|aai!=##++.....",
+".....++@#*=&))))=$%@+............++#=-,!}//_,=#@+.......",
+".......+@@#$##$##@++...............+@#$=====$@@+........",
+".........+++@+@+++...................++@@@@@%+..........",
+"...........+++.+.......................+++.+............",
+"........................................................",
+"......+@#$#$$$*$#$##@+............+%$*&-----&==$%+......",
+".....+@$=);;;));)))=#@+..........+#-,/}~~}/~///,=%+.....",
+"....+@$&;'(eee(e'(;;=$@+........+#&5i^^|9|9|mmi~,&#+....",
+"....@#*;:<:__::_e_e()=#+........@$-pa422aaaaaaam},$@....",
+"....+#=:8d7[<<<<<[[<()=#........@$,a000044444004m/,$....",
+"....#$&<bxg7[[<<[86[:;&$........$&540t000q440000|i5=....",
+"....@$&[dxg6[[[<[[c[:;&#........%=500000q0q40000ap5=....",
+"....+#*:8g6c}_:e:::(;)*#........@$)2000nl1a9|aa|i5>$....",
+"....@@*([6c[_jj>);;&&*$+........%%-m00n0399]]~~5(>=@....",
+"....@@$'<8<__e'&==**$$#+........%#=i404419{!,,,--=$@....",
+"....+@@)(:<pc_,=&$$$#@@.........+@#/ma4403^!j-==$#@.....",
+".....@@=)(_[6_(==$#@@+...........@#,}^2002^,,-$%@+......",
+".....+@#=&:[b[,=$$#@+............+@*,/a00l9,-=$#%.......",
+"......+#$&e<8<e-=$#@@.............+$=!|2029/,-$@@.......",
+"......++%$;_[<(')$#@+.............+@$*i2049{/-$#+.......",
+".......@@#;:[_e')=#@+..............@#$~a02|i/,$#+.......",
+".......+%#=;(::_(&#%+..............+#$,i||119!$#@.......",
+"........+@$=)e<[:;#%@+..............+#=,/|20a~$#@+......",
+"........+@%$$'<6<;##++..............+@$=-^404{=$@+......",
+".........+@#$;<8<:=*#+...............+%$=i404|!-$+......",
+".........+@##;:8<:()$+...............+%$$~a0q|m}&@......",
+"..........+@#)e[<::;=@................+%$/|042|i,@......",
+"..........++@=;:::_e=+................++#(paaa2|,@......",
+"...........++$=)(:_e)+.................+@=,}ma2|5@......",
+"............++#$)e[:&@..................+@$=}|015@......",
+".............++@=;e;*+...................+@#(p|i;+......",
+"...............+$*&*#......................+=)5)$.......",
+".................++..........................++.........",
+"........................................................",
+"........................................................",
+"........................................................",
+"...........+++++++.....................+++@+++..........",
+".........+++@@%@+@++.................+@@%#%#@@@+........",
+".......++%$*===&$$%@+..............+@#&-,,,!-=$%@.......",
+"......+@#$&)'';';&*$%++...........+@$=!}iiii~!-=#@+.....",
+".....++@$=;(::::e'==$@+..........+@#&,~^aa1f|i!,=%@.....",
+".....+@=;(ee::::55:'&#@+.........+%,i||aaffaooai!$%@....",
+"....++#;_[<_e:5e_<c_'*%@........+@$~20419fff14n2i-#@....",
+"....+%#e[dc_ej55<7g85=#@+.......+#$|000199994000f,=#+...",
+"....+@$:7g8_5555}7g8e&$@+.......+%=a0001ooool000|,=%@...",
+"....+#$:6h7}(jjj[7g6_=##@.......@$&a00019999l0003!=$%...",
+"....@#$_6k7~jjj,}7h7_-$%@+......@$-2000l999930003/=$@+..",
+"...++#*e7g8p:___cbd6_-$#@+.....+%$-|000l3o33n0003/-$#+..",
+"...++#*e[6787i7m6|g85>$#++.....+@$-|000nnn000000f/-$@+..",
+"...+@$*;:[7mbghhhgg7:-&#%+.....+#=-ia0n000000000o/,=#+..",
+"...+@#$;_<6dhghhhgb7/&*$@+.....+#$-if0000000000n3/-=#+..",
+"...+%#*e_776gbb66bg8_>*#%+.....+%=-94n00000000003],=%@..",
+"...+%$$:cb|bdm7i7mg8_>&$@@.....+#=-fn00000nnn00n3],=%@..",
+"...+%#=5cb6|b7p}c6b7_'&$@+.....+#=,f00000nqln0001{!-%+..",
+"...+%$*:8g7cp}_5}p7c_,-*@+.....+#=,f0000ql3o14001^/-#+..",
+"...+@%=:7g7}55j!:}8p_(;*#+.....+%$,a00nloo993l0019],$@..",
+"...+%#=_6g8_>>,>5}[<_(,=%@.....+#$,20003{{{{o3441|i,#@..",
+"...+%#$:8hc5j>,>5<68_(;*@+.....+%=-|000o^{{]fq002^]>%+..",
+"....@%$:8g8_,',>5cd6_;)*++......@#-a0003^{{]o0002i/>@+..",
+"....@@$:8d8:,>>-:cg6<'&$@.......%#=|00no^{]/f0004i5=%...",
+"....++%;:[_:jj,,:<8<(&$@+.......+@#~a02a99^^f204m5-#+...",
+"....++@=;(ee:ee(:::e)$#@........++#,pm9|o|9|faa|}-$@....",
+"......+#$*;(e:::e(;)*@@+..........+$-,~m|a|a|mi/-#@+....",
+"......++%#=)';;;;&)*#@+...........+%%=,/i~pi~55>$@+.....",
+".......+@@#$=****$##.+.............+%#$&,>>--==$++......",
+"...........@+@+@++++..................+@@#@#@@++........",
+"............++++++......................++++++..........",
+"..........++@@@@+++...................++@@@%+++.........",
+"........++++@@@@@+++................++%@#####%@+........",
+".......++@$=)&))&*$#++.............+@#=,55//!-=$@+......",
+"......+@%#&;(((('&=*%@+...........@@#$!~9mmmi5,-$@+.....",
+".....+@@$$)e::::e'-=*@++.........+@#=-/9aaaa|{/,-#@+....",
+"....+@%=;(ee:::eee:()*%@........+%#,~9||afa9faa^/-$@....",
+"....+@#)_[__:e((:<[<'=$@+.......+%=~1441ff99|404^,=#+...",
+"...+@%*([68<55,,_868e)*#+......+%%-m0004f9^^1n00a/-=@...",
+"...+@#*ec6[_e(,'e<7[_>&$@+.....+@=-f00039^{{f400a~!=@+..",
+"...+%$*:cb[5,,>>j<c<:(>$@+.....+#=-an00f^{]]9404a^~-#+..",
+"...+@$*e8b[5>>>>(:<[:(;=%+.....%#=,f004o]]]]^f041|i,%@..",
+"..+@#*&_8gc5>,>-j_[[_e'=%@....+@$-!a000o{{]]91041|i,#@..",
+"...@%#=_7gc/>,>>j_8[_e'=#+.....@$=j100q3]{{]91n019i,$+..",
+"..+@$$=}6g8:>,',5_8c_e;=@+....+@==!100n3{{{{o1002|i,#@..",
+"...@%$&_6h6~5!5j_c6c_()$%+.....%$-j2000looo910001^/-#+..",
+"...@##=}bhdmc[~[c7b8:;&$@+.....@$=!10000nqlq0000ai!=@+..",
+"...+%$=_bkhb7667bbg8_)*%+......+#=,10000000000001/-$+...",
+"...+@#=:7ggdb66c877[(=$@+......+%=,a000000000000m,&#+...",
+"...+@##(<87bb7[___:()$@@.......+%$=^40000n03a2a|/-%@....",
+"....@#$>5<c76c/>>;)&$#++........@$=]f4n0003{]]/!&$%+....",
+"....++#&'5[8bp_'>=*$#@@+........+@$5if40041{]!,==#@+....",
+".....@@*&>_~8[_5(-*$#+++.........@#-!~1q00lf^/,*$@++....",
+".....+@#$*(<78c<5>*#%%+..........+@$-,m40004f]-=##+.....",
+"......+@##;:c[[[_'=$@++...........+@$={a0000a{,=#%+.....",
+".......@@#=;e:_<:';&$@.............%#$(~|a24a^]5=@......",
+"........+%$$=;(::ee;$+..............+%=-,~^aa||p-@......",
+".........++@%=;e(:e;&@...............+%%$,p||a|i,@......",
+"..........+@@$=))))=#+................+@#='}_}_,$+......",
+"...........+++@##$#@+..................++@#$*=$#+.......",
+"..............+++.+.......................@++++.........",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+".............++++........................++@+...........",
+"...........++@$$#+.....................+@%&=$@..........",
+"..........@#*&;e>&++..................@=-5i|~,@+........",
+"..........#*)(_[:)@+..................$>/m20a}%@........",
+".........+$=):[6<'#@+................+&,}a004i$%@.......",
+".........+#*)ecd[;$%@................+$)5|000i=#@.......",
+".........+@#*e[d[e$#%+...............+%=>r000|-$#@......",
+"........+@@#$(cg[e=#%@..............%%#$&|000|,*#@......",
+"........++%#*([6[e>=#@+.............+@#=-m000f],=@@.....",
+"......++%%#$$;_8<:()*%@...........++#%$=-{202a^/,#@.....",
+"......+@@##**'e[__e'=%++..........+%%$=--ia042|i,%@+....",
+".....+@$$&&));e::_:e)#@+.........@@&-!!//{|aa12|/$@+....",
+"....@@@=;';''';(:_[:>#@++.......@%%,~i{{i{i^f20a~&#@+...",
+"...+@%#)(:e(e,>-e_8_'*#@+......+##=/^1f9|^]/9102i-$@+...",
+"..+@#=&;:_5(;>>&(_8<(=#@++....+@=,!iaa|^{]]/^204^,$#@+..",
+".++%=;(e:_:,>>--j:8<'=$#@+...+%%,~^|a1f^]]//9104^,=$%@..",
+".+%#)e:___('---)(_8<(=*#%@+..+%$/||1129{////^104^!-=#%+.",
+".+@$;_[[<}:,'>>,_[6c}(;-=$#..+#-i20041f^{{{^300019~/,-$.",
+".+$=:cb8[__:(5__[6db8c<e()*+.%=,a000q41o99310000004a^/-@",
+"+@$&<bhb8____<c76dhgggb[:(&%+#=54000n123140000000000am5#",
+".@$&:6gc__:55_<[886666c[:;=%.#=!20004aff|12000000000ai,%",
+".+#=(<8_(;'>>;('e:::::e(')*+.@$,m2029~i]~i^m||aaaa|mi}>@",
+".@#$)e:;>*$$$*$*==&=&&&&&=$+.%$=~||i/,--->--(,5,55555,&+",
+".+@#=;'&*$$##$#%##$#$#$**$@..+#$'pi5-==$$=$$$=&$=*=>>=#.",
+"..+@$*=$#@@%@+@%@%@@@%@@@@@...+#&>,-$###%@#%#%%#%##%##@.",
+"....+@%+@@++++++++@+++@+........+#%%@@++++++++@+%+@+....",
+".......................+...........................+....",
+"........................................................",
+"........................................................",
+"..........+@@++.......................@@#@+.............",
+"........+@#$=$@+....................+@$-,=#+............",
+".......++%*&;=#++..................+@#>5~,=@+...........",
+".......@*=);()=@++.................#-,/im}>@@+..........",
+"......+$)'e:_(&#@++...............+-}i|12^!$%@+.........",
+"......+)e_<[[:>##%++..............+5|v200a]=$#@+........",
+"......+*(:<[[:()=$@++.............+,m2400am/,=%@+.......",
+"......+*&;e:<<_:,&$%++............+>5p|a4411^!=#@+......",
+".......+#*;e:<c8_'##@+.............@$)~|24002i=$@@......",
+".......++@&;:_87<(&*#%+............+@#5ia2004m!-=#@.....",
+".......+@@*&;(:<:_:(&$#+...........+@#-5~m|411a^5=$+....",
+"........+@#*=);(:<8_(=#@............@@$-(/i^a204^,=%....",
+"........++@#$*&):[68:&*#+...........+@%$=-!}a000a5-$+...",
+"........++@%$$=&e[bc:)$@+...........++%$=-,/|000|/-#+...",
+".........+@#$$=-e[68:)=#+............@@$=-,/9000a},$+...",
+".........+@@#$&&([6c:)$#+............+#%=-j!|000|/-$+...",
+"........++#$*);e::<:;=#+............++$=-/{||24ap,=@....",
+"........+@#$-(:<_e;;=#%+............+#*-/^a42|i~,=#+....",
+"........@@*&)e<c_(=$#@@.............@%-!/|402m,>$@%.....",
+".......+@$)(__:_()*#%++............@#=}m2222|/-$#@+.....",
+".......%$*(<c<:;)$$@@+.............#&,m402ai_-=%%+......",
+"......+#*):8dc(*$#+++.............+$,52000m-=$@++.......",
+"......+*)(:[c:;*%%@+..............+>}ma00ap-$#%+........",
+"......+=(_:ee;=@@++...............+,m2ar|~,#%++.........",
+".....++):[:;**$@+................++}a01p,>=%%...........",
+".......=;:;&*#+++..................,i|p5>$@++...........",
+".......#*)$$@%+....................$>}-=%#+.............",
+"........++++++......................+@++++..............",
+"..........+...........................+.................",
+"........................................................",
+"........................................................",
+"........................................................",
+".........+++@+@+@+...................++@@@@@@+..........",
+".......++@+%@%#%@+@++..............+@@@###$##@@@+.......",
+".....++%#**=&&&&&*$#@+...........++#&--,!!!!!,&$%+......",
+".....+@$=;;;'((e(;&*$+++........++@-,~~ii^9r^~!,&@++....",
+"...+@@#=;(ee:_<<_e')=%++.......+@#$,~|||a2442|i/,$@+....",
+"..++#$&;(eeee_<c<_e')=*#+.....++$-!~^9|||14041|i/,-$@...",
+"..+@=;e(e:(,':c6c<_ee')*@+....@#,p||rf9^{a00043||i/-%+..",
+".+@#;e<_:e(>-:[b7[__:e(&#@+..+%$~a221|^]/f000041aam5$#+.",
+"++@$'_[_:e'>-:cd6c____e)*#+.++#&i202f9i]/f00001111a}-$@.",
+".@$*(<[_'>>&=e[bc_jee::'&*$+.%=,m401^]]j!f00019f|a9i!,=+",
+"+#$&e[[_;==&&j[bc_',:_:('&$%+$=!|00ai!!!!94001{^f219~5-#",
+"+#$&:[8e>===&(<8[:,je::e(;=@%$-5a00|],,,,9400f{9ffa|mi,%",
+"@$=)ec7_>=*==>:[<_:_:ee::e)#@=,_f00a],,,,{a441aaf9|aa|}$",
+".$&;_[8e,*=**-(e__[_5ee_[<;#+&!p200f{>,,-/^a14q1f992q4p&",
+"@$&):c7:'=*=$->':_c[5,(_[<'*@=5~a001{,-,-/]^f4nqf^9z04i-",
+".%$):[7_>&=$=*->e<c[_ee:<_)$+$=5a002{!!-,,/]f2002f|122}=",
+".+#*ec6<(-&***=&j<78<e::_:)#.@$>r004^/!---,!92002f9a2a}$",
+".@+$([8_e>&=*$*=;<88<_e::e&#.%@=m002|]!!---,i4004aaaa|5$",
+".++#)(_ee('>>&==>e__<<_e()*+.+@$}ma||^{~]!,,]|22442|^~>@",
+"..++$&);(e('(>&$&;':_c<e&&#@..+%=5}pm|mim]!-!]^f40qr5,$@",
+"...++#$=;::ee'-$*&&;_8[(*#++...+@$=5i|a||i/-,!5i200m,$%+",
+"...+++#*&))))=*$$**);((&#++....++@$-5}}}/,)==--5i|m5$@+.",
+".....+@@$$$$$$$$###$*==$@+.......+@#*&-=--&=$=$=),,=@+..",
+".......++++@+@%#@@@@++++...........++@@@@@$$%@#@@%++....",
+"..........+++++@++++++................++++@%++++++......",
+"...............+...........................+............",
+"........................................................",
+"........................................................",
+"........................................................",
+".........++.+........................++.+...............",
+"..+++@+@@+@+@+@+++............++@@@%@@%@@@@+++..........",
+".++###$%@%%%#%@@@@++.........+@$$==#####$###%@@+........",
+".%#$$$=*$$##$#$##%@+++.......#$-&-,-=======$$#%@++......",
+"+#&);;>>->'(((>-&&&*#@+.....+=!}~~]]]]{^9^]/!!!-=%+.....",
+"@=;((:ee(5_[[_ee''')=#@+....@,~m|aa|9f1404a|^ii/,=%+....",
+"@&(:__<<__c7d7c:_:e(&$#+....#5m|22242100000aaaam5&$@....",
+"+*);(e(eje[7d8_(('')=$%@....@>}{^99f^f400019^ii},=#@....",
+"@$$&->,,',_8bc_'>>-&$#@+....%=-5/]{{^^100n1{]]/!-=#+....",
+"+##$$*&--,_7bc5-&=**$#@++...@$$=-,!//{3n00o]!,,-=$#@+...",
+"#$)>>>->',}8g8:>>-&=$$$@+...$-/]]]/]{^10003]]/!,-==@+...",
+"*)ee(>>,'j}6di},>,--=**@+...-}|a^{{{^9300nl^{{]/!,-#+...",
+"*(<c_e,j!5c7h7}j,>'>-&$$@...>|2039^999n00039^{{]/!-=%...",
+"$;:_ee''(!c6h7<j(''>)&*#+...=pa2|9{^99q00049^{{]/!,$@...",
+"$&;e'''(je[6g7}(,'-;-&*#+...&5i|ii{^99n0003^^i]~/5>$+...",
+"@*&))->',e<6g8_,,;>)&&*#+...#)5}/]~{^940001^^]]/5!-$+...",
+"+#$=&)->;,<8g8_'>>&&=*$++...+$-'!//]i{40003{]]5!,-&%+...",
+".@@#$**=->_8d[:&&=$$##@+.....@#$&>,,/]3000|!!,-=$$%+....",
+"..++@@#$$*:[b['=*##@++........+@#%$--,a000^,-=$#@+......",
+"....@@%#$$ecb['$*##@+...........@%%$=-|004^--$$@@.......",
+".....+@##*e[6<,*##+@+............+%$=-|004^-=$@%+.......",
+".....+.###e[6<'*##@+.............++%$=9004i-=$@+........",
+"......+@#$([b<'*$%++..............+#$=m001^-=#%+........",
+"......++@#([d[e=$#@+..............+@%$m0009,-$%+........",
+".......+%#([d[:)=#+................+#$m000f},$+.........",
+".......++@'[d[:)=#+................+@#i000|},=+.........",
+"........+@);_()*$@+.................+@5i2m},=@+.........",
+".........+$*=*$#@+...................+=)(,=$#+..........",
+"...........@+@++......................+@@@@+............",
+"............++.+........................++.+............",
+"........................................................",
+"...........++..........................+%...............",
+"........+@$*=$+.....................@%=>,&@.............",
+".......@#$&);&#....................%$>5_i,$.............",
+".......+$*)(e;$....................@&)}m|p).............",
+".......@#$;:[(*+...................@$=pa0i,+............",
+".......+@$;_8:&+...................+%&p2015+............",
+".......++$;[6:)++..................+@&i00a}@+...........",
+".......+%@;<6_)@+..................+##p402}@+...........",
+".......+%$;[6:)++..................+%&i00a}@@...........",
+".......@+#;<6_;%++.................@%$p002~#++..........",
+".......@@#;[6:;@@+.................@#$i002p#@+..........",
+".......@@$(_b_)#++.................@#=i402}$@+..........",
+".......@@$;[6_;#@+.................@#=i002~$#+..........",
+".......+@$;[6<;#%+.................@#&i004~$%@..........",
+".......@@$;[6_;##@+................@#=i004i$$@+.........",
+".......@@#(<b_'##@+................@#$m002{=$#+.........",
+".......+@#;[6_;$#@+................+#$i002i=$#@.........",
+".......+@#(:6<'$#%@+...............+#$i204i-=%@+........",
+".......++@;<c_(=*#++...............+@#i402^,-*@+........",
+"........@%)e[_e()$%+................@#_|02|^/-#@........",
+"........@+&;(::_e&$@+...............@%,p|a22|5=@+.......",
+".........+$=):[6_'#@+................@&,/|002i=#@.......",
+".........+@$*;:[:'&$@................+#=(ia0ai,=%.......",
+"..........+@$&;(';)=#.................@%&,pmip},$.......",
+"...........++#$*&;;)#..................+@$=>5~i}=.......",
+"............++@#*&;&$...................+%#$>5p5&.......",
+"..............++@$*$+.....................+@%&>=@.......",
+".................++..........................+@.........",
+"........................................................",
+"........................................................",
+"........................................................",
+"............+.+++.+.....................+.+++.+.........",
+"........+++@+@++@@+@+++.............++@@@%@@@%@@@++.....",
+".......+++%@%####%#@%@++...........++@###$$$$#$##%@+....",
+"......+#$===&=&*&=&&==$%@+........+$-,,,!,!,!!!!,,-$@+..",
+".....++=;((('(,(,,(,'>)*@+.......+@,~^m^^^^^^^^^{~/-#+..",
+"....+@@)(___________::'&#@+.....+%#/|232131a32a11f^!=%+.",
+"....+@#;_<<:_:_:_:__}__>$%+.....@#$~2022aa13a11114f]=#@.",
+"....@@#([8c_j55j555_[[<'*#@+....@%=m4041999o9oo34n4i,$@+",
+"...+%#*e[b~_jjjjj555p7c(&$@+...+#$-|00q399999oo3q009!=#+",
+"...+%#=:86c_j5,555/<cmcj=$@+...@#=,|000lo99o9ooln0n9!=#@",
+"..+@#*&:c68p<}}}}}}p7675&$%@..+@$-j3n0n43l3llllqn009!-#%",
+"..+@#*-_[78c8[pc878i66c/-##+..+@=,/f00nnnqqqnnnn00no/=$@",
+"..+@*)>_86m7i78i7i767m8:-*#@..+%-/]1n00nnnnnnnn00003/-$%",
+"..+#)(_<c8c888787m6668ce,=#@..@$/|20nnnnnnnnn000000f{!*%",
+"..+%;<c888iccip77m6m87p5'-*@..+$i20n0nn0nnnnn000nnq9{/-%",
+"..@#([78c8p88c8i76bm8p_e')*+..%$m000nnqnnqnnn000nq1fi/-%",
+"..@%)(_<pcp[ppcp8mgm7}_,-*$@..@#/m144nqq4qqqn000nl3^/,&@",
+"..++$&>e~cp[[}[p7bhb85,>=#@+..+@-5]fln4qqlqq0000nf^],=@+",
+"...@%$=,_c[}~}~}76hbp:>&$#++...%%=,^1nqllllln000qo]!=$@+",
+"...+%#*e[7p}<_:/~877<:'&$%+....%#=-940qll333l0004f^!=#+.",
+"...++#*j[bc}5/55_}p<_:(&#@+....+@$-9n0nloooo3lq41|^!=#+.",
+"...+%##e[b[:!5jj55_:::e)#+.....+%$=|0043oo99o93a1a|/$+..",
+"....@@$([8p_5jjj,(,''')*@+......%#*^40q3o9999^^^ii/-#+..",
+"....+@#'_8<__:5e'>)&&=$#+.......+#$i20413o99^]/!!,-$+...",
+".....@@)e_<___ej(-$*#@@+.........%%}|44111f9^/--&#@+....",
+".....+@&(e__[<_e'&$#%@+..........+#!ia24041a{!=$%#@.....",
+".....+@$=>:[7<_e'&#@@+...........+@&,]|000a|i!$%%+......",
+"......+@$$ecd7<e>*#++.............+#=>|0004|~,$@+.......",
+"......++@$;:<_(>&$@@..............++#=pa02m~!=%@........",
+".......++%*);;=*$@+................+@#)_i~5-=#+.........",
+".........+@%##%@++...................@%#$$%%@+..........",
+"........................................................",
+"........................................................",
+"...............+.+.........................+.+..........",
+".............++#%$##+....................+@$$==$@.......",
+"...........++##*==)=#+.................+@$=-,,/,$+......",
+".........++@%$*=);;)$+...............+@@#=-,}pi}-@......",
+"......+++%@##=>(((e;*@+...........++@##$=,]^^m|~>@+.....",
+"....++@+%###*>e:_::'&@+.........++@@#$$=-]|a1a|i!#@.....",
+"...++@%##$*=='_c<_e'&#@@.......++##$==-,,{1042ai!$%@....",
+"..+@$&>;>'>>'e_c[<<:;$%+......@#-5~]]{]{{f20044a~=#@....",
+".@%*;:<__<_::_}cc87<'*%@+....@%>pa44441aa1lqn004^-#@+...",
+".@$&:8d6668cp[<<c6bce*#@+....#&5a000000nq44l00009,$#+...",
+".@#=([7866878c[}c8bce&*@+....%$,m000000nnn4l0000|!-#@...",
+".@@#)(:<[87ccp}_[<c[e'&$@....%%=}ma40000nq43l0n0ai5=@...",
+"..+@$=)e<[887p_!_}<_:e'=@+....+%=,}|40nn0q1o1141a|i,%+..",
+"..+@%$=;:<c86[_j5e::::;&@+....+%$=,ia4000ql9ff1aa|i5#+..",
+"...++#$);(<i6c:',''(e:e)#@+....+@$=/i94n00f{{{i^|a|/&%+.",
+"...+++#$=-:cb[5---&)(:e;*#+....++@$-,/|n00o///!]ma|~>$+.",
+"....++%##=e[6<e-&**&;:e)*#+.....+@#$=,|0009/!,-5i||_>$@.",
+".....+@%##;_<<e'>&**&)=*#+.......+@%$=~a04|^]!--:},>$@..",
+"......+@%#)(::_:(-#$$##@+.........+%#$/^aaa1m/===&$#+...",
+".......++@$&((:_e)$#@%++...........+@%>/^|a1|/=$#%@+....",
+"........+@$$&;e:e)&*#@+.............+@=-5i|a|~!>$%+.....",
+".........+@#$;;:e;;&$++..............+@$*_ia|i~5&@+.....",
+"..........+++=;:e(;&$@+...............+%@,ia|mi5=@+.....",
+"...........++#&));;)*+.................++$,}}pp_>%......",
+"............++#$=&;&*#+.................+@$=,5p5)$@.....",
+"...............+$*)&*@@...................++=>}5>#@.....",
+"................+$*$#@......................@=-=$%......",
+".................@+++........................%@@+.......",
+"........................................................",
+"........................................................",
+"...........++++++......................++++++...........",
+"........+++++++@++..................+@+@@@@#@+..........",
+".......@$=$$#*);&$@+...............%&,==$-/p5-%+........",
+"......+$&;&=$)(_(=#@+.............@&5~5,=/m2^,$#+.......",
+".....+@=;(;=='_[:;$@@+...........+@,~|]!,{20a~=%#+......",
+"....+@@)e_e>=e<6_'$$#++.........@@#}|2|]!9404{-=$@+.....",
+"...+@@#;<c_(-e<b[j&##@++.......+%#*i402^/f0009!=$%@+....",
+"...+@#$([6<5'_8b[5==$#@+.......+%$&m004f{10009!,=$%+....",
+".+@%#$$:[6<5'_8gc/-=*#%@+....+##$=-f0049{100no/!-=$@+...",
+".+#$#$=:86c:j~8gc_>-=$$++....@$==-,|00039ln0q3]/,==@+...",
+"+@$**$=:c6p:j}7g8/>-*$$%++..+#----,fn0q39l00n3{/,-=$@+..",
+"@*)''';<7g7~:8mg6}5,,-=*%+..%-}ii{i400n33n0003o^{/,-#+..",
+"@&e_:eecbg78~7dkdc:5j',*#@+.@5|2aff0000nln000n3o9^{,=%+.",
+"#;<[[<[8bhb7cmghg6p~__()$%+.$i4004400000000000lllf|/&#+.",
+"@)(::::86g67}8dgm8__5('=#@+.@}maaa|n000nln000n13f^i,=#+.",
+"+$&);;;<mbc}/p6g6p5(,>&$%@..+=5}~~i4000l3q000q99^]!-%@..",
+".++##*=:cbp_j}cmc}j'&=$#++...+@$=-,a00q39ln0n19{!,=$%+..",
+".+++##*ecb<!'5p7p_j>-*#@@+...++@$&,|0049{oqnq39{/-=#@+..",
+"..+@%$#e[6<5,j_[<_:(-*$@+.....+@%=*|00qo{o1044|9/-=#@...",
+"...+@@$([6_(-(5__}<5>$#%@......+%%=m0029/^f31149]-$%%...",
+"....+@#(_6_(->,e:_<e>$#@+.......+#$m402^/]^9324a]-$#+...",
+"....+@@;<6_;&&>>(_[_'=$%+.......+%%i402i!!]~9202{,=%@...",
+".....+%;<8:;====;_[<(*$#@+.......+#i40ai,,,,i304^,=$@+..",
+".....+@;_8:;$$$*)e[_(&$#++.......+%p20a~----_|02m!-$@+..",
+"......+)e[(&####=;;;';&*@+........+}|0m!$$$$,~iii]5-#@..",
+".......&(_;=#@#@#*=&;(;=#@........+5m2p,$%$#$-,5~mp,$@..",
+".......*;e)*@+@+@@%$&(;=$++........)p|})%@@@%%#&5mi,&@+.",
+".......#*&*@@++++++#$==$@+.........$>5-#@+++++@$&,,&@+..",
+"........+@@+....+.++@#@+............@@@+....+.++#$#@....",
+"........................................................",
+"........................................................",
+"...........+++.........................+++..............",
+"........++@###@++...................++#$=$%++...........",
+".......++@$)(&*+++.................+@@-}m5-@@+..........",
+".....++@@#;:<e)#@+@+.............+@%#$~a4|/$%@@+........",
+"....+@%##$;_8:;$$%@++...........+@#$$=i401~=&##@+.......",
+"...+@@##$=e[6_,=$$#@++.........@#%$=-,|004^,-=$%@+......",
+"..@@#$$===:cb[(*=$$$%++.......@@$=-,,jf0009,,-==#@+.....",
+".+@#$&&&->_cdc:>-==*$%@+.....@%$-!!!/]1000f]/!!-=$@+....",
+"+%#=':__5([6h8_jj:5';=$@....+#$,{a33o94000399oo^~,-%....",
+"+#*):76c[_cbkbc__[c_e;&#+...+$,/10004l0000032404|~5=+...",
+"@$*'[bkbc~6dhb7}cc68_()=+...#=,i4000nl0000nl00002m}-@...",
+"+$*-<6d8}_pdhmc:}[8[_(;*+...@=,/4000l3n0000f10002m~>@...",
+"@$*&<6d8_5p7g7}j:<[<:(;$@...@=-/200n194000l93404am~-@...",
+"+#*&_8dp5,[7g7_>j_[<:(;*+...@$-!100qo^l00n1{9304am~>@...",
+"@#$=_7gc_jpbh7}5_<8<:(;*@...@$-j100qlo40003f34041m~>@...",
+"@#$=_7dm<_8bhbc_<c7[_()*+...%$=!a0004ln000n340002m}>@...",
+"+##*_6g6c~7gkb7_c768_()*@...@$=,10000400000400004m/)@...",
+"+%#$(<8[_:c6h7[:__8<:;)$+...+#$-90001fn0000f2404ai/&+...",
+"+@#$;:<e(,<7g7_'e:::;)*#+...+@$*~f2f^{20001{9|2ai},$+...",
+".+@#*)'--&e8b<(-)'(())*%.....@%$,}i//!|0009/}imi~5)$....",
+".++@$=)&**e[6[(==))&=*#%.....+@%=,/!,,|000^,!/~5,>$%....",
+"..++##$***ecb_(=$=**$@+.......++$=--->|002^,-,)>=#%.....",
+"....+@@%#$(<b_;$$#@++...........+@%#$*m002i=*$#@@.......",
+".....++@@#;_8_)%@%@+.............+@##$p202}$%#@+........",
+".......@@@):[e&#@++................%@%}|0r!$%@+.........",
+"........++&;_;&+@+..................++5i2i,@@+..........",
+"..........*)()$+.+...................+>}m}&+.+..........",
+"..........@$=$+.......................%&,=%.............",
+"...........+++.........................+@+..............",
+"........................................................",
+"........................................................",
+"...............++++++......................++++++.......",
+".............+@###@@@++..................+%==$%#%@+.....",
+"............+#*&=$*$#@@+................+$>5,--&$%#+....",
+"............+$&;;&=**$$+................@&5i~!,,-&=@....",
+"...........@+&':e'-&&*$@+..............%@,i1|i/!!,=%+...",
+"..........+@#):c<:'>-&=#+.............+#$/a02f^]/!,$+...",
+"..........@@#;<7[<(('>=#+.............@%$i200199i~,&@...",
+".........+@##(<68[_:'>=$@............+@$=^40001fi],=@...",
+".........++#$;_c[[<_(&$#+............+%$-i300041^!-$@...",
+".........+%$*>e<p87<(&$@@............%%=-]f440049!=#@...",
+"........+@#*&,e}pc7[,&$%@+..........+%=-!^flqn04^!=$@+..",
+"........++$&;:<8877<(-$#++..........+@=!~f4nnn049/-$@+..",
+"........+@$>(_cm7c8}e-=$++..........+@-]^10000n4|/,=@+..",
+"........@@=>e_8d77c_5>=$%+..........@#,]m4000n0l9],-#+..",
+".......+@@$-'_cb78p_e>-$@+.........+@%-/{3000n4lf]/-#@..",
+".......+@#$=-_8bmc}}5'-=#@.........+#$=!/1n00nl1f{/,$@..",
+"......+@@%**-jp668<_5'>=%@+.......+%#$-,/9q00n43f^],$@+.",
+".....@+@#$*=&:[b7i8<_e'&$++......@%%$=-,!fq00nn43|{!=@+.",
+"...++@%##$*=-!}76878}_(&$@+....++@#$==,!/9l000nn419!&%+.",
+"...++@#%*$==-5~877m8p_5)#@+....+%#$$--,!/oln0000q1f/=%+.",
+".+@#*=&->>,je<[8788c<:'&%@+..+#$-,!/]]^994q0nn0n4|i!$#+.",
+".+#$);e(e:__c[p[c88[e(-=%@+..@$-/i9|99140nq0nn04f^/,%@+.",
+".%*=':___<[8678pc[[<(-*$@+...%-,ia222400000400049/,=#@..",
+".@#*)(::::_<<_:e5:_5('&$@@...%$>}maaaa2222afffaf^i!-@%..",
+".+@$)'eeeee((;,;>'>'(;;*%+...@#=/i||||9^mi{~]i]i^i~,%+..",
+".+@@=;;';;)*$*$*$$$*'e'&+....+@#,~iiii/,----=--,i|i,%...",
+"..++$&)))-=*$###$%#$&))$+.....+@>,/}}/,-=$*$=$$-5}}=+...",
+"...+@#$$**##@%@+@%@%$$#@.......+#$-=--=$##%%##@#=-$#....",
+".....+++@@@@+@+@++++.+...........++@@@@@%%+@++++.+......",
+"........................................................",
+"........................................................",
+"...........++++........................++++.............",
+".........+@#$##@++...................+%=-=$%@+..........",
+".......+@+$&))=*#@+................+@@&5}/,-$%+.........",
+"......++%#&;e;)=*#++..............+@#$5p|i/,-$@+........",
+"....++@%##;:<:'=$#%@+...........+@##$=]a4aij-$#%+.......",
+"...+@###=$([6<'&$$$@+@.........+@$$=--^004^!--=#@@......",
+"..++@$$$=&:cg[:==*$$%++.......+@#=--,!|000f!,--=#@+.....",
+".+@#&'e(''<bh6<j,>-&=$#@.....+%$5i|^{^000029{{/!,-=%....",
+".+$=(<8<__7dybc__:e(';=$+....@=,m400110000031f|m{},&+...",
+".#$)<6gb8[bhxgbi[[__e(;$+....$-/40000000000n0442|m~-@...",
+"+@$=<bg6c[7dhg6cc<<:e;)$+...+#&540000400000n044a|i}&+...",
+".@$=:7d8_5<8b88c[_ee')=#+....%=,20001o4n00nnqlf|i/,=+...",
+".@#*:8d<:>!}[p<~__(;)*#@.....%$>|004a{o1q44l1a^i/-=@....",
+"+@@*:86<5'j:_~[p_5'>=*#@....+##>a0049{9f1lq41f^],-$%....",
+".@@$e86<(,,j5_p8_(>&$#@@.....@%-|0049{^9o1qn29]!-$#%....",
+".@@$([8<5>,>,:[6[j&=##@+.....@#=m004o{^{{30049!,=$@+....",
+".@@$([8<j',>,:<6<j&*$%@+.....@#=m0019{^{{o4049!-=##+....",
+".+@#;:[:_:jj,_<8<e-=##++.....+@=pa02ao99^14n4|/,=$@+....",
+".+@@)(:____:e_<<_'>&*@%+.....+@#}ma2113of3403^]!-%#+....",
+"..+@=(e:<<__5__<:(>)*#++......+%,i|a4021f112||]/-$@@....",
+"..+@$=):[7<<:5('(:e(;=$%+.....+%>5_a0002|f9m^||m~,&#+...",
+"...+@$=ecb8<:(;-;e<e(;&#+......+#=,a0004a^~/i|4a^~5=+...",
+"....@@#e[dc<:;&$)(<_e;&$+.......@#$|0004ai!-/|42|p5=+...",
+"....++%)(_e;;&*#=)(;;)=#+.......+@#5|2ri~!>$,}mi~/,=@...",
+".....++%&&&**$#@%$*===*#+........+@$,55)>=$%$=-(,,>$+...",
+".......++@+@++@%@++@$$$%+..........@+#@@@@%%@%@@&)&#+...",
+".........++++@++++++@#@+.............++++@++++++#$%+....",
+"....................+++.........................+++.....",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"......++@+@+@+@+@+++..............+@@@@@@@@@@@++........",
+"....++@@%@##%#%@%@@@++..........+@@@##$$#$###%#%@+......",
+"...+@%###$#####$#$##%@+........+@#=$==$=$===$=$$#%+.....",
+"..++*)'>&*&$*$$#=&>)&$#@......+@-/i]!,,--=-=,!]/!-=%....",
+"..+#)e_:,>-==$==-':(;&=#+.....+$}|2f^]/,,-,,/ia|~5,$+...",
+".++#(<c_(,>-=&**>:<_e'&#@....+%$^4029{]/,!,,{f42|i!=@...",
+".+@#([8<5>>-*&&&,e<<e;)*+....+@=m0049{]/,!!!{f44|i}-@...",
+".+%#([8<e>--&&==,e<<:(;*@+...+%&m0049{//!j,!{944|^~>%+..",
+".+@$([8_(,--&&=&>:_<:(;=%+...+#=m0039{//!!!!{a423m~,#+..",
+".+@$([8<j--=&&&&':<_:('=@+...+%&m0029]/!!j!!{f4419i,#+..",
+".+@*([7<(,-&==&&>5[<_e;=%+...+#-|0049{/j,,!!{f42a9i,%@..",
+".@@$([8}j--==&=&>:<_:e;=%+...@%=m0019]/!,j,!{344a|ij#+..",
+".@%$([8<(,--===&,5[<_e'=@+...%#-m0019{//,!,!{fq4f|i,%+..",
+".+@$([7_j--====='5<_:('=#+...+#=|001^]/!>,!j{f44a9i,$@..",
+".+@$([8_(--&=*==,:[<_e'=@@...+#=m0019]/!,,,j{3q41|i,#@..",
+".+@$([7<5,,--->-j_[<_(;&@+...+#=|0049^{]//]/93041|{,#+..",
+".+@$([8[_e!j,,,(:<7[_e'=%+...+@=m0003o99{^^^a40029i,#@..",
+".+@#([7[[__:_::_<868<e;=%+...+#$m0004413afa140002|~,#+..",
+"..+#;<8c<_::eeee<[8c_e;=@+....@$i40041afff|f40001|~,%+..",
+"..+#;<[_e('';>',e_c<:';*++....@$i402f^i{~~{{9204a^~>@+..",
+"..+%;:[:'-&*=$=*>(<::;;*@.....+#pa0|i/!,,-,,]|42ai~)%...",
+"...@)e_()***$#$$&;ee';&$+......@}|2m/,--===-!i||ii5=+...",
+"...+$&)&$$##%##$*&))&)$#+......+=5}5-=$$$$$=-!_/55-$+...",
+"....+###@@@%%@@%%#$$###.........@$=$%%#%%#%%#=*&=$$+....",
+"......+++++++++@+@@@@+@...........+++++++++%@@#@#%@.....",
+"........+.+......+++................+.+......+++........",
+"........................................................",
+"........................................................",
+"........................................................",
+".......++++++++++..................++++@+++++...........",
+".....+++@@@%@@+++@+++............++@#####%@@@@@++.......",
+"....+@#####$$#$##%@++@+.........@#$$$$$=&$=$$#%@@@+.....",
+"...+%$*$$*$$**$*##$#%@%+.......+#=------,---==&$##%@....",
+"...@#&-------&-&&===*$#@@+.....@=!///////!/!!!,,--$%@+..",
+"...@&e____:5jj!5555(,(;=#@+....#!|2133o999oo99f9^^~,&%+.",
+"..+#(<7877[<_<<p[[[[<_e;=#@...+$m40000nl314qq00042ap,&@.",
+"..+#([b6bb78<p878888[[_'=$+...+$m000000n4qn0n000002i,=@.",
+"..+@)(_<88c8pc86c<_::e()$#@...+%}m20000nq0n0041fa|m5&$@.",
+"...+$=)e_ppcc877p_';;))=@+.....+&'}|24qnn0n043^{i~/,#+..",
+"...++#$)e_[}[i66[5>&&&=#++.....+@$*]f144qn00q9]!!!,$@+..",
+"....@@#&>(5__p8bc5-&=$$@+.......%#$,~^ff1q000o/!,-&%+...",
+"....++@$*->>,<cb[5-*$##++.......+%#=,/]{^3n00f/,-=$%+...",
+".....+@@#$*--_pdce**$%%+.........+@#$=,//10009,-=%#+....",
+"......+@@$$=&(c6<j=$$@@+..........+@#=-,!90049,-=#@+....",
+".......+@@#$='<6<(*$#%+............+@#$-,^401^,==%%.....",
+"........+@##*'_c_,$$#@+.............+%$$-i202{-=$@+.....",
+".........+@%#-:[_'&$$%+..............+#%=]|02{!-=#@.....",
+"..........+%#)e_e(-=#@@...............+#$/|2|^/,=%@.....",
+"..........+@@=;:e;;&*@+...............+@#(i||ii!-@@.....",
+"...........++$);'((;=$@+...............+@&/ii^m~,&%+....",
+"............@#*&)(e()=$@................@$-5}^am},&#....",
+".............++%&(_e;&*@.................+@#5m2|i5)%....",
+".............+@+*;e(;=*%.................+@@)~|m~,>#....",
+"..............+@#*&)**$@..................+@$>55,)&%....",
+"................++@####@....................+@#$$$$%....",
+"..................++@@++......................++#%@+....",
+"....................+@+.........................+%+.....",
+"........................................................",
+"........................................................",
+"........................................................",
+".........++@+@@+%+@@+++..............@+@@%@@%@%@@++.....",
+".......+@@#&)**#*=&&*#@+...........+@%&,/,-$-,5!,=%+....",
+"......++#$);:'&#&(e(')*#+.........+@$&/iai!=5^ami5,$+...",
+"......+@$=(<8:'=;_c<e'&#+.........+#=,m40ai,{a00ai5=@...",
+".....@@$$=e[7_'&;_8[_(>*%+.......@#=-,|004{!i200am]-#+..",
+"....+%#*=&e<b<(&(_[<_(;=@+......@#&-,5|0049!^1041m~,%@..",
+"....%$*==):[d<5>'_[<_e;&#@+.....#=),!}a000f]{1043|i!$%+.",
+"....@*&));_7d8:>:_c[<_()$@+.....#-5!/~2000f{f1n4419/-%+.",
+"....$=);(([6g7[5_c88[__;&$@.....=,_i^|0000qf1000q4ai!&#.",
+"....$&;e:<cdg68}[7b67c[e)=#+....&5i||40000n1q00000q|_,$+",
+"....$&;ee_cbhbc_p86688<e>=#....+=5p|az000001q000004|],$.",
+"....@$=&;(<6g7[e}p87c<:;=$@.....#=,5~m4000qf1q0004ai,=#.",
+"....++#$*&:8dc:,:<8[<:e)$@@.....+@==,5a0003{31n4qa|/>#@.",
+".....@+#$$e[dc5,j_p[_e(&#@+......@@$=-|000f{91q41f^!$#+.",
+".....+@@$*ec6[e-j_c<_:(&#@+......+%#=-|000f]910q1fm!$@+.",
+"......+@$#e[d[:-(_p[_5;&#++.......+%==|000f/^1401fi5$@+.",
+"......+@%$e[b<5-j:[<_e'=#@.......++%$*|0009]93q419i,$%..",
+"......++##([d[5-,_[__:;&@+........+%$=m000o/^3041fi!%@..",
+"......+@@$([b[e>,_p<:e'=%@........+@#=m0009]^344a|i,#@..",
+".......@@#(<b[e-,_<[_(;=@+.........@%$m0009/{10439i,#+..",
+".......+@#([d[_,e<c<_e'=%+.........+#$m0003^f4n02|i,#+..",
+".......++#(8d8<e_c7[_e;$@+.........+@$^0002f10002|~-#+..",
+".......+@@(cg6[_<868_(;*@..........+%#m0000240002m~>@...",
+"........++):[_e(::[_e;&$+...........+@}a02|^a242|i!=@...",
+"........++*;(;)=;(e(;)=#+...........++)pmi_!~m|^p/,$+...",
+".........++#$$$%*=))=*#@.............+@$=&*$-,_/(>=@....",
+"..........++@@@@$$=$$##+..............+@#%##=-,-=$$+....",
+"...........+@++++@##@++................+%++@@#$$%%+.....",
+".................+.+.........................+.+........",
+"........................................................",
+"........................................................",
+"...+@###$##@+%+@+@+++..........+%$===$$%@%@@@@+++.......",
+"..@#=;';&&=*##$$$#@++++.......%$,]i]/!,-$=&-==#@@++.....",
+".@#$;:_:e'-=*==&=*$$%@+@+....%$-ia2||{/,-,,!,-=&$%@@+...",
+".@$=e[8<_e'-*&);>)**$#%+++...%&(|0002f^/,!/]]/,-=$#@@+..",
+".+#*;:[__:(5,((5e::((;)&*#@..@$>ia021f99^99f|fa|^]}!>=@.",
+".+@$)e::::___}___[7c<_:';&#+.+#=_|a|af132121400042|i~5&+",
+".+@#&;(e:5_888[c7bgg78[_e'*@.+#$!]m9ff1n000000000002|i>@",
+"..%@=)>(5_[[8[__[8668<<:;)$+..%#,/{9f14400110000002ai_=+",
+".+@@$&>,:_~<8<:,_[88<_e;)=%+.+%%&!]^fll001f^140042ri/($+",
+"..+%#$-'/<<[p:j-'_<<_e;)$#@+..@#=-!^34q4q19/^1442|i5-$#+",
+"..@%$=-(_[p<[:'-'(::::()##+...@%=,/924q44f{/{91aff^/=$%.",
+"..@@*)':<8[[_5'=-;(':ee)$%@+..%#,/io4nqq1f{!/~^^a||/=#@+",
+"..@%=>(_[8c<_e,=&&-;e_e;$@+...@#,]^100n44f{j!j/i92a~-#@.",
+"..@@&(:_p[p[_j>=**=;e_:;$%@...%%59a1q0q419],,,,]|4|~=%%.",
+"..+#'_c<_:___(>==**;:[_;*@+...+$i2043f1119],,,,]a04i-@@.",
+"..@#ec7[5,(e_(>==**;:8['$@@...%=|000f{9|2^],,--~200i-%@.",
+"..+#(c6_'>,:_j-***=;_8[($@+...+$m002^]^a2^/,-,,]200m-#+.",
+"..++&(:;)&(<[:>=*==;:7c'*%+...+@5mai}!^101],-,,~20ni>#+.",
+"...+$=)&==(<7_'*=$=;_7[($++....@=,5!,,m402{,,-,p200m*%+.",
+"....+%$##$([8<,&&&&(:8[($@+.....@$==*-^004{!!j!^z00m&@+.",
+"....++%%##;:[<:(::__[[:)#+......+@%#$=pa04a9|a2200a}=@..",
+"......+@%#)e<[[c[88c[:e&#@........+%#$}|4000000002|5$%..",
+".......++@=;:<[866d8[e;=@+.........+@@,ia40000000|p,%+..",
+"........++$=);::_:__;)=#+...........+@&(}iaaa222i_,$+...",
+"..........%$*=);;;;;&*$@+.............%&-,}ppii}5>&#+...",
+"...........+%%$****$#++................@#$&>>))=$@+.....",
+"............+@@####%@+..................+@#$$$$$@++.....",
+".............++@+++++....................+@@@@%++.......",
+"................+...........................+...........",
+"........................................................",
+"........................................................",
+".........++++........................++++...............",
+".......@$==$$#+++++@@@++...........%-,,-=$@+++@@%%@+....",
+"......+$);))&=$@@@@#$=$+..........+&}i~}5,&%#%#$&>&@....",
+"......+='e(;;&*%%##$$=*#+.........+,i|mii!-##$=--,>*+...",
+"......+*(eeee;&$*=&;(e'&#+........@(i|r||~!=-,5~m|i5$+..",
+"......@=;e:__(>$&)'(:[_;$+........@,p|av2|]-!/ima02p=@..",
+".....++=;e__[:'=-;(:[8[($%+......+@(i|140f{,/]^1000m-#+.",
+".....++*&;:[8_'&;e__<<e;*@+......+%-5pa001^!~|2z44a~>%+.",
+"......@$*):[6<(-':<<::'&*@+.......@=,/|0049/^o04aai5>#+.",
+".....++%$*:[dc5>(_8[e;)=$#+......+%%&,f0009]9200|i},=$@.",
+".....+@%$=e[6c}5__<_()=$#+.......+@$=,900nlo1102m/,-$@..",
+".....+@##$e<77[[[__e;&*#@+.......+%$=-9400044l3|~!-$%+..",
+".....+@#$=,_c876[<e(=$#+++.......+@=-,^1n00002f^!=$%++..",
+".....+%#$=e<876d8<e;&##@+........@%$-,92n000019~!=$%+...",
+"....+@@$*=,_[mbg6_'>&$@%+.......+%#=-,^1000001^]!=%#+...",
+"...++%##=&j_c6gh6~'-$$#++......++#$=,!93n00004{/-=*%+...",
+"...+@$=->':_p86d8<e;-##@+......+#-,/]^f1q00004f{/=$@+...",
+"..+%=);:<[c[cp[pccc_'$#@+.....+#,/if2000040qn002i-$#@...",
+"..+#&;:[6d88<<:e<868e&#%@+....%$5i|0000n44a94000|!=%@+..",
+"..@$)e_[868[_:';:<6[:&*#@+....@=}|2000044f^i|q00f5-*%+..",
+"..+#)e__<<ee;>-&;(ee(;)=##+...@$}|2244||i]/!pm||mi},&$+.",
+"..+#)e_:e(;&*=$$==);;(;)=$@...+$_|2||m~!-,--,,}~pmi/,=%.",
+"...@&(:;;&=$#####%$=);;)=$@....%5m2i~5,-$$$$$$=,}ic/,&#.",
+"...+$&;&**$@@%@+@@@#*&=$%%+....+=5}5>-&#%##@@%#$>,,&$#+.",
+"....+@%#@@++++++++@+@@@@@+......@#$$%@@+++++++@+%###@+..",
+"........++++.........+..............++++.........+......",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"...+@@#@+++....................+%%$%@++.................",
+"..++#*$$#@+...................+@*--=$@@.................",
+".+#$=&)=$$%@+................@$=,5/!-=$@+...............",
+"@$&>(eee'>=#++..............@&5~^|a|i],=@+..............",
+"+&(:_<[_:e;*@++.............@5ma24011m~-#@+.............",
+"@)':<[8<<:'=#@++............@5m|400042{,$@++............",
+"+$&;e<[<<<(-##@+++++@##+@...+&5p|40444m/=$%@++++%$$@@...",
+"+@$=(:[[[<e-*#%%+++@#$##%+..+%&,ma0000|/-$##@@@#$==$#@..",
+".+@$;::[[c:>$##%%%%#$&=$#@+..@#&~a240na]-=$###%=>!,-$@+.",
+".@@%&(:[76<(=*$#$*=;;:;&#+...@@$5^|0004^,-===-,/i|i5$@..",
+".+@@&)e[7g[,=$$#*);(:<:)$+...+@#!~90000^,-==-/~ma4|}=+..",
+"..+%$&;[bh8(&=$**;(e<[_;#+....@%-!i000q9!,--,~ma404~$+..",
+"..+@$=):cdc5>-=*-;:::e(*@+....+@&,/1000f]/,-/iaaa|m,#@..",
+"....##=:[8<:,>&$;(_:(;&$@+.....+$=,|000f^]!-]m2amp5&@+..",
+"...+@@#'_8[_e,-*;e<:;=$#+......+@%={20q1o^/,]|4|i,=$+...",
+"....+%$)(_<[c5>=&;(;&$#++.......%#=}m22009],5~mp5>$%+...",
+"....++%=>(_c6<,=&&)&$#@+........+@%,]^100q^,!!}!=$@%....",
+".....@@#$&_8hce=**#$@@@+.........%#=-510009,,-==##@+....",
+"......+%$=(<8<e'-=$##+@+..........+#-,m404f{/,=$$%@+....",
+"......++@$)(::__e&*##@++..........+@#=/m|a239/-$$@@+....",
+".......+@@#=)e_c:;#$@%++...........+##=,/|20a]==##@+....",
+"........@%#$=;e_:(;&$#@+............@%$-,i|2a^]!-$%+....",
+".........+@##&;(eee(&#@@.............+#$=5~||||^!=#%....",
+"..........+@@$=&(:[:'=#%..............+@%=,j^20ai,$#....",
+"...........++#$*)(:e;=*@+..............+@$&,_m1r],-%+...",
+"............++@$*&;);)&$+...............+@%*>5~}~}5&+...",
+"..............++%#$=&;)#+.................+@%$&,5~/&@...",
+"...............++++#*)&$+..................++@@&-}5=+...",
+"................+.++#$#+....................+.+@$=$@....",
+".....................++..........................++.....",
"........................................................"};
XSync (dpy, False);
screenhack_handle_events (dpy);
- if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput|XtIMSignal))
- XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput|XtIMSignal);
+ if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+ XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
if (delay) usleep (delay);
}
}
-#ifdef USE_GL
-extern Visual *get_gl_visual (Screen *, const char *, const char *);
-#endif
-
#ifdef XLOCKMORE
extern void pre_merge_options (void);
#endif
}
+static Visual *
+pick_visual (Screen *screen)
+{
+#ifdef USE_GL
+ /* If we're linking against GL (that is, this is the version of screenhack.o
+ that the GL hacks will use, which is different from the one that the
+ non-GL hacks will use) then try to pick the "best" visual by interrogating
+ the GL library instead of by asking Xlib. GL knows better.
+ */
+ Visual *v = 0;
+ char *string = get_string_resource ("visualID", "VisualID");
+
+ if (!string || !*string ||
+ !strcmp (string, "gl") ||
+ !strcmp (string, "best") ||
+ !strcmp (string, "color") ||
+ !strcmp (string, "default"))
+ v = get_gl_visual (screen); /* from ../utils/visual-gl.c */
+
+ if (string)
+ free (string);
+ if (v)
+ return v;
+#endif /* USE_GL */
+
+ return get_visual_resource (screen, "visualID", "VisualID", False);
+}
+
int
main (int argc, char **argv)
{
Boolean def_visual_p;
Screen *screen = XtScreen (toplevel);
-
-#ifdef USE_GL
- visual = get_gl_visual (screen, "visualID", "VisualID");
-#else
- visual = get_visual_resource (screen, "visualID", "VisualID", False);
-#endif
+ visual = pick_visual (screen);
if (toplevel->core.width <= 0)
toplevel->core.width = 600;
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*
- * $Revision: 1.7 $
+ * $Revision: 1.9 $
*
* Version 1.0 April 27, 1998.
* - Initial version
* - Now need to define HAVE_PING to compile in the ping stuff.
*/
-/* Define one of these, as appropriate.
- We should make configure detect this, one of these days.
+/* These are computed by configure now:
+ #define HAVE_ICMP
+ #define HAVE_ICMPHDR
*/
-/* #define HAVE_ICMP */
-/* #define HAVE_ICMPHDR */
/* Include Files */
#include <stdio.h>
#include <math.h>
+#include "screenhack.h"
+#include "colors.h"
+#include "hsv.h"
+
#if defined(HAVE_ICMP) || defined(HAVE_ICMPHDR)
# include <unistd.h>
# include <limits.h>
# include <netdb.h>
#endif /* HAVE_ICMP || HAVE_ICMPHDR */
-#include "screenhack.h"
-#include "colors.h"
-#include "hsv.h"
-
-#include <X11/extensions/XShm.h>
-
/* Defines */
/* Allocate a bogie and initialize it */
if ((new = (Bogie *) calloc(1, sizeof(Bogie))) == NULL) {
- fprintf(stderr, "Out of Memory\n");
+ fprintf(stderr, "%s: Out of Memory\n", progname);
return NULL;
}
new->name = name;
struct hostent *hent = gethostbyname(target->name);
if (hent == NULL) {
- fprintf(stderr, "Could not resolve host %s\n", target->name);
+ fprintf(stderr, "%s: could not resolve host %s\n",
+ progname, target->name);
return 0;
}
memcpy(&iaddr->sin_addr, hent->h_addr_list[0],
/* Create the target */
if ((target = calloc(1, sizeof(ping_target))) == NULL) {
- fprintf(stderr, "Out of Memory\n");
+ fprintf(stderr, "%s: Out of Memory\n", progname);
goto target_init_error;
}
if ((target->name = strdup(name)) == NULL) {
- fprintf(stderr, "Out of Memory\n");
+ fprintf(stderr, "%s: Out of Memory\n", progname);
goto target_init_error;
}
/* Make sure we in fact have a file to process */
if ((fname == NULL) || (fname[0] == '\0')) {
- fprintf(stderr, "Invalid ping host file name\n");
+ fprintf(stderr, "%s: invalid ping host file name\n", progname);
return NULL;
}
if ((fp = fopen(fname, "r")) == NULL) {
char msg[1024];
- sprintf(msg, "Unable to open host file %s", fname);
+ sprintf(msg, "%s: unable to open host file %s", progname, fname);
perror(msg);
return NULL;
}
/* Get our hostname */
if (gethostname(hostname, BUFSIZ)) {
- fprintf(stderr, "Unable to get local hostname\n");
+ fprintf(stderr, "%s: unable to get local hostname\n", progname);
return NULL;
}
/* Get our IP address and convert it to a string */
if ((hent = gethostbyname(hostname)) == NULL) {
- fprintf(stderr, "Unable to lookup our IP address\n");
+ fprintf(stderr, "%s: unable to lookup our IP address\n", progname);
return NULL;
}
strcpy(address, inet_ntoa(*((struct in_addr *)hent->h_addr_list[0])));
/* Get a pointer to the last "." in the string */
if ((p = strrchr(address, '.')) == NULL) {
- fprintf(stderr, "Can't parse IP address %s\n", address);
+ fprintf(stderr, "%s: can't parse IP address %s\n", progname, address);
return NULL;
}
p++;
/* Create the ping info structure */
if ((pi = (ping_info *) calloc(1, sizeof(ping_info))) == NULL) {
- fprintf(stderr, "Out of memory\n");
+ fprintf(stderr, "%s: Out of memory\n", progname);
goto ping_init_error;
}
/* Create the ICMP socket and turn off SUID */
if ((pi->icmpsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
- perror("Can't create ICMP socket");
+ char msg[1024];
+ sprintf(msg, "%s: can't create ICMP socket", progname);
+ perror(msg);
fprintf(stderr,
"%s: this program must be setuid to root for `ping mode' to work.\n",
progname);
/* Unknown source */
- fprintf(stderr, "Illegal pingSource: %s\n", src);
+ fprintf(stderr, "%s: illegal pingSource: %s\n", progname, src);
goto ping_init_error;
}
/* Make sure there is something to ping */
if (pi->targets == NULL) {
- fprintf(stderr, "Nothing to ping");
+ fprintf(stderr, "%s: nothing to ping", progname);
goto ping_init_error;
}
&pt->address, sizeof(pt->address))) != pcktsiz) {
#if 0
char errbuf[BUFSIZ];
- sprintf(errbuf, "Error sending ping to %s", pt->name);
+ sprintf(errbuf, "%s: error sending ping to %s", progname, pt->name);
perror(errbuf);
#endif
}
sa.sa_flags = 0;
sa.sa_handler = sigcatcher;
if (sigaction(SIGALRM, &sa, 0) == -1) {
- perror("Unable to trap sigalarm");
+ char msg[1024];
+ sprintf(msg, "%s: unable to trap SIGALRM", progname);
+ perror(msg);
exit(1);
}
strdup((char *) &packet[iphdrlen +
+ sizeof(struct ICMP)
+ sizeof(struct timeval)])) == NULL) {
- fprintf(stderr, "Out of memory\n");
+ fprintf(stderr, "%s: Out of memory\n", progname);
return bl;
}
/* Create the simulation info structure */
if ((si = (sim_info *) calloc(1, sizeof(sim_info))) == NULL) {
- fprintf(stderr, "Out of memory\n");
+ fprintf(stderr, "%s: Out of memory\n", progname);
return NULL;
}
if ((si->teamA = (sim_target *)calloc(si->numA, sizeof(sim_target)))
== NULL) {
free(si);
- fprintf(stderr, "Out of Memory\n");
+ fprintf(stderr, "%s: Out of Memory\n", progname);
return NULL;
}
si->teamAID = get_string_resource("teamAName", "TeamAName");
if ((si->teamA[i].name = (char *) malloc(strlen(si->teamAID) + 4))
== NULL) {
free(si);
- fprintf(stderr, "Out of Memory\n");
+ fprintf(stderr, "%s: Out of Memory\n", progname);
return NULL;
}
sprintf(si->teamA[i].name, "%s%03d", si->teamAID, i+1);
if ((si->teamB = (sim_target *)calloc(si->numB, sizeof(sim_target)))
== NULL) {
free(si);
- fprintf(stderr, "Out of Memory\n");
+ fprintf(stderr, "%s: Out of Memory\n", progname);
return NULL;
}
si->teamBID = get_string_resource("teamBName", "TeamBName");
if ((si->teamB[i].name = (char *) malloc(strlen(si->teamBID) + 4))
== NULL) {
free(si);
- fprintf(stderr, "Out of Memory\n");
+ fprintf(stderr, "%s: Out of Memory\n", progname);
return NULL;
}
sprintf(si->teamB[i].name, "%s%03d", si->teamBID, i+1);
/* Create the Sonar information structure */
if ((si = (sonar_info *) calloc(1, sizeof(sonar_info))) == NULL) {
- fprintf(stderr, "Out of memory\n");
+ fprintf(stderr, "%s: Out of memory\n", progname);
return NULL;
}
if (((si->font = XLoadQueryFont(dpy, get_string_resource ("font", "Font")))
== NULL) &&
((si->font = XLoadQueryFont(dpy, "fixed")) == NULL)) {
- fprintf(stderr, "Can't load an appropriate font\n");
+ fprintf(stderr, "%s: can't load an appropriate font\n", progname);
return NULL;
}
if ((sensor_info = (void *) init_sim()) == NULL)
exit(1);
} else {
- fprintf(stderr, "Unsupported Sonar mode: %s\n", mode);
+ fprintf(stderr, "%s: unsupported Sonar mode: %s\n", progname, mode);
fprintf(stderr,
"\tCurrently supported modes are `ping' and `simulation'\n");
exit(1);
char *progclass = "XJack";
char *defaults [] = {
- ".background: black",
- ".foreground: #00EE00",
+ ".background: #FFF0B4",
+ ".foreground: #000000",
"XJack.font: -*-courier-medium-r-*-*-*-240-*-*-m-*-*-*",
"*delay: 50000",
0
screenhack (Display *dpy, Window window)
{
static const char *source = "All work and no play makes Jack a dull boy. ";
+ /* If you're here because you're thinking about making the above string be
+ customizable, then you don't get the joke. You loser. */
const char *s = source;
int columns, rows; /* characters */
int left, right; /* characters */
while (lines > 0)
{
- XCopyArea (dpy, window, window, gc,
- 0, hspace + line_height,
- xgwa.width,
- xgwa.height - vspace - vspace - line_height,
- 0, vspace);
- XClearArea (dpy, window,
- 0, xgwa.height - vspace - line_height,
- xgwa.width,
- line_height + vspace + vspace,
- False);
- XClearArea (dpy, window, 0, 0, xgwa.width, vspace, False);
- /* See? It's OK. He saw it on the television. */
- XClearArea (dpy, window, 0, 0, hspace, xgwa.height, False);
- XClearArea (dpy, window, xgwa.width - vspace, 0,
- hspace, xgwa.height, False);
+ int i;
+ int inc = line_height / 7;
+ int pix_delay = delay / 1000;
+ if (inc <= 0) inc = 1;
+ for (i = 0; i < line_height; i += inc)
+ {
+ if (i > line_height)
+ i = line_height;
+ XCopyArea (dpy, window, window, gc,
+ 0, inc,
+ xgwa.width, xgwa.height - inc,
+ 0, 0);
+ XSync (dpy, False);
+ if (pix_delay) usleep (pix_delay);
+ }
y--;
lines--;
- XSync (dpy, False);
- if (delay) usleep (delay * 10);
+
+ /* See? It's OK. He saw it on the television. */
+ XClearArea (dpy, window,
+ 0, xgwa.height - vspace - line_height,
+ xgwa.width, line_height + vspace + vspace,
+ False);
+ XSync (dpy, False);
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ columns = (xgwa.width - hspace - hspace) / char_width;
+ rows = (xgwa.height - vspace - vspace) / line_height;
+ if (y > rows) y = rows-1;
+ if (x > columns) x = columns-2;
+
+ if (delay) usleep (delay);
}
if (y < 0) y = 0;
}
void (*hack_draw) (ModeInfo *),
void (*hack_free) (ModeInfo *));
-#ifdef USE_GL
-extern Visual *get_gl_visual (Screen *screen, char *name, char *class);
-#endif
-
#endif /* __XLOCKMORE_INTERNAL_H__ */
".foreground: green",
"*delay: 10000",
"*insert: both",
- "*density: 85",
+ "*density: 75",
0
};
INCLUDES = -I$(srcdir) -I.. @INCLUDES@
SRCS = alpha.c colors.c fade.c grabscreen.c hsv.c overlay.c \
- resources.c spline.c usleep.c visual.c xmu.c xroger.c \
- yarandom.c erase.c sgivideo.c xshm.c xdbe.c
+ resources.c spline.c usleep.c visual.c visual-gl.c xmu.c \
+ xroger.c yarandom.c erase.c sgivideo.c xshm.c xdbe.c
OBJS = alpha.o colors.o fade.o grabscreen.o hsv.o overlay.o \
- resources.o spline.o usleep.o visual.o xmu.o xroger.o \
- yarandom.o erase.o sgivideo.o xshm.o xdbe.o
+ resources.o spline.o usleep.o visual.o visual-gl.o xmu.o \
+ xroger.o yarandom.o erase.o sgivideo.o xshm.o xdbe.o
HDRS = alpha.h colors.h fade.h grabscreen.h hsv.h resources.h \
spline.h usleep.h utils.h version.h visual.h vroot.h xmu.h \
yarandom.h erase.h sgivideo.h xshm.h xdbe.h
visual.o: ../config.h
visual.o: $(srcdir)/resources.h
visual.o: $(srcdir)/visual.h
+visual-gl.o: $(srcdir)/utils.h
+visual-gl.o: ../config.h
+visual-gl.o: $(srcdir)/visual.h
xmu.o: ../config.h
xroger.o: $(srcdir)/utils.h
xroger.o: ../config.h
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SGIVIDEO.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-GTOD.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-STRDUP.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SGIVIDEO.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-GTOD.C
$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-STRDUP.C
static const char screensaver_id[] =
- "@(#)xscreensaver 3.10 (27-Apr-99), by Jamie Zawinski (jwz@jwz.org)";
+ "@(#)xscreensaver 3.12 (10-May-99), by Jamie Zawinski (jwz@jwz.org)";
--- /dev/null
+/* xscreensaver, Copyright (c) 1999 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This file contains code for picking the best visual for GL programs by
+ actually asking the GL library to figure it out for us. The code in
+ visual.c might do a good job of this on most systems, but not, in
+ particular, on SGIs.
+
+ Why? Because with the SGI O2 X server is weird.
+
+ GL programs tend to work best on a visual that is *half* as deep as the
+ depth of the screen, since that way, they can do double-buffering. So
+ generally, if the screen is 24 bits deep, but a 12-bit TrueColor visual
+ is available, then that's the visual you should use.
+
+ But on the server that runs on the O2 (a machine that has serious hardware
+ support for GL) the 12-bit PseudoColor visual looks awful (you get a black
+ and white, flickery image.) On these machines, the visual you want turns
+ out to be 0x31 -- this is but one of the eight 15-bit TrueColor visuals
+ (yes, 8, and yes, 15) that O2s provide. This is the only visual that works
+ properly -- as far as `xdpyinfo' is concerned, all of the 15-bit TrueColor
+ visuals are identical, but some flicker like mad, and some have deeply
+ weird artifacts (hidden surfaces show through!) I suppose these other
+ visuals must be tied to some arcane hardware feature...
+
+ So the bottom line is, there exists information about visuals which is
+ available to GL, but which is not available via Xlib calls. So the only
+ way to know which visual to use (other than impirically) is to actually
+ call GLX routines.
+ */
+
+#include "utils.h"
+#include "visual.h"
+
+#ifdef HAVE_GL
+# include <GL/gl.h>
+# include <GL/glx.h>
+#endif /* HAVE_GL */
+
+Visual *
+get_gl_visual (Screen *screen)
+{
+#ifdef HAVE_GL
+ XVisualInfo *vi = 0;
+ Display *dpy = DisplayOfScreen (screen);
+ int screen_num = screen_number (screen);
+ int attrs[20];
+ int i = 0;
+
+ attrs[i++] = GLX_RGBA;
+ attrs[i++] = GLX_RED_SIZE; attrs[i++] = 1;
+ attrs[i++] = GLX_GREEN_SIZE; attrs[i++] = 1;
+ attrs[i++] = GLX_BLUE_SIZE; attrs[i++] = 1;
+ attrs[i++] = GLX_DEPTH_SIZE; attrs[i++] = 1;
+ attrs[i++] = GLX_DOUBLEBUFFER;
+ attrs[i++] = 0;
+
+ vi = glXChooseVisual (dpy, screen_num, attrs);
+
+ if (!vi) /* Try without double-buffering. */
+ {
+ attrs[i-1] = 0;
+ vi = glXChooseVisual (dpy, screen_num, attrs);
+ }
+
+ if (!vi) /* Try mono. */
+ {
+ i = 0;
+ attrs[i++] = GLX_DOUBLEBUFFER;
+ attrs[i++] = 0;
+ vi = glXChooseVisual (dpy, screen_num, attrs);
+ }
+
+ if (!vi) /* Try mono without double-buffer. */
+ {
+ attrs[0] = 0;
+ vi = glXChooseVisual (dpy, screen_num, attrs);
+ }
+
+ if (!vi)
+ return 0;
+ else
+ {
+ Visual *v = vi->visual;
+ XFree (vi);
+ return v;
+ }
+#else /* !HAVE_GL */
+ return 0;
+#endif /* !HAVE_GL */
+}
-/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998
+/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999
* by Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
static Visual *pick_best_visual (Screen *, Bool, Bool);
static Visual *pick_mono_visual (Screen *);
static Visual *pick_best_visual_of_class (Screen *, int);
+static Visual *pick_best_gl_visual (Screen *);
static Visual *id_to_visual (Screen *, int);
static Visual *id_to_visual (Screen *screen, int id);
#define MONO_VISUAL -3
#define GRAY_VISUAL -4
#define COLOR_VISUAL -5
-#define SPECIFIC_VISUAL -6
+#define GL_VISUAL -6
+#define SPECIFIC_VISUAL -7
Visual *
get_visual (Screen *screen, const char *string, Bool prefer_writable_cells,
else if (!strcmp (v, "gray")) vclass = GRAY_VISUAL;
else if (!strcmp (v, "grey")) vclass = GRAY_VISUAL;
else if (!strcmp (v, "color")) vclass = COLOR_VISUAL;
+ else if (!strcmp (v, "gl")) vclass = GL_VISUAL;
else if (!strcmp (v, "staticgray")) vclass = StaticGray;
else if (!strcmp (v, "staticcolor")) vclass = StaticColor;
else if (!strcmp (v, "truecolor")) vclass = TrueColor;
if (!result && verbose_p)
fprintf (stderr, "%s: no color visuals.\n", progname);
}
+ else if (vclass == GL_VISUAL)
+ {
+ Visual *visual = pick_best_gl_visual (screen);
+ if (visual)
+ result = visual;
+ else if (verbose_p)
+ fprintf (stderr, "%s: no visual suitable for GL.\n", progname, v);
+ }
else if (vclass == SPECIFIC_VISUAL)
{
result = id_to_visual (screen, id);
return 0;
}
+static Visual *
+pick_best_gl_visual (Screen *screen)
+{
+ /* The best visual for GL is a TrueColor visual that is half as deep as
+ the screen. If such a thing doesn't exist, then TrueColor is best.
+ Failing that, the deepest available color visual is best.
+
+ Compare this function to get_gl_visual() in visual-gl.c.
+ This function tries to find the best GL visual using Xlib calls,
+ whereas that function does the same thing using GLX calls.
+ */
+ Display *dpy = DisplayOfScreen (screen);
+ XVisualInfo vi_in, *vi_out;
+ int out_count;
+ Visual *result = 0;
+
+ int ndepths = 0;
+ int *depths = XListDepths (dpy, screen_number (screen), &ndepths);
+ int screen_depth = depths[ndepths];
+ XFree (depths);
+
+ vi_in.class = TrueColor;
+ vi_in.screen = screen_number (screen);
+ vi_in.depth = screen_depth / 2;
+ vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask |
+ VisualDepthMask),
+ &vi_in, &out_count);
+ if (out_count > 0)
+ result = vi_out[0].visual;
+
+ if (vi_out)
+ XFree ((char *) vi_out);
+
+ if (!result && screen_depth > 24)
+ {
+ /* If it's a 32-deep screen and we didn't find a depth-16 visual,
+ see if there's a depth-12 visual. */
+ vi_in.class = TrueColor;
+ vi_in.screen = screen_number (screen);
+ vi_in.depth = 12;
+ vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask |
+ VisualDepthMask),
+ &vi_in, &out_count);
+ if (out_count > 0)
+ result = vi_out[0].visual;
+ }
+
+ if (result)
+ /* No half-depth TrueColor? Ok, try for any TrueColor (the deepest.) */
+ result = pick_best_visual_of_class (screen, TrueColor);
+
+ if (!result)
+ /* No TrueColor? Ok, try for anything. */
+ result = pick_best_visual (screen, False, False);
+
+ return result;
+}
+
+
static Visual *
id_to_visual (Screen *screen, int id)
{
-/* xscreensaver, Copyright (c) 1993-1998 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1993-1999 by Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
extern Visual *get_overlay_visual (Screen *, unsigned long *pixel_return);
extern Bool has_writable_cells (Screen *screen, Visual *visual);
+Visual *get_gl_visual (Screen *screen);
+
#endif /* __VISUAL_H__ */
Begin3
Title: xscreensaver
-Version: 3.10
-Entered-date: 27APR99
+Version: 3.12
+Entered-date: 10MAY99
Description: A modular screen saver and locker for the X Window System.
Highly customizable: allows the use of any program that
can draw on the root window as a display mode.
Author: jwz@jwz.org (Jamie Zawinski)
Maintained-by: jwz@jwz.org (Jamie Zawinski)
Primary-site: http://www.jwz.org/xscreensaver/
- 1081K xscreensaver-3.10.tar.gz
- 30K xscreensaver.README
+ 1094K xscreensaver-3.12.tar.gz
+ 32K xscreensaver.README
1K xscreensaver.lsm
Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
- 1081K xscreensaver-3.10.tar.gz
- 30K xscreensaver.README
+ 1094K xscreensaver-3.12.tar.gz
+ 32K xscreensaver.README
1K xscreensaver.lsm
Alternate-site: ftp.x.org /contrib/applications/
- 1081K xscreensaver-3.10.tar.gz
- 30K xscreensaver.README
+ 1094K xscreensaver-3.12.tar.gz
+ 32K xscreensaver.README
1K xscreensaver.lsm
Platforms: Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
BSDI, SCO, OSF1, Ultrix, VMS.
Name: xscreensaver
Summary: X screen saver and locker
Vendor: Jamie Zawinski <jwz@jwz.org>
-Version: 3.10
+Version: 3.12
Release: 1
URL: http://www.jwz.org/xscreensaver/
Source: xscreensaver-%{version}.tar.gz