Mercurial > hg > xemacs-beta
changeset 116:9f59509498e1 r20-1b10
Import from CVS: tag r20-1b10
line wrap: on
line diff
--- a/BUGS Mon Aug 13 09:21:56 2007 +0200 +++ b/BUGS Mon Aug 13 09:23:06 2007 +0200 @@ -17,3 +17,9 @@ (3) By hand. Do cat info/xemacs* | more "+/^File: xemacs.info, Node: Bugs," + +Part II of the XEmacs FAQ, available in a manner similar to the above, +or via the world wide web, contains extensive information on how to +track down and report bugs. + + http://www.xemacs.org/faq/
--- a/CHANGES-beta Mon Aug 13 09:21:56 2007 +0200 +++ b/CHANGES-beta Mon Aug 13 09:23:06 2007 +0200 @@ -1,4 +1,20 @@ -*- indented-text -*- +to 20.1 beta10 +-- custom-1.68 [Beyond 19.15] +-- W3-3.0.75 +-- Documentation updates +-- cc-mode-4.388 +-- Custom-1.67 +-- EFS fixes courtesy of Michael Sperber +-- time.el-1.11 +-- Various cursor glitch patches courtesy of Darrell Kindred +-- Irix -rpath support courtesy of Darrell Kindred +-- Miscellaneous bug fixes +-- EFS synch to 19.15 for default-dir.el +-- hm--html-mode-5.5 +-- VM-6.22 +-- Gnus-5.4.37 + to 20.1 beta9 -- VM-6.21 -- tm-7.106 @@ -18,7 +34,6 @@ -- floating-toolbar.el-1.02 -- balloon-help.el-1.05 -- W3-3.0.71 --- VM-6.20 -- Custom-1.65 -- Gnus-5.4.33 -- strip unimplemented subwindows subr code
--- a/ChangeLog Mon Aug 13 09:21:56 2007 +0200 +++ b/ChangeLog Mon Aug 13 09:23:06 2007 +0200 @@ -1,3 +1,42 @@ +Thu Mar 27 18:24:19 1997 Steven L Baur <steve@altair.xemacs.org> + + * XEmacs 20.1-b10 is released. + +Wed Mar 26 22:31:10 1997 Steven L Baur <steve@altair.xemacs.org> + + * Remove vms top-level directory. + + * XEmacs 19.15 final released to beta testers. + +Tue Mar 25 19:13:27 1997 Steven L Baur <steve@altair.xemacs.org> + + * XEmacs 19.15 prefinal released to beta testers. + +Mon Mar 24 12:28:17 1997 Steven L Baur <steve@altair.xemacs.org> + + * configure.in (--debug): Correct documentation. + +Sun Mar 23 17:24:38 1997 Steven L Baur <steve@altair.xemacs.org> + + * XEmacs 19.15-b104 is released. + +Sat Mar 22 19:56:36 1997 Steven L Baur <steve@altair.xemacs.org> + + * etc/sgml/CATALOG: Default to html-3.2final. + +Sat Mar 22 17:55:15 1997 Darrell Kindred <dkindred@cmu.edu> + + * configure.in (beta): Add configure support for the -rpath flag + for IRIX analogous to the Solaris "-R". + +Sat Mar 22 16:47:08 1997 Steven L Baur <steve@altair.xemacs.org> + + * info/dir (Packages): Add HM-HTML-Mode to menu. + +Sat Mar 22 21:27:41 1997 Tomasz J. Cholewo <t.cholewo@ieee.org> + + * configure.in: Echo only current configuration using 'tee -a'. + Fri Mar 21 21:26:01 1997 Steven L Baur <steve@altair.xemacs.org> * XEmacs-19.15-b103 is released.
--- a/PROBLEMS Mon Aug 13 09:21:56 2007 +0200 +++ b/PROBLEMS Mon Aug 13 09:23:06 2007 +0200 @@ -1791,3 +1791,44 @@ The is seen when installing the Big Brother Data Base (bbdb) which includes an outdated copy of mail-abbrevs.el. Remove the copy that comes with bbdb and use the one that comes with XEmacs. + +* Linking with -rpath on IRIX. + +Darrell Kindred <dkindred@cmu.edu> writes: +There are a couple of problems [with use of -rpath with Irix ld], though: + + 1. The ld in IRIX 5.3 ignores all but the last -rpath + spec, so the patched configure spits out a warning + if --x-libraries or --site-runtime-libraries are + specified under irix 5.x, and it only adds -rpath + entries for the --site-runtime-libraries. This bug was + fixed sometime between 5.3 and 6.2. + + 2. IRIX gcc 2.7.2 doesn't accept -rpath directly, so + it would have to be prefixed by -Xlinker or "-Wl,". + This would be fine, except that configure compiles with + ${CC-cc} $CFLAGS $LDFLAGS ... + rather than quoting $LDFLAGS with prefix-args, like + src/Makefile does. So if you specify --x-libraries + or --site-runtime-libraries, you must use --use-gcc=no, + or configure will fail. + +* On Irix 5.x and 6.x, the dumped XEmacs (xemacs) core dumps when executed + on another machine, or after newer SGI IRIX patches have been installed. + +The xemacs binary must be executed with the same "libc.so" file which was used +when the xemacs binary was dumped. Some SGI IRIX patches update this file. +Make sure that all machines using the xemacs binary are using the same +set of IRIX patches. If xemacs core dumps after a patch upgrade then you +will have to redump it from temacs. + +* xemacs: can't resolve symbol '__malloc_hook' + +This is a Linux problem where you've compiled the XEmacs binary on a libc +5.4 with version higher than 5.4.19 and attempted to run the binary against +an earlier version. The solution is to upgrade your old library. + +* VM appears to hang in large folders + +This is normal (trust us) when upgrading to VM-6.22 from earlier versions. +Let VM finish what it is doing and all will be well.
--- a/configure Mon Aug 13 09:21:56 2007 +0200 +++ b/configure Mon Aug 13 09:23:06 2007 +0200 @@ -291,7 +291,7 @@ Debugging options: --debug Compile with support for debugging XEmacs. - (Causes code-size increase but no loss of speed.) + (Causes code-size increase and little loss of speed.) --error-checking=TYPE[,TYPE]... Compile with internal error-checking added. Causes noticeable loss of speed. Valid types @@ -2679,13 +2679,38 @@ with_toolbars='yes' fi +runtime_arg="-R${dash_r_space}" + case "${canonical}" in - *-sun-solaris* | *-sun-sunos5* ) add_runtime_flag=yes ;; + *-sun-solaris* | *-sun-sunos5* ) + add_runtime_flag=yes ;; + *-sgi-irix5.* ) + # In the IRIX 5.3 ld, only the last -rpath arg has any effect. This is + # fundamentaly incompatible with having separate LD_SWITCH_X_SITE + # and LD_SWITCH_SITE variables. Fortunately, SGI fixed this by 6.2. + if [ -n "${x_libraries}" ] || [ -n "${site_runtime_libraries}" ]; then + (echo "WARNING: The IRIX 5 ld ignores all but the last -rpath argument,"; + echo " so if you need to specify more than one additional"; + echo " runtime library directory, you will have to do so"; + echo " manually by setting the environment variable"; + echo " LD_SWITCH_SITE to '-rpath <path>' before running"; + echo " configure. If you have only one additional directory," + echo " you can specify it with --site-runtime-libraries.") >&2 + fi + runtime_arg="-rpath " ;; + *-sgi-irix* ) + # Note that IRIX gcc (as of 2.7.2) doesn't accept -rpath, so + # using it can cause trouble. Specifying --use-gcc=no will work + # around this, but the real problem is that configure uses $LDFLAGS + # as arguments to $(CC), instead of using prefix-args like the + # src/Makefile does. + add_runtime_flag=yes; + runtime_arg="-rpath " ;; esac if test -n "${x_libraries}" ; then - if test "${add_runtime_flag}" ; then - LD_SWITCH_X_SITE="-L${x_libraries} -R${dash_r_space}${x_libraries}" + if test "${add_runtime_flag}" = "yes" ; then + LD_SWITCH_X_SITE="-L${x_libraries} ${runtime_arg}${x_libraries}" else LD_SWITCH_X_SITE="-L${x_libraries}" fi @@ -2704,7 +2729,7 @@ for arg in ${site_runtime_libraries} do LD_SWITCH_SITE="${LD_SWITCH_SITE} -L${arg}" - LD_SWITCH_SITE="${LD_SWITCH_SITE} -R${dash_r_space}${arg}" + LD_SWITCH_SITE="${LD_SWITCH_SITE} ${runtime_arg}${arg}" done fi if test -n "${site_includes}" ; then @@ -2855,11 +2880,11 @@ CPP=`eval "echo $CPP"` eval `${CPP} -Isrc ${tempcname} \ | grep 'configure___' \ - | sed -n -e 's/^configure___ \([^=]*=\)\(.*\)$/\1"\2"/p'` + | sed -n -e 's/^configure___ \(^=*=\)\(.*\)$/\1"\2"/p'` if test "x$SPECIFIED_CFLAGS" = x ; then eval `${CPP} -Isrc -DTHIS_IS_CONFIGURE ${tempcname} \ | grep 'configure___' \ - | sed -n -e 's/^configure___ \([^=]*=\)\(.*\)$/\1"\2"/p'` + | sed -n -e 's/^configure___ \(^=*=\)\(.*\)$/\1"\2"/p'` else REAL_CFLAGS="$CFLAGS" fi @@ -2891,7 +2916,7 @@ #### Add the libraries to LIBS and check for some functions. - +] CPPFLAGS="${C_SWITCH_SITE} $c_switch_system $c_switch_machine $c_switch_x_system $CPPFLAGS" DEFS="${C_SWITCH_SITE} $c_switch_system $c_switch_machine $c_switch_x_system $DEFS" LIBS="${LD_SWITCH_SITE} $ld_switch_x_system $libsrc_libs $LIBS" @@ -5856,8 +5881,8 @@ case "${arg}" in -L*) if test -f `echo "${arg}/libtt.a" | sed 's/^\-L//'` ; then dash_r='' - if test -n "${add_runtime_flag}" ; then - dash_r=`echo ${arg} | sed "s/^-L/-R${dash_r_space}/"` + if "${add_runtime_flag}" = "yes" ; then + dash_r=`echo ${arg} | sed "s/^-L */${runtime_arg}/"` fi LD_SWITCH_X_SITE="${LD_SWITCH_X_SITE} ${arg} ${dash_r}" fi @@ -6976,6 +7001,9 @@ +echo "$0 $configure_args" >> Installation +# Start stdout redirection to '| tee -a Installation' +( echo " Configured for \`${canonical}'. @@ -6989,92 +7017,91 @@ Should XEmacs use the relocating allocator for buffers? ${rel_alloc} What window system should XEmacs use? ${window_system}${x_includes+ Where do we find X Windows header files? }${x_includes}${x_libraries+ - Where do we find X Windows libraries? }${x_libraries}" >> Installation + Where do we find X Windows libraries? }${x_libraries}" if test -n "$site_includes"; then - echo " Additional header files: ${site_includes}" >> Installation + echo " Additional header files: ${site_includes}" fi if test -n "$site_libraries" -a -n "$site_runtime_libraries"; then - echo " Additional libraries: ${site_libraries} ${site_runtime_libraries}" >> Installation + echo " Additional libraries: ${site_libraries} ${site_runtime_libraries}" elif test -n "$site_libraries"; then - echo " Additional libraries: ${site_libraries}" >> Installation + echo " Additional libraries: ${site_libraries}" elif test -n "$site_runtime_libraries"; then - echo " Additional libraries: ${site_runtime_libraries}" >> Installation + echo " Additional libraries: ${site_runtime_libraries}" fi if test "$with_wnn"; then - echo " Finding WNN includes with: ${wnn_includes}" >> Installation - echo " Loading WNN libs with: ${wnn_libraries}" >> Installation -fi -test "$with_socks" = yes && echo " Compiling in support for SOCKS." >> Installation -test "$with_term" = yes && echo " Compiling in support for TERM." >> Installation -test "$with_xauth" = yes && echo " Compiling in support for XAUTH." >> Installation -test "$with_xpm" = yes && echo " Compiling in support for XPM." >> Installation + echo " Finding WNN includes with: ${wnn_includes}" + echo " Loading WNN libs with: ${wnn_libraries}" +fi +test "$with_socks" = yes && echo " Compiling in support for SOCKS." +test "$with_term" = yes && echo " Compiling in support for TERM." +test "$with_xauth" = yes && echo " Compiling in support for XAUTH." +test "$with_xpm" = yes && echo " Compiling in support for XPM." if test "$with_xmu" != yes -a "$window_system" != none; then - echo " No Xmu; substituting equivalent routines." >> Installation -fi -test "$with_xface" = yes && echo " Compiling in support for X-Face headers." >> Installation -test "$with_gif" = yes && echo " Compiling in support for GIF image conversion." >> Installation -test "$with_jpeg" = yes && echo " Compiling in support for JPEG image conversion." >> Installation + echo " No Xmu; substituting equivalent routines." +fi +test "$with_xface" = yes && echo " Compiling in support for X-Face headers." +test "$with_gif" = yes && echo " Compiling in support for GIF image conversion." +test "$with_jpeg" = yes && echo " Compiling in support for JPEG image conversion." if test "$with_png" = yes -o "$with_png" = gnuz; then - echo " Compiling in support for PNG image conversion." >> Installation + echo " Compiling in support for PNG image conversion." fi if test "$with_png" = gnuz; then - echo " (Using -lgz instead of -lz.)" >> Installation -fi -test "$with_tiff" = yes && echo " Compiling in support for TIFF image conversion (not implemented)." >> Installation -test "$with_epoch" = yes && echo " Compiling in extra Epoch compatibility." >> Installation - -test "$with_sound" = nas && echo " Compiling in network sound support." >> Installation -test "$with_sound" = native && echo " Compiling in native sound support." >> Installation -test "$with_sound" = both && echo " Compiling in both network and native sound support." >> Installation -test "$old_nas" = true && echo " nas library lacks error trapping, will play synchronously" >> Installation - -test "$with_database_berkdb" = yes && echo " Compiling in support for Berkeley DB." >> Installation -test "$with_database_dbm" = yes && echo " Compiling in support for DBM." >> Installation -test "$with_database_gnudbm" = yes && echo " Compiling in support for GNU DBM." >> Installation - -test "$with_ncurses" = yes && echo " Compiling in support for ncurses." >> Installation -test "$with_socks" = yes && echo " Compiling in support for SOCKS." >> Installation - -test "$with_mule" = yes && echo " Compiling in Mule (multi-lingual) support." >> Installation -test "$with_xim" != no && echo " Compiling in XIM (X11R5+ I18N input method) support." >> Installation -test "$with_xim" = motif && echo " Using Motif to provide XIM support." >> Installation -test "$with_xim" = xlib && echo " Using raw Xlib to provide XIM support." >> Installation -test "$with_canna" = yes && echo " Compiling in support for Canna on Mule." >> Installation -test "$with_wnn" = yes && echo " Compiling in support for WNN on Mule." >> Installation -test "$with_wnn6" = yes && echo " WNN support for version 6." >> Installation -test "$with_i18n3" = yes && echo " Compiling in I18N support, level 3 (doesn't currently work)." >> Installation - -test "$with_cde" = yes && echo " Compiling in support for CDE." >> Installation -test "$with_tooltalk" = yes && echo " Compiling in support for ToolTalk." >> Installation -test "$with_offix" = yes && echo " Compiling in support for OffiX." >> Installation -test "$with_mocklisp" = yes && echo " Compiling in support for Mocklisp." >> Installation -test "$with_sparcworks" = yes && echo " Compiling in support for SparcWorks." >> Installation -test "$with_energize" = yes && echo " Compiling in support for Lucid Energize (doesn't currently work)." >> Installation -test "$with_menubars" = "lucid" && echo " Using the Lucid menubar." >> Installation + echo " (Using -lgz instead of -lz.)" +fi +test "$with_tiff" = yes && echo " Compiling in support for TIFF image conversion (not implemented)." +test "$with_epoch" = yes && echo " Compiling in extra Epoch compatibility." + +test "$with_sound" = nas && echo " Compiling in network sound support." +test "$with_sound" = native && echo " Compiling in native sound support." +test "$with_sound" = both && echo " Compiling in both network and native sound support." +test "$old_nas" = true && echo " nas library lacks error trapping, will play synchronously" + +test "$with_database_berkdb" = yes && echo " Compiling in support for Berkeley DB." +test "$with_database_dbm" = yes && echo " Compiling in support for DBM." +test "$with_database_gnudbm" = yes && echo " Compiling in support for GNU DBM." + +test "$with_ncurses" = yes && echo " Compiling in support for ncurses." +test "$with_socks" = yes && echo " Compiling in support for SOCKS." + +test "$with_mule" = yes && echo " Compiling in Mule (multi-lingual) support." +test "$with_xim" != no && echo " Compiling in XIM (X11R5+ I18N input method) support." +test "$with_xim" = motif && echo " Using Motif to provide XIM support." +test "$with_xim" = xlib && echo " Using raw Xlib to provide XIM support." +test "$with_canna" = yes && echo " Compiling in support for Canna on Mule." +test "$with_wnn" = yes && echo " Compiling in support for WNN on Mule." +test "$with_wnn6" = yes && echo " WNN support for version 6." +test "$with_i18n3" = yes && echo " Compiling in I18N support, level 3 (doesn't currently work)." + +test "$with_cde" = yes && echo " Compiling in support for CDE." +test "$with_tooltalk" = yes && echo " Compiling in support for ToolTalk." +test "$with_offix" = yes && echo " Compiling in support for OffiX." +test "$with_mocklisp" = yes && echo " Compiling in support for Mocklisp." +test "$with_sparcworks" = yes && echo " Compiling in support for SparcWorks." +test "$with_energize" = yes && echo " Compiling in support for Lucid Energize (doesn't currently work)." +test "$with_menubars" = "lucid" && echo " Using the Lucid menubar." if test "$with_menubars" = "motif"; then - echo " Using the Motif menubar." >> Installation - echo " *WARNING* The Motif menubar is currently buggy. We recommend" >> Installation - echo " that you use the Lucid menubar instead. Re-run" >> Installation - echo " configure with --with-menubars='lucid'." >> Installation -fi -test "$with_scrollbars" = lucid && echo " Using the Lucid scrollbar." >> Installation -test "$with_scrollbars" = motif && echo " Using the Motif scrollbar." >> Installation -test "$with_scrollbars" = athena && echo " Using the Athena scrollbar." >> Installation -test "$with_scrollbars" = athena3d && echo " Using the Athena-3d scrollbar." >> Installation -test "$with_dialogs" = motif && echo " Using the Motif dialog boxes." >> Installation -test "$with_dialogs" = athena && echo " Using the Athena dialog boxes." >> Installation -test "$with_dialogs" = athena3d && echo " Using the Athena-3d dialog boxes." >> Installation - -test "${use_union_type}" = yes && echo " Using the union type for Lisp_Objects." >> Installation -test "${debug}" = yes && echo " Compiling in extra code for debugging." >> Installation -test "${memory_usage_stats}" = yes && echo " Compiling in code for checking XEmacs memory usage." >> Installation -test "$usage_tracking" = yes && echo " Compiling with usage tracking active (Sun internal)." >> Installation -echo " >> Installation -" - -test -r Installation && cat Installation + echo " Using the Motif menubar." + echo " *WARNING* The Motif menubar is currently buggy. We recommend" + echo " that you use the Lucid menubar instead. Re-run" + echo " configure with --with-menubars='lucid'." +fi +test "$with_scrollbars" = lucid && echo " Using the Lucid scrollbar." +test "$with_scrollbars" = motif && echo " Using the Motif scrollbar." +test "$with_scrollbars" = athena && echo " Using the Athena scrollbar." +test "$with_scrollbars" = athena3d && echo " Using the Athena-3d scrollbar." +test "$with_dialogs" = motif && echo " Using the Motif dialog boxes." +test "$with_dialogs" = athena && echo " Using the Athena dialog boxes." +test "$with_dialogs" = athena3d && echo " Using the Athena-3d dialog boxes." + +test "${use_union_type}" = yes && echo " Using the union type for Lisp_Objects." +test "${debug}" = yes && echo " Compiling in extra code for debugging." +test "${memory_usage_stats}" = yes && echo " Compiling in code for checking XEmacs memory usage." +test "$usage_tracking" = yes && echo " Compiling with usage tracking active (Sun internal)." +) | tee -a Installation +echo " | tee -a Installation +" # Remove any trailing slashes in these variables.
--- a/configure.in Mon Aug 13 09:21:56 2007 +0200 +++ b/configure.in Mon Aug 13 09:23:06 2007 +0200 @@ -307,7 +307,7 @@ Debugging options: --debug Compile with support for debugging XEmacs. - (Causes code-size increase but no loss of speed.) + (Causes code-size increase and little loss of speed.) --error-checking=TYPE[,TYPE]... Compile with internal error-checking added. Causes noticeable loss of speed. Valid types @@ -1869,13 +1869,38 @@ with_toolbars='yes' fi [ +runtime_arg="-R${dash_r_space}" + case "${canonical}" in - *-sun-solaris* | *-sun-sunos5* ) add_runtime_flag=yes ;; + *-sun-solaris* | *-sun-sunos5* ) + add_runtime_flag=yes ;; + *-sgi-irix5.* ) + # In the IRIX 5.3 ld, only the last -rpath arg has any effect. This is + # fundamentaly incompatible with having separate LD_SWITCH_X_SITE + # and LD_SWITCH_SITE variables. Fortunately, SGI fixed this by 6.2. + if [ -n "${x_libraries}" ] || [ -n "${site_runtime_libraries}" ]; then + (echo "WARNING: The IRIX 5 ld ignores all but the last -rpath argument,"; + echo " so if you need to specify more than one additional"; + echo " runtime library directory, you will have to do so"; + echo " manually by setting the environment variable"; + echo " LD_SWITCH_SITE to '-rpath <path>' before running"; + echo " configure. If you have only one additional directory," + echo " you can specify it with --site-runtime-libraries.") >&2 + fi + runtime_arg="-rpath " ;; + *-sgi-irix* ) + # Note that IRIX gcc (as of 2.7.2) doesn't accept -rpath, so + # using it can cause trouble. Specifying --use-gcc=no will work + # around this, but the real problem is that configure uses $LDFLAGS + # as arguments to $(CC), instead of using prefix-args like the + # src/Makefile does. + add_runtime_flag=yes; + runtime_arg="-rpath " ;; esac if test -n "${x_libraries}" ; then - if test "${add_runtime_flag}" ; then - LD_SWITCH_X_SITE="-L${x_libraries} -R${dash_r_space}${x_libraries}" + if test "${add_runtime_flag}" = "yes" ]; then + LD_SWITCH_X_SITE="-L${x_libraries} ${runtime_arg}${x_libraries}" else LD_SWITCH_X_SITE="-L${x_libraries}" fi @@ -1894,7 +1919,7 @@ for arg in ${site_runtime_libraries} do LD_SWITCH_SITE="${LD_SWITCH_SITE} -L${arg}" - LD_SWITCH_SITE="${LD_SWITCH_SITE} -R${dash_r_space}${arg}" + LD_SWITCH_SITE="${LD_SWITCH_SITE} ${runtime_arg}${arg}" done fi if test -n "${site_includes}" ; then @@ -2966,8 +2991,8 @@ case "${arg}" in -L*) if test -f `echo "${arg}/libtt.a" | sed 's/^\-L//'` ; then dash_r='' - if test -n "${add_runtime_flag}" ; then - dash_r=`echo ${arg} | sed "s/^-L/-R${dash_r_space}/"` + if [ "${add_runtime_flag}" = "yes" ]; then + dash_r=`echo ${arg} | sed "s/^-L */${runtime_arg}/"` fi LD_SWITCH_X_SITE="${LD_SWITCH_X_SITE} ${arg} ${dash_r}" fi @@ -3178,6 +3203,9 @@ dnl # Report on what we decided to do # dnl ############################################################################ +echo "$0 $configure_args" >> Installation +# Start stdout redirection to '| tee -a Installation' +( echo " Configured for \`${canonical}'. @@ -3191,92 +3219,91 @@ Should XEmacs use the relocating allocator for buffers? ${rel_alloc} What window system should XEmacs use? ${window_system}${x_includes+ Where do we find X Windows header files? }${x_includes}${x_libraries+ - Where do we find X Windows libraries? }${x_libraries}" >> Installation + Where do we find X Windows libraries? }${x_libraries}" if test -n "$site_includes"; then - echo " Additional header files: ${site_includes}" >> Installation + echo " Additional header files: ${site_includes}" fi if test -n "$site_libraries" -a -n "$site_runtime_libraries"; then - echo " Additional libraries: ${site_libraries} ${site_runtime_libraries}" >> Installation + echo " Additional libraries: ${site_libraries} ${site_runtime_libraries}" elif test -n "$site_libraries"; then - echo " Additional libraries: ${site_libraries}" >> Installation + echo " Additional libraries: ${site_libraries}" elif test -n "$site_runtime_libraries"; then - echo " Additional libraries: ${site_runtime_libraries}" >> Installation + echo " Additional libraries: ${site_runtime_libraries}" fi if test "$with_wnn"; then - echo " Finding WNN includes with: ${wnn_includes}" >> Installation - echo " Loading WNN libs with: ${wnn_libraries}" >> Installation + echo " Finding WNN includes with: ${wnn_includes}" + echo " Loading WNN libs with: ${wnn_libraries}" fi -test "$with_socks" = yes && echo " Compiling in support for SOCKS." >> Installation -test "$with_term" = yes && echo " Compiling in support for TERM." >> Installation -test "$with_xauth" = yes && echo " Compiling in support for XAUTH." >> Installation -test "$with_xpm" = yes && echo " Compiling in support for XPM." >> Installation +test "$with_socks" = yes && echo " Compiling in support for SOCKS." +test "$with_term" = yes && echo " Compiling in support for TERM." +test "$with_xauth" = yes && echo " Compiling in support for XAUTH." +test "$with_xpm" = yes && echo " Compiling in support for XPM." if test "$with_xmu" != yes -a "$window_system" != none; then - echo " No Xmu; substituting equivalent routines." >> Installation + echo " No Xmu; substituting equivalent routines." fi -test "$with_xface" = yes && echo " Compiling in support for X-Face headers." >> Installation -test "$with_gif" = yes && echo " Compiling in support for GIF image conversion." >> Installation -test "$with_jpeg" = yes && echo " Compiling in support for JPEG image conversion." >> Installation +test "$with_xface" = yes && echo " Compiling in support for X-Face headers." +test "$with_gif" = yes && echo " Compiling in support for GIF image conversion." +test "$with_jpeg" = yes && echo " Compiling in support for JPEG image conversion." if test "$with_png" = yes -o "$with_png" = gnuz; then - echo " Compiling in support for PNG image conversion." >> Installation + echo " Compiling in support for PNG image conversion." fi if test "$with_png" = gnuz; then - echo " (Using -lgz instead of -lz.)" >> Installation + echo " (Using -lgz instead of -lz.)" fi -test "$with_tiff" = yes && echo " Compiling in support for TIFF image conversion (not implemented)." >> Installation -test "$with_epoch" = yes && echo " Compiling in extra Epoch compatibility." >> Installation - -test "$with_sound" = nas && echo " Compiling in network sound support." >> Installation -test "$with_sound" = native && echo " Compiling in native sound support." >> Installation -test "$with_sound" = both && echo " Compiling in both network and native sound support." >> Installation -test "$old_nas" = true && echo " nas library lacks error trapping, will play synchronously" >> Installation - -test "$with_database_berkdb" = yes && echo " Compiling in support for Berkeley DB." >> Installation -test "$with_database_dbm" = yes && echo " Compiling in support for DBM." >> Installation -test "$with_database_gnudbm" = yes && echo " Compiling in support for GNU DBM." >> Installation - -test "$with_ncurses" = yes && echo " Compiling in support for ncurses." >> Installation -test "$with_socks" = yes && echo " Compiling in support for SOCKS." >> Installation - -test "$with_mule" = yes && echo " Compiling in Mule (multi-lingual) support." >> Installation -test "$with_xim" != no && echo " Compiling in XIM (X11R5+ I18N input method) support." >> Installation -test "$with_xim" = motif && echo " Using Motif to provide XIM support." >> Installation -test "$with_xim" = xlib && echo " Using raw Xlib to provide XIM support." >> Installation -test "$with_canna" = yes && echo " Compiling in support for Canna on Mule." >> Installation -test "$with_wnn" = yes && echo " Compiling in support for WNN on Mule." >> Installation -test "$with_wnn6" = yes && echo " WNN support for version 6." >> Installation -test "$with_i18n3" = yes && echo " Compiling in I18N support, level 3 (doesn't currently work)." >> Installation - -test "$with_cde" = yes && echo " Compiling in support for CDE." >> Installation -test "$with_tooltalk" = yes && echo " Compiling in support for ToolTalk." >> Installation -test "$with_offix" = yes && echo " Compiling in support for OffiX." >> Installation -test "$with_mocklisp" = yes && echo " Compiling in support for Mocklisp." >> Installation -test "$with_sparcworks" = yes && echo " Compiling in support for SparcWorks." >> Installation -test "$with_energize" = yes && echo " Compiling in support for Lucid Energize (doesn't currently work)." >> Installation -test "$with_menubars" = "lucid" && echo " Using the Lucid menubar." >> Installation +test "$with_tiff" = yes && echo " Compiling in support for TIFF image conversion (not implemented)." +test "$with_epoch" = yes && echo " Compiling in extra Epoch compatibility." + +test "$with_sound" = nas && echo " Compiling in network sound support." +test "$with_sound" = native && echo " Compiling in native sound support." +test "$with_sound" = both && echo " Compiling in both network and native sound support." +test "$old_nas" = true && echo " nas library lacks error trapping, will play synchronously" + +test "$with_database_berkdb" = yes && echo " Compiling in support for Berkeley DB." +test "$with_database_dbm" = yes && echo " Compiling in support for DBM." +test "$with_database_gnudbm" = yes && echo " Compiling in support for GNU DBM." + +test "$with_ncurses" = yes && echo " Compiling in support for ncurses." +test "$with_socks" = yes && echo " Compiling in support for SOCKS." + +test "$with_mule" = yes && echo " Compiling in Mule (multi-lingual) support." +test "$with_xim" != no && echo " Compiling in XIM (X11R5+ I18N input method) support." +test "$with_xim" = motif && echo " Using Motif to provide XIM support." +test "$with_xim" = xlib && echo " Using raw Xlib to provide XIM support." +test "$with_canna" = yes && echo " Compiling in support for Canna on Mule." +test "$with_wnn" = yes && echo " Compiling in support for WNN on Mule." +test "$with_wnn6" = yes && echo " WNN support for version 6." +test "$with_i18n3" = yes && echo " Compiling in I18N support, level 3 (doesn't currently work)." + +test "$with_cde" = yes && echo " Compiling in support for CDE." +test "$with_tooltalk" = yes && echo " Compiling in support for ToolTalk." +test "$with_offix" = yes && echo " Compiling in support for OffiX." +test "$with_mocklisp" = yes && echo " Compiling in support for Mocklisp." +test "$with_sparcworks" = yes && echo " Compiling in support for SparcWorks." +test "$with_energize" = yes && echo " Compiling in support for Lucid Energize (doesn't currently work)." +test "$with_menubars" = "lucid" && echo " Using the Lucid menubar." if test "$with_menubars" = "motif"; then - echo " Using the Motif menubar." >> Installation - echo " *WARNING* The Motif menubar is currently buggy. We recommend" >> Installation - echo " that you use the Lucid menubar instead. Re-run" >> Installation - echo " configure with --with-menubars='lucid'." >> Installation + echo " Using the Motif menubar." + echo " *WARNING* The Motif menubar is currently buggy. We recommend" + echo " that you use the Lucid menubar instead. Re-run" + echo " configure with --with-menubars='lucid'." fi -test "$with_scrollbars" = lucid && echo " Using the Lucid scrollbar." >> Installation -test "$with_scrollbars" = motif && echo " Using the Motif scrollbar." >> Installation -test "$with_scrollbars" = athena && echo " Using the Athena scrollbar." >> Installation -test "$with_scrollbars" = athena3d && echo " Using the Athena-3d scrollbar." >> Installation -test "$with_dialogs" = motif && echo " Using the Motif dialog boxes." >> Installation -test "$with_dialogs" = athena && echo " Using the Athena dialog boxes." >> Installation -test "$with_dialogs" = athena3d && echo " Using the Athena-3d dialog boxes." >> Installation - -test "${use_union_type}" = yes && echo " Using the union type for Lisp_Objects." >> Installation -test "${debug}" = yes && echo " Compiling in extra code for debugging." >> Installation -test "${memory_usage_stats}" = yes && echo " Compiling in code for checking XEmacs memory usage." >> Installation -test "$usage_tracking" = yes && echo " Compiling with usage tracking active (Sun internal)." >> Installation -echo " >> Installation +test "$with_scrollbars" = lucid && echo " Using the Lucid scrollbar." +test "$with_scrollbars" = motif && echo " Using the Motif scrollbar." +test "$with_scrollbars" = athena && echo " Using the Athena scrollbar." +test "$with_scrollbars" = athena3d && echo " Using the Athena-3d scrollbar." +test "$with_dialogs" = motif && echo " Using the Motif dialog boxes." +test "$with_dialogs" = athena && echo " Using the Athena dialog boxes." +test "$with_dialogs" = athena3d && echo " Using the Athena-3d dialog boxes." + +test "${use_union_type}" = yes && echo " Using the union type for Lisp_Objects." +test "${debug}" = yes && echo " Compiling in extra code for debugging." +test "${memory_usage_stats}" = yes && echo " Compiling in code for checking XEmacs memory usage." +test "$usage_tracking" = yes && echo " Compiling with usage tracking active (Sun internal)." +) | tee -a Installation +echo " | tee -a Installation " - -test -r Installation && cat Installation dnl ############################################################################ dnl # Now generate! # dnl ############################################################################
--- a/etc/FTP Mon Aug 13 09:21:56 2007 +0200 +++ b/etc/FTP Mon Aug 13 09:23:06 2007 +0200 @@ -1,6 +1,6 @@ -*- text -*- - XEmacs availability information. Last Modified: 10-feb-96. + XEmacs availability information. Last Modified: 25-Mar-1997. XEmacs is available via anonymous FTP from ftp.xemacs.org (128.174.252.16) in the directory /pub/xemacs/. @@ -8,17 +8,23 @@ ftp.xemacs.org is the primary distribution point, but you may find copies of it at other sites as well. Some sites to try include: - ftp.ai.mit.edu:/pub/xemacs/ - ftp.uu.net:/systems/gnu/xemacs/ - ftp.sunet.se:/pub/gnu/xemacs/ - ftp.cenatls.cena.dgac.fr:/pub/Emacs/xemacs/ - liasun3.epfl.ch:/pub/gnu/xemacs/ - ftp.th-darmstadt.de:/pub/editors/xemacs/ - audrey.levels.unisa.edu.au:/xemacs/ - sunsite.doc.ic.ac.uk:/gnu/xemacs/ - uiarchive.cso.uiuc.edu:/pub/packages/xemacs/ - ftp.technion.ac.il:/pub/unsupported/gnu/xemacs/ - thphys.irb.hr:/pub/xemacs/ + ftp://ftp.ai.mit.edu:/pub/xemacs/ + ftp://ftp-digital.cern.ch:/pub/beta/xemacs-20.0/ + ftp://ftp.uu.net:/systems/gnu/xemacs/ + ftp://ftp.sunet.se:/pub/gnu/xemacs/ + ftp://tp.cenatls.cena.dgac.fr:/pub/Emacs/xemacs/ + ftp://ftp.th-darmstadt.de:/pub/editors/xemacs/ + ftp://sunsite.doc.ic.ac.uk:/gnu/xemacs/ + ftp://ftp.ibp.fr:/pub/emacs/xemacs/ + ftp://uiarchive.cso.uiuc.edu:/pub/packages/xemacs/ + ftp://ftp.technion.ac.il:/pub/unsupported/gnu/xemacs/ + ftp://thphys.irb.hr:/pub/xemacs/ + ftp://sunsite.cnlab-switch.ch/mirror/xemacs/ + ftp://ftp.unicamp.br:/pub/xemacs/r20.0/ + ftp://ftp.usyd.edu.au:/pub/Xemacs/ + ftp://ftp.lab.kdd.co.jp/xemacs/ + ftp://SunSITE.sut.ac.jp/pub/archives/xemacs/ + The most up-to-date list of distribution sites can always be found on the XEmacs WWW page, http://www.xemacs.org/. Try to pick a site
--- a/etc/NEWS Mon Aug 13 09:21:56 2007 +0200 +++ b/etc/NEWS Mon Aug 13 09:23:06 2007 +0200 @@ -20,7 +20,7 @@ New users should look at the next section on "Using Outline Mode". You will be more efficient when you can navigate quickly through this file. Users -interested in some of the details of how XEmacs differs from FSF GNU Emacs +interested in some of the details of how XEmacs differs from GNU Emacs should read the section "What's Different?". Users who would to know which capabilities have been introduced in each release should look at the appropriate subsection of the "XEmacs Release Notes." @@ -103,7 +103,7 @@ =================== -** Differences between XEmacs and FSF GNU Emacs 19 +** Differences between XEmacs and GNU Emacs 19 ================================================== In XEmacs 20, characters are first-class objects. Characters can be converted to integers, but are not integers. FSF 19, XEmacs 19, and Mule @@ -116,7 +116,7 @@ In XEmacs, keymaps are first-class opaque objects. FSF 19 represents them as complicated combinations of association lists and vectors. If you use the advertised functional interface to manipulation of keymaps, the same code -will work in XEmacs, Emacs 18, and FSF GNU Emacs 19; if your code depends +will work in XEmacs, Emacs 18, and GNU Emacs 19; if your code depends on the underlying implementation of keymaps, it will not. XEmacs uses "extents" to represent all non-textual aspects of buffers; @@ -1586,10 +1586,10 @@ -- The `face' property of extents and text properties can now be a list. --- The `mouse-face' property from FSF GNU Emacs is now supported. +-- The `mouse-face' property from GNU Emacs is now supported. It supersedes the `highlight' property. --- `enriched' and `facemenu' packages from FSF GNU Emacs have been ported. +-- `enriched' and `facemenu' packages from GNU Emacs have been ported. -- New functions for easier creation of dialog boxes: `get-dialog-box-response', `message-box', and `message-or-box'. @@ -2484,7 +2484,7 @@ *** Keymaps ----------- -The FSF GNU Emacs concept of `function-key-map' is now partially +The GNU Emacs concept of `function-key-map' is now partially implemented. This allows conversion of function-key escape sequences such as `ESC [ 1 1 ~' into an equivalent human-readable keysym such as `F1'. This work will be completed in 19.14. The function-key map is @@ -2513,7 +2513,7 @@ can now easily specify an action to be invoked on single-click (i.e. down-up without appreciable motion), double-click, drag-up, etc. -Some code from FSF GNU Emacs has been ported over, generalizing some of +Some code from GNU Emacs has been ported over, generalizing some of the X-specific mouse stuff. ** INCOMPATIBLE CHANGE **: The function `set-mouse-position' accepts
--- a/etc/sample.emacs Mon Aug 13 09:21:56 2007 +0200 +++ b/etc/sample.emacs Mon Aug 13 09:23:06 2007 +0200 @@ -398,6 +398,15 @@ ) ) +;;; ******************** +;;; Load the default-dir.el package which installs fancy handling +;;; of the initial contents in the minibuffer when reading +;;; file names. + +(if (and running-xemacs + (or (and (= emacs-major-version 20) (>= emacs-minor-version 1)) + (and (= emacs-major-version 19) (>= emacs-minor-version 15)))) + (require 'default-dir)) ;;; ******************** ;;; Load the auto-save.el package, which lets you put all of your autosave
--- a/etc/sgml/CATALOG Mon Aug 13 09:21:56 2007 +0200 +++ b/etc/sgml/CATALOG Mon Aug 13 09:23:06 2007 +0200 @@ -51,5 +51,5 @@ PUBLIC "-//Microsoft//DTD Internet Explorer 3.0 Tables//EN" ie3tables.dtd PUBLIC "-//Microsoft//DTD Internet Explorer 3.0 HTML//EN" ie30.dtd PUBLIC "+//Silmaril//DTD HTML Pro v0r11 19970101//EN" htmlpro.dtd -DOCTYPE HTML html.dtd +DOCTYPE HTML html-3.2f.dtd DOCTYPE HTML-3 html-3.dtd
--- a/etc/w3/stylesheet Mon Aug 13 09:21:56 2007 +0200 +++ b/etc/w3/stylesheet Mon Aug 13 09:23:06 2007 +0200 @@ -83,7 +83,7 @@ p { display: block } pre,xmp { display: block; white-space: pre; } -blockquote{ display: block; margin-left: 5; margin-right: 5; } +blockquote{ display: block; margin-left: 5em; margin-right: 5em; } /* ** How to draw form elements. @@ -114,8 +114,8 @@ dir { display: block; } menu { display: block; } dt { font-weight: bold; display: list-item } - dd { display: list-item; margin-left: 5; } - li { display: list-item; margin-left: 5; } + dd { display: list-item; margin-left: 5em; } + li { display: list-item; margin-left: 5em; } ul li { list-style: circle; } ol li { list-style: decimal; }
--- a/etc/xemacs-white.xpm Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/* XPM */ -static char *noname[] = { -/* width height ncolors chars_per_pixel */ -"388 145 25 1", -/* colors */ -"` c #787879", -"a c #686869", -"b c #A6AAF5", -"c c #585859", -"d c #484849", -"e c #09090B", -"f c #5256D7", -"g c #989CEA", -"h c #363ACC", -"i c #C7C8CF", -"j c #282829", -"k c #FFFFFF", -"l c #13154C", -"m c #7074DF", -"n c #D9D9DB", -"o c #232788", -"p c #383838", -"q c #4249D0", -"r c #B6BAF9", -"s c #868AEB", -"t c #A8A8A9", -"u c #989899", -"v c #6266DB", -"w c #888889", -"x c #B9B9B9", -/* pixels */ -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkknkkkkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknikkkknninkkkkkkkkkkknninnnkkkkkkkkkinkkikkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkknknkkkkkkkkkknkkkkkkkknkkkkkknkkkkknkknkkkkkkkkkkkxkkkkkkknkkkkkkknkkkknknkkkkkkknkkkkknknnkkkkkkkkknkkknkkkkknkkkkkkkkkkkkknkkkkkkkkkkkkknkkkkkkkknkkkkkknkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkknnkknnnnikkkkkkkkkknnnnkkknnnnnkkkinnikkkkkinnkkkkkkkkkkikkkkkkknkkkkkkknnkkkkkkkkkkkinnnnkkknnnkkkkkkkkkknnninnkknnnnnkkknnninkkinnnnkkkkkkkkkkinnnkkknnnnnkknnnnnkkknkxnkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkknkkknkkniiiinkknkkknkknkkknkknkkkknkknxkkkkkkkkkkkkkkkkkkkkknkkkkkkiinnkkkknkkkknnnnnxkkkkxkkkkniiiinknnknknkknkkkkkknkkkknknnnnnikkiiiiikkknkknkknkkkknkknkkkknkknikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkknkkkkkkkkkknkkknkknkkkknknkkkknkknnikkkkkkkkkkkkkkkkkkkknkknkkikkknkkkknkkkknnnknnkkkxkikkkkkkkkkknnknknkknkkkknknkkkknkinnnnnkkkkkkkkkknkknkknkkkknkknkkkknkkinnkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkknnkknkkkxkkkkkkkkkknkkknkkinkkikknnkknnkknkkikkkkkkkkkkkkkkkkkkknkknkkikknnkkkknkkkkkxkkkkkkikkkikkkkkkkkknnknknkknnknxkknnkkinkkxkkkkkkkkkkkkkknkknkkkikknikkinkkikkknknnkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkknkknkkninnikkkkkkkknxkkixkkkixxnkkknxxnkkiikkxxkkkkkkkkkkkkkkkknxxxxxkknxxkxnkkixxnkkkkxxikknxiknxnkkkkkkknxikxknnkkixikkkknxikxnkkixikkkkkkkkkkixkkxxkkkixnkkkkixxkkkxnknxikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkknkkkkkkkkknknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkkkkknkkkkkknkkkkkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkkknkknkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkknkkkkkkkkkkknkknkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknknkkkkkkkkkkkknkkkkkkkkkknkknkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkkkknkknkkkkkkkkkkknkkkkkkkkkkkkkkknkkkkkkkkknkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkkkkkknkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkkknkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkknknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknknknkkkkknkknkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknknkkkkkknkknkkkkkkkkkkkkkknknknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkknkkkkkkkknkkkkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknknkkknkkkkkkknknknkkkkknkknkknkknkknkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknkkkkknkkknkknkkkkkkkknknknkkkkkkkknkkkkknkknkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkknkknknknkknkkkkkkkkkkkkkkkkkkkkkknkkkknkkkknkknuunnkknkkkknkkknkkkkntkkkkkkkkkkiikkkkkkknkkkkkknkkkknnkkkknnkkknkkkkkkkkkkkkkkkknkknkknkkknknkkkknkkkkkkkkkkkkkkknkknkknkkkkkkknkknkknknkknknkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknkkkkkkkkkkkknkkkkkkkkkkkkkkkkknkknknkkkknkkkkkknkkkkkkkkkkkkkkknkknkknkkkkkkknkknkknknkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkknkkkknkkkkkkkkkkkknkkkkkkkkkknktnkkkkiknkkkknkkkkkkkkkkkkikkkkkkkkkkkinkkknkkkkknkkkknknkkukkkktkknkknkkkkkkknknkknkkkknknknknkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkknkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkknkkkknkkknknkkknknknkkkkkknknknkknkkkknkknknkknkkkkkkkkkkkkkkkkknkkkkkkkkkknkknkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkknknkkkkkknknkkkkkkkknkknkkknkkkkkknkkkkkkkkktkkkknikkknnkixnknininnnkkxkninkkkkiikikknniikkkkknkkkkkkkxnknkkiikkknknkkkkkkknkkkknkknkkkkkknknknkkkkknkknkkknkkkkkknkkkkkkkkkkkkkkkknkknkknkkknkkknkkkkkkkkkkkkkkkkkkkkkknkkkkknkknkkkknkkkkknkkkkknkkkkkkkknkkknkknknkkkkknkknkkkkkknkknkkknkkkkkknkkkkkkkkkkkkkkkknkknkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkknkknnknkkknnkkkkkkknkkkkkkkkknkkknkkkkkkknnknkkkxnkkkknixtkkxuxuxxikitxiukkktiiuxkknixxikkkkknkkknkktkkkkkktkkkkkkkkkkknkkknknkkkknknknkkknkkkkkkkknkkkkkkkkknkkknkkkkkkkkkknknknkkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknkknkkkkkknkkkkknkknkknknnkkknkkkkkkkknkkkkkkkkknkkknkkkkkkkkkknknknkkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkknkkkkkkkkkkkknkkkkkkkkknknkknkkknkkknknkknknkkkxkkkkkkxknknkiuuukknukxkkxkxnkkktkikkkkxkkktutikknkkknknkkkxknknkkxnknkknknkkkkknkkkknknkkkkknkkkkkkkkkknknkknkkknkkknknkknknkkkkkkkkkkknnkkknkkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkknkknkknkkknknknknkkkkkkknkkkkkknnkkkkkkkknkkknkkkkkkkkknknkknkkknkkknknkknknkkkkkkkkkkknnkkknkkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkkkkknkkkkkkkkknknkkkkkxkkkknkxknkkntnktnkkwkxkkxkxkkkkxkxkkkkxkkxnknxkkkkkkkkknkkxnkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkkkkkknkkkkkkkknkkkkkknkkkkknkkknknkkknkkknkkkkkkknkkkkkkkkkkkkkkkknkkkkkkkkkkknkkknkkkkknkknkkkknkkkkkkkkkknkkkkkkkkkkkkknknkkkkkkkkknkkkkkkkknkkkkkknkkkkknkkknknkkknkkknkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknnknnkxknkknxkknkxkkkwknkwkxkkxkxunkxnkntkkttkktkkixkkkknkkkknkktkknknnxkknkknknknkkkkkknkkkknknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkknknkknkknkkknkkkkkkkkkknkkkknknkkkknkkkkkkkkkkkkkkkkkkkknkknkknknkkknkkkkkkkkknkknkkkkkkknkkknkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknknkknkknkkknkkkkkkkkkknkkkknknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkunkkxwwwwikkuwunwkwwktikwnwnwwnkkknwwittkiwwnwnnkkkknkkkkkntkkkktnnkknkkkknknknnnnnnnnnnnnnkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknnkkkkkknkknnkknkkknkknknkkkknkkkkkkkkkkknknkkkkkknkkkkkkkkkkkknkknknnnknknkkknknknknnkkknknknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknnkkkkkknkknnkknkkknkknknkkkknkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkrrrrrrrrrbrrrrrrbrrrrrrrrrrrrrikinnkkknirrrrrrrrbrbrbrrbrrriknkkkkkkrrrrrrrrrrrrrrbrrrbrbrrrrbrrrrrrrrrrrrrrrrrrssssssgsggbkkkkkkknkkkkkkkkkknknkknkkkkkknkkkkkkknkkkkknknkkkkkkkkknknkkknknknkkkkkkkkknkkknkknknknknknkkknknkkkknknkknkknknkknkknknkkkkkkkkkkkkkknkkkkkkkkkknknkknkkkkkknkkkkkkknkkkkknknkkkkkkkkknknkkknknknkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkrhhhqhhhhhhhhhhhhhhhhhhhhhhhhhhmkkknkkkivhhhhhhhhhhhhhhhhhhhmknknkkkrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhtnknkkkknnkkkkkkkkkkkkknkkkkkkknkkknkkknknkkkkknknkkkkkkknnnkknkkkknknkkkknkknkkkkkkkkkkkkkknkkknknnkknknkkknkknknkkkkkkkkkkknknnkknkkkknnkkkkkkkkkkkkknkkkkkkknkkknkkknknkkkkknknkkkkkkknnnkkknkkknknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkknknknkkihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhodknkkkknvhhhhhhhhhhhhhhhhhhhockkkkkkihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhoenkkknnkkkkknkknknkknkknknnknkkkkkkkkkknkknkknkkkkknknkkkkkknkknknkkkkkkkkkkkkknnkknknknnkknknknkkkknkknknkkkkknkknnnkknnkkknkknknkkknnkkkkknkknkkknknkknnnkkkkkkkkkkkknkknkknkkkkknknkkkkkknkkkknkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkmohhhhhhhhhhhhhhhhhhhhhhhhhoooldkknknkkbhohhhhhhhhhhhhhhhholdnknnkkkmohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhlcnknknkkkkknkkkkkkknknknknkkkkkkknkknnkkkknkkkknnkkkkkkknknkknkkkkknknnkkkkknkkknnkkkkkknknkknknknknknknknknknkknkkknkkkknnkknknknknknkkkkknkkkkknknkknkkknknkkkknkknnkkkknkkkknnkkkkkkknknknnknkkknknnkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkdpllhhhhhhhhhhhhhhhhhhholeepddwnkknknkkwdddqhhhhhhhhhhooeepwknkkknkkddjeoqhhhhhhhhhhhhhhhhhhleeeeeeelloohhhhhhhhhhhhhhhhl`nnnnknknknknnknknkknkkkkkknkknkkkkkkknknkkkkkkknnnknknkkknnkkknnnkkkkkkknkkkknkkknkkkkkkkknknkkknkkkknkkknkkknknkknnknkkkkkkkknknknkkknknknknknkkkknkkkkkkkkknkkkkkkknknkkkkkkknnnknknkkknkkkknknkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkknkx`fhhhhhhhhhhhhhhhhledtnnknnnnnnnnnkkkknshhhhhhhhhlej`nnnnniknknkkkkknghhhhhhhhhhhhhhhhoel`xnninitwudplohhhhhhhhhhhhheunnnnnnnknknkknkknnnkkknknkkkkkkkkkknkknkknnnkkkkkkkkkkkkkkkknkkkknnknkkkkkkkkkkkkknkkknkkkkkknnkkkknkkknknnnkkkkkkkkknkkknknkkkkkkknkkknknknknknnnnknknnknkkkkkkkkknkknkknnnkkkkkkkkkkkkknknkkknknnknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknnmhhhhhhhhhhhhhhhlcxxiixixxxxiinnnkkkighhhhhhhheeaxxxxxxxiiinnknkknnivhhhhhhhhhhhhhhhejxxixxxxxxxxxii`dohhhhhhhhhhoetxtxxinnnnknknknknknnnknkknknkkkknkkkknknnkkkkkkkknkkknkknknknknknkknknknnkkkkknkkkknkkknnknknkkknkkkknknkkknknknknkkkknkkkkkknknkkkkkkkkknknknkknknnknkkknknkkknkkkkknknnkkkkkkkknkkknkknkknknkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkkkkknirfhhhhhhhhhhhhhhecuuwwuuuuuuutxnnnkkrvhhhhhhoeewuwwwuuuuutxxnnknkknrvhhhhhhhhhhhhhhoewwuwuuuwuuwuwuuuuwdqhhhhhhhhoew`wwwuxnnnkknkkknknknknknkkkkknnkknkkkknknnknnknkkkkknkkkkkkkknknkkkkkkkkknknkkkknkkkkkkknkknkknkkknknkkknnknnnkknkkkknknkkknkkkkknkkkkknkkkknkkknkknnknnkkkkknkknknkkknknnknnknkkkkknkkkkkkkkknnnkkknkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkknknitshhhhhhhhhhhhhhlcccccaaaa``wuxinnkrbhhhhhhoejdccaacacaaa`utxnnkknnrvhhhhhhhhhhhhhhllccaccaaaaaaaaaaaaaaaqhhhhhhhljcdcca`txnkkkkkkknknkkkkkknnnknkknnnknkkkkkkkknkkknnkkknkknknkkkkkknkknnkkkknkknkkkkkkkkkkknkknknnknkknknkknkknknknknkknknkkkknknkkkkkkkkkkkkkkknknnkkkkkknnnknkknnnkkkkkkkkkknkkknnkkknkknknknkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkniughhhhhhhhhhhhhhljjpjpppdcaa`utxnnirfhhhhhoeejjpjpjpppddcaaccxnkkinrhhhhhhhhhhhhhhhejjpjppppjpccaccccccddvqhhhhhheejjjjpawxinkkkknkkknknnnnnkknknknkknknnkknkknknknnkknkkkkknkknknkkkkkkuukknkkkkknkkkkkkkknkkknnkkkknkkknknknknkknknknkkkkknkkkkkknknnkkkkknkkkknkkkknknnnkknknknnknknnnkknkknknknnkknkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknnituvhhhhhhhhhhhhhoeeejejpdca`wuxinnrmhhhhhoelpjejejejjjdda`ctnkkkkxnrhhhhhhhhhhhhhhoeeeeejejpdpcaaa`aaaccddmhhhhhheeeeejpc`cdannknknkknknxa`cackknknnnnkccnkcaknkkknknkkkknkkknknkkkkkkkkktkkkkkkkkknkkkkkkkkkknkkkknkknkkkkkknknknknkkkknknknkknkkkkkkkkkkkkkknknknknknknknkkkknknknnknknnkkkknkkknknkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkniitshhhhhhhhhhhhhheeeejjpc`wutxinnrshhhhhoejcdpeeeeeejpc`aaautnnkttishhhhhhhhhhhhhhleeeeeeljpccwaa`uwwacaacsqhhhhoeeeeeejcwxunknkkkittkkktkntktnknxtinknndknwnkkkknknktitniikkkntxkkkkkxxkxkkkitxkkkknknkknxxxkxnnnkitxknntkttnknknknknnkkknkknkkknknkkkkkkknknkkkkknkkknknknnkknknnknknnknknnkkknkknnkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknknnirhhhhhhhhhhhhhheeeeepc`utxxinnighhhhhoepcapjeeeeejjp`wwwatxkknt`rmhhhhhhhhhhhhhhleeeeeejpc`ata`uxxca`ccwwmhhhhleeeeejpawxunkknkktttwnnkkktkkkn`uuu`nknn`cknnnkkkkkkt`xaxuikn`xx`nkk`ttaukk`uxw`nkkkkkkknwuu`xwknntxuiki``ut`xkknkknknnnknkkkkknkkkkkkkknkkkknnkknkknnkkkkkknknnknnnnknknnknnkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknknnknivhhhhhhhhhhhhhleeejpauxinnnnrbqhhhhoedwiwapjeeejjdjtxinunnnkkktrfhhhhhhhhhhhhhheeeeeeeejwuwctnnni`uuwcutshhhheeeeeejpauxuknnknkua`uknnkktnknn`ttuaxknn`wknkxaaacakkckxkkxkxkkkktktnkkkwki`ttxaxnwaaa`tkttntktkkn`autkktnknkwkknknkkkkkkknknkknkkkkkkkknnnknkknkknknknnkknkknkknknknnnnknknnkkknnkkknkkkkkkkkkkkkkknkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknknknkknknknshhhhhhhhhhhhhoeeejd`uinnkkrrqhhhhhednuxucpejejpda`xinntnkknnkxrhhhhhhhhhhhhhhoeeeeeejpaux`x`nnnx`ttuuiighhhheleeeejp`tiunkntktxnnwkknkntknkx`ttttnnkwxttkkkkkkkkknaktkktktkkkktktknnktkx`ttttnkknkkkkkxxkuntnkunkntkkunknkwnkkknkknknnknknknknkknnknkkknknnnknknnkknknknknknnnknkkkknkkkkkknkkkkknkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkkknknknknkbhhhhhhhhhhhhhheeejd`tinknrbqhhhhoejnnu`wdjejjjauxxnnnkuknkknnbshhhhhhhhhhhhhhleeeeeejc`titni`knkcxkniknrhhhoepjeeejd`titnknukwkkn`nknkktkknncxkknkktxnkcnknkkknkkkaktkktkitkkuxkn`knw`nkaxnnnnkkkkkkkktxntntnnukktxkkx`nkuinnnknknknkkkknnkkkknnkkknnknknkknkkkkkknknkkkkknknkkkkkkkknnknkkkkkkkkkkkkkkkkkkkknkknkkknnkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknknknnknknkkknnnfhhhhhhhhhhhhhleejd`tnkkibqhhhhheeinnxajjjepdadd`xknwcccwkntarmhhhhhhhhhhhhhheeeeeeepcwx`unkcanknwcwxknrhhhoecpeeepcwwccccaxkicctuwkntcccnnknwa`xkkaakkackkknkknnaakuikakkiacxknknacxwwnnua`xnknkkkkkiawkanxwkuccicxktn`ciknkknknknknknkkkkknkknnnknnknnnnnkknnnkknknknknnnknnknknkkkkkkkkknknknnkkkkkkkkkkkkkkkkknknknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkknnknkknmhhhhhhhhhhhhhoeejpauxnirfhhhhoeltxnit`cpjpd`utnnkknnnknknkknrqhhhhhhhhhhhhhoeeeeeejpauxknkknnknknknnkkrhhhld`djjjpcwxnnknknnknknknkknkkknkknnnnnkknknkkkknkknkkknkkkkkkkkkkkkkkkkknnnkkknkknkkkkkkkkkkkkkknnnkkkknnktkkknkknnnknnkknkknkknkknkkknkknnkkkknnnnknnnknknkknknknnnknkkkknkkkknkkkkkknkkkkkkkkkkkknkkkkknkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkknkkkkkkknknknnknkknknknbhhhhhhhhhhhhhheeepcuxirvhhhhheliknxtwcpppcawxinknknknnknknknbhhhhhhhhhhhhhhoeeeeeejp`unkkkkkknknknknknghhhe`wcpjjpattnnnnnkknknknknnknkknnkknkkknkkkkkkkknknkknkkknkkkkkkkinknknkknknnnknkknknkkkkkkkkkkknkknknnkknxpctkkkkkkknkknnknnkknnkknknknnnknnnnnkkkkknknkknknkknnkknknknnkkkkkkknknnknkknkkkkkkkknnknkknknknknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkknkkkknnkkkkkkkknknknnkkkkkiqhhhhhhhhhhhhhleejcwrrvhhhhheennnitwadppc`utxnnnkkknknnknnkrshhhhhhhhhhhhhhleeeeeejdwuxinkknnnnknnknnnnmohetuapjjd`xxnnknnknkknknknknnnkknknknknknnkknknnkknnknknkkkkknkkkknnnknkknnknnknnknkknkkknnknkkkkknnnknknknknnnkkkkkkknnnknnnnnknnnkknkknkknnnnnnnnnkknknnnknnkknknkknkknnkkknnnknknkknkkkkkkkkkkkknknkkkknknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkknkkkkkkkkknkknkkkknknkkknnnknmhhhhhhhhhhhhhoeejdtrvhhhhhelnnnitwadppd`uxnnnknnnnknnnknkkrvhhhhhhhhhhhhhheeeeeeepcwxinnknrgvbrknnnnknncjlit`dppcwxnnnnknknnnknkknkknknknknnnnkkkknnnnkknnkkknkkknkkknkkkknnnnnnknknnnnknkkkkknknkkkkkkkkkkkknnkknnnnnnnknkkkkkknnnknnkkknknnknnkkkknknkkkknnknkkkknkknnnnninnkkkkknkkkknknknkknkknkknkkkknnnnknkkkknnkknnnkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkknghhhhhhhhhhhhhheeesrvhhhhoeeinnxtwadppcawtikkkkkkknkknnknknrhhhhhhhhhhhhhhoeeeeeejp`uxnnnnnrqhhwxknnknnkkkkixwapdauinnknknkkknknnniirnikkknkknnniirrggsgikknnnknnkknkkknirrrgsggnnknkknknkkkkkknkkkknkkkkkkknknknirrbsssbnnnnkkkknnnnniiiikkkkkkkkkkknnknnnkknknnnnnnirrrsssggrnnnkkknkkknknnknknnkknkknrrrbsgsgrnnnkkkknrsgrkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknnkkknnknnhhhhhhhhhhhhhhlewrvhhhhhelinnitwadppdawtinkkkknkkknkknknknghhhhhhhhhhhhhhoeeeeeejd`tiinknrshhhetkkkkkkkkknnxwcdd`uiknknnnnniiirrrssvqsikkkkknkrrgvhhhhhhminknknknknnknrbmqhhhhhhmiknknknknnnknkkknnknkkkkkkkkirrsvhhhhhhqgkknnrrrgssgssvmsnknkkknkkkknnnkkkknknknirbsmqhhhhhhhfsrkkkknkkknknnnkknknnnrbmfhhhhhhhfsrnnknrghhhtkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkknnfhhhhhhhhhhhhhoprvhhhhheennnxtwaddpdawxiinkkkkkknknknkknnrmhhhhhhhhhhhhhheeeeeeejcwxinnkirqhhoekkkkkkkkkkknxuaccwxrrrrrrssssvvfhhhhhhlankkkkirgqhhhhhhhhhqxnnknknkknrbmhhhhhhhhhhhgknkknnkkknknnkkkknkkkkkknrrsqhhhhhhhhhhfnkrshhhhhhhhhhdakknkkknkkkknnnknkkknrrgvhhhhhhhhhhhhhhmnknknnknknknnnkknrbmhhhhhhhhhhhhqvsbrgqhhoekkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknnknknghhhhhhhhhhhhhhrshhhhhelinnitwacppdawxinnnnkkkkkkkkkkknkkrfhhhhhhhhhhhhhheeeeeejpcuxinnirmhhhopkkkkkkkkkkknit`aaugvfhhhhhqhhhhhhhhhhhetnnknrrvhhhhhhhhhhhhhinnnknnnrsqhhhhhhhhhhhhhwknkknknknkknknknkknkkkirsqhhhhhhhhhhhhhdnrfhhhhhhhhhhlakkkknkkknkkkknnnnnirgfhhhhhhhhhhhhhhhhhfnnkkknknnknknknrsqhhhhhhhhhhhhhhhhhhhhhhodkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkrhhhhhhhhhhhhhhshhhhheeinnituadppdawtinkknwctkkkkkkxkkkknrhhhhhhhhhhhhhhoeeeeeejp`uinnnrghhhhlankni`dxkknknixw`wxshhhhhhhhhhhhhhhhhhljnnnnibqhhhhhhhhhhhhhqonntnnirshhhhhhhhhhhhhhhhwcxnknknknknkkkknkknkrbvhhhhhhhhhhhhhhqhurhhhhhhhhhhhexkknxcwkkkkkkkkkknrbmhhhhhhholeedqhhhhhhhqnnnnknknnnnnnrshhhhhhhholeeelhhhhhhhhhhlckkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknnknnvhhhhhhhhhhhhhhhhhhlexnnixwacdpda`uxnnkkkukknkkkkiwknkkrghhhhhhhhhhhhhhleeeeeejdwxinnrrqhhhhexkniiiiwnkkknnxtutxghhhhhhhhhhhhhhhhhheanknrrqhhhhhhhhhhhhhhho`i`iirvhhhhhhhhhhhhhhhhhlpnknnwdpaknnknkknknrbqhhhhhhhhhoeeehhhhvshhhhhhhhhhoennknnkukkkkkkkknnrsqhhhhhhhlepuxnshhhhhhhhonknnknnknknrgqhhhhhhhledunkiwfhhhhhhhhlwnknnknkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknknnmhhhhhhhhhhhhhhhhhlecxiitu`ddpdawtxnnkkkkunkknkkk`kkkkkrvhhhhhhhhhhhhhheeeeeeejpwtnxrbqhhhhoeuinxttt`nnnkknnxxixrcllhhhhhhhhhhhhhhhetiurbqhhhhhhhhhhhhhhhhhjtxwrshhhhhhhhhhhhhhhhhhoaxinnnkuknknknxtxnrshhhhhhhhhheecxxumhhvvhhhhhhhhhhljtxiiinwknknnkttirshhhhhhhhledtnirmhhhhhhhhhpxnnitiutnnrqhhhhhhhoewnniituxvhhhhhhheuniixxinknknkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkknkkkkkkkkknkkrhhhhhhhhhhhhhhhhlepwtttu`cpddawuxiinnkkktknkknnkwkkkk`rqhhhhhhhhhhhhhheeeeeeejduxrrsqhhhhhlpudtuw`wainnknknnninxwccashhhhhhhhhhhhoextrbqhhhhhhhhhhhhhhhhhhewurshhhhhhhhhhhhhhhhhhhodttxnnnunknknnuturshhhhhhhhhheedwxtuwfhqhhhhhhhhhhhedacxtttwinnkndubrvhhhhhhhhledw`crbqhhhhhhhhhld`xxaauuwrshhhhhhhhepuiitu`c``qhhhhhhexix`wuuinnininnkkknkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknnkknkkkkkkniqhhhhhhhhhhhhhhlejd`wuwacdpdawtxinnnnknktknnkknkunnnxibhhhhhhhhhhhhhhoeeeepdcwtrrgfhhhhhhhl`iiaw`awainnnkkkknknknwnnrhhhhhhhhhhhhljubbqhhhoelvhhhhhhhhhhhhecrghhhhoeeqhhhhhhhhhhhhojawutxnuknknkna`rghhhhhhhhhoee``ju```shhhhhhhhhhhhoew`awwwuainnnunirvhhhhhhhhoedwwwprmhhhhhhhhhhopjtxwnnntrqhhhhhhhhetwuww`adccshhhhhoeutu``wttnkikkkkkknkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkknkknknknkkkkknshhhhhhhhhhhhhoeeedc``adppda`txinnnkkkkntkknnknnunknuishhhhhhhhhhhhhhsrbrrrsssmvhhhhhhhhhhetitaacc``innknknkkknnnukkrhhhhhhhhhhhhedgrfhhhlectbhhhhhhhhhhhoegbqhhheecitmhhhhhhhhhhhoepcautiwnkunkwirshhhhhhhhhhleaaadacpdshhhhhhhhhhhhlecddccawaxnnntirvhhhhhhhhhedc`aa`rhhhhhhhhhhhoep`u`xnntghhhhhhhhhex``ccdppddwfhhhhoea``ccawunniknkkkknknkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkknkknkkghhhhhhhhhhhhhheeejpccddddawuxinnnnnnkkkukkknnknwnnnnrfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhoeitcccda``inknknknkkkkkunirhhhhhhhhhhhoecrvhhoeecxirhhhhhhhhhhhocrfhhheexnnbshhhhhhhhhhhlejjdauxwnkuknwrshhhhhhhhhhoejw`adpjlashhhhhhhhhhhhejjjejjd`axnnnrrvhhhhhhhhheexp`wa`shhhhhhhhhhhoepdaaxnnbshhhhhhhhhewdcpjjjjdcamhhhhoedddpdcwunkxkkkkkknkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknkknknnkkkknkrqhhhhhhhhhhhhhleejjppppdcwtxnknkknkkkkkukkknknnwiknkrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhlpdjacdpjjpd`kknnnkkkkwcddgshhhhhhhhhhhlershhheedpxtbhhhhhhhhhhhorshhheeuinnrmhhhhhhhhhhhleeejdppddddnkrbqhhhhhhhhhhed`pjejjeewshhhhhhhhhhhheeeeejjejppdnnrvhhhhhhhhhoeutwpjlcshhhhhhhhhhhoejjpjdxtgvhhhhhhhhhljjejljjjpp`ghhhhlepjjejcawnxxknkknkkknkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknknkknnnkkknnmhhhhhhhhhhhhhoeeeejjjdc`txnnnnnnnnnkkkwunkkkknk`nnrghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhewuwcdpdauxnnnnkknknnkkkkkimhhhhhhhhhhhegbhhheedwtirshhhhhhhhhhhsghhoeeauxxwrfhhhhhhhhhhheeeejpcwxnnnnirqhhhhhhhhhhlewadjjjeljsvhhhhhhhhhhhleeeeeejdatikkrshhhhhhhhhhepu`adpjpshhhhhhhhhhheeejpc`tirvhhhhhhhhhhjjjeejdawttrfhhhljjjejpdwxnkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkknkkknkkkkghhhhhhhhhhhhhheeeejjpcwuxinknkknknkkkkxuinkknknnnkrmhhhhhhhhhhhhhhlelllloohhhhhhhhhhhhoewwcpjjdatxnkkkkknkkknknkkrvhhhhhhhhhhodrfhheejcwtxrmhhhhhhhhhhhrqhhlejawxtubhhhhhhhhhhhheeeeejd`tnkknrvhhhhhhhhhhoeccdjeeejjpbvhhhhhhhhhhhleeeeeejc`tinrbhhhhhhhhhhoeu`cpjjljahhhhhhhhhhoeeeeepawxivhhhhhhhhhhoeeejpawtxiimhhhejjeeepcwxnkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknknkknkkkrqhhhhhhhhhhhhhleeejjc`uxnnnknnnnkkkknnnknnkkkknknnrfhhhhhhhhhhhhhheeeeeeeelllhhhhhhhhhol`cpjjjd`tiknnnkkknknknkknrhhhhhhhhhhhorshhlelpauxxrfhhhhhhhhhhmmhhleepcwtxrmhhhhhhhhhhhoeeeeejd`txnnrshhhhhhhhhhhejcpjjeeejpcrqhhhhhhhhhhheeeeeejjcwxnirqhhhhhhhhhhep`cpjeejpdvhhhhhhhhheeeeejjcwtrvhhhhhhhhhhqeeejd`tinnnshhheadjejpcuxnkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkkkknkknkkkkkrvhhhhhhhhhhhhhoeeejpauxinnnnkkkknkkkknnnnknkknnnknrhhhhhhhhhhhhhhoeeeeeeepc`uaqhhhhhhhljdpjljjcwxnnkknknkkkkkknnnshhhhhhhhhhhbghhoeejd`uxtbhhhhhhhhhhhshhoeeepcwutrfhhhhhhhhhhhleeeeejpatxnnbqhhhhhhhhhhoedpjeeeejpcurhhhhhhhhhhhoeeeeeeedauinrmhhhhhhhhhhoecdpjejejd`ufhhhhhhhleeeeeejd`tifhhhhhhhhhhhheejcwtinkkkhhoe`cjjepauinkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknnknknibqhhhhhhhhhhhhhheeejc`tinkkkkkkkkkkknnknknnnnkkknnishhhhhhhhhhhhhhleeeeeeejdawwuvhhhhhhejpeeelpcwxnnknkkknknknknkrmhhhhhhhhhhqrhhheeepcwutrshhhhhhhhhhfqhheeejpawugbhhhhhhhhhhhheeeeeejd`uinrmhhhhhhhhhhhlepjeeeejjd`bshhhhhhhhhhhleeeeeejdwtirbhhhhhhhhhhhlecjjeeejpawxicooooleeeeeeeejd`tishhhhhhhhhhhhpejdwxnnnnkneejwapjjd`tinkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkknknnknkkkkknkkirvhhhhhhhhhhhhhhhleejdwxnnkknkknnkknnnnkknnknknkkkkrvhhhhhhhhhhhhhheeeeeeeejpdaaashhhhhoeeeeeejpauinknknkkknkkkkknrfhhhhhhhhhhmmhhleejdauturvhhhhhhhhhhqhhoeeeepd``tshhhhhhhhhhhheeeeeejp`tirghhhhhhhhhhhoejjeeeeejdauxmhhhhhhhhhhheeeeeeepcwxnrfhhhhhhhhhhhepjleeejpcwxnkkncppleeeeeeeejdwtibhhhhhhhhhhhhhjjd`xnkkkkknnit`dpjd`tnnkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkkkrrvhhhhhhhhhhhhhhhhleejd`tnnkkknnknnkkknnkknnnnnnkkkkrqhhhhhhhhhhhhhoeeeeeeejjpdddc`vhhhhleeeeeejd`tnnnkkkknkknknkknrhhhhhhhhhhhshhoeeejdawwwrhhhhhhhhhhhhhoeeeejpda`rfhhhhhhhhhhhleeeeeejdwtirfhhhhhhhhhhhlejeeeeejpawxrvhhhhhhhhhhoeeeeeeepauxrghhhhhhhhhhhlejjeeeejd`uxinnnntwcpeeeeeeejdwxnrhhhhhhhhhhhhhhjp`unnknkknknxucppcwtnnkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkknkkkknkkkkkkknknkkkkirvhhhhhhhhhhhhhhhhhheejp`uinknkknnknnnkknkkknknknnnknbhhhhhhhhhhhhhhoeeeeeeejpdcccc`mhhhhleeeeeepcwtiknknknnkkknkknnshhhhhhhhhhffhheeeepdaw`gghhhhhhhhhhhhhleeeejjdcwbhhhhhhhhhhhhleeeeeepcwxrghhhhhhhhhhhoeleeeeeepc`xxrhhhhhhhhhhhleeeeeejd`tirfhhhhhhhhhhhlejeeeeepcwtinnkinxwcpjeeeeejpawxnnmhhhhhhhhhhhhhhjcwxnkknkknniu`ddcuxnkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkknknkknkkknrvhhhhhhhhhhhhhhhhhhheeepcuinnnkkntknnnknnkkknnknnkknimhhhhhhhhhhhhhhleeeeeeeejcwwwaushhhoeeeeeejepwxnnnknknknnknkkkrvhhhhhhhhhhqhhleeeepca``bmhhhhhhhhhhhhoeeeeejppdbmhhhhhhhhhhhoeeeeeeejawxrfhhhhhhhhhhhleeeeeeejpauxrghhhhhhhhhhheeeeeeejdwtrghhhhhhhhhhhhejeeeeejdauinnknnixuadjeeeejjd`uinkrhhhhhhhhhhhhhhqd`uinkkkkkkitwac`uinnkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkknnknnrshhhhhdfhhhhhhhhhhhhhoeejc`xnnknkainnnnnkkikkkknkknkurvhhhhhhhhhhhhhheeeeeeejdawuttwbshhhoeejeeejdcuxnkknknknkkkknknrqhhhhhhhhhhhhheeeejpcaawrqhhhhhhhhhhhhleeeeeljjarqhhhhhhhhhhhoeeeeeejpaurghhhhhhhhhhhheeeeeeeepcwxirmhhhhhhhhhhheeeeeeepcuxrmhhhhhhhhhhhleeeeeeepdwxinnnkknitwcdjjjjpd`uxinnnmhhhhhhhhhhhhhhqcwxnnnnknnnxu``wtikkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkkkkknrshhhhhljmhhhhhhhhhhhhhoeejdatinknkanknnnuunkkxxknuini`rhhhhhhhhhhhhhhoeeeeeejed`tiiwwishhhljjjeeejdcxinnnkkkkkiuxukuighhhhhhhhhhhhhoeeeeejcaagghhhhhhhhhhhhoeeeeeejjjwghhhhhhhhhhhheeeeeeejd`trfhhhhhhhhhhhoeeeeeeejpauxnrqhhhhhhhhhhleeeeeejd`uirhhhhhhhhhhhhleeeeeejpawxnkknkknnxuwccdddcautinkkkrqhhhhhhhhhhhhhhpauxnknkkknixuutxnnkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknknknknrshhhhhletrhhhhhhhhhhhhhheeepcuxnkkxxknnkwutwkntwnnutnnsghhhhhhhhhhhhhhoeeeeeeejd`xinuanshhhedppjejpccxnnnnnnnknna`waubmhhhhhhhhhhhhheeeeejepcabmhhhhhhhhhhhhleeeeeejjdbmhhhhhhhhhhhheeeeeeejcwrbhhhhhhhhhhhheeeeeeeejcwtinghhhhhhhhhhhleeeeeejdwtrshhhhhhhhhhhheeeeeeejcatinnkknknnnitu``a`wuxinkkkknghhhhhhhhhhhhhhqp`tinknkkknnxxinnkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkknknknkkkkkknkkkkkknkkrshhhhhleukrqhhhhhhhhhhhhhleejc`tnnkukkknn`da`kknunknuknrmhhhhhhhhhhhhhhleeeeeejpwxinnntishhheuccjjjpacinknwdddd`ktukukrvhhhhhhhhhhhhleeeeeejec`rqhhhhhhhhhhhoeeeeeeelparqhhhhhhhhhhhleeeeeejpawrmhhhhhhhhhhhheeeeeeejpauiirmhhhhhhhhhhheeeeeeejcwxrvhhhhhhhhhhhoeeeeeejpautinknknkknnnnxtttutxinnkkkkkkfhhhhhhhhhhhhhhhd`tnnnknknnnnnnkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknrbqhhhhleuknnmhhhhhhhhhhhhhheejpauinkuknkkutnnwnknunkkunkrfhhhhhhhhhhhhhheeeeeejjpwxnnnkunmhhlexcapjjd``inkknnnknknutkunrhhhhhhhhhhhhhleeeeejjjcughhhhhhhhhhhhleeeeeeejpgghhhhhhhhhhhhleeeeeejd`trqhhhhhhhhhhhleeeeeeejc`tinrqhhhhhhhhhhoeeeeeejpauirhhhhhhhhhhhhoeeeeeejp`tninnkknknkknnnnxiiinnnnknnknknqhhhhhhhhhhhhhhjawtnknkkkknknkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkknknknkkkkkkknkkkkibqhhhhoe`knnxghhhhhhhhhhhhhheeepcwxiniuknk`kkiaknn`nnuuknrhhhhhhhhhhhhhhoeeeeeejdduinnknukgqhlan``dppcw`irikknnnnnnuuktnshhhhhhhhhhhhoeeeeeejjdabshhhhhhhhhhhheeeeeeeejdbmhhhhhhhhhhhoeeeeeeejc`bghhhhhhhhhhhheeeeeeejpcuxnighhhhhhhhhhhleeeeeejd`uighhhhhhhhhhhhleeeeeejc`tnkknknkknkknkkknnnnnnnnnknknkkrqhhhhhhhhhhhhhhjautnknkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknrbqhhhhoedniniusfhhhhhhhhhhhhhleepc`tinnakkkidcuwwnnicdxdtishhhhhhhhhhhhhhleeeeeeejjpankucddcadejppjjddjpdbsqmnkkknnxd`kdrmhhhhhhhhhhhhleeeeeeeec`rfhhhhhhhhhhhlleeeeeejd`rqhhhhhhhhhhhoeeeeeeepaurshhhhhhhhhhhheeeeeeejd`tinrmhhhhhhhhhhheeeeeeejc`trshhhhhhhhhhhheeeeeeepcuinnkknkknknnnkkknnknknknnknkkkknshhhhhhhhhhhhhhod`uxnnkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkknknkknkknkibqhhhhoednnixu`amhhhhhhhhhhhhhoeejd`uinnxxnkknknkkkknknknkrvhhhhhhhhhhhhhheeeeeeejcwxnnkkkkkknkknntwcdc`tibqhhcnkkkkknnnkrqhhhhhhhhhhhheeeeeeejpctbhhhhhhhhhhhheeeeeeeepdgghhhhhhhhhhhheeeeeeejdaurfhhhhhhhhhhhoeeeeeeepawxnnbhhhhhhhhhhhoeeeeeejpauirvhhhhhhhhhhhheeeeeejdatinnikknkkkkknknkkkkkknknnkknknknnmhhhhhhhhhhhhhhlc`tinknkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkirvhhhhhedkniiuwcdshhhhhhhhhhhhhheeepauxinnknkkkkknnkknknknnrqhhhhhhhhhhhhhheeeeeejpauxnnnknknkkknnnxwcdawxrvhhoeikkknknknnbhhhhhhhhhhhhleeeeeeejdabshhhhhhhhhhhoeeeeeeejparmhhhhhhhhhhhheeeeeeejcwxrhhhhhhhhhhhhleeeeeejp`uinrshhhhhhhhhhhleeeeeejd`uirvhhhhhhhhhhhheeeeeejdwtiknnnkkkknnknknkkkkkkkkknnnnkkkknnvhhhhhhhhhhhhhljcwtinkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkirvhhhhoejknnxuwcdp`fhhhhhhhhhhhhhleepcwtinnnnnknnkkkkkkknkknghhhhhhhhhhhhhhoeeeeeejd`tinknkkkkkkkknitwacaurshhhlpnknnnknknimhhhhhhhhhhhheeeeeeeepcwrfhhhhhhhhhhhleeeeeejjdwrfhhhhhhhhhhhleeeeeejpaurghhhhhhhhhhhheeeeeeejcwxinrqhhhhhhhhhhheeeeeeejdwtnrhhhhhhhhhhhhoeeeeeejcwxnknkknkkkknnnkkkkkkkknkknknnnnkknnifhhhhhhhhhhhhhedauinnkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkknkkknknkkkrrvhhhhheliknit`adpdcshhhhhhhhhhhhhoeejdwtinnknknknknknknknnnishhhhhhhhhhhhhhleeeeeejdwtnnkkknnkkknknnxw`a`rbqhhhlwnnknnknnnrvhhhhhhhhhhhheeeeeeejdatbhhhhhhhhhhhoeeeeeeljpatbhhhhhhhhhhhheeeeeeeedatishhhhhhhhhhhoeeeeeejpawiirmhhhhhhhhhhhheeeeeeepcwxnrhhhhhhhhhhhhoeeeeejpawxnknnnknkkkkkkkkkknkkkrsrkknknnknknnbqhhhhhhhhhhhhejd`tinkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkknnrvhhhhheennnixuadpdcabhhhhhhhhhhhhhheejdatinnnnknkknknknnnkknrfhhhhhhhhhhhhhheeeeeeepawinnkknknkknnnnnxtw`brfhhhoexknnninnnnrhhhhhhhhhhhhleeeeeeejcwrshhhhhhhhhhhoeeeeeelpcwbshhhhhhhhhhhheeeeedejdwtrmhhhhhhhhhhhoeeeeeejd`uiirqhhhhhhhhhhhoeeeeeejp`txnrhhhhhhhhhhhhoeeeeejd`tnikknkknnrnkkkknknkkknbhhmnkknnknkknishhhhhhhhhhhhljjcwxnnkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknrmhhhhhllnnnituacpdc`urhhhhhhhhhhhhhhleepcwxnkknnnnkknknkknnnnrhhhhhhhhhhhhhhoeeeeeejpatinkknnkkknkkknnnxtxrvhhhholnknnixxinishhhhhhhhhhhheeeeeeejpaurvhhhhhhhhhhheeeeeeljpaurvhhhhhhhhhhhleeeejrsaawxrvhhhhhhhhhhhleeeeeejc`tnrshhhhhhhhhhhhleeeeedddwtnnrhhhhhhhhhhhhoeeeeejdwxxnnkknnnrghgkkkkknnkkkshhhcnkknnnnknnimhhhhhhhhhhhoejpawinkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknnrshhhhhleunnixwacppc`uxrmhhhhhhhhhhhhhleejd`tinkknknknnnnknknnishhhhhhhhhhhhhhoeeeeeejd`xinkkkknkknnknnnnnrrvhhhhheannnxxtxinrmhhhhhhhhhhhoeeeeeeejc`xrhhhhhhhhhhhheeeeeeljc`trqhhhhhhhhhhheeeeebghhctirvhhhhhhhhhhhleeeeeepauxibqhhhhhhhhhhhheeeeelrsswinkrhhhhhhhhhhhhoeeeeejcwxnnkkknkrbqhhfkkknkkkknshhhenkkkknkkknirqhhhhhhhhhhoeejd`tnnkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkrshhhhhleunnituacpdd`wxnnshhhhhhhhhhhhhheejpauxnnnkkknknnnnkknkimhhhhhhhhhhhhhhleeeeeejcwxnnkknnnkknnknknnirvhhhhhhexnnxuwwuxirfhhhhhhhhhhhleeeeeejjawrshhhhhhhhhhhleeeeeelpawrbhhhhhhhhhhhheeeearqhhl`iivhhhhhhhhhhhleeeeejp`wrrmhhfhhhhhhhhhheeeeegbhhfikkiqhhhhhhhhhhhheeeeejcuxnknkkkirfhhhldkknkkkkimhhhlnnnnkknnnknishhhhhhhhhhoeejpauxnkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknrshhhhhletnnixwaddpc`wxiknrhhhhhhhhhhhhhheeejcwxnnknknknnnnnnknnrfhhhhhhhhhhhhhheeeeeejpaunnnnnnknkkkknkkkrrvhhhhhhoennxtwaawxibhhhhhhhhhhhheeeeeeejdaurvhhhhhhhhhhheeeeeeejpaurshhhhhhhhhhhoeeejrmhhoeunivhhhhhhhhhhhleeeeejd`trshhmhhhhhhhhhhoeeee`rqhhlcnnnvhhhhhhhhhhhheeeeepawxknnkkirvhhhoe`kkknkkkrvhhhounknnnkknnnnrqhhhhhhhhhoeeejdwxnkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknrshhhhhoeannixw`cppdauxinkkifhhhhhhhhhhhhhoeejd`txnnnnkknknknknknbhhhhhhhhhhhhhhoeeeeeeedaunnnkknkkkwcxnnirbqhhhhhhhldnitwacawtrghhhhhhhhhhhheeeeeeejcwxrhhhhhhhhhhhheeeeeeejcwtrmhhhhhhhhhhhleeegghhhedinivhhhhhhhhhhhleeeeejcwrbqhhshhhhhhhhhhleeecrvhhoe`kknmhhhhhhhhhhhhoeeejpauinkkknrshhhhepnnkknnnkrfhhhhdniiiinnnknnnshhhhhhhhhleeejpatikkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkknkkkkkkkkkkkkkkkkkkinrshhhhhhejknixu`cpdcawtinknknfhhhhhhhhhhhhhheejpauxnnkknnknknnnknimhhhhhhhhhhhhhhleeeeeejd`tinknnknknkntnrrshhhhhhhhheuitucpdauxrfhhhhhhhhhhhleeeeeejpaurghhhhhhhhhhhoeeeeeelpcwxrvhhhhhhhhhhheeebbqhhleunnnmhhhhhhhhhhhheeeeeparbqhhvmhhhhhhhhhhleepbshhhepnnkkghhhhhhhhhhhhheeeepauxnkkirshhhhlenknnnknnnrhhhhhjixttxinknknnghhhhhhhhheeeeepawxnkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkknkkkkknnnkknrrghhhhhhoeitxxu`ddpdawwuxkkktrshhhhhhhhhhhhhhoeepcwxinkkntxuntinknrfhhhhhhhhhhhhhhleeeeeepcwxnnittnknnnnrrgfhhhhhhhhhoewwuapjjdairhhhhhhhhhhhhleeeeeejd`trmhhhhhhhhhhhleeeeeejdauxrfhhhhhhhhhhheebbqhhoeaxnnkshhhhhhhhhhhhqeeej`rbqhhorvhhhhhhhhhhleprshhhletnknkiqhhhhhhhhhhhhqeejp`tinnirvhhhhleukkniniiinrhhhhhhutuuuxinnnknrhhhhhhhhheeeeejcwxnkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkknnnxkkktnixikirvhhhhhhhopawtu`cppdcwuwuwxnktxshhhhhhhhhhhhhhhjejd`tinnkn`uw`t`nkrghhhhhhhhhhhhhhhleeeeejpcuxikutuwnknirgfhhhhhhhhhhhlj`p`djjpcwrghhhhhhhhhhhheeeeeeejcwxrqhhhhhhhhhhheeeeeeejdwtirhhhhhhhhhhhhvrbqhhoejtnnnirhhhhhhhhhhhhhvmwrrmqhhoerhhhhhhhhhhhfsrshhhleannnnnimhhhhhhhhhhhhhfcppatiirbfhhhhoewnnnixtutxighhhhhhjw`awtnnnnnnrhhhhhhhhleeeeejd`tikkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkknnkkkkininitrbvhhhhhhhhhdxwuwcppdcwtx`cutnnnrshhhhhhhhhhhhhhhqplddpcccwkxtkuntnirfhhhhhhhhhhhhhhhleeeeeejjdtnkwawtirrsfhhhhhhhhhhhhhed`adpjjcwxrmhhhhhhhhhhhoeeeeeejpauighhhhhhhhhhhoeeeeeejpcuxirhhhhhhhhhhhhhvhhhhleaxiknxtvhhhhhhhhhhhhhhvvhhhhheprhhhhhhhhhhhhvfhhhoepxiknnxxxqhhhhhhhhhhhhhqsgrrbsfhhhhhoednnkixww`uxrshhhhhhqaacauinnknighhhhhhhoeeeeeejd`xinkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkknnkkxnnirrgqhhhhhhhhhhmt``cdppc`uxwikntknirfhhhhhhhhhhhhhhhhqscawxnkkkxtktnxrrvhhhhhhhhhhhhhhhhqcpeeejc`xiitrrrbsvhhhhhhhhhhhhhhhoewcjjjjjawxrfhhhhhhhhhhhleeeeeejc`trmhhhhhhhhhhhleeeeeejdatinrhhhhhhhhhhhhhhhhhledwxinxtwshhhhhhhhhhhhhhhhhhhhelirhhhhhhhhhhhhhhhhoejuxinixtuushhhhhhhhhhhhhhhhhhhhhhhhhoecnknitu`aawtrshhhhhhhqddcwxnknnrfhhhhhhhleeeeeejd`tnnkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkknkkxrrgvhhhhhhhhhhhhhfgbuppc`uxiunirrrbsfhhhhhhhhhhhhhhhhhhhfsbrinknxxirrbsqhhhhhhhhhhhhhhhhhhqmsrrrrrrgsgmvqhhhhhhhhhhhhhhhhhhoe`djejejatxbhhhhhhhhhhhheeeeeeejcwtrfhhhhhhhhhhheeeeeeejcwxnnifhhhhhhhhhhhhhhhlejauxiiuw`wqhhhhhhhhhhhhhhhhhhlexkifhhhhhhhhhhhhhhheeauxxixww`wumhhhhhhhhhhhhhhhhhhhhhhhoedkkiixu`cca`trvhhhhhhhhmcd`tnnnrshhhhhhhleeeeeeejd`xnkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkknkkkkniinkkkngqhhhhhhhhhhhhhhhhhhqhpauxnktarvqhhhhhhhhhhhhhhhhhhhhhhhhhhhfskiaurvhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhejejeejjdddgshhhhhhhhhhhoeeeeeejpaurbhhhhhhhhhhhoeeeeeeepcuinknmhhhhhhhhhhhhhhleed`uxitu`awgqhhhhhhhhhhhhhhhhlewnnkmhhhhhhhhhhhhhheep`txxxuwa`wtimhhhhhhhhhhhhhhhhhhhhhlednnkxxu`cccauxrvhhhhhhhhhfgubrrbmhhhhhhhlejjeeeeejdwtnkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkknghhhhhhhhhhhhhhhhhhhhhj`tinkkkrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhowkkkrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhejjeeejjcuxrvhhhhhhhhhhhleeeeeejd`tishhhhhhhhhhhleeeeeejd`uxnnknhhhhhhhhhhhhhleejd`uttw`aawxshhhhhhhhhhhhhhheeaxnniiqhhhhhhhhhhhoeeedautttwaawuxinahhhhhhhhhhhhhhhhhhoeeunnnixuwaccawtirqhhhhhhhhhhhhvvfhhhhhhhhlepdjeeeeepcuxnnkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkrhhhhhhhhhhhhhhhhhhhhhewxnkkkkkhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhodnkkkhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhoejjeeejpauxnhhhhhhhhhhhheeeeeeejcwxivhhhhhhhhhhheeeeeeejd`tnnknkrhhhhhhhhhhleeeejdawuw`aawuxiwhhhhhhhhhhhhoeecwttxtuwhhhhhhhhhhleeejpawuw`aa`wtnnnn`ohhhhhhhhhhhhhholejxnnnxtu`cddawuxnrhhhhlllohhhhhhhhhhhhhhlee`wcjeeeejdauinkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkteeeeeeeeeeeeeeeeeeeeewxnnkkknkeeeeeeeeeeeeeeeeeeeeeeeeeeeeeepnnnkkeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeejd`tinneeeeeeeeeeeeeeeeeepauxnkdeeeeeeeeeeeeeeeeepcuxnnknknnoohhhooleeeeeeepcaaaaa`uxnnnxoohhhhhholeeejda`www`adohhhhhhoeeeeeepdaa`acawtxnnnnitplohhhhhhhhoolee`tttttu``ccdc`txinihhhel``dllohhhhhhhholeeaixwdjeeeejcwxikkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkknnnixuwadpeeeeejdwtinnnkkkkkknknnniixwapeeeeeeeeeeeeepc`txinnnnknknnkniiuwcpleeeeeeeeeeelpawxinnnnnnnnixxxxuuw`adpjjeeeeeeepcwtnknknnnniuadleeeeeeejp`tinkkknknixwdjeeeeeeejd`uinnkkknkn`peeeeeeeeeeeejpddccawtiiknniclllleeeeeeeejpccccccccpllleeeeeeeeejpdccca`uiiknknnxwajeelllleeeeepc`wwww`acddda`utnnnnglejxnxwdjeeelllleeed`knit`djeejjdauxnnkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkknknnixuwadjjeeeeejdawtxinnnkknkknnnixtu`cpleeeeeeeeeeeejpc`uuxiinnnknnnixuwapjeeeeeeeeeeeeejc`utxiniixxxxtuuw`acdppjeeeeeeeejpatxikknkkkniuapjeeeeeeejdwtnnkkkkknit`djeeeeeeejd`tnnknnknknniuapeeeeeeeeejjjdcawtinnknnixwcleeeeeeeeeejjpppdcawuucpjeeeeeeeeejjpdc`uxinkkkknitwcpjeeeeeeeeejppdcccddppdc`uxinkkkiuuxnit`djeeljjdc`iinnnnxwcpjeejpawxnnkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkknitw`cpjjeeeeeejjda`wtxnnkkknknixtuw`cpjeeeeeeeeeeeeeejpca`wutinnknnitw`cdjjeeeeeeeeeeeeejpcawwuuuuuwww``acddpjjjeeeeeeeeejd`tinnknkknnxucpeeeeeeejpcwinnkkknkiiuadjeeeeeejjawxnnkkknknknitadjeeeeeeeeejpdcwtinnknkkniu`djeeeeeeeeeeljjpdawttxuadjeeeeeeeejjpc`utinnknkkknitwcpjeeeeeeeeeejjjjjpjpdc`tixnknnnknkkkxtadjjeejpd`wuxxxxxw`djjjjpcwtinkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkknkixuacdjjjejeejejjddaawtinnkkknnxtw`acdpjejeeeeeeeejejjjjpdaa`utinnnitwacdpjjeeeeeeeeeejejjjddcaa`a`aaacccddppjjejejeeeeejjpcwxnknkknnknxwcpjeeeejejd`tinkkkkknnxuapjjeeeejjdauinknkknkkknixwcpeeeeeeeejjpa`txnknknknnnxwadjleeeeeeeejjpdawtiiitwcpeeeeeeeejpcauxinknknknknnxtwcdjjeeeeeeeeejjjjjpcawuxikikknknknnnitapjjjjjppcawuuuuwacpjjjda`txnnknkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkknntw`cdpppjjpjpjppddca`uxnnkkknixu`acddpppjppjpppjpjjjpppddcaawtxnnnxu`acdpppppppppjppjjpjppddccaccacccccddddppppppjppppjpdc`txnkkknkknnxwacpppppppdcwxinkkkknknxuacpppppppdawxinknnkknkknnxuacpjejejjjpcautinknkkknknnxxwadpjeeeejejjpd`wxinnniu`cpjeeeejjpc`utnnknkkkkkknnnxtwacppejeejejeejjpdcawuinnkkknknknkknxu`dppppddddcca```ccdpppcawxxnkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkknnxu`aaaccacccacacaaa`wtinkknkknitw`aaaacaacccccacccaccacaca``wtinnnitw`aaaaacacacaccccccacaaaa````a`aaaaaaaacccacaccdcacaawuxnnkknkknknxuwaaccccaa`wuinknkkkknnitwaaccccacawtinknknknnkknnnxu`cdpppddcawuxinnkkkkkkknnnitw`ddppjjppdda`uxikkknnxu`ddppppdcawuxnnknknnkknkknnnitu`acdppjjjjpppdc`wuxinnknkknkkkkknnit`cccaaaaaccccccacdcccawuxinkkkkkknkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkknixtuuuuuwuuuwuuuuuuttxixkkkknnixttuuuuuwuuuuwuwuuuwuwuwuuuuttxnnnnxattuuuwuuuuudauuutuuwu`uuuuuuwuuuac`cuwuawuuuwuwawwuutxxnnnkkkkknnnnxcwuuuuuuuttinnkkkkkkknnactuuuuu`ctxxii`iwikknkkknnixuw`aaa``wutxinkkkkkkkutkkknixuwaaccccaawutxnw`ikkkixu`acdccawuxinnnkkkkknknki`kknnxxuwaadccccca``wuxinnnkkkkkkknnknkkitu``wuuuuww```aaaaaa`wutxiknkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkknnixxxxxxxxiiiiiiixinnwnkkkkknnnniiiiiixixixxixixiixxxxxxxxiinnknnntiiixxxixxxxpxxixxiii`txxxxiuwixiucupixiiwixixixwiixxiinkkkkkkkkkknnniuxxiiiiuiinnkkkkkknkknntiixiiuxiatnnkdndxkknknkknnnxxtuuuuxxxinnnkknkkkkkxknkkknuxuuwwwwuuxxinnknxkkknnixuuwwuutxnnkkkkkknknkkkkxnknknnittuwawwwuuutxinnnkkkkkkkkkkkkkknnixuttxiixxttuuwwwuuuttxinnkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknnknnnnnkninnnknnnnnkwkknknxinkntnxxinnxxnxtknnnnttnnnxxxtiknkkixnxnnnnnnnnnnuunnnnknnnwnnnnnnunnnnt`icnnnnunnknknitnnnknkknkkkiinxxknnnxxtnnniwxxxnkxixninnkkkxnnknkxnnnnknkck`nknkkknkknknnniiiiinnnkknkkknkkkkinxnkniwtuwtxututitnnkkkxnkkkknnixiutuxixknkkixnkkknxxnxkknnxxnniix`xxxxiinnnnkkkkkkkkkkkknkkkkkniininnnnnniixxxxxxiinnknkknkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkknkknknkknkknknkkkkkkkkiikkkkxxxtkkxwuxttknu`xx`kkxuxxwnkiwtxtiknxtxuwkkkkknkkknunkkkknkkiiknnnnntknkknukukkkkktkkkkkntkkkkkkkkkkkiuwxxwkkk`xxukknuxxnkkxwxwxtiknkxkkkkkiwinkkkk`kukknkkkkkkkknknnnnnknknkkkkkkkknkkutxtnknutttnntwtwxxtkkkkikkkkkknnnnx`xwxxxkkutxuxnkitxuwkkxuxiwnnnnxxnnnnnnnkkkkkkkkkkkkkkknkknknnnnknkkknknnnnnnnnnnnknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkxkkkkktwutkkktkkktkktkkknxnuixxtukkikkkxkkxkkktnnknkkknkkkkknkknkkxkkkkkkkxkkkkkkkknknkktnkkkkkntkkkkkkkkkkktkkknxnkxkkxkkkxkkkkkkukxkkxkkkxkkkkkkkktikkkknkkkkknknkkkkknkkkkknkknknknknkkkkkikkkxkkxkknnnk`ktkkxkknkxkknkwuwwwikwkxkkiknnkkkxkktkkktkkuiixtukkkkxkkkkkkkkkkkkkkkknkknkkkknkkkknknkkkkknknkkknknknkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkknkkkkkkkkkxkkkkxnkkxkkktkkkxnktkkknikwiixiinkxkkkxkkxkkkikkkkknkkkkkkkkkkkknikkknknkxknkkknkknkknknukkkkkkwkkkkkkkknkktkkknikkxkkxkkkxknkkkkwkikkxkkkxkkkkkikknxkkkkkkkknkkknknkkkkkkkkkkkkkkkkkkkkkkkkxkknxkkxknkkknwkxkkxnkknxkkkkkkkkknkwkikkikxkkkkxkkxkkkxknuxiixnkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknknkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkknikkkxkknukkkwnknxkkutknukkttkkknkkxnnkxkktnkiwkknkkkkkkkkkkkkkkkknxkkknkntkkkkkknkkkknkktkkkkkknnkkkkiukkkkttkntkkkxkkikkktkkknkkukxkkxkkkxkkkkkttxxkkkknknkkknkkkkknknkkkkkkknwiknkknkkkkkkxkkkxkkinknnkkwkikkinkkkxnknkkkkkkkkukikkikktnknxkktnkiwkktxkkknknktkkkkkkknknkkkkkkkkkkkkkknknkkkkkkkknkknkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkktkkknuuixtkkituxkkkinutnkkkiuwiknxuikxukkktuxnwkkknknknkkkknkkkkkkukknkkktnkkkkkknkkkkkkntkkkkkkukkkkiukkkkinutnkkuuknuukkkuwuikuukxnkukxuuwuikkkkiknkkknkkkkkknkknkkkkkkkkkkknunkknkkkkkknxunkuuikkxwuxktuinxkxinwuuutkkkkkkkktuinxkxnkkuuxkkkkuuxnukknuuiknkkukkkkkkkkkkkkkkkkkkkknkkknkkkkknknkkkkkkkkkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkknkkkkknnkkkkkkkkkkikkkkkkikkkkknkkkknkkkkkknkkkkkkkknkkkkkkkkkkkkknkkkkkniknknkkxkkkkkkkknknkkknnkkkkkikkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknknkkknkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknkkknkkkkkkkkkkkkkkknknkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkxnkkkkkkkkkkknkkkkkkkkkkkkkknknkknkkkkknkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkuwtkkkkxwuknkkknkkkkknkkkkkkkkkkkkkkknkkknkknkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkxwunkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkknknkknkkkkkkkknkkkkkkkknkkkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknknkkkkkkkkkknknkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkkkkkkkkkknkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkknkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknnkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknknknktixikkkxkkkkkkinkkkkkkkkkkkkkkkkkkknxkkkkkkkkkkkkkkkkkkkkknxnkkkkkkikkkkkixnxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkktikkkkkkkkkkkkkkkkkkkkktxkkkkknkkkkkkkkkkkkkkkkkkkkkkkkinkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkxnkkkxixtkkkknkkkkkkikkkkkkkkkkkkkkkkkkkknkkkkkkknkkkkkkkkkkkkkkknkkkkkikkukkkntnukkkkkkkkkkkkkkkkkkkkkkknkkkknkkkknkkkkkknkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkikkkkxnixkkkkikkkkkkiknkkkkkkkkkkkknnnkkknknkkkkninnkkknnnknkkkkknkkkkknkkkkkknxktkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkinikkkninnnkkininnnkkkknkkkkkkkkkkkiniknnkkkknikkkkknnknkkkknkkkkkkikkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkknnkkknnnnnkkkkknkkkkkkikkkkkkkkkkknxnninkkninnnkkninnkkkinninikkkknkkkkkninkkkkkikikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxnnikkninnnkknxnxninkkknkkkkkkkkkkknxnxnnnkkxnnxnkkinnxnkkinniikkkknkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkikkkkkkikkkkkkkkkkknnnnnxkknkkknkkknkkkkknnknknkkkknkkkkkkkkikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkknkkkkkkxknkknkkknkkkkkxxxxxkkxknkknknkkkknknkkkknkkinnnikkkknkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkikkkkkkkkkkinnnnnkkkkkknkkknkkkkknnknknkkkknkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkknkkkkkkiknkknkkknkkkkkkkkkkkkiknkknknkkkknknkkkknkkinnnnkkkknkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkknkkkkkiikkkkikkkkkknkkknkkknkkkkknkkkkkkkkknkkkknninkkkkkkkkkkkkkkkkkkkkkkkkkkkkikkkkkkkkkkkknkknkkknkkkkkkiknkknkkknkkkkkkkkkkkkiknkknknnkknkkknkknnkkxkkkkkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkknkkkknnkkkkkiinkkknnknnnkkkinnkkinkikknkninnikkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknikkkkkkkkkkkiikkiikkkninkkiiknnkiknninikkkkkkkkkinknkkikkkiinkkkkinnnnkkniikkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", -"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" -};
--- a/etc/xemacs.xpm Mon Aug 13 09:21:56 2007 +0200 +++ b/etc/xemacs.xpm Mon Aug 13 09:23:06 2007 +0200 @@ -3,175 +3,175 @@ /* width height ncolors chars_per_pixel */ "388 145 25 1", /* colors */ -"` c #686869", -"a c #A6AAF5", -"b c #585859", -"c c #797979", -"d c #09090B", -"e c #989CEA", -"f c #383839", -"g c #363ACC", -"h c #282829", -"i c #88888A", -"j c #13154C", -"k c #7074DF", -"l c #5256D8", -"m c #484949", -"n c #232788", -"o s None c None", -"p c #B8B8B9", +"` c #787879", +"a c #686869", +"b c #A6AAF5", +"c c #585859", +"d c #484849", +"e c #09090B", +"f c #5256D7", +"g c #989CEA", +"h c #363ACC", +"i c #C7C8CF", +"j c #282829", +"k s None c None", +"l c #13154C", +"m c #7074DF", +"n c #D9D9DB", +"o c #232788", +"p c #383838", "q c #4249D0", "r c #B6BAF9", "s c #868AEB", "t c #A8A8A9", -"u c #C8C8CF", -"v c #989899", -"w c #6266DB", -"x s None c None", +"u c #989899", +"v c #6266DB", +"w c #888889", +"x c #B9B9B9", /* pixels */ -"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", -"oxxoxxoxxoxxoxxoxoxoxoxxoxxoxxoxxxxoxxoxxxoxxoxxoxxoxxoxoxxoxxxoxxoxxoxxoxxoxoxxoxxoxxxoxxoxxoxoxoxoxxoxxoxoxoxxoxxoxoxoxoxoxoxxoxxoxxoxxoxxoxxoxoxoxoxxoxxoxxoxxxxoxxoxxxoxxoxxoxxoxxoxoxxoxxxoxxoxxoxxoxxoxoxxoxxoxxxoxxoxxoxoxoxoxxoxxoxoxoxxoxxoxoxoxoxoxoxxoxxoxxoxxoxxoxxoxoxoxoxxoxxoxxoxxxxoxxoxxxoxxoxxoxxoxxoxoxxoxxxoxxoxxoxxoxxoxoxxoxxoxxxoxxoxxoxoxoxoxxoxxoxoxoxoxxoxoxoxoxoxoxoxxoxx", -"xxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxxoxxxxxxxxxxxoxxxxoxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxxxxxxxxxxxxxoxxxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxxoxxxxxxxxxxxoxxxxoxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxxxxxxxxxxxxxoxxxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxxoxxxxxxxxxxxoxxxxoxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxx", -"oxxoxxxxoxoxxxxxoxoxoxxxoxxoxxoxxxoxxoxxxxoxxoxxxxxoxxoxxxxoxxxxxxxxxoxxxxoxxxxxxxoxxxxxoxxxxoxoxoxxxxoxoxxoxxxoxoxxxoxoxoxoxxxxoxxoxxxxoxoxxxxxoxoxoxxxoxxoxxoxxxoxxoxxxxoxxoxxxxxoxxoxxxxoxxxxxxxxxoxxxxoxxxxxxxoxxxxxoxxxxoxoxoxxxxoxoxxoxxxoxoxxxoxoxoxoxxxxoxxoxxxxoxoxxxxxoxoxoxxxoxxoxxoxxxoxxoxxxxoxxoxxxxxoxxoxxxxoxxxxxxxxxoxxxxoxxxxxxxoxxxxxoxxxxoxoxoxxxxxoxoxxoxxxxxxxxoxoxoxoxxxxxoxx", -"xxxxoxxxxxxxxxoxxxxxxxxxxoxxxxxoxxxxxxoxxxxxxxxoxxxxoxxxoxxxoxxoxxxxxxxxxxxxoxxxoxxxxxoxxxoxxxxxxxoxoxxxxoxxxxxxxxxoxxxxxxxxoxxxxxxxoxxxxxxxxxoxxxxxxxxxxoxxxxxoxxxxxxoxxxxxxxxoxxxxoxxxoxxxoxxoxxxxxxxxxxxxoxxxoxxxxxoxxxoxxxxxxxoxoxxxxoxxxxxxxxxoxxxxxxxxoxxxxxxxoxxxxxxxxxoxxxxxxxxxxoxxxxxoxxxxxxoxxxxxxxxoxxxxoxxxoxxxoxxoxxxxxxxxxxxxoxxxoxxxxxoxxxoxxxxxxoxoxxxxxxoxxxoxoxxoxxxxxxxxoxoxxxxx", -"xoxxxoxxxxoxoxxxxxxoxoxoxxxxoxxxoxxoxxxxxoxxoxxxoxxxxxxxxxoxxoxxoxxxxoxxxxxxxoxxxxoxxxxxxxxxxxoxoxxxxxxoxxxoxxoxxoxxxxxxxoxxxxxoxoxxxoxxxxoxoxxxxxxoxoxoxxxxoxxxoxxoxxxxxoxxoxxxoxxxxxxxxxoxxoxxoxxxxoxxxxxxxoxxxxoxxxxxxxxxxxoxoxxxxxxoxxxoxxoxxoxxxxxxxoxxxxxoxoxxxoxxxxoxoxxxxxxoxoxoxxxxoxxxoxxoxxxxxoxxoxxxoxxxxxxxxxoxxoxxoxxxxoxxxxxxxoxxxxoxxxxxxxxxxoxoxxxxxoxoxxxxoxxxxxxxxxxxxoxxxxxxoxox", -"xxoxxxxoxxxxxoxxxoxxxxxxxxoxxxxxxoxxxoxoxxxxxxxxxxoxxoxxxxxoxxxxxoxxxxoxxoxxxxxxxxxxoxxxxxxxoxxxoxoxxoxxxxxxoxxxxxxxxxxoxxxoxxxxxxoxxxxoxxxxxoxxxoxxxxxxxxoxxxxxxoxxxoxoxxxxxxxxxxoxxoxxxxxoxxxxxoxxxxoxxoxxxxxxxxxxoxxxxxxxoxxxoxoxxoxxxxxxoxxxxxxxxxxoxxxoxxxxxxoxxxxoxxxxxoxxxoxxxxxxxxoxxxxxxoxxxoxoxxxxxxxxxxoxxoxxxxxoxxxxxoxxxxoxxoxxxxxxxxxxoxxxxxxxxxxxooxoxxxxoxxxxoxxxoxxxxxoxxxoxxxxxxxx", -"xxxxxoxxxoxxxxoxxxxxoxxoxxxxxxoxxxxoxxxxxxxxoxxxoxxoxxxxoxxxoxxoxxxxxxxoxxxxxoxxxxxxxxxxxoxxxxxoxxxxxxxoxoxxxxoxxoxxoxxxxxxxoxxoxxxxxoxxxoxxxxoxxxxxoxxoxxxxxxoxxxxoxxxxxxxxoxxxoxxoxxxxoxxxoxxoxxxxxxxoxxxxxoxxxxxxxxxxxoxxxxxoxxxxxxxoxoxxxxoxxoxxoxxxxxxxoxxoxxxxxoxxxoxxxxoxxxxxoxxoxxxxxxoxxxxoxxxxxxxxoxxxoxxoxxxxoxxxoxxoxxxxxxxoxxxxxoxxxxxxxxxxxoxxxxoxxxxxoxoxxxoxxxoxxxxxoxxxxxxxoxxxxoxx", -"xoxoxxxxxxxoxxxoxxxxxoxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxoxoxxxxxxoxxoxxoxxxxxxxoxxxxxxxxxxoxxxxxxxxxxoxoxxxxxxoxxxxxxxxxxoxxxxxxxxxxxoxxxxoxxxxoxxxoxxxxxoxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxoxoxxxxxxoxxoxxoxxxxxxxoxxxxxxxxxxoxxxxxxxxxxoxoxxxxxxoxxxxxxxxxxoxxxxxxxxxxxoxxxxoxxxxoxxxoxxxxxoxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxoxoxxxxxxoxxoxxoxxxxxxxoxxxxxxxxxxoxxxxxoxxxoxxxxxxoxxxxoxxxxxxxxoxxxxxxxxxoxxox", -"xxxxxoxoxoxxoxxxoxxxxxxxxoxxxxoxxxxoxxxxxxxxxxxxxxoxxxxxxoxoxxoxxoxxoxxxoxxxxoxoxxxxxxxxxxxxoxxxxxxxoxxoxxxoxxoxxxxxoxxoxxxxxxxxxxxoxxxxxoxxoxxxoxxxxxxxxoxxxxoxxxxoxxxxxxxxxxxxxxoxxxxxxoxoxxoxxoxxoxxxoxxxxoxoxxxxxxxxxxxxoxxxxxxxoxxoxxxoxxoxxxxxoxxoxxxxxxxxxxxoxxxxxoxxoxxxoxxxxxxxxoxxxxoxxxxoxxxxxxxxxxxxxxoxxxxxxoxoxxoxxoxxoxxxoxxxxoxoxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxoxxxxoxxoxxxxxxxxxxxx", -"xxoxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxoxxxxxxxxxxxxxxxxoxxxxxxxxoxoxxxxxxxxoxxxoxxoxxxxxxoxxxoxxxoxxxxxxxoxxxxxxxxxxxoxoxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxoxxxxxxxxxxxxxxxxoxxxxxxxxoxoxxxxxxxxoxxxoxxoxxxxxxoxxxoxxxoxxxxxxxoxxxxxxxxxxxoxoxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxoxxxxxxxxxxxxxxxxoxxxxxxxxoxoxxxxxxxxxxxoxxxxxxxoxoxxxoxxxxoxxxxxxxoxxxxxxxoxxx", -"xxxoxxoxuuxoxxxopxxxxxxxxxuuxxxxoxxxoxxxxxxxxxoxuuoxxxoxoxxxoxoxopoxxxxxoxxxooxxxxxxxxxxxxxxoxxxxxxxoxxxxxxxxxoxxxxxoxoxxxxxxxxxxxxxxpoxoxxxoxxxxxxxxxxpoxxxxxxxoxxxoxxxxxxxxpooxxoxxxoxoxxxoxxoxxxxxxxxoxxxooxxxxxxxxxxxxxxoxxxxxxxoxxxxxxxxxoxxxxxoxoxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxoxoxxoxxxoxoxxxoxxoxxxxxxxxoxxxooxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxoxoxxxxxoxoxxxxxxxxxxoxx", -"xxxxxxxxxoxxoxxxuxxxxxxxxxxuxxoxxxxxxxxoxxxxxxxxxuxxoxxoxxxxxxxoupxoxxupppxxxxxxxxxoxpptpuuxxxoxxxxotuxotuxxoxxxoxxxxxxoxxxxxxxxxxoxxxuxoxxxxxxxoxxxxxxxuxxxxoxxxxxxxxxoxxxxxxuxxxxoxxoxxxxxxoxxoxxxoxxxxxoxxxxxxxxoxxxoxxxxxxoxxxxxxxoxxxxoxxxxoxxxxxxoxxxxxxxxxxoxxxoxoxxxxxxxoxxxxxxxxxxxoxoxxxxxxxxoxxxxxxxxoxxxoxxoxxxxxoxxoxxxoxxxxxoxxxxxxxxoxxxoxxxxxxoxxxxxxxxxxxxxxxxxoxxxxxxoxxoxxxxxxxxx", -"xoxxoxooxoxxxouooxxxxxxxxxxooooxooxouoxxoxxuuxoxxuxouuxxoxxxxoxxtuxxxxxxuxxxxxxouoxxxoxoxxoxxxuuooxxopxuoxxxxxxxxooouxuoxoxouoxxxxxooxuxxxuuoxxxxxxxxxxxuouxxxxxuuoooxxouoxoxxuxuuoxoxxoxxxxxxoxxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxoxxxoxxoxxxxxxxxxxxxxoxxxxxxxxxxxxxoxxxxxxxooxooxxxoxxxxxoxxoxoxoxxxxxxxxoxxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxoxxxxxxxxxxxxxoxxxxxoxoxxxoxx", -"xoxxxuoouuoxuuoppxxxxxxxxxopuuuoxxupuppxxopuupooxuxpuoxxxoxxxxxopxxxxoxxuxoxooxouuoxxxxuxxxxxpuuuuxoxuupxxxxxxxxxopuupupxxupuupxxxpuupoxopuupuxxxxxxxxxxtuupxxxpuopuxoupuupxxxuxtuoxoxxoxoxxoxxoxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxooxxoxxoxxxxxxxxoxoxoxxoxxoxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxoxxxxx", -"xoxxoxoxxuxxuxxxuxxuptptuxxuxxxuxxuxxxooouxxxxuxxutoxoxoxxoxxxxxxxoxxxxxuxxxxooppuoxxxxoxxxxuuouutxxxotoxxxutptpuxuuxuxuxxuxxoxuxuxxxouxuuuuotxxppptpoxxoxxuxxooxxxuxxuxxoxuxxppoxxoxxxxxxoxxxxxooxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxxxxxxoxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxooxoxoxxxxxxoxxxxxooxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxooxxxxxoxxxxxoxx", -"xoxxoxxxxoxxoxxxuxxxxxxxxxxuxxxuxxuxoxouxuxoxxuxxuotxoxxxoxxxxxxoxoxxxoxuxxuxxpoxouxxxxuxxxxpuuouuxxxtxpoxxxxxxxxouuxuxuxxuxxxxuxuxxxxuxpuouuuxxxxxxxxxxuxxuxxuxxxxuxxuoxxxuxxpuuxxxooxoxoxxxxxxxxoxoxoxoxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxooxxoxxoxxxxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxoxxxxxxxxooxooxoxxxxxxxxoxoxoxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxooxxxoxxxxxxoxoxxox", -"xoxxoooxuuxxuoxotxxxxxxxxxxuxxxuxxpuxopxoopxxpoxxuxopxxxoxxxxxxoxxxoxxxouoouxxuoxuuxxxxuxxxxotoxxoxxpoxotxxxxxxxxxuuouxuxxuuxopoxuuxopuxotoxxxxxxxxxxxxxuxxuxxxpoxopoxpoxotxxxuxuuxxxxxxxxxxxxxoxoxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxoxxxoxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxxxoxxxxx", -"xooxxxuuouuxxppuotxxxxxxxxutoxttoxxpttoxxxuttooxppxxttoxxxoxxxxxoxxoxxutttttxxuttotuxxpttuxxxxptpoxotuxotpxxxxxoxutpxtoupxopttoxxxutpotoxoptpxxxxxxxxxxttxottxxoptpxxxoptpooxtuxotpxxoxoxxoxxxxxxxxoxxxoxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxoxxoxxxxxxxxxoxxxoxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxoxoxxxxoxxx", -"xxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxoxxoxxoxxxxxxoxxoxxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxxxoxxoxxoxxxxxxxoxoxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxxoxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxoxxoxxxoxxoxxoxxxxxxxoxoxxoxxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxoxoxxoxx", -"xoxxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxooxxxxoxxxxxxxxoxxxxoxxoxxxxoxoxxxxoxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxxxoxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxoxxxxooxoxxxxoxoxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxoxxxxooxoxxxxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxoxxox", -"xxxoxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxxxoxoooxxxxxxxxoooxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxoxoxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxooxxxxxxxxxoooxxxxxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxxxxxxxxoxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxoxxxoxxoxoxxxxxxxxoooxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxxxxxxxxxoxxxxxx", -"xoxxoxxxxxxxoxxxxxxxxxoooxxxxxxxxxxxoxoxxooxoxxxxoxoxxxxxxxxxxxxxxxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxooxxxxxxxxxoxxxxxxxxxoooxxxxxxxxxxxxxooxxoxoxxxoxxxoxxxxoxxxxxxxxxoxoxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxoooxxxxxxxxxxxoxoxxxooxxxxxxxxoxxoxxxxxxxxxxxoxoxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxoxxxxoxxxxoxoxx", -"xxxxxxoxoxxxxxoxxxxxxxxxxoxoxxxxxxxxxxxooxxxxxxxxxxxxxxoxoxxxxxoxoxxxoxoxxoxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxxxxooxxxxxxxxoxxxxxxxxxxooxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxxxxoxoxxoxoxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxxxxoxxooxxxxxxxxoxxxxxoxxxxoxoxxxxxxxxxxxxoxxxxxxxoxxxxxoxxxxxxxxoxoxxoxoxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxoxxxoxxx", -"xoxoxxxxxxxoxxxxxxxooxooxoxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxoxxxxooxxoxxxxxxxxxxxxxxooxoxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxooxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxoxoxoxxxxxoxxoxxxxxxxxxxxxxxxooxooxxoxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxooxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxoxoxxoxxxxox", -"xxxxoxoxxxxxooxooxxxxxxxxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxooxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxoxxxxxooxxxxxxxooxooxxxxxxxxoxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxoxoxxooxxxxxxxooxooxxxxxxxxoxoxxxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxoxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxoxxx", -"xoxxxxxoxxxxxxxxxxxxxxoooxoooxoxxoxoxxxxxxxxxxxxxxxxxxxxxxxxooxxxxuxxxiixooxxxxxxxxxoxxxxxovxxxxxxxxxxupxxxxxxxxxxxxxxoxxoxxuxxxxuxxxxoxxxxxxxoxxxxxxxoooxxooxoxooxoxxxxoxxxxxxxxxxxxxxxxxxxooxxxxoxxxooxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxoxxxoxxxxxxxoxxxxxxxooxxoooxoxxooxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxooxooxxoxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxoxxoxx", -"xxxoxoxxxxxxxxxooxxoxxxxxoxxoxooxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvoxxxxpxxxxoxxoxoxxxxxxxxxuxxxxxxxxxxxuxxxoxxxxoxxxoxxxoxxovoxxxvxoooxoxxxxxxxxooxxxxxxxooxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxxoxxxoxxxxxxooxoxxxxxxxxooxxxxxxxoxxoxooxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxoxxxxxxoxxxxxxxox", -"xoxxxxooxxxxxxxxoxxxoxxxxxxxxxxoxoxxxxxxxoxxxxxxxxxxxxxoxxxxxxxxxvxxxxxtooxxoxppoxxpupoouxxpxouxxxxxuuxpxxxupuxxxxoxxxxxxxxpuxxxouuxxxxoxxxxxxxxoxxxooxoxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoooxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxxxoxxoxxxoxxxxxxxxoxxxooxooxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoooxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxoxoxoxxx", -"xxxxoxxxxxxxxxxoxxxoxoxooooxooxxooxxxxxxxxooxxxxxxxxxxxoxxxxxxxxuoxoxxxpxxxxxuppvoxpipiptuxpvtpixxxvupipxxopptuxxxxoxoxxxxxtxxxxxxtxxxxxxxxxxxoxxxxoxxxooxoxooxxooxxxxxxxoooxxxxxxxxxxxoxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxoooooxxooxxxxxxxxooxxxxxxxxxxxoxxxxxxxxxxxoxxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxx", -"xoxxxxoxoxoxxxxxooxxxxxxxxxxxoxxxxxxxxxxxoxxxxxxxxxxoxoooxxxxxxxpxxxxxxpooxoxuiivxxxixpxxpxpoxxxtxuxxxxtxxxvitpxxxxxxxoooxxpoxoxxopoxoxxxxxxxxxxooxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxoxoooxxxxxxxxxxxxxxxooxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxoxoxxoxxxxoxxxxxxxxxooxxxoxxxxxxxoxxxxxxxxxxoxxxxxxxxxxxoxoooxxxxxxxxxxxxxxxooxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxoxxxoxo", -"xxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxpxxxxxopxoxoovxxtoxoixpxxpxpxxxxpxpxxxxuxxtoxopxxxxxxxxxxxxpoxxxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxxxoxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxoxxxx", -"xoxxxoxxoxoxxoxxxxxxoxxxoxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxoxpxxxxotxxxxpoxxixoxcxpxxpxpvoxuuxovxxtvxxtxxppxxxxxxxxxoxxtxxxxxopxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxooxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoooxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxxxxxoxxx", -"xxxoxxoxxxxoxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxvoxopccccuxxviipixcixvuxcuiociuxxxxicuttxpiioiuxxxxxxxxxxxuvxoxovuoxxxxxxxoxxxxooooouoooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoooxxxxxxxxoxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxoxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxox", -"xoxxxxxoxoxxoxxoxxxoxxxxxxxxxxxxxuururuurrrruururrurururrrrrrrruxuuoxxxxurrrrrrrrrrrrrrrrrrruxxxxxxxxrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssssssseaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxoxxxxxooxoxooxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxoxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxxoxxxxox", -"xxoxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxrgqggggqgqgggggqggqggggggggggggkxxxxxxxrwgggggggggggggggggggkxxxxxxxrggggggggggggggggggggggggggggggggggggggggggggggqggggggqtxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxoxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoooxxxoxxxxxxxoxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxoxxoxoxxx", -"xxxxoxoxxoxoxxoxoxxxoxxxxxxxxxxxxuggggggggggggggggggggggggggggggnmxxxxxxowgggggggggggggggggggnmxxxxxxogggggggggggggggggggggggggggggggggggggggggggggggggggggndxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxoxxxoxxooxxxxxxxxxxooxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoxxxoxxxooxxxxoxxoxxxxoxx", -"xxoxxxxxxxxxoxxoxxxxxxxxoxoxoxxxxxknggggggggggggggggggggggggggnnjmxxxxxxxegnggggggggggggggggnjmxxxxxxxkngggggggggggggggggggggggggggggggggggggggggggggggggggjmoxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxooxxxxxxoxxxxoxxxxoooxxxxxxxxxxxxxoooxxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxooxxxxxxxxoxoxxxxxxoxxox", -"xxxxoxoxoxxxxxxxoxxxxxoxxxxoxoxoxoxbfjjgggggggggggggggggggnjddfmmcxoxoxxxximmmqggggggggggnjddfcxoxxxxxxmmjdnqggggggggggggggggggjdddddddjjnnggggggggggggggggjcoooooxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxoxxxoxxxxxxxxooxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxx", -"xxoxxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxopclggggggggggggggggjdmtooooouooooooxxxxosgggggggggjdf`ououoooxxxxxxxxueggggggggggggggggndjcpuuuouviimfjngggggggggggggdiuuuuooxxxxxxxxxxooxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxoxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxx", -"xxxoxxoxxxxxxoxxxxxoxxxxxxxxxxxxxxxxxoxuokgggggggggggggggjmpppupuppptpuuoxxxxusggggggggdd`ppppppppuuuoxxxxxouwgggggggggggggggdhpppuppppppppppcmnggggggggggndtptpppuoooxoxxxxxooxooxxxxxxxxxxxxxxxxxooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxoxoxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxxxxooxooxxxxxxxxxxxxxxxxxooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxoxxox", -"xoxxxxxxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxourlggggggggggggggdbiiiiiivvvvvtpuoxxxrwggggggnddciiiiiivvvttpuoxxxxorwggggggggggggggndciiviiviiviiiviviimqggggggggjhciciivpuooxxxxxxxxoxooxoxxxxxxxxxxxxxxxxooxxxxxxxxxxxxxxxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxooxoxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxxx", -"xxoxxoxxoxoxoxxxxxoxxxxxxxxxxxxxxxxxxxxoptkggggggggggggggjbbbbb`b```ccvppuoxuaggggggndhm`bb`b`b`b`citpoxxxxorwggggggggggggggjjbbbbbb``b``````````bqgggggggjhmbmb`cvpuxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxoxooxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxoxxoxox", -"xxxoxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxoopvaggggggggggggggjhhfhfffmb``cituoxurlgggggnddjhfhfhfffmmb``mbtxxxpurgggggggggggggggdhhfhffffhfbbbbbbbbbmmwqggggggddhhhhf`ipuxxxxxxxxxxxoxxxxxxxxxxxooxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvtxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxx", -"xoxxxxxoxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxopvvwgggggggggggggndddhdhfmm`civtuoorkgggggndhfhdhdhdhhhfbbcbpuxxxxuurggggggggggggggndddhddhhfmfb``````bbbmmkggggggdddddhhb`bm`oxxxxxxxxxov``b`bxxooxxoxxmbxxbcxxxxxoxxxxxxxxxxxxxxxxxxxxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoooxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoooxxxxxxooxoooxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxx", -"xxxxoxxxxxoxxxooxxoxxxxxxxxxxxxxxxxxxxxooptsggggggggggggggdddddhfbcivtpuuursgggggndhmmfddddddhfb```bvtxxxttusggggggggggggggjdddddddhfbbi``cvii`bb`bsqggggnddddddfbitvoxxxxxuttxxxtoxvxtxxxpvpoooomxocoxxxxxxxxpopxuoxxxxtuxxxxxppxuxxxotoxxxxxxxxxxpupxtoxxxutuxootxttoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxxxooxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxoxx", -"xxxxxoxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoouurggggggggggggggddddhfbcvtppuoouegggggndfbbfhdddddhhfcvii`vpxxxtcrkggggggggggggggjddddddhfbc`tbcippb`cbbiikggggjdddddhfbipvxxxxxxtttioxxxxtxxxocivicxxxuc`xxxxxxxxxxt`t`tvuxx`tpcxxxipt`vxxivtiixxxxxxxxxcvvipcxxuttvuxuicvtcpxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxooooxoxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxx", -"oxoxxxxxxxoxxxxxxxxoxxxxxxxxxxxxxxxxxoxoxxouwgggggggggggggjdddhf`ituuuooraqggggndmiui`fhdddhhmhvpuuvoooxxxtrlggggggggggggggddddddddfcvcbtooop`vvimvtsggggddddddhf`vpvoxxxxxvbcvxxxxxtxxxucttvbpooo`iooxpc``bcxx`xpxxpxpxxxxpxtoxxxvxucttt`uxvc`ccvxttxvxtxxocbvtxxvoxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxoooooxoxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxox", -"xxxoxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxoxooxxokgggggggggggggndddhfctpoxxxraqgggggdmovpibfdhdhfm`cpuootoxxxoxarggggggggggggggnddddddhfbvpcp`ooxpcvvtvpueggggdjddddhf`tpvoxotxtpooixxxxxvxxxpcvvttoxxipttxxxxxxxxxx`xpxxpxtxxxxtxtxxxxtxpcttvtoxxxoxxxxptxtotxxvxxxtxxtuxxxvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxoxxxxxxxxxx", -"oxxxxxoxoxoxxxoxoxxxxoxxxxxxxxxxxxxxoxxxoxxxrggggggggggggggdddhmctuooxraqgggggddooicimhdhhh`vttoooxvxxxxxxasggggggggggggggjddddddhmctuvxucxoxbpxouxxrgggndfhdddhmctuvxxxvxixxocxxxxxtxoxobuxxxxxttxx`oxxxxxxxxx`xpxxpxotxxvuxocxoicxxbpooooxxxxxxxxptxtovoovxxtuxxtcoxipoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxoxx", -"xoxxxxxxxxxoxxxxxxoxxxxxxxxxxxxxooxoxooxxxooulgggggggggggggjddhmctoxxuaqggggnddooop`hhhdhm`mmcuooibbbixxtbrkggggggggggggggdddddddfbvpcioxbbxxxibcpoxrgggndbhhddfbcvbbbbbuxubbtiixxtb`booxxibcpxx``xx``xxxxxxxx``xvuxcxxu``pxxxobbpiixxi`cpxxxxxxxxobix`opixvbbubpxpocbuxxoxxxxxxxxxxxxxxxxxxxxxxxoxooxoxxxooxxxxxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxx", -"xxoxxxxoxoxxoxoxxxxxxxxxxxxxxxoxxooxxxooxxxxokgggggggggggggnddhf`vpoorlgggggdjvpoutcbfhfmcvtuxxxooxxxxxxxorqgggggggggggggnddddddhf`vpoxxxxxoxoxxxxxxrgggjmcmhdhfbitooxooxxxxxoxxxxxxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoooxoxxxxxxxxxxxxxxxxxxxxoxxxxxxxxtxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxuoxxxooxxxxxoxxxxxxxoxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxoxxxxxxxxxxxxxxxxxxxxoxoxxxoxoxx", -"xxxoxxxxxxxxxxxxoxxoxxxxxxxxxxoxxxooxoxoxxxxxaggggggggggggggdddfbvprrwgggggdjuxoptibfffb`ituoxxxxoxooxxxxoaggggggggggggggndddddddm`voxxxxxxxxoxxoxxoegggdcibfhhf`ttuooxxoxxxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxpmbpxxxxxxxxoxxoxxxxxxxxxxxxooxxxooxoxoxxxxxxxxxoxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxoxxxxoxx", -"xoxxxoxxxxxxxoxoxxoxxxxxoxxxxxxoxxoooxooxxxxxuqgggggggggggggjddhbirrwggggnddoouuti`fffbcvtuooxxxxoxooxoxxrsggggggggggggggjddddddhmivuoxxxxooxxxoxooookngdtv`fhhmcppooxooxxxxxxoxxxoxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoooxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxooxxxxxxxxxxoxxxoxxxxxxxxxxxxxxoooxooxxxxxxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxooxxxxxxxxxxxxxxxxxxxxxoxxxxxxxox", -"xxxoxoxxxxxxxxxoooxooxxxxxoxxxxxxxxxxoxxxxxoxokgggggggggggggnddhmtrwgggggdjuxoutibmffm`vpuooxxoxxxxooxxxxrwggggggggggggggddddddhhbipuoxxxrswarxooooxoxmhdutcmffbipxuxoxxxxxoxxxxxxxoxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxooxoxxxxxxxxxxxxxxxxxxxxxxoxxoooouoxxxxxxxxxooooxoxxxxxxxxxoxxxxxxoxxxxxoxxxxxxxxxxxoooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxooxooooxxxxxxxxxxxxxxxxxxoxoxoxxx", -"xoxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxoeggggggggggggggdddsrwgggggdduoopti`mffb`ituxxxxxxoxxxxxxxxxrggggggggggggggnddddddhm`vpuoooorqggipxooxooxxxxupi`ff`vuoooxxxxxxxxoxuuuruoxxxoxxoxxoorreseeoxxxxxxxxxxxxxxxourrssseooxxxoxxxxxxxxxxxxxxxxxxxxxxxoxxourrasssroxxxxxxxoouooouooxxxxxxxxxxxooxxxxxxxxoxooxourrrsssserxxxxxxxxxxxxxxxxxxxxxxxxoorrassserooxxxxxorserxxxxxxxxxxxxxxxxoxxxxxoxx", -"xxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxrggggggggggggggjdirwgggggdjuouuti`mffm`vtuoxxxxxxxxxxoxxxxoeggggggggggggggnddddddhmctuuoxorsgggdtxxxxxxxxxxopibmm`vuxxxouoooururrrsswqsuxxxxxxxrrswggggggkoxoxxxxxxxxxxrakqggggggkrxxxxxxxxxxxxxxxxxxxxxxxxxxxorrswgggqggqexxxxrrressssslksxxxxxxxxxxxxooxxxxoxoxorraswqggggggglsuxxxxxxxxxxxxxxxxxxxxraslgggqggglkrooxorsgggtxxxxxxxxxxxxxxxxoxoxxxox", -"oxxoxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxowgggggggggggggnfrwggggnddooopti`mmfm`ippoxxxxxxxxxxxxxxoxrkggggggggggggggdddddddhmituoxxurqggndxxxxxxxxxxxopv`bbiprrrrrrsssswwlggggggjcxxxxxureqgggggggggqpoxxxxxxxorakgggggggggggexxxxxxxxxxxxxxxxxxxxxxxxorrsqggggggggggwxxrsggggggggggqcxxxxxxxxxxxooxxxxxxorrewgggggggggggggqsxxxxxxxxxooxxxxxorakgggggggggggggwsareqggndxxxxxxxxxxxxxxxxxxxxoxxx", -"xxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxsggggggggggggggrsgggggdjuxouti`mffm`ituooxoxxxxxxxxxxxxxxrlggggggggggggggddddddhfbvpuoourkgggnfxxxxxxxxxxxxutc``vewlgggggggggggggggggdtxxxxorwggggggggggggguxoxxxxorsqgggggggggggggixxxxxxxxxxxxxxxxxxxxxxorsqgggggggggggggmxrlggggggggggd`xxxxxxxxxxxxxoxxxxurelgggggggggggggggggloxxxxxxxxxxxxxxrsqggggggggggggggggggggggnmxxxxxxxxxxxxxxxxxxxxxxox", -"xoxoxoxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxrggggggggggggggsgggggdduouuti`mmfm`ituoxxov`pxxxxxxuxxxxxrggggggggggggggnddddddhfctuuooreggggjcxxxxibuxxoxooticipsggggggggggggggggggjhoxxxraqggggggggggggggnootoxureggggggggggggggggvbuxxxxxxxxxxxxxxxxxxrawggggggggggggggggvrgggggggggggduxxxu`vxxxxxxxxxxorakgggggggnjddmqgggggggqoxxxxxxxooooorsggggggggnjdddjggggggggggjmxxxxxxxxxxxxxxxxoxxoxxxx", -"xxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxowggggggggggggggggggjdpooupi`bffm`cvpoxxxxvxxxxxxxovxxxxosggggggggggggggjddddddhmcpuooraqggggdpxxuuupixxxxoouvvtpeggggggggggggggggggjboxxraqgggggggggggggggn`ucpurwgggggggggggggggggjfoxxxibfcxxxxxxxxxxrrqgggggggggndddggggweggggggggggndoxxxoxtxxxxxxxxxorsqqggggggjdhvuusgggggggggoxoxxoooxoxreggggggggjdmvoxuclggggggggjixooooooxxxxxxxxxxxxxxoxx", -"xxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxookgggggggggggggggggjdbpuutv`bmfm`itpuxxxxxtxxxxxxxcxxxxxrwggggggggggggggdddddddhfipupraqggggndvooptttcoxxxxouupuppljjgggggggggggggggdtuiraqggggggggggggggggghtpirsggggggggggggggggggn`uuoooxtxxxxxxutpxrsggggggggggddbppvkggwwggggggggggjhtuuuuovxxxxxxtpursggggggggjdbtourkgggggggggfpuouvuvtoorqgggggggndcoouptvpwgggggggdiopttvpoouoooooxxxoooxxox", -"xxxoxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrggggggggggggggggjdfivptvcbffm`ivpuooxxxxpxxxxxxxixxxxirqggggggggggggggdddddddhmvprreqgggggjfvmtviii`uoxxxxxouuopibb`sggggggggggggndppaaqggggggggggggggggggdivrsgggggggggggggggggggnfttpuoovxxxxxottvrsggggggggggddmiptvilgqgggggggggggdm`bptptiooxxobvarwggggggggjdmicbraqgggggggggjmcpu``vvirsggggggggdfvpptvcbccqggggggdtutciiitoutupuooxouoouxxo", -"xoxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxulggggggggggggggjddbcivi`bfmm`itpuooxxxxxpxxxxxxxtxxxpuaggggggggggggggnddddfmbitrrslgggggggjcuu`i``i`uoxxxxxxxxoxxcoxrggggggggggggjhvaaqgggndjwggggggggggggd`reggggnddqggggggggggggnh`ivtuovxxxxxo`creggggggggggdd`chii`ikggggggggggggndcc`iiiv`uoxovourwggggggggjdfiicfrkggggggggggnfhvpiooxvrqggggggggdtivii``fbbsggggggdivv`civvuxtxuxxoxuoooooxx", -"xxoxxxoxooxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxokgggggggggggggnddhfbcc`mmfm`cvpuoooxxxxxtxxxxxxovoxxvusggggggggggggggsrarrrssskwggggggggggdvut``bbc`uooxxxxxxxxxxvxxrggggggggggggdmerlgggjdbtaggggggggggggdsaqgggddbutkgggggggggggndfmcituixxvxxiursggggggggggjdc``b`mmmsggggggggggggjdbmmmb`c`puooturwgggggggggdmbccbcrgggggggggggndmcicpootegggggggggdtccbbfmhmmclggggnd`c`mb`iiuopxuxxoxuoooooxx", -"oxxxoxxxxxoxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxeggggggggggggggdddhmmbmmfm`itpuooxxxxxxxtxxxxxxxcxooorlggggggggggggggggggggggggggggggggggndupmbbmbicuoxxxxxxxxxxxvoorgggggggggggndbrwgggdd`purgggggggggggnbrlgggddpoxasgggggggggggjdhhm`vpioxvxxirsggggggggggjdhic`mfhj`sggggggggggggdhhhdhhmc`pooxrrwgggggggggdjpfciccsgggggggggggndhb``puoasgggggggggdimbfhhhhmm`sggggndmmmffbcvuotxoxxoxuoxoxxxx", -"xxxxxoxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxuqgggggggggggggjddhhffhfmbitpoxxoxxxxxxxpxxxxxxxcuoxxrgggggggggggggggggggggggggggggggggggjfff`bmmhhfmixxxxxxxxxvbmmesgggggggggggjdrsgggddffptagggggggggggnrsgggddvuoorkgggggggggggjdddhmffmmmmxxraqggggggggggdmcfjhhhddisggggggggggggdddddhhdhfmmoorwgggggggggndvtifjhbsgggggggggggndhhfhmptewgggggggggjhhdjhhjhff`eggggjdhhjdhmbcutpxuoxpxxouoooxo", -"xoxoxxxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxokgggggggggggggnddddhhfmbcvpooooooxxxxxxvtxxxxxxxioxregggggggggggggggggggggggggggggggggggdivcbfff`vpuxxxxxxxxxxxxxxrkgggggggggggdeaggnddmitursgggggggggggseggndd`vptirlgggggggggggddddhfbipoxxourqggggggggggjdibmhhddhhslgggggggggggjddddddhm`tuxorsggggggggggdfvc`mhhfsgggggggggggdddhfmcturwgggggggggghhhddhm`ivtalgggjhhhdhhmituoxoxxxxxxxxxxxxx", -"xxxxoxxxxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxeggggggggggggggddddhhfbitpuoxxxxoxxxxxxuvuxxxxxoooxrkggggggggggggggjdjjjjnnggggggggggggndiibmhfm`tpoxxxxxxxxxxxxxxuwggggggggggnmrlggddhbiturkgggggggggggrqggjdh`iptvaggggggggggggdddddhmctoxxorwggggggggggndb`fhdddhhfawgggggggggggjddddddhmctuoraggggggggggndicbffhjh`ggggggggggnddddhf`iprwggggggggggndddhfbitpuukgggdhhddhhbipuoxxooxxxxxxxoxox", -"oxoxxoxoxxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuqgggggggggggggjddddfmcvpooxxxxxoxxxxxxxxxxxxxxxxxxrlggggggggggggggddddddddjjjgggggggggnjibfhhhmctuxxxxxxxxxxxxxxxrgggggggggggnrsggjdjf`vptrlggggggggggkkggjddfbitpasgggggggggggndddddhm`tpoxrsgggggggggggdhbfhhdddhfbrqgggggggggggdddddddfbvpuorqggggggggggdmcbfhddhfmwgggggggggddddddfmiprwgggggggggggdddhmcvpuoosgggd`fhddfbipoooxxxxxxoxxxxxxx", -"xxxoxxxxoxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxuwgggggggggggggndddhf`vpuoxoxxxxxxxxxxoxoxxxxxxxooorggggggggggggggndddddddfbcv`qgggggggjhmfhjdhbipoxxxxxxxxxxxxxxosgggggggggggaeggnddhmcvppagggggggggggsggndddfbivtrlgggggggggggjdddddhfcvpooaqggggggggggndmfhddddhfbvrgggggggggggnddddddhf`vuorkggggggggggndbmfhddhhmcvqgggggggjddddddhmctpwggggggggggggddhmituooooggndcmhhhfbvpuxxoxxoxxxxxoxxox", -"oxxxxxoxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxraqggggggggggggggdddhmituoxxxxxxxxxxxxxxoxoxxxxxxxorsggggggggggggggjddddddhhm`cvvwggggggdhhdddhfbipoxxxxxxxxxxxxxxrkgggggggggggrqggdddfbivtrsgggggggggglqggdddhf`iveaggggggggggggddddddhmcvuorkgggggggggggjdfhdddddhmcasgggggggggggjddddddhmituragggggggggggjjmhhdddhf`ipobnnnnjddddddddhmctusggggggggggggfdhmipuoooxoddhibfhhf`vpooxoxxxxxxxxxxxxx", -"xxoxxxoxoxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxorwgggggggggggggggjddhbcpoxxxxxxxxxxxxoxxxoxxoxxxxxxuwggggggggggggggddddddddhfbb``sgggggndhddddhf`vuxxxxxxxxxxxxxxxrlggggggggggswggjddhm`vtvrwggggggggggqggnddddfb`ctsggggggggggggddddddhfcturegggggggggggndhhddddhhmcvpsgggggggggggdddddddhbiporlgggggggggggdfhhdddhhbipoxxobffjddddddddhmcpueggggggggggggghhmctoxxxxxouut`mhhm`tuooxxxoxxoxxxxxxxx", -"xxxoxxxxxoxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrrwggggggggggggggggjddhmctoxxxxxxxxxxxxoxxxxoxoxxxxxxrqgggggggggggggnddddddddhfmmbbcwggggjddddddhmctuxxxxxxxxxxxxxxxrgggggggggggsggndddhm`ciirgggggggggggggnddddhfm`crlgggggggggggjddddddhmiturlgggggggggggjdhdddddhfbiprlggggggggggnddddddhf`vpregggggggggggjdhhddddhmcvpuoxootibfdddddddhmiporgggggggggggggghf`vuoxxoxooutibffmcvuooxxoxxxxxoxoxoxx", -"xoxxxxoxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxorwggggggggggggggggggddhf`vuxxxxxxxxoxxxxxxxxxxxxxxxxxaggggggggggggggndddddddhfmbbbbckggggdddddddfbituxxxxxxxxxxxxxxosggggggggggllggddddhmciceegggggggggggggjdddddfmbiaggggggggggggjddddddhbipregggggggggggndjddddddhbitprgggggggggggjddddddhfcturlgggggggggggjdhdddddfbituxoxootibfhdddddhfbipookgggggggggggggghbipuxxoxxxopv`mmbituxooxxxoxoxxxxxxxx", -"xxxxxxxxoxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxorwgggggggggggggggggggdddf`vuoxxxxopxoxxxxxxxxoxxxxxxxusggggggggggggggjddddddhdhbcii`vsggggddddddhdfipoxxxxxxxxxxxxxxrwggggggggggqggjdddhfb`ccakggggggggggggndddddhffmakgggggggggggnddddddhf`iprlgggggggggggjdddddddhm`vpuegggggggggggdddddddhbcpregggggggggggndhdddddhm`tpooxoxupv`mhddddhhbcvuoxrggggggggggggggqmcvpoxxoxooutc`b`vpuoxxoxxxxxxxxxxoxx", -"xxoxxoxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxrsgggggmlgggggggggggggnddhmcpoxxxx`uxxoxxxxxxxxxxxxxxvrwggggggggggggggddddddddb`itttiasgggnddddddhmmtpoxxxxxxxxxxxxxxrqgggggggggggggddddhfb``irqggggggggggggjdddddhhj`rqgggggggggggndddddddf`vreggggggggggggddddddddhbiturkgggggggggggdddddddfbvprkgggggggggggndddddddfbcpuoxxxxxutibffhhhhm`vpuoxokggggggggggggggmbipuoxoxooupv`cctpoooxoxxoxoxoxoxxxx", -"oxxxxxxoxoxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxorsgggggjhkgggggggggggggnddhm`tuxxxx`xooxuvtxxxpuxotuxucrggggggggggggggnddddddhdmctpuiiusgggjhfhdddhmbpuoxxxxxxxxtutxtuegggggggggggggndddddhbb`eeggggggggggggnddddddhhhieggggggggggggdddddddhmctrlgggggggggggndddddddhm`vuorqggggggggggjddddddhfcvurggggggggggggjddddddhf`vpoxxxxxoouvi`mmmmb`vtuoxxxrqggggggggggggggf`vpooxoxooptvivpuoxxxxxxxxxxxxxxoxx", -"xxxoxxxxxoxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxorsgggggjdtaggggggggggggggdddfbipoxxupxooxivtixxpiouvvoueeggggggggggggggndddddddhmcpuov`osgggdmffhdhfbbpoooxxxxxxo`ii`tesgggggggggggggdddddhdfb`akggggggggggggjddddddhhmakggggggggggggdddddddfbiraggggggggggggddddddddhbituuegggggggggggjddddddhmctrsggggggggggggdddddddhm`tuoxxxxxxouutvccccivpuoxxxxxsgggggggggggggggfcvpooxxxooupppuooxxoxxxoxooxoxxxox", -"xoxxxxxxxxoxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxrsgggggjdvxrlgggggggggggggjddhbctoxxtxxxoocm`ixxxvxxxvxxakggggggggggggggjddddddhfcpuooovusgggdvbbhhhf``pxxxcmbbbixvvxvxrlggggggggggggjddddddhdbcrqgggggggggggnddddddddf`rqgggggggggggjdddddddf`irkggggggggggggdddddddhf`vporkgggggggggggdddddddfbvprwgggggggggggndddddddf`vtuoxxxxxxxooopttvvtpuoxxxxxxxwgggggggggggggggmctuooxoxoouuuuoxxxxoxxxxxxxxoxxxx", -"xxoxoxoxxxxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxoraqggggjdvxookggggggggggggggddhfcvuxxvxxxxvpoxixxoioxxtxxrlggggggggggggggddddddhffvpoooxvokggjdpb`fhhmc`uxxxxoooxxxttxtorgggggggggggggjdddddhhhbveggggggggggggjdddddddhmseggggggggggggjddddddhm`trqgggggggggggjdddddddhmctuorqggggggggggnddddddhf`vurggggggggggggnddddddhm`touxxxxxxxxxoooouuuuoooxxxxxxxxqggggggggggggggj`ctuooxoxxoooxxxxxxxoxoxoxoxxoxxx", -"oxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxraqggggndcxoopsggggggggggggggdddfbipuxutxxxixxu`xxoixovvxorggggggggggggggnddddddhfmvpoxxxvxeqgjboccmffbicuruxxooxooovtxvosggggggggggggndddddddhm`rkggggggggggggddddddddhbakgggggggggggndddddddhmiaeggggggggggggdddddddhf`vpouegggggggggggjddddddhm`treggggggggggggjddddddhbitoxxxxxxxxxxxxxxoooooooxxxxxxxxrqggggggggggggggh`ituooxxxxxxxxxxxxxxoxxxxxxxxoxx", -"xxoxxoxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxraqggggndmououvvqgggggggggggggjddfmctuxx`xxxobmviixoumbpmprsggggggggggggggjdddddddhhf`oxtmbmb`mdhffhhmmhfmaslkxxxxxopmixbrkggggggggggggjdddddddhmcrlgggggggggggjjddddddhfcrqgggggggggggnddddddhf`vrkggggggggggggdddddddhmctporkgggggggggggdddddddhbctusggggggggggggdddddddfbvuuoxxxxxxxxxxxxxxoxoxxxoxxxxxxxxsggggggggggggggnm`vpuoxoxxxxoxxxxxxxxxoxoxoxxxox", -"oxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuaqggggndmooupvcbsgggggggggggggnddhmcvpoxpuxxxxxxxxxxxxoxxxrwggggggggggggggdddddddhbipuxxxxxxxxxxxutibfbctraqggbxxxxxxooxxrqggggggggggggdddddddhfbtaggggggggggggddddddddhbeeggggggggggggdddddddhm`vrlgggggggggggnddddddhh`ipooagggggggggggnddddddhf`vprwggggggggggggddddddhm`vooxxxxxxxxxxxxxxxxxxxxxoxxxxxxxookgggggggggggggghmcvpoxxxoxxxoxxxxxxoxxxxxxxxxxx", -"xxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxurwgggggdmxoupvc`msggggggggggggggdddf`vpuooxxxxxxxxxxxxxxxxorqggggggggggggggddddddhf`vuoxxxxxxxxxxxoti`m`iprwggnduxxxxxxxxuaggggggggggggjdddddddhm`asgggggggggggndddddddhf`akggggggggggggdddddddhbiprggggggggggggjddddddhfcvuorsgggggggggggjddddddhfcvurwggggggggggggddddddhmctuxxoxxxxxxxxxxxxxxxxxxxxxoxoxxxxxolgggggggggggggjfbctuooxxxxxxxxxxxxxxxoxxxxoxxx", -"oxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxurwggggndhxooptcbmfcqgggggggggggggjdhhbituooxxxxxxxxxxxxxxxxoeggggggggggggggnddddddhmctuoxxxxxxxxxxxuti`b`vrsgggjfxxxxxxoxxusggggggggggggddddddddfbirlgggggggggggjddddddjhbirlgggggggggggjdddddddfbvreggggggggggggdddddddhbipuurqgggggggggggdddddddhbitorggggggggggggnddddddhbipoxoxxxxxxxoxxxxxxxxxxxxxxxoxxxxxooulgggggggggggggdf`vtuxxxxxxxxxoxxxxxxxxoxxxoxx", -"xxoxxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxurwgggggdjuxoutc`mfmbsgggggggggggggnddhmituooxxxxxxxxxxxxxxxxrsggggggggggggggjddddddhmitooxxxxxxxxxxoopic`craqgggjixxxooxxoorwggggggggggggdddddddhm`tagggggggggggnddddddjhm`vaggggggggggggdddddddhm`tusgggggggggggndddddddf`iuursggggggggggggdddddddfbiporggggggggggggndddddhf`vpoxxoxxxxxxxxxxxxxxxxxuerxxxoxxxxxouaqggggggggggggdhm`vuooxxxxxxxxxxxxxoxxxxoxxox", -"oxxxoxxoxxxxxxxxxxxxxxxxxxxxoxxxxxorwgggggdhuouupibmfmbcaggggggggggggggddhf`tpooooxxxxxxxxxoxxxxrwggggggggggggggdddddddf`ipxxxxxxxxxxxxoopticarlggggdpxxxououoorggggggggggggjdddddddhbiasgggggggggggnddddddjfbirsggggggggggggdddddmdhmctrkgggggggggggnddddddhmcvuurqgggggggggggnddddddhfcvporggggggggggggndddddhmcvuoxxxxxxxoxxxxxxxxxxxxaggkxxxooxxxxousggggggggggggjdhbctuoxxxxxxxxxoxxxxxxxxxxxxx", -"xxoxxxxoxxxxxxxxxxxxxxxxxxxxoxxxxorkgggggjduooutv`bfmmcvaqgggggggggggggjddfbipoxxxxxxxxxxxxxxooorggggggggggggggnddddddhf`tuoxxxxxxxxxxxoooptprwggggjjxooouppuorsggggggggggggdddddddhf`trwgggggggggggddddddjhf`vrwgggggggggggjddddhrs``ipuwgggggggggggjddddddhbctorsggggggggggggjdddddmmmituorggggggggggggndddddhmipuoxxxxxxrsqaxxxxxxxxxxegggmxxxoxoxxxouwgggggggggggndhf`ipuxxxxxxxxxxxxxxxxxxoxxxx", -"xxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxoorsgggggjdvouppi`bfmmcvprkgggggggggggggjddhm`tuoxxxxxxxxoxxoxoxrsggggggggggggggnddddddhmctuxxxxxxxxoxxxooourrwgggggd`xoupttpporkgggggggggggndddddddhmctrggggggggggggddddddjhmctrqgggggggggggdddddaegg`turwgggggggggggjdddddhf`vpraqggggggggggggdddddjrssiuxxrggggggggggggndddddhbipuxxxxxxraqqgkxxxxxxxxosgggdxxxxxxoxoourqggggggggggnddhmctuoxxxxxxxxxxxxxoxxxxoxox", -"xoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxorsgggggjdvoouti`mfmmcipoosggggggggggggggddhf`vpooxxxxxxxoooxxoxukggggggggggggggjddddddhbiuoxxxxxxxxxxoxooxurwggggggdpouptiivpurlgggggggggggjddddddhh`irsgggggggggggjddddddjf`iaaggggggggggggdddd`rgggjcuuwgggggggggggjdddddhf`vprkgglggggggggggdddddeaggluxxuqggggggggggggdddddhbvuuxxxxxurlgggjbxxxxxxxokgggjoxxoxxxxoxuusggggggggggnddhfbipooxxxxxxxxxxxxxxxoxxxxx", -"xxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxrsgggggjdvoouticmmfmcvtuxorggggggggggggggdddhbipuxxxxxxoooxoxxoxrlggggggggggggggdddddddf`vuooxxxxxxxxxxxxxrrwggggggndxopti``ituaggggggggggggdddddddhm`trwgggggggggggdddddddhf`vrsgggggggggggndddhrkggndiorwgggggggggggjdddddhmctrsggkggggggggggnddddcrqggjbxxowggggggggggggdddddf`iuxxxxxorwgggndvxxxxxxxrwgggnvoxoooxxoooorqgggggggggndddhmctuxxxxxxxxxxxxxooxxxxoxx", -"xoxoxxxoxoxxxxxxxxxxxxxxxxxxxorsgggggndbxuupi`bfmm`ipuoxxulgggggggggggggnddhmctpuxoxxxoxooxxxxuaggggggggggggggnddddddhf`vuoxxxoxxxvbpoxoraqgggggggjmoptc`b`itreggggggggggggdddddddhbiprggggggggggggdddddddhbitrkgggggggggggjdddeegggdmuoowgggggggggggjdddddhbiraqggsggggggggggjdddmrwggndcxxokggggggggggggndddhh`vpxxxxxrsggggdhxxxxxxxxrlggggmuuuuuoooxoousgggggggggjdddhf`vpoxxxxxxxxxxxxxxoxxxxox", -"xxxxxoxxuxxxxxxxxxxxxxxxxxxuorsggggggdfooutvcbffm`ituxxxxowggggggggggggggddhf`vpooxxoxxxoxooxxukggggggggggggggjddddddhmctuooxxxxxxxxvorrkgggggggggdvptv`fm`vprlgggggggggggjddddddhf`vregggggggggggnddddddjfbiprwgggggggggggdddaaqggjdvuookggggggggggggdddddf`raqggwkggggggggggjddfrsgggdfoxxxegggggggggggggdddhf`vuxxxorsggggjjoxxxxxooorgggggjupttppoooxooegggggggggdddddfbipoxxxxxxxxxxxxxxxoxoxxx", -"xoxoxxxxuxxxxxoooxxxxuoxxxxareggggggnduvppicbffm`iiipxxxprsggggggggggggggnddfbituoxxotpvovuoxorlggggggggggggggjddddddhbitoxutvxxxoooarelgggggggggndivi`fhhm`urggggggggggggjddddddhfctrkgggggggggggjddddddhf`vprlgggggggggggddaaqggndbuooxsggggggggggggqdddh`aaqggnrwggggggggggjdfrsgggjdtoxxxoqggggggggggggqdddf`tuoxurwggggjdvxxouuuuuorggggggvtivvpuoooxorgggggggggdddddhbctuoxxxxxxoxoxxoxxxxxoxx", -"xxxxxoxooxxxxuuutxxotuptpxurwgggggggnfbctvcbffmbivivipxxttsggggggggggggggghdhmctuoxxociicvcxxregggggggggggggggjdddddhf`vpuxvvvixxourelgggggggggggjhcf`mhhfbireggggggggggggdddddddhbiprqgggggggggggdddddddhbiturggggggggggggwraqggndhtuoxurgggggggggggggwkcrrsqggndrggggggggggglsrsgggjd`uooooukggggggggggggglbmf`turralggggndcxoouptvtpuegggggghic`ituooooorggggggggjdddddhmctuxxxxxxxxxxoxxxoxoxxxx", -"xoxxxxxoxxxxxpooxxxpuupuvrawgggggggggmpivcbffmbivp`bitxoorsgggggggggggggggqhhfffmbbixptxvovorrlgggggggggggggggjdddddddhmtuxi`cvurrslgggggggggggggdfc`mfhhmcprkgggggggggggnddddddhf`vregggggggggggnddddddhhbvpurgggggggggggggwggggjd`tuouptwggggggggggggggwwgggggdhrggggggggggggwlgggndfpuxoupptqgggggggggggggqserraelgggggndmoooutvccvtrsggggggq`bb`vuooooregggggggnddddddhfctuoxxxxxxxxxxxxxxxxoxox", -"xxoxoxooxxxxxxxopxxtuuprreqggggggggggktccbfffbcvpioxotoorrlggggggggggggggggqk``ipoxxxtpxvoprrwggggggggggggggggqbfdddhbituoprrraswgggggggggggggggndibhhhhh`vprlgggggggggggjddddddhmctrsgggggggggggjddddddhm`vuurgggggggggggggggggjdmvpuoptisggggggggggggggggggggdhurggggggggggggggggndhipuoupvvvsgggggggggggggggggggggggggndmooxupic``ctrsgggggggqbmbcpoxoorlgggggggjddddddhm`tpoxxxxxxxxxoxoxxoxxxxx", -"xxxxxxxooxxxuoxxouxotrrewggggggggggggglsrvffmcvpuixrrrraslggggggggggggggggggglsaruxxxppurrasqggggggggggggggggggqksrrrrrresskwqggggggggggggggggggnj`mhddhh`vpaggggggggggggdddddddhbitrlgggggggggggdddddddhbipooulgggggggggggggggjdh`vpuuvicclggggggggggggggggggjdtxulgggggggggggggggdd`vppppiicivkgggggggggggggggggggggggndmxxoptvcbb`ctrwggggggggwbm`tuxursgggggggjdddddddhfctuoxxxxoxxxxxxxoxxxxoxx", -"xoxxoxoxuoxxouppuxxxoeqggggggggggggggggggqnm`ipoxt`rwqggggggggggggggggggggggggggglexu`vrwgggggggggggggggggggggggggggggggggggggggggggggggggggggggdhhddhdhfmmesgggggggggggnddddddhf`vragggggggggggndddddddfbvuoxokggggggggggggggjddm`vpptic`isqggggggggggggggggjdixxosggggggggggggggddfcvpppvi`citpkgggggggggggggggggggggjdmxxxppvc`mb`vtrwgggggggggletarrakgggggggjdhhdddddhmctoooxxxxxxxxxoxxoxoxxxx", -"xxoxxxxxooxoxxxxxxxxosggggggggggggggggggggghctuoxxxrggggggggggggggggggggggggggggggncxxxrggggggggggggggggggggggggggggggggggggggggggggggggggggggggdhhhddhhbiprwgggggggggggjddddddhmctrkgggggggggggjddddddhfcvpoxxuqggggggggggggjddhmcvttic``ipsgggggggggggggggdd`puoupqgggggggggggnddjf`vttvc``cvpuo`ggggggggggggggggggnddioouupvc`mb`iturqggggggggggggwwlggggggggjdfmhdddddfbitooxxxxxxxoxxxxxxxxoxox", -"oxxxxxoxxoxxxxxxxxxxxagggggggggggggggggggggdipoxxxxxggggggggggggggggggggggggggggggnmxxxxgggggggggggggggggggggggggggggggggggggggggggggggggggggggndhddddhf`vpoggggggggggggdddddddhmitukgggggggggggdddddddhmctuoxoxrggggggggggjddddhf`ivic``cvpucggggggggggggjddbivtptvcggggggggggjdddhf`ivic```ituooucnggggggggggggggnjdhtooupticbmm`cvporggggjjjnggggggggggggggjdj`imhddddhf`vpooxxoxxxxxxoxxxxoxxxxx", -"xxoxoxxxxxxxxxxxxxxxxxtdddddddddddddddddddddipoxxxxxxddddddddddddddddddddddddddddddfooxxxdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddhmctpooddddddddddddddddddf`vpoxmdddddddddddddddddfbipooxxoxunngggnnjddddddhhbb`bb`cvpuoopnnggggggnjdddhf`ciicc`bnggggggnddddddhm````b`itpoooouthjnggggggggnnjddctttttvccbmbbcvpuuugggdjccmjjnggggggggnjdd`ppimhddddhbctuooxxxxoxxxxxxxxxxxoxxx", -"oxxxxoxoxoxxxxxxxxxxxxxxxoooooppvc`mhdddddhmctuoxxxxxxxxxxooouppibfdddddddddddddfbcvpuoooxoxxooxoupvcbfjddddddddddddf`ipuuoooooouuppptvvi``mfhhdddddddhbitooxxoooouv`fjdddddddhfcvuoxxxxxoupcmhdddddddhm`vuooxxxoxo`fddddddddddddhfmmbb`ituuxuoubjjjjjddddddjhfmbbbbmbbfjjjdddddddddhfmbbb`cvpuooxoupi`hddjjjjdddddfbcciicc`bmmmbcvtuoooejdhpupcmhdddjjjjdddmcoouvcfhdddhm`ipuoxxxxxxxxxxxxxxxxxxxox", -"xxoxxxxoxxoxxxxxxxxxxxoxxxoouptvc`mhhdddddhmbivppooxxxxxxooupptvcbhhddddddddddddhfbcivppuuooooooppvi`fhdddddddddddddfmcvtppupppppttvvic`bmfhhddddddddhf`vpuoxxxxoouv`fhdddddddhmctuxxxxxxoptcmhdddddddhmctuoxxxxxoooui`fddddddddddhffb`ivpooxxuutcbhddddddddddhhfffmm`cvvmfhdddddddddhhfmbcvpuoxxxxoutibfhdddddddddhhmmmbmmfffmbcvtuoxxouvvtxuvcmhdddhhmb`uuuooutibfhdhhfbituooxoxoxxxxxxxxxxxxxxxxx", -"xxxxxoxxxxxxxxxxxxxxoxxxxxoupti`bfhhdddddddfm`citpuxxxxxxuuptvccbfhddddddddddddddhfm`civtuuoxooptv`bmhhdddddddddddddhfm`civvvvviiic``bmmfhhhdddddddddhm`tuooooxxoopibfdddddddhfbvpoxxxxxoopv`fhddddddhhbitoxxxooxxxouv`mhdddddddddhhmbctuooxoxoouv`mhddddddddddjhhfm`ivtpv`mhdddddddddhfb`ituuxxxxxooptcbfhddddddddddhhhfhhffmbcvupuxooxoxxxouv`fhdjdhfb`ittppppicmhhdhfbcvuuxxxxxxxxxxxxxxxxxoxxoxx", -"xoxxxxxxoxoxoxxxxxxxxxxxxxxuticbmhhdhddhdhhhfmb`itpoxxxxoupvicbbmhhdddddddddddhdhhhfmb`citpoouuvc`bffhhddddddddddhdhhhfmb```````bbbbmffhhhdhhddddddhhfbipuxxxxxooupibfhdddddhhm`vuoxxxxxootv`fhdddddhhm`vpooxxxoxxxoupcbhhddddddhhhmbivpuxoxxxoouti`mhdddddddddhhfm`ituuptcbhhddddddhhfb`vppooxoxxxxoupvcbmhhdddddddddhdhhhfmbivpuxuxxooxoxoopt`mhhhhhhfb`civvvc`mfhhhmbctpuoxoxxxxxxxxxxxxxxxxxxxxx", -"xxoxxxxxxxxxxxxxxxxxxxxxxoouti`mmffhfhfhhhffmmb`cvpoxxxxoupvc`bmmffffffhfhffhfhfhffmmbb`ivpuoupvc`bmffffffhffhfhhhhhffmmbb`b`bbbbbmmmmmffffhffffffhffbcvpoxxxoxxooti`mfffffhfmbitpxxxxxxxupv`bffffffff`cpuooxoxxoxxoopv`mhhhdhdhhfm`ituoxoxxxoxoopti`mfhddddhdhhfm`ituooopvcmhhddddhhfb`vtuoooxxxxxoooopti`mfhdhddddhdhhhfmbcivpuoxxxxxoxoxoopv`mfhfffmmmm```c`bbmffmm`itpooxoxoooxxxxxxxxxxxxoxxoxx", -"xxxxoxxxxxxxxxoxxxxxxxxxxxoutvc```bbbbbbbbbb```civpoxxxxxupvi`c```bbbbbbbbbbbbbbbb`bb`ccitpooouvic```bbbb`bb`bbbbbbb`b````c`c```````b``mbbbbbbmmbbb``ivpuxxxxxxoxopvc`bbbbb```itpoxxxxxxxouti``bbbbb``ivpoxooxxxoxxouupicbfffffmb`cvtuooxxxxxxxooupti`bmffhhhffm`cvtpoxxoopicmffhfhfb`cvpuoxxxxoxxxxxoouutvc`bmffhfhhhffmb`ivtuuxxxxxxxxxxxouptcbbb````bbbbbbb`bmmmb`cvtuooxxxxxxoxxxxoxxxxxxxxxxxox", -"xxoxxxoxxxxxxxxxxxxxxxxxxxoouttiiiviivivvvvvviivtpupxxxxoouptvvivivvvviiiviiviiiiviiiivvtpuuoot`tvviiivvvivmbivvvviiiciivivvcvvv`mcmivi`ivivvii`iiivvtpuooxxxxxoooupbcvvvvivvvtpoxxxxxxxoou`bvvvviicbttpupcucpoxoxxxooupvic````civtpuoxxxxxxxvtxxxoptvi`bbbbb``citpovcpxxoupvi`bmb``cvppooxxxxxxxxxxpcxxouptvc``mbmbbb``civtpuooxxxxxxxxxxxxxuticciivvviccc```````ccitpuooxxxxxxxxooxxxoxxxxoxxoxxxx", -"xxxxoxxxxxxxoxxxxxxxxxxxxxxxouuppppppppppppuupppuuiuxxxxxxouuuupuupppupppppuppuptpppppppuoooooovuupppppppptftppuppuuctpppppvipppvbifpppuippupppippppuuoxxxxxxxxxooouuippppuuvuuuoxxxxxxxxooovuppuuvtp`vooomompxxoxoxoooupttvvvvttpuuooxxxxxxxxpxxxxxuitviiiiivvtpuuooxpxxxooptviiiivtpuooxxxxxxxxxxxxtxooxouutvvibiiiivvtppooxxxxxxxxxxxxxxxooutvvtppppptvviiiiivvttppuoxoxxxxxxxxxxxxxxooxxxxxxoxxx", -"xoxxxxoxxxxxxxxxxxxxxxxxxxxxoooxuouoooouuooxoooooxixxxxotpoxotuptpooppottoooxutvoooppptuoooxututooooooooooviooooooouioouuouioooot`uboooovuooxoouvoooooxxxxxxuuoptooootpvooopitttxxpopxuuxxxotoooootooooxxxmx`oxxxxxxxoxoouupppuuuooooxxxxxxxxxpopoxouivvivtvvvtptooxxxpxxxoxouuppvvvtupxxxxupoxxooptopxxootpouuppcttppppuuooxxxxxxxxxxxxxxxxxxopuuuuoooouupppttpppuuoooxxxxxxxxxxxxxxxxxxxoxxxoxxxox", -"xxoxxxxxoxxxxxxxxxxxxxxxxxxxxoooxxooxoxxoxxxxoxxouuxxxxppttxxtiipvtouictpcoxtiptcoopctttuxxttpicoooooxoxoovuxoxxoxxupoooooovxooooixioxxoxvxxxxxxvxxxxxxxxxxxuiitpcxxx`ptixxuiptuxxpcpittpxxxpxxxxxucpuxxxxcxvxxoxxxxxxxxxoooooooooxxxxxxxxxxxxvtttuxoittvuutcvctttxxxxpxxxxxxxouotctctptxxtvpipoxptpiioxtvppcuoooppouoooooxxxxxxxxxxxxxxxxxxxxouoooxoxooxoooououuooooxoxxxxxxxxxxxxxxxooxxxoxxxxoxxx", -"xxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpxxxxxtcvtxxxtxxxtxxtoxoopovpppvixxpxxopoxtxxxtxxxxxxoxxxxxxxxxoxopxxxooxopoxxxxxxxxoxxxtoxxxxxotxxxxxxxxxxxtxxxopxxpxxpxxxpxxxxxxixpxxpxxxpxxxxxxxxtpxxxxoxxxxoxxxxxxoxxoxxxxxxoxoxxxxxxxxxxpxxxpxxpxooooocxtxxpxxxxpxxxxciccipxixpxxuxuoxxxpxxtxxxtxxvppptvxxxxtxxxoxoxxxxxxxxxxxxxxxxxxoxxxooxoxxxxxoooxoxoxooooxxxxxxxxxxxxxxxoxxxoxoxxoxoxxoxx", -"xoxoxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxpxxxxpuxxtxxxtxxxtxxtxxxopxcpptpuxopxxxpxxpxxxpxoxxxxxxxxxxxxxxxxopxxxxxoxpxxxxxxxxxoxxxovxxxxxxixxxxxxxxxxxtxxxopxxpxxpxxxpxxxxxxixpxxpxxxpxxxxxoxxopxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxpxxxtxxpxoxoxxixpxxpoxoopxxxxxxxxxoxixpxxuxpxxxxpxxpxxxpxxipppppxxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxox", -"xxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuxxxtxxovxxxcoxotxxvtxovoxttxxxoxxpoxxpxxvxxucxxxxxxxxxxxxxxxxxxxopxxooxotxxxxxxoxxxxxoxtxxxxxxuoxxxxuvxxxxvtxovxxxpxxuxxxtxxxoxxvxpxxpxxxuxxxxxvvttxxxxoxxxxxxxxxxoxxxxxxxxxxoiuxxxxxxxxxxxpxxxpxxpoxoooxixpxxpoxxxpxxxxxxxxxxxixuxxuxxvoxutxxvoxucxxttxxxoxxxtxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxxxxxxxxxoxxxxxoxxoxxoxxxxxx", -"xoxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxvxxxxiiptpxxptitxxxuuivooxxuiipoxtipxtixxxtituixxxooxxxxxxxxxxxxxxvxxxooxtoxxxxxooxxoxxxotxxxxxxvxxxxuvxxxxuuivoxxiixuivxxxvivuxiixpuxixpiivvuxxxxuxxxxxxxxxxxoxoxxoxxxxxxxxxxoiuxxxxxxxxxxpiuxiiuxxtiipotiuutxtuoiiiitxxxxxxxxtiuupxpoxxvvtxxxxvituixxovipxooxvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxoxxxxxxxxxxxxxxxoxxxxxxxxxxxxxoxxxxoxxoxxxoxoxx", -"xxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxpxxxxxxpxxxxxxoxxxxoxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxuuxoxxxxtxxxxxxxxxxoxxxuxxxxxxoxxxxxxxxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuxxxxxoxoxxxxoxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxxxoxoxoxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxtoxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxoxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxox", -"xxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvivxxxxpivoxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxpiioxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxx", -"oxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxxxoxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxoxxoxxxxxxxx", -"xxoxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxoxxoxxxxoxx", -"oxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxxxooxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoxxxxoxxxoxxxxx", -"xxoxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxoxxxxxxxoxxxxoxox", -"xxxoxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxoxxxxxoxxxxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxoxxxxxxxxxxxxxoxxxxxooxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxxoxxxxoxxxxxxxxxx", -"xoxxxxoxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxoxooxxxxxxxxxxxxxouxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxoxoxxoxoxoxxxox", -"xxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxoxuxxxvpppxxxpxxxxxxpoxxxxxxxxxxxxxxxxxxxopxxxxxxxxxxxxxxxxxxxxxxpuxxxxxxpxxxxxupopxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxootuxxxxxxxxxxxoooxoxxoxxtpxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxuuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxoxxxxxxxxxxxxxoxxxoxxxxxxxxxxx", -"xxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxooxoxoxxxxxxxxxxxxxxtoxxxtpttxxxooxxxxxxpxxxxxxxxxxxxxxxxxxxxuxxxxxxxoxxxxxxxxxxxxxxxuxxxxxuxxvxxxuvuixxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxoxuxxxxxxoxxxxxxxxoxxxxxxuxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxuxxxxxxxxxxuxxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxoxxxoxxxxxxxxxxxoxxoxxxoxxoxxxxx", -"oxxoxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxoxxxxxxxxxxxxpoxoxtuptxxxxpxxxxxxpooxxxxxxxxxxxxuuoxxxuxoxxxxupooxxxoooxoxxxxxoxxxxxuxxxxxxutxvxxxxxxxxxxxxxxxxxxxxxxxxxoxooxxxouuuxxxupouuxxuuuouuxxoxuxxxxxxxxxxououoooxxxxuuxxxxxuuxoxxxxoxxxxxxuxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxoxxxxxxxxxxxxxxoxxxoxxoxxoxoxx", -"xoxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxouxxoopoouxxxxouxxxxxxpxxxxxxxxxxxotuupuxxupuuuxxopuuxxoppppupxxxxoxxxxxupuxxxxxpxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxtuupxxotuuoxxututupuxoxuxxxxxxxoxxoututupoxotuutoxxpuutuxxupuupxxxxuxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxoxooxxoxxxxxxxxx", -"xxxxxxoxxxxxxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxoxxxxxxxuxoxxxxxoxoxxxxpxxxxxxuoxxxoxxxxxxuuuuutxxoxxxoxxxuxxxxxuoxuxuxxxxuxxxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxuxxuxoxuxxxxxxtxuxxuxxxoxxxxopttptxxtxuxxuxuxxxxuxuoxxxuxxpuuupxxxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxoxxxoxxxxxxxxoxxoxxxoxoxxxox", -"xxxoxxxoxxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxoxxxxxxuxxxoxoxoxxxxxxuoxxoxxopxxxxoxoxxopuuuuuxxoxxxooxxuxxxxxuuxoxuxxxxoxxxxuxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxuxouxxxuxxxxxxpxuxxuxoxuxxxxxxxxxxxxpxuxouxuxoxxuxuxxxxoxopuuuuoxxxuxxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxoxxoxxxxxxxxxoxoxxxxxxoxxx", -"xoxxxxxxxoxxxxxxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxoxxxxxxxxxxoooxxxxxxxoxxxxxuxxxoxxuxxxxxpuoxxopoxxxxxuxxxuxoxuxxxxxuoxuxoxxxxuxxoxoppuoxxxxxxxxxxoxxxxxxxxxxxxxxxupoxxoxxxoxoxxuxxooxxuxoxxxxtxuxouxxxuxxxxxxxxoxxxpxuxxuoouxxpoxouxxupxxpoxxxxxxxuxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxxoxxxxxoxxxxxxxxxxxxxxxxxxxoxxoxxxxx", -"xxoxxoxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxooxxxoxoxxoxxxxxxpxxxoxxxxxoxxxxuoxxxxxouxxxxpuxxxxxppuoxopuxupuxxoppuoopuxpxouxpppppxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxopxxxxoxxxxoxppooppxoouppoxppxuoxpxuppppoxxxxxxxxppxuoxpxxoppooxxoppouuxxuppoxxxxuxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxooxxxoxxoxxoxxxxxxxxxoxxxxxxoxxox", -"xxxoxxxxxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxxxoxxxxxooxxxxxxxxxxoxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxoxxxxxxxxoxoxoxxxxxxpxxxxxxuoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxoxxxoxxx", -"xoxxxoxxoxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxoxxoxxoxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxoxoxxxxxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxoxoxxoxxoxxxxxxxxxxoxxxxxxxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxoxxxoxxoxxxxxxxoxxxxxxxox", -"xxxoxxxxxxxxxxoxxxxxoxoxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxoxxxoxxxxxxxoxxoxxxxoxxxoxoxxxxxxxxxxxxoxxxoxoxxxxxxoxxxxoxxxxxxxxoxxxoxoxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxoxoxxxoxxxxxxxxxxxoxxoxoxxxxxxxoxxxxxxxxxxxxxxxxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxoxxxoxxxxxxxxxoxxxxxxxxxoxxx", -"xxxxxoxxxxoxxxxxoxxxxxxoxxxxxxxxxxoxoxxxxxxxxxxxxoxooxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxxoxoxxxoxxxxxxoxxxxxxxxxxxxxxxxxoxxxxxxxoxxxxxoxxxxoxxoxxxxoxxxoxxxxxxxxxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxoxxoxxoxxxxxxxoxoxxxxxxxxxxxxxxxxoxoxxxoxxxxxxxxxxoxoxxxxxxoxxoxxxxxxxxxxxxxooxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxxxxoxxxxxxxxxxxxxoxxxxxx", -"oxxoxxoxoxxxoxoxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxoxxxxxxxoxxxxoxxxxxoxxxxxxxxxxxoxxxxoxxoxoxxxoxxxxxoxxxxxxxxoxxxxxxxxxxxxxxxxxxoxxoxxxxxxoxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxoxxxxxxxxoxxxxxxxxxxxxoxxxxoxxoxxxxoxoxxoxxoxxxxxxxxoxxxoxxxxxxxxxxxxxxxxoxxxxxxoxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxoxxxxxxxxoxxxxxxxxoxoxxxxxxxoxoxx", -"xxxxoxxxxxoxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxoxxxoxxxoxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxxxxoxxxxoxxoxxoxxxxxxxxxxxoxxxxoxxxxxoxxxoxxxxxxxxxxoxxxxoxxxxxxxxxxoxoxxxoxxoxxoxxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxoxxoxxxxoxxxxxxxoxoxxoxxxxxoxoxoxxxxxxxxxxxxxoxxxxxxoxxoxxxxoxxxxxxxoxxxxoxxxxoxxoxxoxxxoxoxoxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxxoxxoxxxoxxxxxxoxxxxxxxxxox", -"xoxxxxoxoxxxxxxxxxxoxxxoxxoxoxxxoxoxxxxxxxxxxoxxxxxxoxxxoxxxoxxxxxoxxxoxoxxxoxxxxxxxxxoxxxxxxoxxxxoxxxxxxxxxxxxoxxxxxxxxxoxxxxxoxxxxoxoxxxxoxxxoxxxxxxxoxxoxxxxoxxxxxoxxoxoxxxxxxoxxoxxoxxxxoxoxoxxxxxxxoxxxxoxxxxxxxxxxxxxxxxoxxxxoxxoxxxxxoxxxoxxxxoxxxoxxxxxxxxxoxxxoxoxxxxxxxxoxxxoxxxxxxxxoxxxxoxxxxxxxxxxxxxxxxxoxoxxoxoxoxxxxxxoxoxxxoxxxxxxxxxxxoxxxxoxxxxxoxxxxxxxoxxxoxxxxoxoxxxxxxxxxxxxx", -"xxoxxxxxoxxxoxoxoxxxxoxxxxxxxoxxxxxxoxxxxxoxxxxoxoxxxoxxxxxxxoxoxxxxoxxxxxxxxoxxxxxxxxxxoxxxxxxoxxxoxxoxxoxoxoxxxoxxoxoxxxoxoxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxuoxxxxxxxxxxoxxoxxxxxoxxxxouoxxxxoxooxxxxoxxxxoxxxxxxxoxoxxxxxxoxxxxoxxxoxxxxxxxxoxxxxoxxxxxxxoxxoxxxoxxxxxoxxoxxxxxxxxxoxxoxxxxoxxxxxoxxxoxoxxoxoxoxxxxxoxxxxxxoxoxoxxxxxxxxoxxxxxxxxoxxxxxxxoxxoxxxoxxoxxxxoxxxoxxxxxoxoxxxxxxoxxx", -"xxxxxxxxxxoxxxxxxxxxxxxxoxxoxxxxoxoxxoxoxxxxxoxxxxxoxxxoxxoxxxxxxoxxxxoxoxxoxxxxxoxxxoxxxxxxoxxxoxxxoxxxxxxxxxxxxxxxxoxxoxxxxxxxoxxxxxxxxxxoxxxoxxxoxxxoxoxoxoxxxoxoxoxoxxoxxxxxxoxoxxoxoxxxxoxoxxxoxoxoxxxoxxxxoxoxxxxxoxxoxxxoooxxxxxxxxxxoxxoxxxxoxxxoxoxoxxxxxxxxxxxxoxxxxxxxxoxxxxxxoxxxoxxxoxxoxxoxxxxxoxxxxxxoxoxxxxxoxoxxxxxxxoxoxoxxxoxxxoxxxxxxxoxxxxoxxxoxxxxxxxxxxxxxxxxxoxxxxxoxoxxxoxx", -"xoxxoxoxxxxoxxxxxxxoxxoxxxxxxoxxxxxoxxxxoxoxxxoxoxxxoxxxoxxxoxoxxoxxxxxxxoxxxoxxxxxoxxxoxxxxxxxxxxoxxxxoxxoooxxooxxoxxooooooxoxxxooxoxxxxxxxooxoxoxxxoxoxxxxxxooxoxxxooxoxxxoxoxxxxoooxxxoxxoxxxooxoxxxxxooooxxxooxoxoxxooxxxoxxoxxoxoxoxxoxxxxxxxxxxxoxxxxxxoxoxxxxxoxxxxoxoxxxxxxoxxoxxxxoxxxoxxoxxxxxoxxoxxoxoxoxxxxoxxoxxxxoxoxxxxxxxxxoxxxxxxxxoxxxoxxxoxxxxoxxxoxoxxoxoxxoxxoxxxoxoxxxxxoxxxxx", -"xxoxxxxxoxxxxoxxoxxxxxxxoxoxxxoxxoxxoxoxxxxoxxxxxxoxxoxxxxoxxxxxxxoxoxxoxxxoxxoxxxxxxxxxoxxoxoxxoxxxoxxxxxoxooxxxoxooxxxooxoxxxooxooxxoxoxoxxooooooxxxoxooxoxooooxoxooxoxoxoxxxxxoxxoxoxxxoxxoxxxxooxxoxoxoxooxooxooxxxxxoxxxxxxoxxxxxxxoxxxxoxxoxoxoxxxxoxoxxxxxxoxxxoxoxxxxxoxxxxxxxxxoxxxxoxxxxxxoxoxxoxxxxxxxxxoxoxxoxxxxoxxxxoxxoxxoxxxoxoxxxxxxoxxxxxxxxoxxxxoxxxxxxxxxoxxxxxxoxxxxxoxoxxxxoxx", -"xxxxoxoxxxoxxxxxxoxxoxxxxxxoxxxxxxxxxxxoxoxxoxxoxxxoxxoxoxxoxxoxoxxxxoxxoxxxoxxoxxxxxoxxxxxxxxoxxxxxxoxoxxooxoxoxoxxoxoxxxxxoxxoxxxoxxooooooxxxxxxoxooxxoxxxoxxxxoxoxooooxxoooooxxoxoooxoxxxoxxoxxxoxxxxxoxoxxxxoxxxxoxxxoxxoxxxoxoxxoxxxxoxxxoxxxxxxoxoxxxxxoxxoxxoxxxxxxoxxxxoxoxxoxxxxoxxxxxoxoxxxxoxxxoxxoxxoxxxxxoxxoxxxxoxoxxoxxoxxoxxxxxoxoxxxxxoxxoxxxxoxxxxoxxoxoxxxxxoxoxxoxoxoxxxxoxoxxox" +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkknkkkkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknikkkknninkkkkkkkkkkknninnnkkkkkkkkkinkkikkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkknknkkkkkkkkkknkkkkkkkknkkkkkknkkkkknkknkkkkkkkkkkkxkkkkkkknkkkkkkknkkkknknkkkkkkknkkkkknknnkkkkkkkkknkkknkkkkknkkkkkkkkkkkkknkkkkkkkkkkkkknkkkkkkkknkkkkkknkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkknnkknnnnikkkkkkkkkknnnnkkknnnnnkkkinnikkkkkinnkkkkkkkkkkikkkkkkknkkkkkkknnkkkkkkkkkkkinnnnkkknnnkkkkkkkkkknnninnkknnnnnkkknnninkkinnnnkkkkkkkkkkinnnkkknnnnnkknnnnnkkknkxnkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkknkkknkkniiiinkknkkknkknkkknkknkkkknkknxkkkkkkkkkkkkkkkkkkkkknkkkkkkiinnkkkknkkkknnnnnxkkkkxkkkkniiiinknnknknkknkkkkkknkkkknknnnnnikkiiiiikkknkknkknkkkknkknkkkknkknikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkknkkkkkkkkkknkkknkknkkkknknkkkknkknnikkkkkkkkkkkkkkkkkkkknkknkkikkknkkkknkkkknnnknnkkkxkikkkkkkkkkknnknknkknkkkknknkkkknkinnnnnkkkkkkkkkknkknkknkkkknkknkkkknkkinnkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkknnkknkkkxkkkkkkkkkknkkknkkinkkikknnkknnkknkkikkkkkkkkkkkkkkkkkkknkknkkikknnkkkknkkkkkxkkkkkkikkkikkkkkkkkknnknknkknnknxkknnkkinkkxkkkkkkkkkkkkkknkknkkkikknikkinkkikkknknnkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkknkknkkninnikkkkkkkknxkkixkkkixxnkkknxxnkkiikkxxkkkkkkkkkkkkkkkknxxxxxkknxxkxnkkixxnkkkkxxikknxiknxnkkkkkkknxikxknnkkixikkkknxikxnkkixikkkkkkkkkkixkkxxkkkixnkkkkixxkkkxnknxikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkknkkkkkkkkknknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkkkkknkkkkkknkkkkkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkkknkknkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkknkkkkkkkkkkknkknkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknknkkkkkkkkkkkknkkkkkkkkkknkknkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkkkknkknkkkkkkkkkkknkkkkkkkkkkkkkkknkkkkkkkkknkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkkkkkknkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkkknkkkknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkknknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknknknkkkkknkknkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknknkkkkkknkknkkkkkkkkkkkkkknknknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkknkkkkkkkknkkkkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknknkkknkkkkkkknknknkkkkknkknkknkknkknkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknkkkkknkkknkknkkkkkkkknknknkkkkkkkknkkkkknkknkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkknkknknknkknkkkkkkkkkkkkkkkkkkkkkknkkkknkkkknkknuunnkknkkkknkkknkkkkntkkkkkkkkkkiikkkkkkknkkkkkknkkkknnkkkknnkkknkkkkkkkkkkkkkkkknkknkknkkknknkkkknkkkkkkkkkkkkkkknkknkknkkkkkkknkknkknknkknknkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknkkkkkkkkkkkknkkkkkkkkkkkkkkkkknkknknkkkknkkkkkknkkkkkkkkkkkkkkknkknkknkkkkkkknkknkknknkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkknkkkknkkkkkkkkkkkknkkkkkkkkkknktnkkkkiknkkkknkkkkkkkkkkkkikkkkkkkkkkkinkkknkkkkknkkkknknkkukkkktkknkknkkkkkkknknkknkkkknknknknkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkknkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkknkkkknkkknknkkknknknkkkkkknknknkknkkkknkknknkknkkkkkkkkkkkkkkkkknkkkkkkkkkknkknkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkknknkkkkkknknkkkkkkkknkknkkknkkkkkknkkkkkkkkktkkkknikkknnkixnknininnnkkxkninkkkkiikikknniikkkkknkkkkkkkxnknkkiikkknknkkkkkkknkkkknkknkkkkkknknknkkkkknkknkkknkkkkkknkkkkkkkkkkkkkkkknkknkknkkknkkknkkkkkkkkkkkkkkkkkkkkkknkkkkknkknkkkknkkkkknkkkkknkkkkkkkknkkknkknknkkkkknkknkkkkkknkknkkknkkkkkknkkkkkkkkkkkkkkkknkknkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkknkknnknkkknnkkkkkkknkkkkkkkkknkkknkkkkkkknnknkkkxnkkkknixtkkxuxuxxikitxiukkktiiuxkknixxikkkkknkkknkktkkkkkktkkkkkkkkkkknkkknknkkkknknknkkknkkkkkkkknkkkkkkkkknkkknkkkkkkkkkknknknkkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknkknkkkkkknkkkkknkknkknknnkkknkkkkkkkknkkkkkkkkknkkknkkkkkkkkkknknknkkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkknkkkkkkkkkkkknkkkkkkkkknknkknkkknkkknknkknknkkkxkkkkkkxknknkiuuukknukxkkxkxnkkktkikkkkxkkktutikknkkknknkkkxknknkkxnknkknknkkkkknkkkknknkkkkknkkkkkkkkkknknkknkkknkkknknkknknkkkkkkkkkkknnkkknkkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkknkknkknkkknknknknkkkkkkknkkkkkknnkkkkkkkknkkknkkkkkkkkknknkknkkknkkknknkknknkkkkkkkkkkknnkkknkkknkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkkkkknkkkkkkkkknknkkkkkxkkkknkxknkkntnktnkkwkxkkxkxkkkkxkxkkkkxkkxnknxkkkkkkkkknkkxnkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkkkkkknkkkkkkkknkkkkkknkkkkknkkknknkkknkkknkkkkkkknkkkkkkkkkkkkkkkknkkkkkkkkkkknkkknkkkkknkknkkkknkkkkkkkkkknkkkkkkkkkkkkknknkkkkkkkkknkkkkkkkknkkkkkknkkkkknkkknknkkknkkknkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknnknnkxknkknxkknkxkkkwknkwkxkkxkxunkxnkntkkttkktkkixkkkknkkkknkktkknknnxkknkknknknkkkkkknkkkknknkkkkkkkkkknkkkkkkkkkkkkkkkkkkkknknkknkknkkknkkkkkkkkkknkkkknknkkkknkkkkkkkkkkkkkkkkkkkknkknkknknkkknkkkkkkkkknkknkkkkkkknkkknkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknknkknkknkkknkkkkkkkkkknkkkknknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkunkkxwwwwikkuwunwkwwktikwnwnwwnkkknwwittkiwwnwnnkkkknkkkkkntkkkktnnkknkkkknknknnnnnnnnnnnnnkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknnkkkkkknkknnkknkkknkknknkkkknkkkkkkkkkkknknkkkkkknkkkkkkkkkkkknkknknnnknknkkknknknknnkkknknknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknnkkkkkknkknnkknkkknkknknkkkknkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkrrrrrrrrrbrrrrrrbrrrrrrrrrrrrrikinnkkknirrrrrrrrbrbrbrrbrrriknkkkkkkrrrrrrrrrrrrrrbrrrbrbrrrrbrrrrrrrrrrrrrrrrrrssssssgsggbkkkkkkknkkkkkkkkkknknkknkkkkkknkkkkkkknkkkkknknkkkkkkkkknknkkknknknkkkkkkkkknkkknkknknknknknkkknknkkkknknkknkknknkknkknknkkkkkkkkkkkkkknkkkkkkkkkknknkknkkkkkknkkkkkkknkkkkknknkkkkkkkkknknkkknknknkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkrhhhqhhhhhhhhhhhhhhhhhhhhhhhhhhmkkknkkkivhhhhhhhhhhhhhhhhhhhmknknkkkrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhtnknkkkknnkkkkkkkkkkkkknkkkkkkknkkknkkknknkkkkknknkkkkkkknnnkknkkkknknkkkknkknkkkkkkkkkkkkkknkkknknnkknknkkknkknknkkkkkkkkkkknknnkknkkkknnkkkkkkkkkkkkknkkkkkkknkkknkkknknkkkkknknkkkkkkknnnkkknkkknknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkknknknkkihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhodknkkkknvhhhhhhhhhhhhhhhhhhhockkkkkkihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhoenkkknnkkkkknkknknkknkknknnknkkkkkkkkkknkknkknkkkkknknkkkkkknkknknkkkkkkkkkkkkknnkknknknnkknknknkkkknkknknkkkkknkknnnkknnkkknkknknkkknnkkkkknkknkkknknkknnnkkkkkkkkkkkknkknkknkkkkknknkkkkkknkkkknkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkmohhhhhhhhhhhhhhhhhhhhhhhhhoooldkknknkkbhohhhhhhhhhhhhhhhholdnknnkkkmohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhlcnknknkkkkknkkkkkkknknknknkkkkkkknkknnkkkknkkkknnkkkkkkknknkknkkkkknknnkkkkknkkknnkkkkkknknkknknknknknknknknknkknkkknkkkknnkknknknknknkkkkknkkkkknknkknkkknknkkkknkknnkkkknkkkknnkkkkkkknknknnknkkknknnkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkdpllhhhhhhhhhhhhhhhhhhholeepddwnkknknkkwdddqhhhhhhhhhhooeepwknkkknkkddjeoqhhhhhhhhhhhhhhhhhhleeeeeeelloohhhhhhhhhhhhhhhhl`nnnnknknknknnknknkknkkkkkknkknkkkkkkknknkkkkkkknnnknknkkknnkkknnnkkkkkkknkkkknkkknkkkkkkkknknkkknkkkknkkknkkknknkknnknkkkkkkkknknknkkknknknknknkkkknkkkkkkkkknkkkkkkknknkkkkkkknnnknknkkknkkkknknkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkknkx`fhhhhhhhhhhhhhhhhledtnnknnnnnnnnnkkkknshhhhhhhhhlej`nnnnniknknkkkkknghhhhhhhhhhhhhhhhoel`xnninitwudplohhhhhhhhhhhhheunnnnnnnknknkknkknnnkkknknkkkkkkkkkknkknkknnnkkkkkkkkkkkkkkkknkkkknnknkkkkkkkkkkkkknkkknkkkkkknnkkkknkkknknnnkkkkkkkkknkkknknkkkkkkknkkknknknknknnnnknknnknkkkkkkkkknkknkknnnkkkkkkkkkkkkknknkkknknnknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknnmhhhhhhhhhhhhhhhlcxxiixixxxxiinnnkkkighhhhhhhheeaxxxxxxxiiinnknkknnivhhhhhhhhhhhhhhhejxxixxxxxxxxxii`dohhhhhhhhhhoetxtxxinnnnknknknknknnnknkknknkkkknkkkknknnkkkkkkkknkkknkknknknknknkknknknnkkkkknkkkknkkknnknknkkknkkkknknkkknknknknkkkknkkkkkknknkkkkkkkkknknknkknknnknkkknknkkknkkkkknknnkkkkkkkknkkknkknkknknkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkkkkknirfhhhhhhhhhhhhhhecuuwwuuuuuuutxnnnkkrvhhhhhhoeewuwwwuuuuutxxnnknkknrvhhhhhhhhhhhhhhoewwuwuuuwuuwuwuuuuwdqhhhhhhhhoew`wwwuxnnnkknkkknknknknknkkkkknnkknkkkknknnknnknkkkkknkkkkkkkknknkkkkkkkkknknkkkknkkkkkkknkknkknkkknknkkknnknnnkknkkkknknkkknkkkkknkkkkknkkkknkkknkknnknnkkkkknkknknkkknknnknnknkkkkknkkkkkkkkknnnkkknkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkknknitshhhhhhhhhhhhhhlcccccaaaa``wuxinnkrbhhhhhhoejdccaacacaaa`utxnnkknnrvhhhhhhhhhhhhhhllccaccaaaaaaaaaaaaaaaqhhhhhhhljcdcca`txnkkkkkkknknkkkkkknnnknkknnnknkkkkkkkknkkknnkkknkknknkkkkkknkknnkkkknkknkkkkkkkkkkknkknknnknkknknkknkknknknknkknknkkkknknkkkkkkkkkkkkkkknknnkkkkkknnnknkknnnkkkkkkkkkknkkknnkkknkknknknkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkniughhhhhhhhhhhhhhljjpjpppdcaa`utxnnirfhhhhhoeejjpjpjpppddcaaccxnkkinrhhhhhhhhhhhhhhhejjpjppppjpccaccccccddvqhhhhhheejjjjpawxinkkkknkkknknnnnnkknknknkknknnkknkknknknnkknkkkkknkknknkkkkkkuukknkkkkknkkkkkkkknkkknnkkkknkkknknknknkknknknkkkkknkkkkkknknnkkkkknkkkknkkkknknnnkknknknnknknnnkknkknknknnkknkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknnituvhhhhhhhhhhhhhoeeejejpdca`wuxinnrmhhhhhoelpjejejejjjdda`ctnkkkkxnrhhhhhhhhhhhhhhoeeeeejejpdpcaaa`aaaccddmhhhhhheeeeejpc`cdannknknkknknxa`cackknknnnnkccnkcaknkkknknkkkknkkknknkkkkkkkkktkkkkkkkkknkkkkkkkkkknkkkknkknkkkkkknknknknkkkknknknkknkkkkkkkkkkkkkknknknknknknknkkkknknknnknknnkkkknkkknknkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkniitshhhhhhhhhhhhhheeeejjpc`wutxinnrshhhhhoejcdpeeeeeejpc`aaautnnkttishhhhhhhhhhhhhhleeeeeeljpccwaa`uwwacaacsqhhhhoeeeeeejcwxunknkkkittkkktkntktnknxtinknndknwnkkkknknktitniikkkntxkkkkkxxkxkkkitxkkkknknkknxxxkxnnnkitxknntkttnknknknknnkkknkknkkknknkkkkkkknknkkkkknkkknknknnkknknnknknnknknnkkknkknnkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknknnirhhhhhhhhhhhhhheeeeepc`utxxinnighhhhhoepcapjeeeeejjp`wwwatxkknt`rmhhhhhhhhhhhhhhleeeeeejpc`ata`uxxca`ccwwmhhhhleeeeejpawxunkknkktttwnnkkktkkkn`uuu`nknn`cknnnkkkkkkt`xaxuikn`xx`nkk`ttaukk`uxw`nkkkkkkknwuu`xwknntxuiki``ut`xkknkknknnnknkkkkknkkkkkkkknkkkknnkknkknnkkkkkknknnknnnnknknnknnkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknknnknivhhhhhhhhhhhhhleeejpauxinnnnrbqhhhhoedwiwapjeeejjdjtxinunnnkkktrfhhhhhhhhhhhhhheeeeeeeejwuwctnnni`uuwcutshhhheeeeeejpauxuknnknkua`uknnkktnknn`ttuaxknn`wknkxaaacakkckxkkxkxkkkktktnkkkwki`ttxaxnwaaa`tkttntktkkn`autkktnknkwkknknkkkkkkknknkknkkkkkkkknnnknkknkknknknnkknkknkknknknnnnknknnkkknnkkknkkkkkkkkkkkkkknkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknknknkknknknshhhhhhhhhhhhhoeeejd`uinnkkrrqhhhhhednuxucpejejpda`xinntnkknnkxrhhhhhhhhhhhhhhoeeeeeejpaux`x`nnnx`ttuuiighhhheleeeejp`tiunkntktxnnwkknkntknkx`ttttnnkwxttkkkkkkkkknaktkktktkkkktktknnktkx`ttttnkknkkkkkxxkuntnkunkntkkunknkwnkkknkknknnknknknknkknnknkkknknnnknknnkknknknknknnnknkkkknkkkkkknkkkkknkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkkknknknknkbhhhhhhhhhhhhhheeejd`tinknrbqhhhhoejnnu`wdjejjjauxxnnnkuknkknnbshhhhhhhhhhhhhhleeeeeejc`titni`knkcxkniknrhhhoepjeeejd`titnknukwkkn`nknkktkknncxkknkktxnkcnknkkknkkkaktkktkitkkuxkn`knw`nkaxnnnnkkkkkkkktxntntnnukktxkkx`nkuinnnknknknkkkknnkkkknnkkknnknknkknkkkkkknknkkkkknknkkkkkkkknnknkkkkkkkkkkkkkkkkkkkknkknkkknnkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknknknnknknkkknnnfhhhhhhhhhhhhhleejd`tnkkibqhhhhheeinnxajjjepdadd`xknwcccwkntarmhhhhhhhhhhhhhheeeeeeepcwx`unkcanknwcwxknrhhhoecpeeepcwwccccaxkicctuwkntcccnnknwa`xkkaakkackkknkknnaakuikakkiacxknknacxwwnnua`xnknkkkkkiawkanxwkuccicxktn`ciknkknknknknknkkkkknkknnnknnknnnnnkknnnkknknknknnnknnknknkkkkkkkkknknknnkkkkkkkkkkkkkkkkknknknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkknnknkknmhhhhhhhhhhhhhoeejpauxnirfhhhhoeltxnit`cpjpd`utnnkknnnknknkknrqhhhhhhhhhhhhhoeeeeeejpauxknkknnknknknnkkrhhhld`djjjpcwxnnknknnknknknkknkkknkknnnnnkknknkkkknkknkkknkkkkkkkkkkkkkkkkknnnkkknkknkkkkkkkkkkkkkknnnkkkknnktkkknkknnnknnkknkknkknkknkkknkknnkkkknnnnknnnknknkknknknnnknkkkknkkkknkkkkkknkkkkkkkkkkkknkkkkknkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkknkkkkkkknknknnknkknknknbhhhhhhhhhhhhhheeepcuxirvhhhhheliknxtwcpppcawxinknknknnknknknbhhhhhhhhhhhhhhoeeeeeejp`unkkkkkknknknknknghhhe`wcpjjpattnnnnnkknknknknnknkknnkknkkknkkkkkkkknknkknkkknkkkkkkkinknknkknknnnknkknknkkkkkkkkkkknkknknnkknxpctkkkkkkknkknnknnkknnkknknknnnknnnnnkkkkknknkknknkknnkknknknnkkkkkkknknnknkknkkkkkkkknnknkknknknknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkknkkkknnkkkkkkkknknknnkkkkkiqhhhhhhhhhhhhhleejcwrrvhhhhheennnitwadppc`utxnnnkkknknnknnkrshhhhhhhhhhhhhhleeeeeejdwuxinkknnnnknnknnnnmohetuapjjd`xxnnknnknkknknknknnnkknknknknknnkknknnkknnknknkkkkknkkkknnnknkknnknnknnknkknkkknnknkkkkknnnknknknknnnkkkkkkknnnknnnnnknnnkknkknkknnnnnnnnnkknknnnknnkknknkknkknnkkknnnknknkknkkkkkkkkkkkknknkkkknknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkknkkkkkkkkknkknkkkknknkkknnnknmhhhhhhhhhhhhhoeejdtrvhhhhhelnnnitwadppd`uxnnnknnnnknnnknkkrvhhhhhhhhhhhhhheeeeeeepcwxinnknrgvbrknnnnknncjlit`dppcwxnnnnknknnnknkknkknknknknnnnkkkknnnnkknnkkknkkknkkknkkkknnnnnnknknnnnknkkkkknknkkkkkkkkkkkknnkknnnnnnnknkkkkkknnnknnkkknknnknnkkkknknkkkknnknkkkknkknnnnninnkkkkknkkkknknknkknkknkknkkkknnnnknkkkknnkknnnkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkknghhhhhhhhhhhhhheeesrvhhhhoeeinnxtwadppcawtikkkkkkknkknnknknrhhhhhhhhhhhhhhoeeeeeejp`uxnnnnnrqhhwxknnknnkkkkixwapdauinnknknkkknknnniirnikkknkknnniirrggsgikknnnknnkknkkknirrrgsggnnknkknknkkkkkknkkkknkkkkkkknknknirrbsssbnnnnkkkknnnnniiiikkkkkkkkkkknnknnnkknknnnnnnirrrsssggrnnnkkknkkknknnknknnkknkknrrrbsgsgrnnnkkkknrsgrkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknnkkknnknnhhhhhhhhhhhhhhlewrvhhhhhelinnitwadppdawtinkkkknkkknkknknknghhhhhhhhhhhhhhoeeeeeejd`tiinknrshhhetkkkkkkkkknnxwcdd`uiknknnnnniiirrrssvqsikkkkknkrrgvhhhhhhminknknknknnknrbmqhhhhhhmiknknknknnnknkkknnknkkkkkkkkirrsvhhhhhhqgkknnrrrgssgssvmsnknkkknkkkknnnkkkknknknirbsmqhhhhhhhfsrkkkknkkknknnnkknknnnrbmfhhhhhhhfsrnnknrghhhtkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkknnfhhhhhhhhhhhhhoprvhhhhheennnxtwaddpdawxiinkkkkkknknknkknnrmhhhhhhhhhhhhhheeeeeeejcwxinnkirqhhoekkkkkkkkkkknxuaccwxrrrrrrssssvvfhhhhhhlankkkkirgqhhhhhhhhhqxnnknknkknrbmhhhhhhhhhhhgknkknnkkknknnkkkknkkkkkknrrsqhhhhhhhhhhfnkrshhhhhhhhhhdakknkkknkkkknnnknkkknrrgvhhhhhhhhhhhhhhmnknknnknknknnnkknrbmhhhhhhhhhhhhqvsbrgqhhoekkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknnknknghhhhhhhhhhhhhhrshhhhhelinnitwacppdawxinnnnkkkkkkkkkkknkkrfhhhhhhhhhhhhhheeeeeejpcuxinnirmhhhopkkkkkkkkkkknit`aaugvfhhhhhqhhhhhhhhhhhetnnknrrvhhhhhhhhhhhhhinnnknnnrsqhhhhhhhhhhhhhwknkknknknkknknknkknkkkirsqhhhhhhhhhhhhhdnrfhhhhhhhhhhlakkkknkkknkkkknnnnnirgfhhhhhhhhhhhhhhhhhfnnkkknknnknknknrsqhhhhhhhhhhhhhhhhhhhhhhodkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkrhhhhhhhhhhhhhhshhhhheeinnituadppdawtinkknwctkkkkkkxkkkknrhhhhhhhhhhhhhhoeeeeeejp`uinnnrghhhhlankni`dxkknknixw`wxshhhhhhhhhhhhhhhhhhljnnnnibqhhhhhhhhhhhhhqonntnnirshhhhhhhhhhhhhhhhwcxnknknknknkkkknkknkrbvhhhhhhhhhhhhhhqhurhhhhhhhhhhhexkknxcwkkkkkkkkkknrbmhhhhhhholeedqhhhhhhhqnnnnknknnnnnnrshhhhhhhholeeelhhhhhhhhhhlckkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknnknnvhhhhhhhhhhhhhhhhhhlexnnixwacdpda`uxnnkkkukknkkkkiwknkkrghhhhhhhhhhhhhhleeeeeejdwxinnrrqhhhhexkniiiiwnkkknnxtutxghhhhhhhhhhhhhhhhhheanknrrqhhhhhhhhhhhhhhho`i`iirvhhhhhhhhhhhhhhhhhlpnknnwdpaknnknkknknrbqhhhhhhhhhoeeehhhhvshhhhhhhhhhoennknnkukkkkkkkknnrsqhhhhhhhlepuxnshhhhhhhhonknnknnknknrgqhhhhhhhledunkiwfhhhhhhhhlwnknnknkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknknnmhhhhhhhhhhhhhhhhhlecxiitu`ddpdawtxnnkkkkunkknkkk`kkkkkrvhhhhhhhhhhhhhheeeeeeejpwtnxrbqhhhhoeuinxttt`nnnkknnxxixrcllhhhhhhhhhhhhhhhetiurbqhhhhhhhhhhhhhhhhhjtxwrshhhhhhhhhhhhhhhhhhoaxinnnkuknknknxtxnrshhhhhhhhhheecxxumhhvvhhhhhhhhhhljtxiiinwknknnkttirshhhhhhhhledtnirmhhhhhhhhhpxnnitiutnnrqhhhhhhhoewnniituxvhhhhhhheuniixxinknknkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkknkkkkkkkkknkkrhhhhhhhhhhhhhhhhlepwtttu`cpddawuxiinnkkktknkknnkwkkkk`rqhhhhhhhhhhhhhheeeeeeejduxrrsqhhhhhlpudtuw`wainnknknnninxwccashhhhhhhhhhhhoextrbqhhhhhhhhhhhhhhhhhhewurshhhhhhhhhhhhhhhhhhhodttxnnnunknknnuturshhhhhhhhhheedwxtuwfhqhhhhhhhhhhhedacxtttwinnkndubrvhhhhhhhhledw`crbqhhhhhhhhhld`xxaauuwrshhhhhhhhepuiitu`c``qhhhhhhexix`wuuinnininnkkknkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknnkknkkkkkkniqhhhhhhhhhhhhhhlejd`wuwacdpdawtxinnnnknktknnkknkunnnxibhhhhhhhhhhhhhhoeeeepdcwtrrgfhhhhhhhl`iiaw`awainnnkkkknknknwnnrhhhhhhhhhhhhljubbqhhhoelvhhhhhhhhhhhhecrghhhhoeeqhhhhhhhhhhhhojawutxnuknknkna`rghhhhhhhhhoee``ju```shhhhhhhhhhhhoew`awwwuainnnunirvhhhhhhhhoedwwwprmhhhhhhhhhhopjtxwnnntrqhhhhhhhhetwuww`adccshhhhhoeutu``wttnkikkkkkknkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkknkknknknkkkkknshhhhhhhhhhhhhoeeedc``adppda`txinnnkkkkntkknnknnunknuishhhhhhhhhhhhhhsrbrrrsssmvhhhhhhhhhhetitaacc``innknknkkknnnukkrhhhhhhhhhhhhedgrfhhhlectbhhhhhhhhhhhoegbqhhheecitmhhhhhhhhhhhoepcautiwnkunkwirshhhhhhhhhhleaaadacpdshhhhhhhhhhhhlecddccawaxnnntirvhhhhhhhhhedc`aa`rhhhhhhhhhhhoep`u`xnntghhhhhhhhhex``ccdppddwfhhhhoea``ccawunniknkkkknknkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkknkknkkghhhhhhhhhhhhhheeejpccddddawuxinnnnnnkkkukkknnknwnnnnrfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhoeitcccda``inknknknkkkkkunirhhhhhhhhhhhoecrvhhoeecxirhhhhhhhhhhhocrfhhheexnnbshhhhhhhhhhhlejjdauxwnkuknwrshhhhhhhhhhoejw`adpjlashhhhhhhhhhhhejjjejjd`axnnnrrvhhhhhhhhheexp`wa`shhhhhhhhhhhoepdaaxnnbshhhhhhhhhewdcpjjjjdcamhhhhoedddpdcwunkxkkkkkknkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknkknknnkkkknkrqhhhhhhhhhhhhhleejjppppdcwtxnknkknkkkkkukkknknnwiknkrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhlpdjacdpjjpd`kknnnkkkkwcddgshhhhhhhhhhhlershhheedpxtbhhhhhhhhhhhorshhheeuinnrmhhhhhhhhhhhleeejdppddddnkrbqhhhhhhhhhhed`pjejjeewshhhhhhhhhhhheeeeejjejppdnnrvhhhhhhhhhoeutwpjlcshhhhhhhhhhhoejjpjdxtgvhhhhhhhhhljjejljjjpp`ghhhhlepjjejcawnxxknkknkkknkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknknkknnnkkknnmhhhhhhhhhhhhhoeeeejjjdc`txnnnnnnnnnkkkwunkkkknk`nnrghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhewuwcdpdauxnnnnkknknnkkkkkimhhhhhhhhhhhegbhhheedwtirshhhhhhhhhhhsghhoeeauxxwrfhhhhhhhhhhheeeejpcwxnnnnirqhhhhhhhhhhlewadjjjeljsvhhhhhhhhhhhleeeeeejdatikkrshhhhhhhhhhepu`adpjpshhhhhhhhhhheeejpc`tirvhhhhhhhhhhjjjeejdawttrfhhhljjjejpdwxnkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkknkkknkkkkghhhhhhhhhhhhhheeeejjpcwuxinknkknknkkkkxuinkknknnnkrmhhhhhhhhhhhhhhlelllloohhhhhhhhhhhhoewwcpjjdatxnkkkkknkkknknkkrvhhhhhhhhhhodrfhheejcwtxrmhhhhhhhhhhhrqhhlejawxtubhhhhhhhhhhhheeeeejd`tnkknrvhhhhhhhhhhoeccdjeeejjpbvhhhhhhhhhhhleeeeeejc`tinrbhhhhhhhhhhoeu`cpjjljahhhhhhhhhhoeeeeepawxivhhhhhhhhhhoeeejpawtxiimhhhejjeeepcwxnkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknknkknkkkrqhhhhhhhhhhhhhleeejjc`uxnnnknnnnkkkknnnknnkkkknknnrfhhhhhhhhhhhhhheeeeeeeelllhhhhhhhhhol`cpjjjd`tiknnnkkknknknkknrhhhhhhhhhhhorshhlelpauxxrfhhhhhhhhhhmmhhleepcwtxrmhhhhhhhhhhhoeeeeejd`txnnrshhhhhhhhhhhejcpjjeeejpcrqhhhhhhhhhhheeeeeejjcwxnirqhhhhhhhhhhep`cpjeejpdvhhhhhhhhheeeeejjcwtrvhhhhhhhhhhqeeejd`tinnnshhheadjejpcuxnkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkkkknkknkkkkkrvhhhhhhhhhhhhhoeeejpauxinnnnkkkknkkkknnnnknkknnnknrhhhhhhhhhhhhhhoeeeeeeepc`uaqhhhhhhhljdpjljjcwxnnkknknkkkkkknnnshhhhhhhhhhhbghhoeejd`uxtbhhhhhhhhhhhshhoeeepcwutrfhhhhhhhhhhhleeeeejpatxnnbqhhhhhhhhhhoedpjeeeejpcurhhhhhhhhhhhoeeeeeeedauinrmhhhhhhhhhhoecdpjejejd`ufhhhhhhhleeeeeejd`tifhhhhhhhhhhhheejcwtinkkkhhoe`cjjepauinkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknnknknibqhhhhhhhhhhhhhheeejc`tinkkkkkkkkkkknnknknnnnkkknnishhhhhhhhhhhhhhleeeeeeejdawwuvhhhhhhejpeeelpcwxnnknkkknknknknkrmhhhhhhhhhhqrhhheeepcwutrshhhhhhhhhhfqhheeejpawugbhhhhhhhhhhhheeeeeejd`uinrmhhhhhhhhhhhlepjeeeejjd`bshhhhhhhhhhhleeeeeejdwtirbhhhhhhhhhhhlecjjeeejpawxicooooleeeeeeeejd`tishhhhhhhhhhhhpejdwxnnnnkneejwapjjd`tinkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkknknnknkkkkknkkirvhhhhhhhhhhhhhhhleejdwxnnkknkknnkknnnnkknnknknkkkkrvhhhhhhhhhhhhhheeeeeeeejpdaaashhhhhoeeeeeejpauinknknkkknkkkkknrfhhhhhhhhhhmmhhleejdauturvhhhhhhhhhhqhhoeeeepd``tshhhhhhhhhhhheeeeeejp`tirghhhhhhhhhhhoejjeeeeejdauxmhhhhhhhhhhheeeeeeepcwxnrfhhhhhhhhhhhepjleeejpcwxnkkncppleeeeeeeejdwtibhhhhhhhhhhhhhjjd`xnkkkkknnit`dpjd`tnnkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknkkkkkkrrvhhhhhhhhhhhhhhhhleejd`tnnkkknnknnkkknnkknnnnnnkkkkrqhhhhhhhhhhhhhoeeeeeeejjpdddc`vhhhhleeeeeejd`tnnnkkkknkknknkknrhhhhhhhhhhhshhoeeejdawwwrhhhhhhhhhhhhhoeeeejpda`rfhhhhhhhhhhhleeeeeejdwtirfhhhhhhhhhhhlejeeeeejpawxrvhhhhhhhhhhoeeeeeeepauxrghhhhhhhhhhhlejjeeeejd`uxinnnntwcpeeeeeeejdwxnrhhhhhhhhhhhhhhjp`unnknkknknxucppcwtnnkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkknkkkknkkkkkkknknkkkkirvhhhhhhhhhhhhhhhhhheejp`uinknkknnknnnkknkkknknknnnknbhhhhhhhhhhhhhhoeeeeeeejpdcccc`mhhhhleeeeeepcwtiknknknnkkknkknnshhhhhhhhhhffhheeeepdaw`gghhhhhhhhhhhhhleeeejjdcwbhhhhhhhhhhhhleeeeeepcwxrghhhhhhhhhhhoeleeeeeepc`xxrhhhhhhhhhhhleeeeeejd`tirfhhhhhhhhhhhlejeeeeepcwtinnkinxwcpjeeeeejpawxnnmhhhhhhhhhhhhhhjcwxnkknkknniu`ddcuxnkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkknknkknkkknrvhhhhhhhhhhhhhhhhhhheeepcuinnnkkntknnnknnkkknnknnkknimhhhhhhhhhhhhhhleeeeeeeejcwwwaushhhoeeeeeejepwxnnnknknknnknkkkrvhhhhhhhhhhqhhleeeepca``bmhhhhhhhhhhhhoeeeeejppdbmhhhhhhhhhhhoeeeeeeejawxrfhhhhhhhhhhhleeeeeeejpauxrghhhhhhhhhhheeeeeeejdwtrghhhhhhhhhhhhejeeeeejdauinnknnixuadjeeeejjd`uinkrhhhhhhhhhhhhhhqd`uinkkkkkkitwac`uinnkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkknnknnrshhhhhdfhhhhhhhhhhhhhoeejc`xnnknkainnnnnkkikkkknkknkurvhhhhhhhhhhhhhheeeeeeejdawuttwbshhhoeejeeejdcuxnkknknknkkkknknrqhhhhhhhhhhhhheeeejpcaawrqhhhhhhhhhhhhleeeeeljjarqhhhhhhhhhhhoeeeeeejpaurghhhhhhhhhhhheeeeeeeepcwxirmhhhhhhhhhhheeeeeeepcuxrmhhhhhhhhhhhleeeeeeepdwxinnnkknitwcdjjjjpd`uxinnnmhhhhhhhhhhhhhhqcwxnnnnknnnxu``wtikkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkkkkknrshhhhhljmhhhhhhhhhhhhhoeejdatinknkanknnnuunkkxxknuini`rhhhhhhhhhhhhhhoeeeeeejed`tiiwwishhhljjjeeejdcxinnnkkkkkiuxukuighhhhhhhhhhhhhoeeeeejcaagghhhhhhhhhhhhoeeeeeejjjwghhhhhhhhhhhheeeeeeejd`trfhhhhhhhhhhhoeeeeeeejpauxnrqhhhhhhhhhhleeeeeejd`uirhhhhhhhhhhhhleeeeeejpawxnkknkknnxuwccdddcautinkkkrqhhhhhhhhhhhhhhpauxnknkkknixuutxnnkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknknknknrshhhhhletrhhhhhhhhhhhhhheeepcuxnkkxxknnkwutwkntwnnutnnsghhhhhhhhhhhhhhoeeeeeeejd`xinuanshhhedppjejpccxnnnnnnnknna`waubmhhhhhhhhhhhhheeeeejepcabmhhhhhhhhhhhhleeeeeejjdbmhhhhhhhhhhhheeeeeeejcwrbhhhhhhhhhhhheeeeeeeejcwtinghhhhhhhhhhhleeeeeejdwtrshhhhhhhhhhhheeeeeeejcatinnkknknnnitu``a`wuxinkkkknghhhhhhhhhhhhhhqp`tinknkkknnxxinnkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkknknknkkkkkknkkkkkknkkrshhhhhleukrqhhhhhhhhhhhhhleejc`tnnkukkknn`da`kknunknuknrmhhhhhhhhhhhhhhleeeeeejpwxinnntishhheuccjjjpacinknwdddd`ktukukrvhhhhhhhhhhhhleeeeeejec`rqhhhhhhhhhhhoeeeeeeelparqhhhhhhhhhhhleeeeeejpawrmhhhhhhhhhhhheeeeeeejpauiirmhhhhhhhhhhheeeeeeejcwxrvhhhhhhhhhhhoeeeeeejpautinknknkknnnnxtttutxinnkkkkkkfhhhhhhhhhhhhhhhd`tnnnknknnnnnnkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknknrbqhhhhleuknnmhhhhhhhhhhhhhheejpauinkuknkkutnnwnknunkkunkrfhhhhhhhhhhhhhheeeeeejjpwxnnnkunmhhlexcapjjd``inkknnnknknutkunrhhhhhhhhhhhhhleeeeejjjcughhhhhhhhhhhhleeeeeeejpgghhhhhhhhhhhhleeeeeejd`trqhhhhhhhhhhhleeeeeeejc`tinrqhhhhhhhhhhoeeeeeejpauirhhhhhhhhhhhhoeeeeeejp`tninnkknknkknnnnxiiinnnnknnknknqhhhhhhhhhhhhhhjawtnknkkkknknkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkknknknkkkkkkknkkkkibqhhhhoe`knnxghhhhhhhhhhhhhheeepcwxiniuknk`kkiaknn`nnuuknrhhhhhhhhhhhhhhoeeeeeejdduinnknukgqhlan``dppcw`irikknnnnnnuuktnshhhhhhhhhhhhoeeeeeejjdabshhhhhhhhhhhheeeeeeeejdbmhhhhhhhhhhhoeeeeeeejc`bghhhhhhhhhhhheeeeeeejpcuxnighhhhhhhhhhhleeeeeejd`uighhhhhhhhhhhhleeeeeejc`tnkknknkknkknkkknnnnnnnnnknknkkrqhhhhhhhhhhhhhhjautnknkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknrbqhhhhoedniniusfhhhhhhhhhhhhhleepc`tinnakkkidcuwwnnicdxdtishhhhhhhhhhhhhhleeeeeeejjpankucddcadejppjjddjpdbsqmnkkknnxd`kdrmhhhhhhhhhhhhleeeeeeeec`rfhhhhhhhhhhhlleeeeeejd`rqhhhhhhhhhhhoeeeeeeepaurshhhhhhhhhhhheeeeeeejd`tinrmhhhhhhhhhhheeeeeeejc`trshhhhhhhhhhhheeeeeeepcuinnkknkknknnnkkknnknknknnknkkkknshhhhhhhhhhhhhhod`uxnnkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkknknkknkknkibqhhhhoednnixu`amhhhhhhhhhhhhhoeejd`uinnxxnkknknkkkknknknkrvhhhhhhhhhhhhhheeeeeeejcwxnnkkkkkknkknntwcdc`tibqhhcnkkkkknnnkrqhhhhhhhhhhhheeeeeeejpctbhhhhhhhhhhhheeeeeeeepdgghhhhhhhhhhhheeeeeeejdaurfhhhhhhhhhhhoeeeeeeepawxnnbhhhhhhhhhhhoeeeeeejpauirvhhhhhhhhhhhheeeeeejdatinnikknkkkkknknkkkkkknknnkknknknnmhhhhhhhhhhhhhhlc`tinknkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkirvhhhhhedkniiuwcdshhhhhhhhhhhhhheeepauxinnknkkkkknnkknknknnrqhhhhhhhhhhhhhheeeeeejpauxnnnknknkkknnnxwcdawxrvhhoeikkknknknnbhhhhhhhhhhhhleeeeeeejdabshhhhhhhhhhhoeeeeeeejparmhhhhhhhhhhhheeeeeeejcwxrhhhhhhhhhhhhleeeeeejp`uinrshhhhhhhhhhhleeeeeejd`uirvhhhhhhhhhhhheeeeeejdwtiknnnkkkknnknknkkkkkkkkknnnnkkkknnvhhhhhhhhhhhhhljcwtinkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkirvhhhhoejknnxuwcdp`fhhhhhhhhhhhhhleepcwtinnnnnknnkkkkkkknkknghhhhhhhhhhhhhhoeeeeeejd`tinknkkkkkkkknitwacaurshhhlpnknnnknknimhhhhhhhhhhhheeeeeeeepcwrfhhhhhhhhhhhleeeeeejjdwrfhhhhhhhhhhhleeeeeejpaurghhhhhhhhhhhheeeeeeejcwxinrqhhhhhhhhhhheeeeeeejdwtnrhhhhhhhhhhhhoeeeeeejcwxnknkknkkkknnnkkkkkkkknkknknnnnkknnifhhhhhhhhhhhhhedauinnkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkknkkknknkkkrrvhhhhheliknit`adpdcshhhhhhhhhhhhhoeejdwtinnknknknknknknknnnishhhhhhhhhhhhhhleeeeeejdwtnnkkknnkkknknnxw`a`rbqhhhlwnnknnknnnrvhhhhhhhhhhhheeeeeeejdatbhhhhhhhhhhhoeeeeeeljpatbhhhhhhhhhhhheeeeeeeedatishhhhhhhhhhhoeeeeeejpawiirmhhhhhhhhhhhheeeeeeepcwxnrhhhhhhhhhhhhoeeeeejpawxnknnnknkkkkkkkkkknkkkrsrkknknnknknnbqhhhhhhhhhhhhejd`tinkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkknnrvhhhhheennnixuadpdcabhhhhhhhhhhhhhheejdatinnnnknkknknknnnkknrfhhhhhhhhhhhhhheeeeeeepawinnkknknkknnnnnxtw`brfhhhoexknnninnnnrhhhhhhhhhhhhleeeeeeejcwrshhhhhhhhhhhoeeeeeelpcwbshhhhhhhhhhhheeeeedejdwtrmhhhhhhhhhhhoeeeeeejd`uiirqhhhhhhhhhhhoeeeeeejp`txnrhhhhhhhhhhhhoeeeeejd`tnikknkknnrnkkkknknkkknbhhmnkknnknkknishhhhhhhhhhhhljjcwxnnkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknrmhhhhhllnnnituacpdc`urhhhhhhhhhhhhhhleepcwxnkknnnnkknknkknnnnrhhhhhhhhhhhhhhoeeeeeejpatinkknnkkknkkknnnxtxrvhhhholnknnixxinishhhhhhhhhhhheeeeeeejpaurvhhhhhhhhhhheeeeeeljpaurvhhhhhhhhhhhleeeejrsaawxrvhhhhhhhhhhhleeeeeejc`tnrshhhhhhhhhhhhleeeeedddwtnnrhhhhhhhhhhhhoeeeeejdwxxnnkknnnrghgkkkkknnkkkshhhcnkknnnnknnimhhhhhhhhhhhoejpawinkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknnrshhhhhleunnixwacppc`uxrmhhhhhhhhhhhhhleejd`tinkknknknnnnknknnishhhhhhhhhhhhhhoeeeeeejd`xinkkkknkknnknnnnnrrvhhhhheannnxxtxinrmhhhhhhhhhhhoeeeeeeejc`xrhhhhhhhhhhhheeeeeeljc`trqhhhhhhhhhhheeeeebghhctirvhhhhhhhhhhhleeeeeepauxibqhhhhhhhhhhhheeeeelrsswinkrhhhhhhhhhhhhoeeeeejcwxnnkkknkrbqhhfkkknkkkknshhhenkkkknkkknirqhhhhhhhhhhoeejd`tnnkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkrshhhhhleunnituacpdd`wxnnshhhhhhhhhhhhhheejpauxnnnkkknknnnnkknkimhhhhhhhhhhhhhhleeeeeejcwxnnkknnnkknnknknnirvhhhhhhexnnxuwwuxirfhhhhhhhhhhhleeeeeejjawrshhhhhhhhhhhleeeeeelpawrbhhhhhhhhhhhheeeearqhhl`iivhhhhhhhhhhhleeeeejp`wrrmhhfhhhhhhhhhheeeeegbhhfikkiqhhhhhhhhhhhheeeeejcuxnknkkkirfhhhldkknkkkkimhhhlnnnnkknnnknishhhhhhhhhhoeejpauxnkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknrshhhhhletnnixwaddpc`wxiknrhhhhhhhhhhhhhheeejcwxnnknknknnnnnnknnrfhhhhhhhhhhhhhheeeeeejpaunnnnnnknkkkknkkkrrvhhhhhhoennxtwaawxibhhhhhhhhhhhheeeeeeejdaurvhhhhhhhhhhheeeeeeejpaurshhhhhhhhhhhoeeejrmhhoeunivhhhhhhhhhhhleeeeejd`trshhmhhhhhhhhhhoeeee`rqhhlcnnnvhhhhhhhhhhhheeeeepawxknnkkirvhhhoe`kkknkkkrvhhhounknnnkknnnnrqhhhhhhhhhoeeejdwxnkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknrshhhhhoeannixw`cppdauxinkkifhhhhhhhhhhhhhoeejd`txnnnnkknknknknknbhhhhhhhhhhhhhhoeeeeeeedaunnnkknkkkwcxnnirbqhhhhhhhldnitwacawtrghhhhhhhhhhhheeeeeeejcwxrhhhhhhhhhhhheeeeeeejcwtrmhhhhhhhhhhhleeegghhhedinivhhhhhhhhhhhleeeeejcwrbqhhshhhhhhhhhhleeecrvhhoe`kknmhhhhhhhhhhhhoeeejpauinkkknrshhhhepnnkknnnkrfhhhhdniiiinnnknnnshhhhhhhhhleeejpatikkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkknkkkkkkkkkkkkkkkkkkinrshhhhhhejknixu`cpdcawtinknknfhhhhhhhhhhhhhheejpauxnnkknnknknnnknimhhhhhhhhhhhhhhleeeeeejd`tinknnknknkntnrrshhhhhhhhheuitucpdauxrfhhhhhhhhhhhleeeeeejpaurghhhhhhhhhhhoeeeeeelpcwxrvhhhhhhhhhhheeebbqhhleunnnmhhhhhhhhhhhheeeeeparbqhhvmhhhhhhhhhhleepbshhhepnnkkghhhhhhhhhhhhheeeepauxnkkirshhhhlenknnnknnnrhhhhhjixttxinknknnghhhhhhhhheeeeepawxnkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkknkkkkknnnkknrrghhhhhhoeitxxu`ddpdawwuxkkktrshhhhhhhhhhhhhhoeepcwxinkkntxuntinknrfhhhhhhhhhhhhhhleeeeeepcwxnnittnknnnnrrgfhhhhhhhhhoewwuapjjdairhhhhhhhhhhhhleeeeeejd`trmhhhhhhhhhhhleeeeeejdauxrfhhhhhhhhhhheebbqhhoeaxnnkshhhhhhhhhhhhqeeej`rbqhhorvhhhhhhhhhhleprshhhletnknkiqhhhhhhhhhhhhqeejp`tinnirvhhhhleukkniniiinrhhhhhhutuuuxinnnknrhhhhhhhhheeeeejcwxnkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkknnnxkkktnixikirvhhhhhhhopawtu`cppdcwuwuwxnktxshhhhhhhhhhhhhhhjejd`tinnkn`uw`t`nkrghhhhhhhhhhhhhhhleeeeejpcuxikutuwnknirgfhhhhhhhhhhhlj`p`djjpcwrghhhhhhhhhhhheeeeeeejcwxrqhhhhhhhhhhheeeeeeejdwtirhhhhhhhhhhhhvrbqhhoejtnnnirhhhhhhhhhhhhhvmwrrmqhhoerhhhhhhhhhhhfsrshhhleannnnnimhhhhhhhhhhhhhfcppatiirbfhhhhoewnnnixtutxighhhhhhjw`awtnnnnnnrhhhhhhhhleeeeejd`tikkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkknnkkkkininitrbvhhhhhhhhhdxwuwcppdcwtx`cutnnnrshhhhhhhhhhhhhhhqplddpcccwkxtkuntnirfhhhhhhhhhhhhhhhleeeeeejjdtnkwawtirrsfhhhhhhhhhhhhhed`adpjjcwxrmhhhhhhhhhhhoeeeeeejpauighhhhhhhhhhhoeeeeeejpcuxirhhhhhhhhhhhhhvhhhhleaxiknxtvhhhhhhhhhhhhhhvvhhhhheprhhhhhhhhhhhhvfhhhoepxiknnxxxqhhhhhhhhhhhhhqsgrrbsfhhhhhoednnkixww`uxrshhhhhhqaacauinnknighhhhhhhoeeeeeejd`xinkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkknnkkxnnirrgqhhhhhhhhhhmt``cdppc`uxwikntknirfhhhhhhhhhhhhhhhhqscawxnkkkxtktnxrrvhhhhhhhhhhhhhhhhqcpeeejc`xiitrrrbsvhhhhhhhhhhhhhhhoewcjjjjjawxrfhhhhhhhhhhhleeeeeejc`trmhhhhhhhhhhhleeeeeejdatinrhhhhhhhhhhhhhhhhhledwxinxtwshhhhhhhhhhhhhhhhhhhhelirhhhhhhhhhhhhhhhhoejuxinixtuushhhhhhhhhhhhhhhhhhhhhhhhhoecnknitu`aawtrshhhhhhhqddcwxnknnrfhhhhhhhleeeeeejd`tnnkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkknkkxrrgvhhhhhhhhhhhhhfgbuppc`uxiunirrrbsfhhhhhhhhhhhhhhhhhhhfsbrinknxxirrbsqhhhhhhhhhhhhhhhhhhqmsrrrrrrgsgmvqhhhhhhhhhhhhhhhhhhoe`djejejatxbhhhhhhhhhhhheeeeeeejcwtrfhhhhhhhhhhheeeeeeejcwxnnifhhhhhhhhhhhhhhhlejauxiiuw`wqhhhhhhhhhhhhhhhhhhlexkifhhhhhhhhhhhhhhheeauxxixww`wumhhhhhhhhhhhhhhhhhhhhhhhoedkkiixu`cca`trvhhhhhhhhmcd`tnnnrshhhhhhhleeeeeeejd`xnkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkknkkkkniinkkkngqhhhhhhhhhhhhhhhhhhqhpauxnktarvqhhhhhhhhhhhhhhhhhhhhhhhhhhhfskiaurvhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhejejeejjdddgshhhhhhhhhhhoeeeeeejpaurbhhhhhhhhhhhoeeeeeeepcuinknmhhhhhhhhhhhhhhleed`uxitu`awgqhhhhhhhhhhhhhhhhlewnnkmhhhhhhhhhhhhhheep`txxxuwa`wtimhhhhhhhhhhhhhhhhhhhhhlednnkxxu`cccauxrvhhhhhhhhhfgubrrbmhhhhhhhlejjeeeeejdwtnkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkknghhhhhhhhhhhhhhhhhhhhhj`tinkkkrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhowkkkrhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhejjeeejjcuxrvhhhhhhhhhhhleeeeeejd`tishhhhhhhhhhhleeeeeejd`uxnnknhhhhhhhhhhhhhleejd`uttw`aawxshhhhhhhhhhhhhhheeaxnniiqhhhhhhhhhhhoeeedautttwaawuxinahhhhhhhhhhhhhhhhhhoeeunnnixuwaccawtirqhhhhhhhhhhhhvvfhhhhhhhhlepdjeeeeepcuxnnkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkrhhhhhhhhhhhhhhhhhhhhhewxnkkkkkhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhodnkkkhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhoejjeeejpauxnhhhhhhhhhhhheeeeeeejcwxivhhhhhhhhhhheeeeeeejd`tnnknkrhhhhhhhhhhleeeejdawuw`aawuxiwhhhhhhhhhhhhoeecwttxtuwhhhhhhhhhhleeejpawuw`aa`wtnnnn`ohhhhhhhhhhhhhholejxnnnxtu`cddawuxnrhhhhlllohhhhhhhhhhhhhhlee`wcjeeeejdauinkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkteeeeeeeeeeeeeeeeeeeeewxnnkkknkeeeeeeeeeeeeeeeeeeeeeeeeeeeeeepnnnkkeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeejd`tinneeeeeeeeeeeeeeeeeepauxnkdeeeeeeeeeeeeeeeeepcuxnnknknnoohhhooleeeeeeepcaaaaa`uxnnnxoohhhhhholeeejda`www`adohhhhhhoeeeeeepdaa`acawtxnnnnitplohhhhhhhhoolee`tttttu``ccdc`txinihhhel``dllohhhhhhhholeeaixwdjeeeejcwxikkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkknnnixuwadpeeeeejdwtinnnkkkkkknknnniixwapeeeeeeeeeeeeepc`txinnnnknknnkniiuwcpleeeeeeeeeeelpawxinnnnnnnnixxxxuuw`adpjjeeeeeeepcwtnknknnnniuadleeeeeeejp`tinkkknknixwdjeeeeeeejd`uinnkkknkn`peeeeeeeeeeeejpddccawtiiknniclllleeeeeeeejpccccccccpllleeeeeeeeejpdccca`uiiknknnxwajeelllleeeeepc`wwww`acddda`utnnnnglejxnxwdjeeelllleeed`knit`djeejjdauxnnkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkknknnixuwadjjeeeeejdawtxinnnkknkknnnixtu`cpleeeeeeeeeeeejpc`uuxiinnnknnnixuwapjeeeeeeeeeeeeejc`utxiniixxxxtuuw`acdppjeeeeeeeejpatxikknkkkniuapjeeeeeeejdwtnnkkkkknit`djeeeeeeejd`tnnknnknknniuapeeeeeeeeejjjdcawtinnknnixwcleeeeeeeeeejjpppdcawuucpjeeeeeeeeejjpdc`uxinkkkknitwcpjeeeeeeeeejppdcccddppdc`uxinkkkiuuxnit`djeeljjdc`iinnnnxwcpjeejpawxnnkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkknitw`cpjjeeeeeejjda`wtxnnkkknknixtuw`cpjeeeeeeeeeeeeeejpca`wutinnknnitw`cdjjeeeeeeeeeeeeejpcawwuuuuuwww``acddpjjjeeeeeeeeejd`tinnknkknnxucpeeeeeeejpcwinnkkknkiiuadjeeeeeejjawxnnkkknknknitadjeeeeeeeeejpdcwtinnknkkniu`djeeeeeeeeeeljjpdawttxuadjeeeeeeeejjpc`utinnknkkknitwcpjeeeeeeeeeejjjjjpjpdc`tixnknnnknkkkxtadjjeejpd`wuxxxxxw`djjjjpcwtinkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkknkixuacdjjjejeejejjddaawtinnkkknnxtw`acdpjejeeeeeeeejejjjjpdaa`utinnnitwacdpjjeeeeeeeeeejejjjddcaa`a`aaacccddppjjejejeeeeejjpcwxnknkknnknxwcpjeeeejejd`tinkkkkknnxuapjjeeeejjdauinknkknkkknixwcpeeeeeeeejjpa`txnknknknnnxwadjleeeeeeeejjpdawtiiitwcpeeeeeeeejpcauxinknknknknnxtwcdjjeeeeeeeeejjjjjpcawuxikikknknknnnitapjjjjjppcawuuuuwacpjjjda`txnnknkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkknntw`cdpppjjpjpjppddca`uxnnkkknixu`acddpppjppjpppjpjjjpppddcaawtxnnnxu`acdpppppppppjppjjpjppddccaccacccccddddppppppjppppjpdc`txnkkknkknnxwacpppppppdcwxinkkkknknxuacpppppppdawxinknnkknkknnxuacpjejejjjpcautinknkkknknnxxwadpjeeeejejjpd`wxinnniu`cpjeeeejjpc`utnnknkkkkkknnnxtwacppejeejejeejjpdcawuinnkkknknknkknxu`dppppddddcca```ccdpppcawxxnkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkknnxu`aaaccacccacacaaa`wtinkknkknitw`aaaacaacccccacccaccacaca``wtinnnitw`aaaaacacacaccccccacaaaa````a`aaaaaaaacccacaccdcacaawuxnnkknkknknxuwaaccccaa`wuinknkkkknnitwaaccccacawtinknknknnkknnnxu`cdpppddcawuxinnkkkkkkknnnitw`ddppjjppdda`uxikkknnxu`ddppppdcawuxnnknknnkknkknnnitu`acdppjjjjpppdc`wuxinnknkknkkkkknnit`cccaaaaaccccccacdcccawuxinkkkkkknkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkknixtuuuuuwuuuwuuuuuuttxixkkkknnixttuuuuuwuuuuwuwuuuwuwuwuuuuttxnnnnxattuuuwuuuuudauuutuuwu`uuuuuuwuuuac`cuwuawuuuwuwawwuutxxnnnkkkkknnnnxcwuuuuuuuttinnkkkkkkknnactuuuuu`ctxxii`iwikknkkknnixuw`aaa``wutxinkkkkkkkutkkknixuwaaccccaawutxnw`ikkkixu`acdccawuxinnnkkkkknknki`kknnxxuwaadccccca``wuxinnnkkkkkkknnknkkitu``wuuuuww```aaaaaa`wutxiknkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkknnixxxxxxxxiiiiiiixinnwnkkkkknnnniiiiiixixixxixixiixxxxxxxxiinnknnntiiixxxixxxxpxxixxiii`txxxxiuwixiucupixiiwixixixwiixxiinkkkkkkkkkknnniuxxiiiiuiinnkkkkkknkknntiixiiuxiatnnkdndxkknknkknnnxxtuuuuxxxinnnkknkkkkkxknkkknuxuuwwwwuuxxinnknxkkknnixuuwwuutxnnkkkkkknknkkkkxnknknnittuwawwwuuutxinnnkkkkkkkkkkkkkknnixuttxiixxttuuwwwuuuttxinnkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkknnknnnnnkninnnknnnnnkwkknknxinkntnxxinnxxnxtknnnnttnnnxxxtiknkkixnxnnnnnnnnnnuunnnnknnnwnnnnnnunnnnt`icnnnnunnknknitnnnknkknkkkiinxxknnnxxtnnniwxxxnkxixninnkkkxnnknkxnnnnknkck`nknkkknkknknnniiiiinnnkknkkknkkkkinxnkniwtuwtxututitnnkkkxnkkkknnixiutuxixknkkixnkkknxxnxkknnxxnniix`xxxxiinnnnkkkkkkkkkkkknkkkkkniininnnnnniixxxxxxiinnknkknkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkknkknknkknkknknkkkkkkkkiikkkkxxxtkkxwuxttknu`xx`kkxuxxwnkiwtxtiknxtxuwkkkkknkkknunkkkknkkiiknnnnntknkknukukkkkktkkkkkntkkkkkkkkkkkiuwxxwkkk`xxukknuxxnkkxwxwxtiknkxkkkkkiwinkkkk`kukknkkkkkkkknknnnnnknknkkkkkkkknkkutxtnknutttnntwtwxxtkkkkikkkkkknnnnx`xwxxxkkutxuxnkitxuwkkxuxiwnnnnxxnnnnnnnkkkkkkkkkkkkkkknkknknnnnknkkknknnnnnnnnnnnknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkxkkkkktwutkkktkkktkktkkknxnuixxtukkikkkxkkxkkktnnknkkknkkkkknkknkkxkkkkkkkxkkkkkkkknknkktnkkkkkntkkkkkkkkkkktkkknxnkxkkxkkkxkkkkkkukxkkxkkkxkkkkkkkktikkkknkkkkknknkkkkknkkkkknkknknknknkkkkkikkkxkkxkknnnk`ktkkxkknkxkknkwuwwwikwkxkkiknnkkkxkktkkktkkuiixtukkkkxkkkkkkkkkkkkkkkknkknkkkknkkkknknkkkkknknkkknknknkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkknkkkkkkkkkxkkkkxnkkxkkktkkkxnktkkknikwiixiinkxkkkxkkxkkkikkkkknkkkkkkkkkkkknikkknknkxknkkknkknkknknukkkkkkwkkkkkkkknkktkkknikkxkkxkkkxknkkkkwkikkxkkkxkkkkkikknxkkkkkkkknkkknknkkkkkkkkkkkkkkkkkkkkkkkkxkknxkkxknkkknwkxkkxnkknxkkkkkkkkknkwkikkikxkkkkxkkxkkkxknuxiixnkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknknkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkknikkkxkknukkkwnknxkkutknukkttkkknkkxnnkxkktnkiwkknkkkkkkkkkkkkkkkknxkkknkntkkkkkknkkkknkktkkkkkknnkkkkiukkkkttkntkkkxkkikkktkkknkkukxkkxkkkxkkkkkttxxkkkknknkkknkkkkknknkkkkkkknwiknkknkkkkkkxkkkxkkinknnkkwkikkinkkkxnknkkkkkkkkukikkikktnknxkktnkiwkktxkkknknktkkkkkkknknkkkkkkkkkkkkkknknkkkkkkkknkknkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkktkkknuuixtkkituxkkkinutnkkkiuwiknxuikxukkktuxnwkkknknknkkkknkkkkkkukknkkktnkkkkkknkkkkkkntkkkkkkukkkkiukkkkinutnkkuuknuukkkuwuikuukxnkukxuuwuikkkkiknkkknkkkkkknkknkkkkkkkkkkknunkknkkkkkknxunkuuikkxwuxktuinxkxinwuuutkkkkkkkktuinxkxnkkuuxkkkkuuxnukknuuiknkkukkkkkkkkkkkkkkkkkkkknkkknkkkkknknkkkkkkkkkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkknkkkkknnkkkkkkkkkkikkkkkkikkkkknkkkknkkkkkknkkkkkkkknkkkkkkkkkkkkknkkkkkniknknkkxkkkkkkkknknkkknnkkkkkikkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknknkkknkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknkkknkkkkkkkkkkkkkkknknkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkxnkkkkkkkkkkknkkkkkkkkkkkkkknknkknkkkkknkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkuwtkkkkxwuknkkknkkkkknkkkkkkkkkkkkkkknkkknkknkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkxwunkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkknknkknkkkkkkkknkkkkkkkknkkkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknknkkkkkkkkkknknkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkknkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkknkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkkkkkkkkkknkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkknkknkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkknkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkknkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkknnkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkknknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkknknknktixikkkxkkkkkkinkkkkkkkkkkkkkkkkkkknxkkkkkkkkkkkkkkkkkkkkknxnkkkkkkikkkkkixnxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkktikkkkkkkkkkkkkkkkkkkkktxkkkkknkkkkkkkkkkkkkkkkkkkkkkkkinkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkknkkkkkkkkkkkkkkkkkkxnkkkxixtkkkknkkkkkkikkkkkkkkkkkkkkkkkkkknkkkkkkknkkkkkkkkkkkkkkknkkkkkikkukkkntnukkkkkkkkkkkkkkkkkkkkkkknkkkknkkkknkkkkkknkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkknkkkkkkkikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkikkkkxnixkkkkikkkkkkiknkkkkkkkkkkkknnnkkknknkkkkninnkkknnnknkkkkknkkkkknkkkkkknxktkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkinikkkninnnkkininnnkkkknkkkkkkkkkkkiniknnkkkknikkkkknnknkkkknkkkkkkikkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkkknnkkknnnnnkkkkknkkkkkkikkkkkkkkkkknxnninkkninnnkkninnkkkinninikkkknkkkkkninkkkkkikikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxnnikkninnnkknxnxninkkknkkkkkkkkkkknxnxnnnkkxnnxnkkinnxnkkinniikkkknkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkkikkkkkkikkkkkkkkkkknnnnnxkknkkknkkknkkkkknnknknkkkknkkkkkkkkikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkknkkkkkkxknkknkkknkkkkkxxxxxkkxknkknknkkkknknkkkknkkinnnikkkknkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkkikkkkkkkkkkinnnnnkkkkkknkkknkkkkknnknknkkkknkkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkknkkknkkkkkkiknkknkkknkkkkkkkkkkkkiknkknknkkkknknkkkknkkinnnnkkkknkkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkknkkkkkiikkkkikkkkkknkkknkkknkkkkknkkkkkkkkknkkkknninkkkkkkkkkkkkkkkkkkkkkkkkkkkkikkkkkkkkkkkknkknkkknkkkkkkiknkknkkknkkkkkkkkkkkkiknkknknnkknkkknkknnkkxkkkkkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkkkkkkkkkknkkkkkkknkkkknnkkkkkiinkkknnknnnkkkinnkkinkikknkninnikkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkknikkkkkkkkkkkiikkiikkkninkkiiknnkiknninikkkkkkkkkinknkkikkkiinkkkkinnnnkkniikkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkknkkkkkknkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" };
--- a/info/dir Mon Aug 13 09:21:56 2007 +0200 +++ b/info/dir Mon Aug 13 09:23:06 2007 +0200 @@ -53,10 +53,12 @@ * CL:: A Common Lisp compatibility package for Emacs-Lisp. * Custom:: Customization Library for Emacs * Ediff:: A Visual Interface to Unix Diff and Patch Utilities. +* EFS:: Transparent remote file access via FTP * External-Widget:: Use XEmacs as a text widget inside of another program. * Forms:: A package for editing databases by filling in forms. * Gnus:: A netnews and mail reader for XEmacs. +* HM--HTML-Mode:: HTML Editing Mode. * Hyperbole:: A programmable information management and hypertext system. * ILISP:: Multi-dialect inferior LISP interface. * Ispell:: Interactive spelling corrector.
--- a/lib-src/ChangeLog Mon Aug 13 09:21:56 2007 +0200 +++ b/lib-src/ChangeLog Mon Aug 13 09:23:06 2007 +0200 @@ -1,3 +1,7 @@ +Sun Mar 23 15:57:19 1997 Steven L Baur <steve@altair.xemacs.org> + + * update-elc.sh (make_special_commands): Use target of x20 for efs. + Wed Mar 19 10:38:04 1997 Steven L Baur <steve@altair.xemacs.org> * Makefile.in.in (SCRIPTS): Link gzip-el.sh in --srcdir
--- a/lib-src/emacsserver.c Mon Aug 13 09:21:56 2007 +0200 +++ b/lib-src/emacsserver.c Mon Aug 13 09:23:06 2007 +0200 @@ -59,6 +59,13 @@ #if ! defined (HAVE_SYSVIPC) /* BSD code is very different from SYSV IPC code */ +#include "../src/sysproc.h" /* Needed for select */ +#ifndef SOCK_STREAM +/* this is normally included by src/sysproc.h. might be safe to omit + * it entirely. lousy ultrix's sys/socket.h chokes if it's included + * twice, so we can't include unconditionally. */ +#include <sys/socket.h> +#endif #include <sys/types.h> #include <sys/file.h> #include <sys/signal.h> @@ -66,13 +73,6 @@ #include <sys/un.h> #include <stdio.h> #include <errno.h> -#include "../src/sysproc.h" /* Needed for select */ -#ifndef SOCK_STREAM -/* this is normally included by src/sysproc.h. might be safe to omit - * it entirely. lousy ultrix's sys/socket.h chokes if it's included - * twice, so we can't include unconditionally. */ -#include <sys/socket.h> -#endif void main ()
--- a/lib-src/update-elc.sh Mon Aug 13 09:21:56 2007 +0200 +++ b/lib-src/update-elc.sh Mon Aug 13 09:23:06 2007 +0200 @@ -111,7 +111,7 @@ #make_special vm #make_special ediff elc #make_special viper elc -make_special efs +make_special efs x20 make_special gnus some make_special w3 xemacs-w3 make_special hyperbole elc
--- a/lisp/ChangeLog Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/ChangeLog Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,64 @@ +Fri Jul 19 12:01:51 1996 Christoph Wedler <wedler@fmi.uni-passau.de> + + * packages/info.el (Info-elisp-ref): Look first in lispref, then + elisp. + + * packages/func-menu.el (fume-function-name-regexp-bibtex): `,' + isn't allowed. + + * packages/etags.el (list-tags): Interactive argument should be an + existing file name. + +Wed Mar 26 22:33:40 1997 Steven L Baur <steve@altair.xemacs.org> + + * Remove ns lisp directory. + * Remove vms lisp directory. + +Tue Mar 25 12:22:57 1997 Steven L Baur <steve@altair.xemacs.org> + + * prim/files.el (file-remote-p): Update doc string. + + * packages/terminal.el (te-stty-string): Fix definition for Linux. + +Mon Mar 24 23:43:53 1997 Steven L Baur <steve@altair.xemacs.org> + + * prim/files.el (file-remote-p): Correct documentation and allow + for `allow-remote-paths' to control loading of efs. + +Sun Mar 23 16:58:08 1997 Tomasz J. Cholewo <t.cholewo@ieee.org> + + * packages/etags.el (with-caps-disable-folding): New macro. + (find-tag-internal): Use it. + (tags-search): Use it. + (tags-query-replace): Use it. Case bug corrected. + +Mon Mar 24 00:47:38 1997 Steven L Baur <steve@altair.xemacs.org> + + * x11/x-menubar.el (popup-mode-menu): Change guard when stripping + keywords to be more robust. + +Sun Mar 23 00:26:53 1997 Steven L Baur <steve@altair.xemacs.org> + + * prim/startup.el (splash-hack-version-string): Correct for case + of hosts with '-' in the names. + +Sat Mar 22 14:25:47 1997 Tomasz J. Cholewo <t.cholewo@ieee.org> + + * modes/sendmail.el (user-mail-address): Require cus-edit. + Fix when scope. + +Sat Mar 22 14:25:47 1997 Tomasz J. Cholewo <t.cholewo@ieee.org> + + * calendar/diary-lib.el (diary-countdown): New function. + (fancy-diary-display): Use modeline-buffer-identification. + + * calendar/appt.el (appt-diary-entries): Do not display diary. + (appt-check): Display diary buffer at midnight. + Fri Mar 21 19:16:46 1997 Steven L Baur <steve@altair.xemacs.org> * mule/mule-coding.el (enable-multibyte-characters): MULE - compatabile variable. + compatible variable. Thu Mar 20 13:28:17 1997 Steven L Baur <steve@altair.xemacs.org>
--- a/lisp/README Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/README Mon Aug 13 09:23:06 2007 +0200 @@ -67,7 +67,7 @@ loads a file named $TERM.el from this directory, if that file exists. - vms VMS-specific code. + vms VMS-specific code. (Not functional) x11 X Window System-specific code. @@ -80,19 +80,27 @@ Some packages are fairly large; those have been given their own directories: + auctex A package for editing TeX documents. + bytecomp The XEmacs-lisp compiler. calendar A calendar and appointment manager. + cl Common Lisp compatibility code. + comint General code for interacting with inferior processes, like shell buffers and lisp interpreters. - dired The directory editor. + custom User environment customization code. edebug A source-level debugger for Elisp. ediff A comprehensive visual interface to diff and patch. + efs The directory editor, remote FTP frontend. + + egg MULE Input Method. + electric The "electric" commands; these implement temporary windows for help, list-buffers, etc. @@ -103,7 +111,7 @@ eterm A merge of the comint shell mode with an ANSI-compatible terminal-emulator. - gnus An NNTP-based newsreader; version 3.14. + gnus A network news and mail reader. hm--html-menus Menu interface to html-mode. @@ -112,22 +120,47 @@ ilisp A comint-based package for interacting with inferior lisp processes. + iso ISO Latin language support. + + its MULE Input Method. + + locale IE18N stuff. + + mailcrypt Package for dealing with PGP encrypted messages. + + mel MIME encoding library (part of the Tools for MIME). + mh-e An interface to the MH-E mail handling system. + mu Message Utilities library (part of the Tools for + MIME). + + mule Multi-lingual extensions for XEmacs. + + ns NeXTStep support. + oobr An Object-Oriented class browser. pcl-cvs An interface to the Concurrent Version System. + psgml General purpose SGML editing support with extra + support for editing HTML. + + quail MULE Input Method. + rmail A BABYL-format mail reader. sunpro Additional code for interfacing with SunPro products. + tl Tiny Library (Part of the Tools for MIME). + + tm Tools for MIME. MIME support for emacs lisp based + news and mail readers. + tooltalk An inteface to the ToolTalk communication protocol. viper A full-featured VI emulator. vm View Mail, an UNIX-format alternative to RMAIL. - url A Uniform Resource Locator retrieval tool. - w3 A World Wide Web interface.
--- a/lisp/calendar/appt.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/calendar/appt.el Mon Aug 13 09:23:06 2007 +0200 @@ -24,7 +24,10 @@ ;;; 29-nov-89 created by Neil Mager <neilm@juliet.ll.mit.edu>. ;;; 23-feb-91 hacked upon by Jamie Zawinski <jwz@lucid.com>. ;;; 1-apr-91 some more. -;;; 12-jul-95 updated for XEmacs 19.12 by Greg Veres <gveres@cgl.uwaterloo.ca> +;;; 12-jul-95 updated for XEmacs 19.12 by Greg Veres +;;; <gveres@cgl.uwaterloo.ca> +;;; 21-mar-97 better support for fancy diary display by Tomasz J. Cholewo +;;; <t.cholewo@ieee.org> ;;; ;; appt.el - visible and/or audible notification of ;; appointments from ~/diary file generated from @@ -117,7 +120,7 @@ ;;; ;;; This also interacts correctly with Benjamin Pierce's reportmail.el package. ;;; -;;; Brief internal description - Skip this if your not interested! +;;; Brief internal description - Skip this if you are not interested! ;;; ;;; The function appt-initialize invokes 'diary' to get a list of today's ;;; appointments, and parses the lines beginning with date descriptions. @@ -133,7 +136,7 @@ ;;; ;;; TO DO: ;;; -;;; o multiple adjascent appointments are not handled gracefully. If there +;;; o multiple adjacent appointments are not handled gracefully. If there ;;; is an appointment at 3:30 and another at 3:35, and you have set things ;;; up so that you get a notification twenty minutes before each appt, ;;; then a notification should come at 3:10 for the first appt, and at @@ -369,7 +372,7 @@ ;;; Internal stuff (defun appt-convert-time (time2conv) - " Convert hour:min[am/pm] format to minutes from midnight." + "Convert hour:min[am/pm] format to minutes from midnight." (cond ((string-match "^[ \t]*midni\\(ght\\|te\\)[ \t]*\\'" time2conv) 0) ((string-match "^[ \t]*noon[ \t]*\\'" time2conv) @@ -401,8 +404,8 @@ (+ (* hr 60) min))))) -(defun appt-current-time-in-seconds () - "returns the current time in seconds since midnight." +(defun appt-current-time-in-minutes () + "Returns the current time in minutes since midnight." (let* ((str (current-time-string)) (hour (string-to-int (substring str 11 13))) (min (string-to-int (substring str 14 16)))) @@ -415,17 +418,18 @@ (< (car (car x)) (car (car y))))))) (defun appt-diary-entries () + "Return an updated list of appointments for today." (let ((list-diary-entries-hook '(appt-make-list)) - (diary-display-hook nil) + (diary-display-hook 'ignore) (diary-list-include-blanks nil)) ;; this will set appt-time-msg-list. (diary 1) appt-time-msg-list)) (defun appt-initialize () - " Read your `diary-file' and remember today's appointments. Call this from + "Read your `diary-file' and remember today's appointments. Call this from your .emacs file, or any time you want your .diary file re-read (this happens - automatically at midnight to move to notice the next day's appointments). + automatically at midnight to notice the next day's appointments). The time must be at the beginning of a line for it to be put in the appointments list. @@ -483,11 +487,11 @@ (append (nreverse new-appts) appt-time-msg-list)))) (setq appt-time-msg-list (appt-sort-list appt-time-msg-list)) ;; - ;; Get the current time and convert it to minutes from midnight. ie. 12:01am - ;; = 1, midnight = 0, so that the elements in the list that are earlier than - ;; the present time can be removed. + ;; Get the current time and convert it to minutes from midnight, i.e., + ;; 12:01am = 1, midnight = 0, so that the elements in the list that + ;; are earlier than the present time can be removed. ;; - (let ((cur-comp-time (appt-current-time-in-seconds)) + (let ((cur-comp-time (appt-current-time-in-minutes)) (appt-comp-time (car (car (car appt-time-msg-list))))) (while (and appt-time-msg-list (< appt-comp-time cur-comp-time)) (setq appt-time-msg-list (cdr appt-time-msg-list)) @@ -548,8 +552,8 @@ (if appt-issue-message (let ((min-to-app -1)) ;; Get the current time and convert it to minutes - ;; from midnight. ie. 12:01am = 1, midnight = 0. - (let* ((cur-comp-time (appt-current-time-in-seconds)) + ;; from midnight, i.e., 12:01am = 1, midnight = 0. + (let* ((cur-comp-time (appt-current-time-in-minutes)) ;; If the current time is the same as the tick, just return. ;; This means that this function has been called more than once ;; in the current minute, which is not useful. @@ -559,8 +563,8 @@ ;; ;; If it is now the next day (we have crossed midnight since the last ;; time this was called) then we should update our appointments to - ;; today's list. - (if turnover-p (appt-diary-entries)) + ;; today's list. Show the diary entries (tjc). + (if turnover-p (diary 1)) ;; ;; Get the first time off of the list and calculate the number ;; of minutes until the appointment.
--- a/lisp/calendar/diary-lib.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/calendar/diary-lib.el Mon Aug 13 09:23:06 2007 +0200 @@ -359,8 +359,7 @@ (save-excursion;; Prepare the fancy diary buffer. (set-buffer (get-buffer-create fancy-diary-buffer)) (setq buffer-read-only nil) - (make-local-variable 'mode-line-format) - (calendar-set-mode-line "Diary Entries") + (setq modeline-buffer-identification '("Diary Entries")) (erase-buffer) (let ((entry-list diary-entries-list) (holiday-list) @@ -1102,6 +1101,13 @@ order of the parameters should be changed to D1, M1, Y1, D2, M2, Y2.) + %%(diary-countdown BEFORE AFTER M1 D1 Y1) text + Entry will appear on dates between BEFORE days before + and AFTER days after specified date. (If + `european-calendar-style' is t, the order of the + parameters should be changed to BEFORE, AFTER, D1, M1, + Y1.) + %%(diary-anniversary MONTH DAY YEAR) text Entry will appear on anniversary dates of MONTH DAY, YEAR. (If `european-calendar-style' is t, the order of the @@ -1261,7 +1267,7 @@ (defun diary-block (m1 d1 y1 m2 d2 y2) "Block diary entry. Entry applies if date is between two dates. Order of the parameters is -M1, D1, Y1, M2, D2, Y2 `european-calendar-style' is nil, and +M1, D1, Y1, M2, D2, Y2 if `european-calendar-style' is nil, and D1, M1, Y1, D2, M2, Y2 if `european-calendar-style' is t." (let ((date1 (calendar-absolute-from-gregorian (if european-calendar-style @@ -1275,6 +1281,28 @@ (if (and (<= date1 d) (<= d date2)) entry))) +(defun diary-countdown (before after m1 d1 y1) + "Countdown diary entry. +Entry applies if date is between BEFORE days before and AFTER days after +specified date. Order of the parameters is BEFORE, AFTER, M1, D1, Y1 if +`european-calendar-style' is nil, and BEFORE, AFTER, D1, M1, Y1 if +`european-calendar-style' is t." + (let* ((date1 (calendar-absolute-from-gregorian + (if european-calendar-style + (list d1 m1 y1) + (list m1 d1 y1)))) + (d (calendar-absolute-from-gregorian date)) + (diff (- d date1))) + (cond + ((and (<= (- before) diff) (< diff 0)) + (concat (format "It is %d day%s before " + (- diff) (if (= diff -1) "" "s")) entry)) + ((= diff 0) (concat (format "TODAY: " diff) entry)) + ((and (<= diff after) (> diff 0)) + (concat (format "It is %d day%s after " + diff (if (= diff 1) "" "s")) entry)) + (t nil)))) + (defun diary-float (month dayname n) "Floating diary entry--entry applies if date is the nth dayname of month. Parameters are MONTH, DAYNAME, N. MONTH can be a list of months, the constant
--- a/lisp/custom/ChangeLog Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/custom/ChangeLog Mon Aug 13 09:23:06 2007 +0200 @@ -1,3 +1,56 @@ +Thu Mar 27 19:31:40 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 1.68 released. + +Thu Mar 27 18:50:16 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * widget.el (:active): New keywords. + (:inactive): Ditto. + (:activate): Ditto. + (:deactivate): Ditto. + + * wid-edit.el (widget-inactive-face): new face. + (widget-specify-inactive): New function. + (widget-overlay-inactive): Ditto. + (widget-specify-active): Ditto. + (widget-apply-action): Ditto. + (widget-field-activate): Use it. + (widget-button-click): Ditto. + (widget-button1-click): Ditto. + (widget-button-press): Ditto. + (widget-gui-action): Ditto. + (default): Use new keywords. + (widget-default-active): New function. + (widget-default-deactivate): Ditto. + (widget-checkbox-action): New function. + (checkbox): Use it. + (widget-checklist-add-item): Initialize active state. + (widget-radio-add-item): Ditto. + (widget-radio-value-set): Ditto. + (widget-radio-action): Ditto. + + * widget.texi (Widget Properties): Document the new keywords. + +Mon Mar 24 18:36:15 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * Version 1.67 released. + +Mon Mar 24 18:19:05 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * cus-edit.el (custom-save-all): Added autoload. + + * Version 1.66 released. + +Mon Mar 24 18:09:04 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * wid-edit.el (widget-default-delete): Added workaround for bug + with empty `:format'. + +Thu Mar 20 12:33:59 1997 Per Abrahamsen <abraham@dina.kvl.dk> + + * custom.texi (The Init File): Explain that `custom-file' is not + automatically loaded. + Tue Mar 18 14:42:31 1997 Per Abrahamsen <abraham@dina.kvl.dk> * Version 1.65 released.
--- a/lisp/custom/cus-edit.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/custom/cus-edit.el Mon Aug 13 09:23:06 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: help, faces -;; Version: 1.65 +;; Version: 1.68 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -517,6 +517,7 @@ (custom-mode) (widget-insert "This is a customization buffer. Push RET or click mouse-2 on the word ") + ;; (put-text-property 1 2 'start-open nil) (widget-create 'info-link :tag "help" :help-echo "Read the online help." @@ -1763,6 +1764,7 @@ (unless (eolp) (princ "\n"))))) +;;;###autoload (defun custom-save-all () "Save all customizations in `custom-file'." (custom-save-variables)
--- a/lisp/custom/cus-face.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/custom/cus-face.el Mon Aug 13 09:23:06 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: help, faces -;; Version: 1.65 +;; Version: 1.68 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary:
--- a/lisp/custom/custom.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/custom/custom.el Mon Aug 13 09:23:06 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: help, faces -;; Version: 1.65 +;; Version: 1.68 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary:
--- a/lisp/custom/wid-browse.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/custom/wid-browse.el Mon Aug 13 09:23:06 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: extensions -;; Version: 1.65 +;; Version: 1.68 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary:
--- a/lisp/custom/wid-edit.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/custom/wid-edit.el Mon Aug 13 09:23:06 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: extensions -;; Version: 1.65 +;; Version: 1.68 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -24,6 +24,9 @@ (autoload 'pp-to-string "pp") (autoload 'Info-goto-node "info") + (when (string-match "XEmacs" emacs-version) + (require 'overlay)) + (if (string-match "XEmacs" emacs-version) ;; XEmacs spell `intangible' as `atomic'. (defun widget-make-intangible (from to side) @@ -380,6 +383,41 @@ (goto-char (point-max)) result))) +(defface widget-inactive-face '((((class grayscale color) + (background dark)) + (:foreground "light gray")) + (((class grayscale color) + (background light)) + (:foreground "dark gray")) + (t + (:italic t))) + "Face used for inactive widgets." + :group 'widgets) + +(defun widget-specify-inactive (widget from to) + "Make WIDGET inactive for user modifications." + (unless (widget-get widget :inactive) + (let ((overlay (make-overlay from to nil t nil))) + (overlay-put overlay 'face 'widget-inactive-face) + (overlay-put overlay 'evaporate 't) + (overlay-put overlay (if (string-match "XEmacs" emacs-version) + 'read-only + 'modification-hooks) '(widget-overlay-inactive)) + (widget-put widget :inactive overlay)))) + +(defun widget-overlay-inactive (&rest junk) + "Ignoring the arguments, signal an error." + (unless inhibit-read-only + (error "Attempt to modify inactive widget"))) + + +(defun widget-specify-active (widget) + "Make WIDGET active for user modifications." + (let ((inactive (widget-get widget :inactive))) + (when inactive + (delete-overlay inactive) + (widget-put widget :inactive nil)))) + ;;; Widget Properties. (defsubst widget-type (widget) @@ -440,6 +478,12 @@ (cons (list (car vals)) (cdr vals))) (t nil))) +(defun widget-apply-action (widget &optional event) + "Apply :action in WIDGET in response to EVENT." + (if (widget-apply widget :active) + (widget-apply widget :action event) + (error "Attempt to perform action on inactive widget"))) + ;;; Glyphs. (defcustom widget-glyph-directory (concat data-directory "custom/") @@ -659,7 +703,7 @@ (interactive "@d") (let ((field (get-text-property pos 'field))) (if field - (widget-apply field :action event) + (widget-apply-action field event) (call-interactively (lookup-key widget-global-map (this-command-keys)))))) @@ -670,12 +714,12 @@ (event-glyph event)) (let ((widget (glyph-property (event-glyph event) 'widget))) (if widget - (widget-apply widget :action event) + (widget-apply-action widget event) (message "You clicked on a glyph.")))) ((event-point event) (let ((button (get-text-property (event-point event) 'button))) (if button - (widget-apply button :action event) + (widget-apply-action button event) (call-interactively (or (lookup-key widget-global-map [ button2 ]) (lookup-key widget-global-map [ down-mouse-2 ]) @@ -690,7 +734,7 @@ (event-glyph event)) (let ((widget (glyph-property (event-glyph event) 'widget))) (if widget - (widget-apply widget :action event) + (widget-apply-action widget event) (message "You clicked on a glyph."))) (call-interactively (lookup-key widget-global-map (this-command-keys))))) @@ -699,7 +743,7 @@ (interactive "@d") (let ((button (get-text-property pos 'button))) (if button - (widget-apply button :action event) + (widget-apply-action button event) (let ((command (lookup-key widget-global-map (this-command-keys)))) (when (commandp command) (call-interactively command)))))) @@ -947,6 +991,9 @@ :value-inline 'widget-default-value-inline :menu-tag-get 'widget-default-menu-tag-get :validate (lambda (widget) nil) + :active 'widget-default-active + :activate 'widget-specify-active + :deactivate 'widget-default-deactivate :action 'widget-default-action :notify 'widget-default-notify) @@ -1077,7 +1124,9 @@ (inhibit-read-only t) after-change-functions) (widget-apply widget :value-delete) - (delete-region from to) + (when (< from to) + ;; Kludge: this doesn't need to be true for empty formats. + (delete-region from to)) (set-marker from nil) (set-marker to nil))) @@ -1101,6 +1150,19 @@ (widget-get widget :tag) (widget-princ-to-string (widget-get widget :value)))) +(defun widget-default-active (widget) + "Return t iff this widget active (user modifiable)." + (and (not (widget-get widget :inactive)) + (let ((parent (widget-get widget :parent))) + (or (null parent) + (widget-apply parent :active))))) + +(defun widget-default-deactivate (widget) + "Make WIDGET inactive for user modifications." + (widget-specify-inactive widget + (widget-get widget :from) + (widget-get widget :to))) + (defun widget-default-action (widget &optional event) ;; Notify the parent when a widget change (let ((parent (widget-get widget :parent))) @@ -1196,7 +1258,7 @@ (defun widget-gui-action (widget) "Apply :action for WIDGET." - (widget-apply widget :action (this-command-keys))) + (widget-apply-action widget (this-command-keys))) ;;; The `link' Widget. @@ -1492,7 +1554,17 @@ :on "[X]" :on-glyph "check1" :off "[ ]" - :off-glyph "check0") + :off-glyph "check0" + :action 'widget-checkbox-action) + +(defun widget-checkbox-action (widget &optional event) + "Toggle checkbox, notify parent, and set active state of sibling." + (widget-toggle-action widget event) + (let ((sibling (widget-get-sibling widget))) + (when sibling + (if (widget-value widget) + (widget-apply sibling :activate) + (widget-apply sibling :deactivate))))) ;;; The `checklist' Widget. @@ -1549,7 +1621,9 @@ ((eq escape ?v) (setq child (cond ((not chosen) - (widget-create-child widget type)) + (let ((child (widget-create-child widget type))) + (widget-apply child :deactivate) + child)) ((widget-get type :inline) (widget-create-child-value widget type (cdr chosen))) @@ -1735,7 +1809,9 @@ (setq child (if chosen (widget-create-child-value widget type value) - (widget-create-child widget type)))) + (widget-create-child widget type))) + (unless chosen + (widget-apply child :deactivate))) (t (error "Unknown escape `%c'" escape))))) ;; Update properties. @@ -1795,7 +1871,10 @@ (widget-apply current :match value)))) (widget-value-set button match) (if match - (widget-value-set current value)) + (progn + (widget-value-set current value) + (widget-apply current :activate)) + (widget-apply current :deactivate)) (setq found (or found match)))))) (defun widget-radio-validate (widget) @@ -1822,9 +1901,11 @@ children (cdr children)) (let* ((button (widget-get current :button))) (cond ((eq child button) - (widget-value-set button t)) + (widget-value-set button t) + (widget-apply current :activate)) ((widget-value button) - (widget-value-set button nil))))))) + (widget-value-set button nil) + (widget-apply current :deactivate))))))) ;; Pass notification to parent. (widget-apply widget :notify child event)) @@ -1967,7 +2048,7 @@ (setq children (cdr children))) (setcdr children (cons child (cdr children))))))) (widget-setup) - (widget-apply widget :notify widget)) + widget (widget-apply widget :notify widget)) (defun widget-editable-list-delete-at (widget child) ;; Delete child from list of children.
--- a/lisp/custom/widget-example.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/custom/widget-example.el Mon Aug 13 09:23:06 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: help, extensions, faces, hypermedia -;; Version: 1.65 +;; Version: 1.68 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ (require 'widget)
--- a/lisp/custom/widget.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/custom/widget.el Mon Aug 13 09:23:06 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Keywords: help, extensions, faces, hypermedia -;; Version: 1.65 +;; Version: 1.68 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -27,7 +27,8 @@ (set (car keywords) (car keywords))) (setq keywords (cdr keywords))))))) -(define-widget-keywords :sibling-args :delete-button-args +(define-widget-keywords :deactivate :active :inactive :activate + :sibling-args :delete-button-args :insert-button-args :append-button-args :button-args :tag-glyph :off-glyph :on-glyph :valid-regexp :secret :sample-face :sample-face-get :case-fold :widget-doc
--- a/lisp/efs/Makefile Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/Makefile Mon Aug 13 09:23:06 2007 +0200 @@ -2,7 +2,7 @@ # # File: Makefile # Release: $efs release: 1.15 $ -# Version: $Revision: 1.4 $ +# Version: $Revision: 1.5 $ # RCS: # Description: Makefile for byte-compiling efs and dired. # Author: Andy Norman, HPLabs, Bristol, UK. @@ -21,7 +21,8 @@ # 19.1 and 19.22, inclusive. # 19.23 for version 19.23 and later of the original GNU Emacs from FSF # l19.11 for XEmacs 19.11 trhu 19.14 -# x19.15 for XEmacs 19.15 and later +# x19.15 for XEmacs 19.15 +# x20 for XEmacs 20.1 and later # LISPDIR should be the directory in which you want the .elc # files installed. # BDIR should be the directory containing the .elc files for the @@ -41,7 +42,8 @@ # 19.22, inclusive # 19.23 for the original GNU Emacs from FSF, version 19.23 and later. # l19.11 for Lucid XEmacs 19.11 thru 19.14 -# x19.15 for XEmacs 19.15 and later +# x19.15 for XEmacs 19.15 +# x20 for XEmacs 20.1 and later # # If you have set the VERSION variable correctly, then typing just # make will suffice. @@ -72,6 +74,10 @@ CWD=`pwd` # Directory in which to install the lisp files LISPDIR= +# Directory in which to install the info files +INFODIR= +# Directory in which to install the Texinfo file +TEXIDIR= # Directory containing byte-compiler. This is used by fixup.el BDIR= # Directory containing VM's .elc files. @@ -112,13 +118,18 @@ efs-vms.el efs-vos.el efs-plan9.el efs-ms-unix.el VMOBJS = efs-vm.elc VMSRC = efs-vm.el -DUMPSRC = efs-dump.el -GEOBJS = dired-fsf.elc dired-mule.elc efs-dired-mule.elc \ - passwd.elc diff.elc auto-save.elc -GESRC = dired-fsf.el dired-mule.el efs-dired-mule.el \ - passwd.el diff.el auto-save.el -XEOBJS = dired-faces.elc dired-xemacs.elc -XESRC = dired-faces.el dired-xemacs.el +MULEOBJS = dired-mule.elc efs-dired-mule.elc +MULESRC = dired-mule.el efs-dired-mule.el +GEOBJS = dired-fsf.elc \ + passwd.elc diff.elc auto-save.elc \ + $(MULEOBJS) +GESRC = dired-fsf.el \ + passwd.el diff.el auto-save.el \ + $(MULESRC) +XEOBJS = dired-faces.elc dired-xemacs.elc \ + $(VMOBJS) +XESRC = dired-faces.el dired-xemacs.el \ + $(VMSRC) $(MULESRC) OBJS = $(DOBJS) $(EFSOBJS) $(VMOBJS) $(GEOBJS) $(XEOBJS) \ efs-18.elc efs-19.elc efs-19.23.elc \ efs-l19.11.elc efs-x19.15.elc \ @@ -260,24 +271,25 @@ 19.23: efs dired efs-19.23.elc $(GEOBJS) l19.11: efs dired efs-l19.11.elc $(XEOBJS) x19.15: efs dired efs-x19.15.elc $(XEOBJS) +x20: efs dired efs-x19.15.elc $(XEOBJS) $(MULEOBJS) # Installation install: @echo "Installing in $(LISPDIR)..." - @ls -C *.elc cp *.elc $(LISPDIR) + cp efs.info $(INFODIR) install_src: @echo "Installing in $(LISPDIR)..." - @ls -C `ls *.el 2>&1 | grep -v "fixup"` 2> /dev/null cp `ls *.el | grep -v "fixup"` $(LISPDIR) + cp efs.texi $(TEXIDIR) install_xemacs: @echo "Installing source in $(LISPDIR)..." cp $(EFSSRC) $(DSRC) $(XESRC) efs-x19.15.el $(LISPDIR) - cp $(DUMPSRC) $(LISPDIR) cp Makefile README fixup.el $(LISPDIR) + cp efs.texi $(TEXIDIR) diff_xemacs: for f in $(EFSSRC) $(DSRC) $(XESRC) efs-x19.15.el \ - $(DUMPSRC) Makefile README fixup.el; do \ + Makefile README fixup.el; do \ if [ -e $(LISPDIR)/$$f ]; \ then\ diff -c $(LISPDIR)/$$f $$f; \
--- a/lisp/efs/default-dir.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/default-dir.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: default-dir.el ;; RCS: -;; Version: $Revision: 1.4 $ +;; Version: #Revision: 1.5 $ ;; Description: Defines the function default-directory, for fancy handling ;; of the initial contents in the minibuffer when reading ;; file names. @@ -35,6 +35,10 @@ ((>= (string-to-int (substring emacs-version 0 2)) 19) 'fsf-19) (t 'fsf-18))) +(defconst default-dir-find-file-takes-coding-system + (and (eq default-dir-emacs-variant 'xemacs) + (>= (string-to-int (substring emacs-version 0 2)) 20))) + ;;;###autoload (defvar default-directory-function nil "A function to call to compute the default-directory for the current buffer. @@ -61,7 +65,7 @@ (cond ((or (featurep 'mule) (boundp 'MULE)) - + (defun default-dir-find-file (file &optional coding-system) "Documented as original" (interactive @@ -122,7 +126,7 @@ (read-coding-system "Coding-system: ")))) (default-dir-real-find-file-other-frame file coding-system)))) - + (if (fboundp 'find-file-read-only-other-frame) (progn (defun default-dir-find-file-read-only-other-frame @@ -145,14 +149,14 @@ ;; optional arguments, and the interaction screws things up. ;; Therefore these functions accept an optional dummy coding-system ;; argument. - + (defun default-dir-find-file (file &optional coding-system) "Documented as original" (interactive (list (expand-file-name (read-file-name "Find file: " (default-directory))))) - (default-dir-real-find-file file coding-system)) + (default-dir-real-find-file file)) (defun default-dir-find-file-other-window (file &optional coding-system) "Documented as original" @@ -160,15 +164,15 @@ (list (expand-file-name (read-file-name "Find file in other window: " (default-directory))))) - (default-dir-real-find-file-other-window file coding-system)) + (default-dir-real-find-file-other-window file)) - (defun default-dir-find-file-read-only (file &optional coding-system) + (defun default-dir-find-file-read-only (file &optional coding-system) "Documented as original" (interactive (list (expand-file-name (read-file-name "Find file read-only: " (default-directory) nil t)))) - (default-dir-real-find-file-read-only file coding-system)) + (default-dir-real-find-file-read-only file)) (if (fboundp 'find-file-read-only-other-window) (progn @@ -208,6 +212,7 @@ (default-dir-real-find-file-read-only-other-frame file))))) (t + (defun default-dir-find-file (file) "Documented as original" (interactive @@ -266,7 +271,7 @@ (default-directory) nil t)))) (default-dir-real-find-file-read-only-other-frame file)))))) - + (efs-overwrite-fn "default-dir" 'find-file 'default-dir-find-file) (efs-overwrite-fn "default-dir" 'find-file-other-window @@ -361,7 +366,7 @@ (expand-file-name (read-file-name "Change default directory: " (default-directory))))) (default-dir-real-cd dir)) - + (efs-overwrite-fn "default-dir" 'cd 'default-dir-cd) (defun default-dir-set-visited-file-name (filename)
--- a/lisp/efs/dired-cmpr.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-cmpr.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-cmpr.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: Commands for compressing marked files. ;;
--- a/lisp/efs/dired-diff.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-diff.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: dired-diff.el ;; RCS: -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; Description: Support for diff and related commands. ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> ;; Created: Fri Jun 24 08:50:20 1994 by sandy on ibm550
--- a/lisp/efs/dired-faces.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-faces.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-faces.el -;; Dired Version: $Revision: 1.2 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: rudimentary face customization support for dired ;; Author: Mike Sperber <sperber@informatik.uni-tuebingen.de>
--- a/lisp/efs/dired-fsf.el Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,684 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; File: dired-fsf.el -;; Dired Version: $Revision: 1.1 $ -;; RCS: -;; Description: dired functions for V19 of the original GNU Emacs from FSF -;; Created: Sat Jan 29 01:38:49 1994 by sandy on ibm550 -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;;; Requirements and provisions -(provide 'dired-fsf) -(require 'dired) - -;;;; Variables to set. - -(setq dired-modeline-tracking-cmds '(mouse-set-point)) - -;;;; Support for text properties - -(defun dired-insert-set-properties (beg end) - ;; Sets the text properties for the file names. - (save-excursion - (goto-char beg) - (beginning-of-line) - (let ((eol (save-excursion (end-of-line) (point))) - (bol (point))) - (while (< (point) end) - (setq eol (save-excursion (end-of-line) (point))) - (if (dired-manual-move-to-filename nil bol eol) - (dired-set-text-properties - (point) (dired-manual-move-to-end-of-filename nil bol eol))) - (goto-char (setq bol (1+ eol))))))) - -(defun dired-remove-text-properties (start end &optional object) - ;; Removes text properties. Called in popup buffers. - (remove-text-properties start end '(mouse-face dired-file-name) object)) - -(defun dired-set-text-properties (start end) - ;; Sets dired's text properties - (put-text-property start end 'mouse-face 'highlight) - (put-text-property start end 'dired-file-name t)) - -(defun dired-move-to-filename (&optional raise-error bol eol) - (or bol (setq bol (save-excursion - (skip-chars-backward "^\n\r") - (point)))) - (or eol (setq eol (save-excursion - (skip-chars-forward "^\n\r") - (point)))) - (goto-char bol) - (let ((spot (next-single-property-change bol 'dired-file-name nil eol))) - (if (= spot eol) - (if raise-error - (error "No file on this line") - nil) - (goto-char spot)))) - -(defun dired-move-to-end-of-filename (&optional no-error bol eol) - ;; Assumes point is at beginning of filename, - ;; thus the rwx bit re-search-backward below will succeed in *this* - ;; line if at all. So, it should be called only after - ;; (dired-move-to-filename t). - ;; On failure, signals an error (with non-nil NO-ERROR just returns nil). - (or eol (setq eol (save-excursion (skip-chars-forward "^\r\n") (point)))) - (and - (null no-error) - selective-display - (or bol (setq bol (save-excursion (skip-chars-backward "^\r\n") (point)))) - (eq (char-after (1- bol)) ?\r) - (cond - ((dired-subdir-hidden-p (dired-current-directory)) - (error - (substitute-command-keys - "File line is hidden. Type \\[dired-hide-subdir] to unhide."))) - ((error - (substitute-command-keys - "File line is omitted. Type \\[dired-omit-toggle] to un-omit."))))) - (if (get-text-property (point) 'dired-file-name nil) - (goto-char (next-single-property-change (point) 'dired-file-name - nil eol)) - (and (null no-error) (error "No file on this line")))) - -;; Text properties do not work properly in pre-19.26. - -(if (or (not (boundp 'emacs-major-version)) - (= emacs-major-version 19)) - (progn - (if (not (boundp 'emacs-minor-version)) - ;; Argument structure of where-is-internal went through some - ;; changes. - (defun dired-key-description (cmd &rest prefixes) - ;; Return a key description string for a menu. - ;; If prefixes are given, they should be either strings, - ;; integers, or 'universal-argument. - (let ((key (where-is-internal cmd dired-mode-map nil t))) - (if key - (key-description - (apply 'vconcat - (append - (mapcar - (function - (lambda (x) - (if (eq x 'universal-argument) - (where-is-internal 'universal-argument - dired-mode-map nil t) - x))) - prefixes) - (list key)))) - "")))) - (if (or (not (boundp 'emacs-minor-version)) - (< emacs-minor-version 26)) - (progn - (fset 'dired-insert-set-properties 'ignore) - (fset 'dired-remove-text-properties 'ignore) - (fset 'dired-set-text-properties 'ignore) - (fset 'dired-move-to-filename 'dired-manual-move-to-filename) - (fset 'dired-move-to-end-of-filename - 'dired-manual-move-to-end-of-filename))))) - -;;;; Keymaps - -;;; Caching Menus - -(defun dired-menu-item (menu-item cmd width &rest prefixes) - ;; Return a key description string for a menu. If prefixes are given, - ;; they should be either characters, or 'universal-argument. - (let ((desc (apply 'dired-key-description cmd prefixes))) - (if (string-equal desc "") - menu-item - (concat menu-item - (make-string - (max (- width (length menu-item) (length desc) 2) 1) 32) - "(" desc ")")))) - -(defun dired-cache-key (keymap event cmd &rest prefixes) - ;; Caches a keybinding for cms in a menu keymap. - ;; This is able to handle prefix keys. - (let ((desc (apply 'dired-key-description cmd prefixes))) - (or (string-equal desc "") - (progn - (let ((elt (assq event keymap))) - (if elt - (let ((tail (cdr elt))) - (setcdr tail - (cons - (cons - nil (concat " (" desc ")")) - (cdr tail)))))))))) - -;; Don't cache keys in old emacs versions. Is 23 the right cut-off point? -(if (or (not (boundp 'emacs-minor-version)) - (< emacs-minor-version 23)) - (fset 'dired-cache-key 'ignore)) - -(defvar dired-visit-popup-menu nil) -;; Menus of commands in the Visit popup menu. -(defvar dired-do-popup-menu nil) -;; Menu of commands in the dired Do popup menu. - -;; Menus for the menu bar. -(defvar dired-subdir-menu - (cons "Subdir" (make-sparse-keymap "Subdir"))) -(defvar dired-mark-menu - (cons "Mark" (make-sparse-keymap "Mark"))) -(defvar dired-do-menu - (cons "Do" (make-sparse-keymap "Do"))) -(defvar dired-regex-menu - (cons "Regexp" (make-sparse-keymap "Regex"))) -(defvar dired-look-menu - (cons "Look" (make-sparse-keymap "Look"))) -(defvar dired-sort-menu - (cons "Sort" (make-sparse-keymap "Sort"))) -(defvar dired-help-menu nil) - -(defun dired-setup-menus () - - ;; popup menu - - (setq dired-visit-popup-menu - (list - (cons (dired-menu-item "Find File" 'dired-find-file 35) - 'dired-advertised-find-file) - (cons (dired-menu-item "Find in Other Window" - 'dired-find-file-other-window 35) - 'dired-find-file-other-window) - (cons (dired-menu-item "Find in Other Frame" - 'dired-find-file-other-frame 35) - 'dired-find-file-other-frame) - (cons (dired-menu-item "View File" 'dired-view-file 35) - 'dired-view-file) - (cons (dired-menu-item "Display in Other Window" - 'dired-find-file-other-window 35 - 'universal-argument) - 'dired-display-file))) - - ;; Operate popup menu - - (setq dired-do-popup-menu - (list - (cons (dired-menu-item "Copy to..." 'dired-do-copy 35 1) - 'dired-do-copy) - (cons (dired-menu-item "Rename to..." 'dired-do-rename 35 1) - 'dired-do-rename) - (cons (dired-menu-item "Compress/Uncompress" 'dired-do-compress - 35 1) 'dired-do-compress) - (cons (dired-menu-item "Uuencode/Uudecode" 'dired-do-uucode - 35 1) 'dired-do-uucode) - (cons (dired-menu-item "Change Mode..." 'dired-do-chmod 35 1) - 'dired-do-chmod) - (cons (dired-menu-item "Change Owner..." 'dired-do-chown 35 1) - 'dired-do-chown) - (cons (dired-menu-item "Change Group..." 'dired-do-chgrp 35 1) - 'dired-do-chgrp) - (cons (dired-menu-item "Load" 'dired-do-load 35 1) - 'dired-do-load) - (cons (dired-menu-item "Byte-compile" 'dired-do-byte-compile 35 1) - 'dired-do-byte-compile) - (cons (dired-menu-item "Hardlink to..." 'dired-do-hardlink 35 1) - 'dired-do-hardlink) - (cons (dired-menu-item "Symlink to..." 'dired-do-symlink 35 1) - 'dired-do-symlink) - (cons (dired-menu-item "Relative Symlink to..." - 'dired-do-relsymlink 35 1) - 'dired-do-relsymlink) - (cons (dired-menu-item "Shell Command..." - 'dired-do-shell-command 35 1) - 'dired-do-shell-command) - (cons (dired-menu-item "Background Shell Command..." - 'dired-do-background-shell-command 35 1) - 'dired-do-background-shell-command) - (cons (dired-menu-item "Delete" 'dired-do-delete 35 1) - 'dired-do-delete))) - - ;; Subdir Menu-bar Menu - - (define-key dired-mode-map [menu-bar subdir] dired-subdir-menu) - (define-key dired-mode-map [menu-bar subdir uncompress-subdir-files] - (cons "Uncompress Compressed Files" - (function - (lambda () (interactive) (dired-compress-subdir-files t))))) - (dired-cache-key dired-subdir-menu 'uncompress-subdir-files - 'dired-compress-subdir-files 'universal-argument) - (define-key dired-mode-map [menu-bar subdir compress-subdir-files] - '("Compress Uncompressed Files" . dired-compress-subdir-files)) - (define-key dired-mode-map [menu-bar subdir flag] - '("Flag Files for Deletion" . dired-flag-subdir-files)) - (define-key dired-mode-map [menu-bar subdir mark] - '("Mark Files" . dired-mark-subdir-files)) - (define-key dired-mode-map [menu-bar subdir redisplay] - '("Redisplay Subdir" . dired-redisplay-subdir)) - (define-key dired-mode-map [menu-bar subdir subdir-separator] - '("-- Commands on All Files in Subdir --")) - (define-key dired-mode-map [menu-bar subdir kill-subdir] - '("Kill This Subdir" . dired-kill-subdir)) - (define-key dired-mode-map [menu-bar subdir create-directory] - '("Create Directory..." . dired-create-directory)) - (define-key dired-mode-map [menu-bar subdir insert] - '("Insert This Subdir" . dired-maybe-insert-subdir)) - (define-key dired-mode-map [menu-bar subdir down-dir] - '("Down Dir" . dired-down-directory)) - (define-key dired-mode-map [menu-bar subdir up-dir] - '("Up Dir" . dired-up-directory)) - (define-key dired-mode-map [menu-bar subdir prev-dirline] - '("Prev Dirline" . dired-prev-dirline)) - (define-key dired-mode-map [menu-bar subdir next-dirline] - '("Next Dirline" . dired-next-dirline)) - (define-key dired-mode-map [menu-bar subdir prev-subdir] - '("Prev Subdir" . dired-prev-subdir)) - (define-key dired-mode-map [menu-bar subdir next-subdir] - '("Next Subdir" . dired-next-subdir)) - - ;; Mark Menu-bar Menu - - (define-key dired-mode-map [menu-bar mark] dired-mark-menu) - (define-key dired-mode-map [menu-bar mark mark-from-compilation-buffer] - '("Mark Files from Compile Buffer..." . dired-mark-files-compilation-buffer)) - (define-key dired-mode-map [menu-bar mark mark-from-other-buffer] - '("Mark Files from Other Dired" . - dired-mark-files-from-other-dired-buffer)) - (define-key dired-mode-map [menu-bar mark mark-separator] - '("--")) - (define-key dired-mode-map [menu-bar mark marker-char-right] - '("Marker stack right" . dired-marker-stack-right)) - (define-key dired-mode-map [menu-bar mark marker-char-left] - '("Marker stack left" . dired-marker-stack-left)) - (define-key dired-mode-map [menu-bar mark restore-marker] - '("Restore marker char" . dired-restore-marker-char)) - (define-key dired-mode-map [menu-bar mark add-marker] - '("Set new marker char..." . dired-set-marker-char)) - (define-key dired-mode-map [menu-bar mark auto-save-files] - '("Flag Auto-save Files" . dired-flag-auto-save-files)) - (define-key dired-mode-map [menu-bar mark backup-files] - '("Flag Backup Files" . dired-flag-backup-files)) - (define-key dired-mode-map [menu-bar mark executables] - '("Mark Executables" . dired-mark-executables)) - (define-key dired-mode-map [menu-bar mark directory] - '("Mark Old Backups" . dired-clean-directory)) - (define-key dired-mode-map [menu-bar mark directories] - '("Mark Directories" . dired-mark-directories)) - (define-key dired-mode-map [menu-bar mark symlinks] - '("Mark Symlinks" . dired-mark-symlinks)) - (define-key dired-mode-map [menu-bar mark toggle] - (cons "Toggle Marks..." - (function (lambda () (interactive) - (let ((current-prefix-arg t)) - (call-interactively 'dired-change-marks)))))) - (dired-cache-key dired-mark-menu 'toggle 'dired-change-marks - 'universal-argument) - (define-key dired-mode-map [menu-bar mark unmark-all] - '("Unmark All" . dired-unmark-all-files)) - (define-key dired-mode-map [menu-bar mark marks] - '("Change Marks..." . dired-change-marks)) - (define-key dired-mode-map [menu-bar mark prev] - '("Previous Marked" . dired-prev-marked-file)) - (define-key dired-mode-map [menu-bar mark next] - '("Next Marked" . dired-next-marked-file)) - - ;; Do Menu-bar Menu - - (define-key dired-mode-map [menu-bar do] - dired-do-menu) - (define-key dired-mode-map [menu-bar do do-popup] - (cons "Operate on file menu >" - 'dired-do-popup-menu-internal)) - (dired-cache-key dired-do-menu 'do-popup - 'dired-do-popup-menu) - (define-key dired-mode-map [menu-bar do visit-popup] - (cons "Visit file menu >" - 'dired-visit-popup-menu-internal)) - (dired-cache-key dired-do-menu 'visit-popup - 'dired-visit-popup-menu) - (define-key dired-mode-map [menu-bar do delete] - '("Delete Marked Files" . dired-do-delete)) - (define-key dired-mode-map [menu-bar do background-command] - '("Background Shell Command..." . dired-do-background-shell-command)) - (define-key dired-mode-map [menu-bar do command] - '("Shell Command..." . dired-do-shell-command)) - (define-key dired-mode-map [menu-bar do symlink] - '("Symlink to..." . dired-do-symlink)) - (define-key dired-mode-map [menu-bar do hardlink] - '("Hardlink to..." . dired-do-hardlink)) - (define-key dired-mode-map [menu-bar do compile] - '("Byte-compile" . dired-do-byte-compile)) - (define-key dired-mode-map [menu-bar do load] - '("Load" . dired-do-load)) - (define-key dired-mode-map [menu-bar do chgrp] - '("Change Group..." . dired-do-chgrp)) - (define-key dired-mode-map [menu-bar do chown] - '("Change Owner..." . dired-do-chown)) - (define-key dired-mode-map [menu-bar do chmod] - '("Change Mode..." . dired-do-chmod)) - (define-key dired-mode-map [menu-bar do print] - '("Print..." . dired-do-print)) - (define-key dired-mode-map [menu-bar do uucode] - '("Uuencode/Uudecode" . dired-do-uucode)) - (define-key dired-mode-map [menu-bar do compress] - '("Compress/Uncompress" . dired-do-compress)) - (define-key dired-mode-map [menu-bar do expunge] - '("Expunge File Flagged for Deletion" . dired-expunge-deletions)) - (define-key dired-mode-map [menu-bar do rename] - '("Rename to..." . dired-do-rename)) - (define-key dired-mode-map [menu-bar do copy] - '("Copy to..." . dired-do-copy)) - -;; Regex Menu-bar Menu - - (define-key dired-mode-map [menu-bar regex] dired-regex-menu) - (define-key dired-mode-map [menu-bar regex show-omit-regexp] - (cons "Show Omit Regex" - (function - (lambda () - (interactive) - (let ((current-prefix-arg 0)) - (call-interactively 'dired-add-omit-regexp)))))) - (dired-cache-key dired-regex-menu 'show-omit-regexp - 'dired-add-omit-regexp 0) - (define-key dired-mode-map [menu-bar regex remove-omit-extension] - (cons "Remove Omit Extension..." - (function - (lambda () - (interactive) - (let ((current-prefix-arg '(16))) - (call-interactively 'dired-add-omit-regexp)))))) - (dired-cache-key dired-regex-menu 'remove-omit-extension - 'dired-add-omit-regexp 'universal-argument - 'universal-argument) - (define-key dired-mode-map [menu-bar regex add-omit-extension] - (cons "Add Omit Extension..." - (function - (lambda () - (interactive) - (let ((current-prefix-arg '(4))) - (call-interactively 'dired-add-omit-regexp)))))) - (dired-cache-key dired-regex-menu 'add-omit-extension - 'dired-add-omit-regexp 'universal-argument) - (define-key dired-mode-map [menu-bar regex remove-omit-regexp] - (cons "Remove Omit Regex..." - (function - (lambda () - (interactive) - (let ((current-prefix-arg 1)) - (call-interactively 'dired-add-omit-regexp)))))) - (dired-cache-key dired-regex-menu 'remove-omit-regexp - 'dired-add-omit-regexp 1) - (define-key dired-mode-map [menu-bar regex add-omit-regexp] - '("Add Omit Regex..." . dired-add-omit-regexp)) - (define-key dired-mode-map [menu-bar regex separator] - '("--")) - (define-key dired-mode-map [menu-bar regex relsymlink] - '("Relative Symlink..." . dired-do-relsymlink-regexp)) - (define-key dired-mode-map [menu-bar regex symlink] - '("Symlink..." . dired-do-symlink-regexp)) - (define-key dired-mode-map [menu-bar regex hardlink] - '("Hardlink..." . dired-do-hardlink-regexp)) - (define-key dired-mode-map [menu-bar regex rename] - '("Rename..." . dired-do-rename-regexp)) - (define-key dired-mode-map [menu-bar regex copy] - '("Copy..." . dired-do-copy-regexp)) - (define-key dired-mode-map [menu-bar regex upcase] - '("Upcase" . dired-upcase)) - (define-key dired-mode-map [menu-bar regex downcase] - '("Downcase" . dired-downcase)) - (define-key dired-mode-map [menu-bar regex dired-flag-extension] - '("Flag Files with Extension..." . dired-flag-extension)) - (define-key dired-mode-map [menu-bar regex flag] - '("Flag..." . dired-flag-files-regexp)) - (define-key dired-mode-map [menu-bar regex mark-extension] - '("Mark Files with Extension..." . dired-mark-extension)) - (define-key dired-mode-map [menu-bar regex mark] - '("Mark..." . dired-mark-files-regexp)) - - ;; Look Menu-bar Menu - - (define-key dired-mode-map [menu-bar look] dired-look-menu) - (define-key dired-mode-map [menu-bar look patch] - '("Patch File" . dired-epatch)) - (define-key dired-mode-map [menu-bar look ediff] - '("Ediff Files..." . dired-ediff)) - (define-key dired-mode-map [menu-bar look emerge-with-ancestor] - '("Merge Files Having Common Ancestor..." . dired-emerge-with-ancestor)) - (define-key dired-mode-map [menu-bar look emerge] - '("Merge Files..." . dired-emerge)) - (define-key dired-mode-map [menu-bar look backup-diff] - '("Diff with Backup" . dired-backup-diff)) - (define-key dired-mode-map [menu-bar look diff] - '("Diff File..." . dired-diff)) - ;; Put in a separator line. - (define-key dired-mode-map [menu-bar look look-separator] - '("--")) - (define-key dired-mode-map [menu-bar look tags-query-replace] - '("Tags Query Replace..." . dired-do-tags-query-replace)) - (define-key dired-mode-map [menu-bar look tags-search] - '("Tags Search for..." . dired-do-tags-search)) - (define-key dired-mode-map [menu-bar look grep] - '("Grep for..." . dired-do-grep)) - - ;; Sort Menu-bar Menu - - (define-key dired-mode-map [menu-bar sort] dired-sort-menu) - (define-key dired-mode-map [menu-bar sort redisplay-killed] - (cons "Redisplay Killed Lines" - (function (lambda () (interactive) (dired-do-kill-file-lines 0))))) - (dired-cache-key dired-sort-menu 'redisplay-killed - 'dired-do-kill-file-lines 0) - (define-key dired-mode-map [menu-bar sort kill] - '("Kill Marked Lines" . dired-do-kill-file-lines)) - (define-key dired-mode-map [menu-bar sort toggle-omit] - '("Toggle Omit" . dired-omit-toggle)) - (define-key dired-mode-map [menu-bar sort hide-subdir] - '("Hide Subdir" . dired-hide-subdir)) - (define-key dired-mode-map [menu-bar sort hide-all] - '("Hide All Subdirs" . dired-hide-all)) - (define-key dired-mode-map [menu-bar sort sort-separator] - '("--")) - (define-key dired-mode-map [menu-bar sort entire-edit] - (cons "Edit Switches for Entire Buffer..." - (function (lambda () (interactive) - (dired-sort-toggle-or-edit '(16)))))) - (dired-cache-key dired-sort-menu 'entire-edit - 'dired-sort-toggle-or-edit 'universal-argument - 'universal-argument) - (define-key dired-mode-map [menu-bar sort entire-name] - (cons "Sort Entire Buffer by Name" - (function (lambda () (interactive) - (dired-sort-toggle-or-edit 'name))))) - (dired-cache-key dired-sort-menu 'entire-name 'dired-sort-toggle-or-edit - 'universal-argument) - (define-key dired-mode-map [menu-bar sort entire-date] - (cons "Sort Entire Buffer by Date" - (function (lambda () (interactive) - (dired-sort-toggle-or-edit 'date))))) - (dired-cache-key dired-sort-menu 'entire-date 'dired-sort-toggle-or-edit - 'universal-argument) - (define-key dired-mode-map [menu-bar sort new-edit] - (cons "Edit Default Switches for Inserted Subdirs..." - (function (lambda () (interactive) (dired-sort-toggle-or-edit 2))))) - (dired-cache-key dired-sort-menu 'new-edit 'dired-sort-toggle-or-edit 2) - (define-key dired-mode-map [menu-bar sort edit] - (cons "Edit Switches for Current Subdir..." - (function (lambda () (interactive) (dired-sort-toggle-or-edit 1))))) - (dired-cache-key dired-sort-menu 'edit 'dired-sort-toggle-or-edit 1) - (define-key dired-mode-map [menu-bar sort show] - (cons "Show Current Switches" - (function (lambda () (interactive) (dired-sort-toggle-or-edit 0))))) - (dired-cache-key dired-sort-menu 'show 'dired-sort-toggle-or-edit 0) - (define-key dired-mode-map [menu-bar sort toggle] - '("Toggle Current Subdir by Name/Date" . dired-sort-toggle-or-edit)) - - ;; Help Menu-bar Menu - - (or dired-help-menu - (setq dired-help-menu - (if (and (boundp 'menu-bar-help-menu) (keymapp menu-bar-help-menu)) - (cons "Help" (cons 'keymap (cdr menu-bar-help-menu))) - (cons "Help" (make-sparse-keymap "Help"))))) - (define-key dired-mode-map [menu-bar dired-help] dired-help-menu) - (define-key dired-mode-map [menu-bar dired-help help-separator] - '("--")) - (define-key dired-mode-map [menu-bar dired-help dired-bug] - '("Report Dired Bug" . dired-report-bug)) - (define-key dired-mode-map [menu-bar dired-help dired-var-apropos] - (cons "Dired Variable Apropos" - (function (lambda () - (interactive) - (let ((current-prefix-arg t)) - (call-interactively 'dired-apropos)))))) - (dired-cache-key dired-help-menu 'dired-var-apropos - 'dired-apropos 'universal-argument) - (define-key dired-mode-map [menu-bar dired-help dired-apropos] - '("Dired Command Apropos" . dired-apropos)) - (define-key dired-mode-map [menu-bar dired-help dired-info] - (cons "Dired Info Manual" - (function (lambda () - (interactive) - (dired-describe-mode t))))) - (dired-cache-key dired-help-menu 'dired-info 'dired-describe-mode - 'universal-argument) - (define-key dired-mode-map [menu-bar dired-help dired-describe-mode] - '("Describe Dired" . dired-describe-mode)) - (define-key dired-mode-map [menu-bar dired-help dired-summary] - '("Dired Summary Help" . dired-summary))) - -(add-hook 'dired-setup-keys-hook 'dired-setup-menus) - -;;; Mouse functions - -(defun dired-mouse-find-file (event) - "In dired, visit the file or directory name you click on." - (interactive "e") - (save-excursion - (set-buffer (window-buffer (posn-window (event-end event)))) - (if dired-subdir-alist - (save-excursion - (goto-char (posn-point (event-end event))) - (dired-find-file)) - (error - (concat "dired-subdir-alist seems to be mangled. " - (substitute-command-keys - "\\<dired-mode-map>Try dired-revert (\\[dired-revert]).")))))) - -(defun dired-mouse-mark (event) - "In dired, mark the file name that you click on. -If the file name is already marked, this unmarks it." - (interactive "e") - (save-excursion - (set-buffer (window-buffer (posn-window (event-end event)))) - (if dired-subdir-alist - (save-excursion - (goto-char (posn-point (event-end event))) - (beginning-of-line) - (if (looking-at dired-re-mark) - (dired-unmark 1) - (dired-mark 1))) - (error - (concat "dired-subdir-alist seems to be mangled. " - (substitute-command-keys - "\\<dired-mode-map>Try dired-revert (\\[dired-revert]).")))))) - -(defun dired-mouse-flag (event) - "In dired, flag for deletion the file name that you click on. -If the file name is already flag, this unflags it." - (interactive "e") - (save-excursion - (set-buffer (window-buffer (posn-window (event-end event)))) - (if dired-subdir-alist - (save-excursion - (goto-char (posn-point (event-end event))) - (beginning-of-line) - (if (char-equal (following-char) dired-del-marker) - (dired-unflag 1) - (dired-flag-file-deletion 1))) - (error - (concat "dired-subdir-alist seems to be mangled. " - (substitute-command-keys - "\\<dired-mode-map>Try dired-revert (\\[dired-revert]).")))))) - -(defun dired-mouse-get-target (event) - "In dired, put a copy of the selected directory in the active minibuffer." - (interactive "e") - (let ((obuff (current-buffer)) - mb) - (set-buffer (window-buffer (posn-window (event-end event)))) - (if (and dired-subdir-alist (setq mb (dired-get-active-minibuffer-window))) - (let (dir) - (goto-char (posn-point (event-end event))) - (setq dir (dired-current-directory)) - (select-window mb) - (set-buffer (window-buffer mb)) - (erase-buffer) - (insert dir)) - (set-buffer obuff) - (if mb - (error "No directory specified") - (error "No active minibuffer"))))) - -(defun dired-visit-popup-menu (event) - "Popup a menu to visit the moused file." - (interactive "e") - (save-excursion - (set-buffer (window-buffer (posn-window (event-end event)))) - (save-excursion - (goto-char (posn-point (event-end event))) - (dired-visit-popup-menu-internal event)))) - -(defun dired-visit-popup-menu-internal (event) - (interactive "e") - (let ((fn (dired-get-filename 'no-dir)) - fun) - (dired-remove-text-properties 0 (length fn) fn) - (setq fun (x-popup-menu - event - (list "Visit popup menu" - (cons - (concat "Visit " fn " with") - dired-visit-popup-menu)))) - (if fun (funcall fun)))) - -(defun dired-do-popup-menu (event) - ;; Pop up a menu do an operation on the moused file. - (interactive "e") - (let ((obuff (current-buffer))) - (unwind-protect - (progn - (set-buffer (window-buffer (posn-window (event-end event)))) - (dired-save-excursion - (goto-char (posn-point (event-end event))) - (dired-do-popup-menu-internal event))) - (set-buffer obuff)))) - -(defun dired-do-popup-menu-internal (event) - (interactive "e") - (let ((fn (dired-get-filename 'no-dir)) - fun) - (dired-remove-text-properties 0 (length fn) fn) - (setq fun (x-popup-menu - event - (list "Do popup menu" - (cons - (concat "Do operation on " fn) - dired-do-popup-menu)))) - (dired-save-excursion - (if fun (let ((current-prefix-arg 1)) - (call-interactively fun)))))) - -;;; Key maps - -;; Get rid of the Edit menu bar item to save space. -(define-key dired-mode-map [menu-bar edit] 'undefined) -;; We have our own help item -(define-key dired-mode-map [menu-bar help] 'undefined) -(define-key dired-mode-map [mouse-2] 'dired-mouse-find-file) -(define-key dired-mode-map [S-mouse-1] 'dired-mouse-mark) -(define-key dired-mode-map [C-S-mouse-1] 'dired-mouse-flag) -(define-key dired-mode-map [down-mouse-3] 'dired-visit-popup-menu) -;; This can be useful in dired, so move to double click. -(define-key dired-mode-map [double-mouse-3] 'mouse-save-then-kill) -(define-key dired-mode-map [C-down-mouse-2] 'dired-do-popup-menu) -(define-key dired-mode-map [M-mouse-2] 'dired-mouse-get-target) - -(or (memq 'dired-help menu-bar-final-items) - (setq menu-bar-final-items (cons 'dired-help menu-bar-final-items))) - -;;; end of dired-fsf.el
--- a/lisp/efs/dired-grep.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-grep.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: dired-grep.el ;; RCS: -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; Description: Support for running grep on marked files in a dired buffer. ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> ;; Created: Tue Jul 13 22:59:37 1993 by sandy on ibm550
--- a/lisp/efs/dired-help.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-help.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-help.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: Obtaining help for dired ;; Modified: Sun Nov 20 21:10:47 1994 by sandy on gandalf
--- a/lisp/efs/dired-mob.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-mob.el Mon Aug 13 09:23:06 2007 +0200 @@ -2,7 +2,7 @@ ;; ;; File: dired-mob.el ;; RCS: -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; Description: Commands for marking files from another buffer. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--- a/lisp/efs/dired-mule.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-mule.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-mule.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: MULE support for dired. ;; Created: Sun Jul 17 14:45:12 1994 by sandy on ibm550
--- a/lisp/efs/dired-oas.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-oas.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-oas.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: dired odds and sods. Dired functions not usually needed. ;; This file is not a reference to the Organization of
--- a/lisp/efs/dired-rgxp.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-rgxp.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-rgxp.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: Commands for running commands on files whose names ;; match a regular expression.
--- a/lisp/efs/dired-sex.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-sex.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-sex.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: Marking files according to sexpressions. Sorry. ;; Created: Wed Sep 14 01:30:43 1994 by sandy on ibm550
--- a/lisp/efs/dired-shell.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-shell.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-shell.el -;; Dired Version: $Revision: 1.2 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: Commands for running shell commands on marked files. ;;
--- a/lisp/efs/dired-uu.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-uu.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-uu.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: Commands for uuencoding/uudecoding marked files. ;; Author: Sandy Rutherford <sandy@math.ubc.ca>
--- a/lisp/efs/dired-vir.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-vir.el Mon Aug 13 09:23:06 2007 +0200 @@ -2,7 +2,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-vir.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: Virtual dired mode for browsing ls -lR listings. ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
--- a/lisp/efs/dired-xemacs.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-xemacs.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-xemacs.el -;; Dired Version: $Revision: 1.3 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: dired functions for XEmacs ;; Author: Mike Sperber <sperber@informatik.uni-tuebingen.de> @@ -45,11 +45,11 @@ "-[-r][-w][-x][-r][-w][sS][-r][-w][xst]") "setgid plain file (even if not executable)") -(defvar dired-re-pre-permissions "^.? ?[0-9 ]*[-d]" +(defvar dired-re-pre-permissions "^[^-d]? ?[0-9 ]*[-d]" "Regexp matching the preamble to file permissions part of a dired line. This shouldn't match socket or symbolic link lines (which aren't editable).") -(defvar dired-re-permissions "[-r][-w][-Ssx][-r][-w][-Ssx][-r][-w][-xst]" +(defvar dired-re-permissions "[-r][-w][-Ssx][-r][-w][-Ssx][-r][-w][-xstT]" "Regexp matching the file permissions part of a dired line.") ;;; Setup @@ -690,10 +690,10 @@ (setq dired-u-r-keymap (dired-setup-chmod-keymap ?u ?r '(?r)) dired-u-w-keymap (dired-setup-chmod-keymap ?u ?w '(?w)) - dired-u-x-keymap (dired-setup-chmod-keymap ?u ?x '(?x ?s ?S) '(?x)) + dired-u-x-keymap (dired-setup-chmod-keymap ?u ?x '(?x ?s) '(?x)) dired-g-r-keymap (dired-setup-chmod-keymap ?g ?r '(?r)) dired-g-w-keymap (dired-setup-chmod-keymap ?g ?w '(?w)) - dired-g-x-keymap (dired-setup-chmod-keymap ?g ?x '(?x ?s ?S) '(?x)) + dired-g-x-keymap (dired-setup-chmod-keymap ?g ?x '(?x ?s) '(?x)) dired-o-r-keymap (dired-setup-chmod-keymap ?o ?r '(?r)) dired-o-w-keymap (dired-setup-chmod-keymap ?o ?w '(?w)) dired-o-x-keymap (dired-setup-chmod-keymap ?o ?x '(?x ?s ?t) '(?x))))
--- a/lisp/efs/dired-xy.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired-xy.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: dired-xy.el -;; Dired Version: $Revision: 1.1 $ +;; Dired Version: #Revision: 7.9 $ ;; RCS: ;; Description: Commands for reading mail from dired. ;;
--- a/lisp/efs/dired.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/dired.el Mon Aug 13 09:23:06 2007 +0200 @@ -5,7 +5,7 @@ ;; ;; File: dired.el ;; RCS: -;; Dired Version: $Revision: 1.4 $ +;; Dired Version: #Revision: 7.9 $ ;; Description: The DIRectory EDitor is for manipulating, and running ;; commands on files in a directory. ;; Authors: FSF, @@ -36,7 +36,7 @@ ;;; Dired Version -(defconst dired-version (substring "$Revision: 1.4 $" 11 -2) +(defconst dired-version (substring "#Revision: 7.9 $" 11 -2) "The revision number of Tree Dired (as a string). Don't forget to mention this when reporting bugs to: @@ -5719,7 +5719,10 @@ (function (lambda (x) (and (not (eq (current-buffer) (cdr x))) x))) - dired-buffers)))) + dired-buffers))) + ;; If there are no more dired buffers, we are no longer needed in the + ;; file-name-handler-alist. + (or dired-buffers (dired-remove-from-file-name-handler-alist))) (defun dired-fun-in-all-buffers (directory fun &rest args) ;; In all buffers dired'ing DIRECTORY, run FUN with ARGS.
--- a/lisp/efs/efs-auto.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-auto.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,11 +3,12 @@ ;; ;; File: efs-auto.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.7 $ ;; RCS: ;; Description: Simple way of autoloading efs ;; Author: Andy Norman, Dawn ;; Created: Thu Sep 24 09:50:08 1992 +;; Modified: Sun Nov 27 11:45:28 1994 by sandy on gandalf ;; Language: Emacs-Lisp ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -16,7 +17,7 @@ ;;; (it's copylefted) and warrranty (there isn't one) information. ;;; Provides a way of autoloading efs. To use this, just put -;;; (require 'efs-auto in your .emacs file. +;;; (require 'efs-auto) in your .emacs file. ;;; ;;; The Bad News: ;;; @@ -36,7 +37,7 @@ (defconst efs-auto-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.7 $" 11 -2))) ;;; Interactive functions that should be accessible from here.
--- a/lisp/efs/efs-cms-knet.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-cms-knet.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-cms-knet.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: CMS support for efs using KNET/VM server ;; Authors: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -23,7 +23,7 @@ (defconst efs-cms-knet-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;; ------------------------------------------------------------ ;;;; CMS support for KNET-VM server
--- a/lisp/efs/efs-cms.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-cms.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-cms.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.9 $ ;; RCS: ;; Description: CMS support for efs ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -22,7 +22,7 @@ (defconst efs-cms-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.9 $" 11 -2))) ;;;; ------------------------------------------------------------ ;;;; CMS support
--- a/lisp/efs/efs-coke.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-coke.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-coke.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Coke Machine support for efs ;; Author: Sandy Rutherford <sandy@imb550.sissa.it> @@ -22,7 +22,7 @@ (defconst efs-coke-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;; ------------------------------------------------------------ ;;;; Coke Machine support
--- a/lisp/efs/efs-cp-p.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-cp-p.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-cp-p.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Support for preserving file modtimes with copies. i.e. cp -p ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -24,7 +24,7 @@ (defconst efs-cp-p-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) (defvar efs-local-timezone nil) ;; cache.
--- a/lisp/efs/efs-cu.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-cu.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-cu.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.4 $ +;; Version: #Revision: 1.12 $ ;; RCS: ;; Description: Common utilities needed by efs files. ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -55,7 +55,7 @@ (defconst efs-cu-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.4 $" 11 -2))) + (substring "#Revision: 1.12 $" 11 -2))) (defconst efs-case-insensitive-host-types '(vms cms mts ti-twenex ti-explorer dos mvs tops-20 mpe ka9q dos-distinct @@ -359,6 +359,7 @@ (user-login-name)))) (efs-set-user host user))))) +;;;###autoload (defun efs-ftp-path (path) "Parse PATH according to efs-path-regexp. Returns a list (HOST USER PATH), or nil if PATH does not match the format."
--- a/lisp/efs/efs-defun.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-defun.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-defun.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: efs-defun allows for OS-dependent coding of functions ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -136,7 +136,7 @@ (defconst efs-defun-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) (defconst efs-key-obarray (make-vector 7 0))
--- a/lisp/efs/efs-dired-mule.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-dired-mule.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-dired.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Makes efs-dired.el work with MULE. ;; Author: Ishikawa Ichiro <ichiro@ccsr.u-tokyo.ac.jp> @@ -16,7 +16,7 @@ (defconst efs-dired-mule-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;; Keep the byte-compiler happy (defvar efs-version-host-types)
--- a/lisp/efs/efs-dired.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-dired.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-dired.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.3 $ +;; Version: #Revision: 1.31 $ ;; RCS: ;; Description: Extends much of Dired to work under efs. ;; Authors: Sebastian Kremer <sk@thp.uni-koeln.de>, @@ -25,7 +25,7 @@ (defconst efs-dired-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.3 $" 11 -2))) + (substring "#Revision: 1.31 $" 11 -2))) ;;;; ---------------------------------------------------------------- ;;;; User Configuration Variables
--- a/lisp/efs/efs-dl.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-dl.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-dl.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.3 $ ;; RCS: ;; Description: Unix descriptive listing support for efs ;; Author: Sandy Rutherford <sandy@tsmi19.sissa.it> @@ -21,7 +21,7 @@ (defconst efs-dl-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.3 $" 11 -2))) ;;;----------------------------------------------------------------- ;;; Unix descriptive listing (dl) support for efs
--- a/lisp/efs/efs-dos-distinct.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-dos-distinct.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-dos-distinct.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Distinct's DOS FTP server support for efs ;; Author: Sandy Rutherford <sandy@tsmi19.sissa.it> @@ -23,7 +23,7 @@ (defconst efs-dos-distinct-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;; ----------------------------------------------------------------- ;;;; Distinct's DOS FTP server support for efs
--- a/lisp/efs/efs-dump.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-dump.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-dump.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Install a bare-bones EFS hook into file-name-handler-alist ;; for dumping @@ -11,8 +11,33 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(provide 'efs-dump) + +(defconst efs-dump-version + (concat (substring "$efs release: 1.15 $" 14 -2) + "/" + (substring "#Revision: 1.1 $" 11 -2))) + ;;;###autoload -(setq file-name-handler-alist - (cons - (cons efs-path-root-regexp 'efs-file-handler-function) - file-name-handler-alist)) +(defvar allow-remote-paths t + "*Set this to nil if you don't want remote paths to access +remote files.") + +;;;###autoload +(or (assoc efs-path-root-regexp file-name-handler-alist) + (setq file-name-handler-alist + (cons + (cons efs-path-root-regexp 'remote-path-file-handler-function) + file-name-handler-alist))) + +;;;###autoload +(defun remote-path-file-handler-function (operation &rest args) + "Function to call special file handlers for remote files." + (if allow-remote-paths + (apply 'efs-file-handler-function operation args) + (let ((inhibit-file-name-handlers + (cons 'remote-path-file-handler-function + (and (eq inhibit-file-name-operation operation) + inhibit-file-name-handlers))) + (inhibit-file-name-operation operation)) + (apply operation args))))
--- a/lisp/efs/efs-fnh.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-fnh.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-fnh.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.3 $ ;; RCS: ;; Description: Look for the emacs version, and install into ;; the file-name-handler-alist @@ -20,7 +20,7 @@ (defconst efs-fnh-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.3 $" 11 -2))) ;;;; ---------------------------------------------------------------- ;;;; Loading emacs version files @@ -96,7 +96,10 @@ (defun efs-root-handler-function (operation &rest args) "Function to handle completion in the root directory." - (let ((handler (get operation 'efs-root))) + (let ((handler (and (if (boundp 'allow-remote-paths) + allow-remote-paths + t) + (get operation 'efs-root)))) (if handler (apply handler args) (let ((inhibit-file-name-handlers @@ -135,7 +138,8 @@ nil) (and (not (memq (cdr x) - '(efs-file-handler-function + '(remote-path-file-handler-function + efs-file-handler-function efs-root-handler-function ange-ftp-hook-function ange-ftp-completion-hook-function)))
--- a/lisp/efs/efs-guardian.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-guardian.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-guardian.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.7 $ ;; RCS: ;; Description: Guardian support for efs ;; Author: Sandy Rutherford <sandy@math.ubc.ca> @@ -22,7 +22,7 @@ (defconst efs-guardian-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.7 $" 11 -2))) (provide 'efs-guardian) (require 'efs)
--- a/lisp/efs/efs-gwp.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-gwp.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-gwp.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Support for efs to use an interactive gateway. ;; Author: Andy Norman, Dawn @@ -77,7 +77,7 @@ (defconst efs-gwp-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) (defvar efs-gwp-running t) (defvar efs-gwp-status nil)
--- a/lisp/efs/efs-hell.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-hell.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-hell.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Hellsoft FTP server support for efs ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -22,7 +22,7 @@ (defconst efs-hell-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;; -------------------------------------------------------------- ;;;; Hellsoft FTP server support for efs
--- a/lisp/efs/efs-ka9q.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-ka9q.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-ka9q.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.2 $ ;; RCS: ;; Description: KA9Q support for efs ;; Author: Sandy Rutherford <sandy@tsmi19.sissa.it> @@ -23,7 +23,7 @@ (defconst efs-ka9q-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.2 $" 11 -2))) ;;;----------------------------------------------------------------- ;;; KA9Q support for efs
--- a/lisp/efs/efs-kerberos.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-kerberos.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-kerberos.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.0 $ ;; RCS: ;; Description: Support for Kerberos gateways. ;; Author: Sandy Rutherford <sandy@gandalf.sissa.it> @@ -21,7 +21,7 @@ (defconst efs-kerberos-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.0 $" 11 -2))) ;;; Internal Variables
--- a/lisp/efs/efs-l19.11.el Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,175 +0,0 @@ -;; -*-Emacs-Lisp-*- -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; File: efs-l19.11.el -;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ -;; RCS: -;; Description: efs support for XEemacs, versions 19.11, and later. -;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> -;; Created: Tue Aug 2 17:40:32 1994 by sandy on ibm550 -;; Modified: Sun Nov 27 18:34:33 1994 by sandy on gandalf -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(provide 'efs-l19\.11) -(require 'efs-cu) -(require 'default-dir) -(require 'efs-ovwrt) - -(defconst efs-l19\.11-version - (concat (substring "$efs release: 1.15 $" 14 -2) - "/" - (substring "$Revision: 1.1 $" 11 -2))) - -;;; Functions requiring special defs. for these lemacs versions. - -(defun efs-abbreviate-file-name (filename &optional hack-homedir) - ;; lucid emacs version of abbreviate-file-name for remote files. - (let (file-name-handler-alist) - (if (and hack-homedir (efs-ftp-path filename)) - ;; Do replacements from directory-abbrev-alist - (apply 'efs-unexpand-parsed-filename - (efs-ftp-path (abbreviate-file-name filename nil))) - (abbreviate-file-name filename hack-homedir)))) - -(defun efs-relativize-filename (file &optional dir new) - "Abbreviate the given filename relative to DIR . -If DIR is nil, use the value of `default-directory'. If the -optional parameter NEW is given and the non-directory parts match, only return -the directory part of the file." - (let* ((dir (or dir default-directory)) - (dlen (length dir)) - (result file)) - (and (> (length file) dlen) - (string-equal (substring file 0 dlen) dir) - (setq result (substring file dlen))) - (and new - (string-equal (file-name-nondirectory result) - (file-name-nondirectory new)) - (or (setq result (file-name-directory result)) - (setq result "./"))) - (abbreviate-file-name result t))) - -(defun efs-set-buffer-file-name (filename) - ;; Sets the buffer local variables for filename appropriately. - ;; A special function because Lucid and FSF do this differently. - (setq buffer-file-name filename) - (if (and efs-compute-remote-buffer-file-truename - (memq (efs-host-type (car (efs-ftp-path filename))) - efs-unix-host-types)) - (compute-buffer-file-truename) - (setq buffer-file-truename filename))) - -;; Do we need to do anything about compute-buffer-file-truename, or -;; will the handler for file-truename handle this automatically? I suppose -;; that efs-compute-remote-buffer-file-truename should really apply to -;; compute-buffer-file-truename, and not file-truename, but then we would -;; have to do deal with the fact that this function doesn't exist in GNU Emacs. - -;; Only Lucid Emacs has this function. Why do we need both this and -;; set-visited-file-modtime? - -(defun efs-set-buffer-modtime (buffer &optional time) - ;; For buffers visiting remote files, set the buffer modtime. - (or time - (progn - (setq time - (let* ((file (save-excursion - (set-buffer buffer) buffer-file-name)) - (parsed (efs-ftp-path file))) - (efs-get-file-mdtm (car parsed) (nth 1 parsed) - (nth 2 parsed) file))) - (if time - (setq time (cons (car time) (nth 1 time))) - (setq time '(0 . 0))))) - (let (file-name-handler-alist) - (set-buffer-modtime buffer time))) - -;;; Need to add access to the file-name-handler-alist to these functions. - -(defun efs-l19\.11-set-buffer-modtime (buffer &optional time) - "Documented as original" - (let ((handler (save-excursion - (set-buffer buffer) - (and buffer-file-name - (find-file-name-handler buffer-file-name - 'set-buffer-modtime))))) - (if handler - (funcall handler 'set-buffer-modtime buffer time) - (let (file-name-handler-alist) - (efs-real-set-buffer-modtime buffer time))))) - -(efs-overwrite-fn "efs" 'set-buffer-modtime 'efs-l19\.11-set-buffer-modtime) - -(defun efs-l19\.11-backup-buffer () - "Documented as original" - (if buffer-file-name - (let ((handler (find-file-name-handler buffer-file-name 'backup-buffer))) - (if handler - (funcall handler 'backup-buffer) - (let (file-name-handler-alist) - (efs-real-backup-buffer)))))) - -(efs-overwrite-fn "efs" 'backup-buffer 'efs-l19\.11-backup-buffer) - -(defun efs-l19\.11-create-file-buffer (file) - "Documented as original" - (let ((handler (find-file-name-handler file 'create-file-buffer))) - (if handler - (funcall handler 'create-file-buffer file) - (let (file-name-handler-alist) - (efs-real-create-file-buffer file))))) - -(efs-overwrite-fn "efs" 'create-file-buffer 'efs-l19\.11-create-file-buffer) - -(defun efs-l19\.11-abbreviate-file-name (filename &optional hack-homedir) - "Documented as original" - (let ((handler (find-file-name-handler filename 'abbreviate-file-name))) - (if handler - (funcall handler 'abbreviate-file-name filename hack-homedir) - (let (file-name-handler-alist) - (efs-real-abbreviate-file-name filename hack-homedir))))) - -(efs-overwrite-fn "efs" 'abbreviate-file-name - 'efs-l19\.11-abbreviate-file-name) - -(defun efs-l19\.11-recover-file (file) - "Documented as original" - (interactive - (let ((prompt-file buffer-file-name) - (file-name nil) - (file-dir nil)) - (and prompt-file - (setq file-name (file-name-nondirectory prompt-file) - file-dir (file-name-directory prompt-file))) - (list (read-file-name "Recover file: " - file-dir nil nil file-name)))) - (let* ((file (expand-file-name file)) - (handler (or (find-file-name-handler file 'recover-file) - (find-file-name-handler - (let ((buffer-file-name file)) - (make-auto-save-file-name)) - 'recover-file)))) - (if handler - (funcall handler 'recover-file file) - (efs-real-recover-file file)))) - -(efs-overwrite-fn "efs" 'recover-file 'efs-l19\.11-recover-file) - -(defun efs-l19\.11-substitute-in-file-name (filename) - "Documented as original." - (let ((handler (find-file-name-handler filename 'substitute-in-file-name))) - (if handler - (funcall handler 'substitute-in-file-name filename) - (let (file-name-handler-alist) - (efs-real-substitute-in-file-name filename))))) - -(efs-overwrite-fn "efs" 'substitute-in-file-name - 'efs-l19\.11-substitute-in-file-name) - -;;; For the file-name-handler-alist - -(put 'set-buffer-modtime 'efs 'efs-set-buffer-modtime) - -;;; end of efs-l19.11.el
--- a/lisp/efs/efs-mpe.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-mpe.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-mpe.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.8 $ ;; RCS: ;; Description: MPE (HP3000) support for efs. ;; Author: (Corny de Souza) cdesouza@hpbbn.bbn.hp.com @@ -125,7 +125,7 @@ (defconst efs-mpe-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.8 $" 11 -2))) ;;; Support for build parameters
--- a/lisp/efs/efs-ms-unix.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-ms-unix.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-ms-unix.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: efs support for the Microsoft PC FTP server in unix mode. ;; Author: Sandy Rutherford <sandy@tsmi19.sissa.it> @@ -19,7 +19,7 @@ (defconst efs-ms-unix-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) (defvar efs-ms-unix-month-and-time-regexp (concat
--- a/lisp/efs/efs-mts.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-mts.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-mts.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: MTS support for efs ;; Author: Sandy Rutherford <sandy@itp.ethz.ch> @@ -22,7 +22,7 @@ (defconst efs-mts-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;; ------------------------------------------------------------ ;;;; MTS support
--- a/lisp/efs/efs-mvs.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-mvs.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-mvs.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.4 $ ;; RCS: ;; Description: MVS support for efs ;; Author: Sandy Rutherford <sandy@math.ubc.ca, sandy@itp.ethz.ch> @@ -26,7 +26,7 @@ (defconst efs-mvs-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.4 $" 11 -2))) ;; What's the MVS character set for valid partitioned data sets? ;; I'll guess [-A-Z0-9_$+]
--- a/lisp/efs/efs-netrc.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-netrc.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-netrc.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.2 $ ;; RCS: ;; Description: Parses ~/.netrc file, and does completion in /. ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -32,7 +32,7 @@ (defconst efs-netrc-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.2 $" 11 -2))) ;; Make the byte compiler happy. (defvar dired-directory)
--- a/lisp/efs/efs-netware.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-netware.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-netware.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.5 $ ;; RCS: ;; Description: efs support for the Novell Netware FTP server ;; Author: Sandy Rutherford <sandy@math.ubc.ca> @@ -24,7 +24,7 @@ (defconst efs-netware-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.5 $" 11 -2))) ;;; Basic efs support
--- a/lisp/efs/efs-nos-ve.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-nos-ve.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-nos-ve.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.2 $ ;; RCS: ;; Description: efs support for NOS/VE ;; Authors: Sandy Rutherford <sandy@ibm550.sissa,it> @@ -26,7 +26,7 @@ (defconst efs-nos-ve-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.2 $" 11 -2))) ;;;;--------------------------------------------------------------- ;;;; NOS/VE support for efs
--- a/lisp/efs/efs-ovwrt.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-ovwrt.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-ovwrt.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.2 $ ;; RCS: ;; Description: Utilities for overwriting functions with new definitions. ;; Author: Andy Norman <ange@hplb.hpl.hp.com> @@ -15,11 +15,15 @@ ;;; makes it easier for other programs to require them. (provide 'efs-ovwrt) +(eval-when-compile + (condition-case nil + (require 'advice) + (error))) (defconst efs-ovwrt-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.2 $" 11 -2))) (defvar efs-overwrite-fmt "Note: This function has been modified to work with %s.")
--- a/lisp/efs/efs-pc.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-pc.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-pc.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: PC support for efs ;; Author: Sandy Rutherford <sandy@tsmi19.sissa.it> @@ -31,7 +31,7 @@ (defconst efs-pc-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;----------------------------------------------------------------- ;;; PC support for efs
--- a/lisp/efs/efs-plan9.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-plan9.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-plan9.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: efs support for the Plan 9 FTP Server ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -24,7 +24,7 @@ (defconst efs-plan9-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) (efs-defun efs-fix-dir-path plan9 (dir-path) ;; Convert DIR-PATH from UN*X-ish to Plan 9. Does nothing actually.
--- a/lisp/efs/efs-report.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-report.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-report.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.9 $ ;; RCS: ;; Description: Function to report efs bugs in a usable way. ;; Author: Andy Norman, Dawn @@ -22,7 +22,7 @@ (defconst efs-report-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.9 $" 11 -2))) (defconst efs-report-salutations ["Dear bug team:"
--- a/lisp/efs/efs-ti-explorer.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-ti-explorer.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-ti-explorer.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Explorer support for efs ;; Author: Jamie Zawinski <jwz@lucid.com> @@ -22,7 +22,7 @@ (defconst efs-ti-explorer-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;; ------------------------------------------------------------ ;;;; Explorer support.
--- a/lisp/efs/efs-ti-twenex.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-ti-twenex.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-ti-twenex.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Support for a TI lisp machine in Twenex emulation mode. ;; Author: Jamie Zawinski <jwz@lucid.com> @@ -22,7 +22,7 @@ (defconst efs-ti-twenex-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;; ------------------------------------------------------------ ;;;; Twenex support.
--- a/lisp/efs/efs-tops-20.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-tops-20.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-tops-20.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.2 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: TOPS-20 support for efs ;; Author: Sandy Rutherford <sandy@math.ubc.ca, sandy@itp.ethz.ch> @@ -22,7 +22,7 @@ (defconst efs-tops-20-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.2 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;; ------------------------------------------------------------ ;;;; TOPS-20 support
--- a/lisp/efs/efs-vm.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-vm.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-vm.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Allows the VM mail reader to access folders using efs. ;; If you are looking for support for VM/CMS, see efs-cms.el. @@ -75,7 +75,7 @@ (defconst efs-vm-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) (defun efs-vm-get-new-mail (&optional arg)
--- a/lisp/efs/efs-vms.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-vms.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-vms.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.13 $ ;; RCS: ;; Description: VMS support for efs ;; Authors: Andy Norman, Joe Wells, Sandy Rutherford <sandy@itp.ethz.ch> @@ -20,7 +20,7 @@ (defconst efs-vms-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.13 $" 11 -2))) ;;;; ------------------------------------------------------------ ;;;; VMS support.
--- a/lisp/efs/efs-vos.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-vos.el Mon Aug 13 09:23:06 2007 +0200 @@ -4,7 +4,7 @@ ;; File: efs-vos.el ;; Description: VOS support for efs ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> ;; Created: Sat Apr 3 03:05:00 1993 by sandy on ibm550 @@ -27,7 +27,7 @@ (defconst efs-vos-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.1 $" 11 -2))) + (substring "#Revision: 1.1 $" 11 -2))) ;;;;--------------------------------------------------------------- ;;;; VOS support for efs
--- a/lisp/efs/efs-x19.15.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs-x19.15.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs-x19.15.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.3 $ +;; Version: #Revision: 1.2 $ ;; RCS: ;; Description: efs support for XEmacs, versions 19.15, and later. ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> @@ -18,7 +18,7 @@ (defconst efs-x19\.15-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.3 $" 11 -2))) + (substring "#Revision: 1.2 $" 11 -2))) ;;; Functions requiring special defs. for these XEmacs versions.
--- a/lisp/efs/efs.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/efs.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: efs.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.4 $ +;; Version: #Revision: 1.56 $ ;; RCS: ;; Description: Transparent FTP support for the original GNU Emacs ;; from FSF and Lucid Emacs @@ -902,7 +902,7 @@ ;;; efs|Andy Norman and Sandy Rutherford ;;; |ange@hplb.hpl.hp.com and sandy@ibm550.sissa.it ;;; |transparent FTP Support for GNU Emacs -;;; |$Date: 1997/03/22 06:01:58 $|$efs release: 1.15 beta $| +;;; |$Date: 1997/03/28 02:28:27 $|$efs release: 1.15 beta $| ;;; Host and listing type notation: ;;; @@ -1049,7 +1049,7 @@ (defconst efs-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" - (substring "$Revision: 1.4 $" 11 -2))) + (substring "#Revision: 1.56 $" 11 -2))) (defconst efs-time-zero 1970) ; we count time from midnight, Jan 1, 1970 GMT. @@ -3235,8 +3235,9 @@ (if efs-ftp-activity-function (funcall efs-ftp-activity-function num)))) +;;;###autoload (defun efs-display-ftp-activity () - "Displays the number of active background ftp sessions. + "Displays the number of active background ftp sessions in the modeline. Uses the variable `efs-mode-line-format' to determine how this will be displayed." (interactive) @@ -7841,7 +7842,7 @@ ;;; Getting directory listings. -(defun efs-directory-files (directory &optional full match nosort) +(defun efs-directory-files (directory &optional full match nosort &rest ignored-for-now) ;; Returns directory-files for remote directories. ;; NOSORT is a V19 arg. (let* ((directory (expand-file-name directory)) @@ -10730,7 +10731,10 @@ ;;;###autoload (defun efs-file-handler-function (operation &rest args) "Function to call special file handlers for remote files." - (let ((handler (get operation 'efs))) + (let ((handler (and (if (boundp 'allow-remote-paths) + allow-remote-paths + t) + (get operation 'efs)))) (if handler (apply handler args) (let ((inhibit-file-name-handlers @@ -10742,7 +10746,10 @@ (defun efs-sifn-handler-function (operation &rest args) ;; Handler function for substitute-in-file-name - (if (eq operation 'substitute-in-file-name) + (if (and (if (boundp 'allow-remote-paths) + allow-remote-paths + t) + (eq operation 'substitute-in-file-name)) (apply 'efs-substitute-in-file-name args) (let ((inhibit-file-name-handlers (cons 'efs-sifn-handler-function
--- a/lisp/efs/emacs-19.el Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,484 +0,0 @@ -;;;; Emacs 19 compatibility functions for use in Emacs 18. -;;;; Based on: $Id: emacs-19.el,v 1.1 1997/02/11 05:05:14 steve Exp $ -;;;; -;;;; Rewritten by sandy@ibm550.sissa.it after gnu emacs 19 was -;;;; released to make it closer to V19. -;;;; Last modified: Sun Jun 12 00:06:06 1994 by sandy on ibm550 - -;;; This program is free software; you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 1, or (at your option) -;;; any later version. -;;; -;;; This program is distributed in the hope that it will be useful, -;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. -;;; -;;; A copy of the GNU General Public License can be obtained from this -;;; program's author (send electronic mail to roland@ai.mit.edu) or from -;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA -;;; 02139, USA. - -;; These functions are used in dired.el, but are also of general -;; interest, so you may want to add this to your .emacs: -;; -;; (autoload 'make-directory "emacs-19" "Make a directory." t) -;; (autoload 'delete-directory "emacs-19" "Remove a directory." t) -;; (autoload 'member "emacs-19" "Like memq, but uses `equal' instead of `eq'.") -;; (autoload 'compiled-function-p "emacs-19" "Emacs 18 doesn't have these.") - -(provide 'emacs-19) - -;;; Variables - -(defvar insert-directory-program "ls" - "Absolute or relative name of the `ls' program used by `insert-directory'.") - -(defvar bv-length) ; make the byte compiler a happy camper - -(defconst directory-abbrev-alist - nil - "*Alist of abbreviations for file directories. -A list of elements of the form (FROM . TO), each meaning to replace -FROM with TO when it appears in a directory name. This replacement is -done when setting up the default directory of a newly visited file. -*Every* FROM string should start with `^'. - -Use this feature when you have directories which you normally refer to -via absolute symbolic links. Make TO the name of the link, and FROM -the name it is linked to.") - -(defconst automount-dir-prefix "^/tmp_mnt/" - "Regexp to match the automounter prefix in a directory name.") - -(defvar abbreviated-home-dir nil - "The the user's homedir abbreviated according to `directory-abbrev-list'.") - -;;; Autoloads - -(autoload 'diff "diff" "Diff two files." t) -(autoload 'diff-backup "diff" "Diff a file with its most recent backup.") - -;;; Functions which are subroutines in Emacs 19. - -;; Provide a non-working version of find-file-name-handler. -;; If you want it to work, require 'fn-handler. - -(or (fboundp 'find-file-name-handler) (fset 'find-file-name-handler 'ignore)) -(or (boundp 'file-name-handler-alist) (defvar file-name-handler-alist nil)) - -;; The name of buffer-flush-undo has changed in V19. -(fset 'buffer-disable-undo 'buffer-flush-undo) - -(defun current-time () - "Returns the number of seconds since midnight. -A poor man's version of the the function `current-time' in emacs 19." - (let ((string (current-time-string))) - (list - 0 - (+ (* 3600 (string-to-int (substring string 11 13))) - (* 60 (string-to-int (substring string 14 16))) - (string-to-int (substring string 17 19))) - 0))) - -;; call-process below may lose if filename starts with a `-', but I -;; fear not all mkdir or rmdir implementations understand `--'. - -(defun delete-directory (fn) - "Delete a directory. -This is a subr in Emacs 19." - (interactive - (list (read-file-name "Delete directory: " nil nil 'confirm))) - (setq fn (expand-file-name fn)) - (if (file-directory-p fn) - (call-process "rmdir" nil nil nil fn) - (error "Not a directory: %s" fn)) - (if (file-exists-p fn) - (error "Could not remove directory %s" fn))) - -(defun make-directory (dir &optional parents) - "Create the directory DIR and any nonexistent parent dirs." - (interactive "FMake directory: \nP") - (if (not parents) - (make-directory-internal dir) - (let ((dir (directory-file-name (expand-file-name dir))) - create-list) - (while (not (file-exists-p dir)) - (setq create-list (cons dir create-list) - dir (directory-file-name (file-name-directory dir)))) - (while create-list - (make-directory-internal (car create-list)) - (setq create-list (cdr create-list)))))) - -(defun make-directory-internal (fn) - ;; This is a subroutine in emacs 19. - (let* ((fn (expand-file-name fn)) - (handler (find-file-name-handler fn 'make-directory-internal))) - (if handler - (funcall handler 'make-directory-internal fn) - (setq fn (directory-file-name fn)) - (if (file-exists-p fn) - (error "Cannot make directory %s: file already exists" fn) - (call-process "mkdir" nil nil nil fn)) - (or (file-directory-p fn) - (error "Could not make directory %s" fn))))) - -(defun kill-new (string) - "Save STRING as if killed in a buffer." - (setq kill-ring (cons string kill-ring)) - (if (> (length kill-ring) kill-ring-max) - (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)) - (setq kill-ring-yank-pointer kill-ring)) - -(defun insert-directory (file switches &optional wildcard full-directory-p) - "Insert directory listing for FILE, formatted according to SWITCHES. -Leaves point after the inserted text. -SWITCHES may be a string of options, or a list of strings. -Optional third arg WILDCARD means treat FILE as shell wildcard. -Optional fourth arg FULL-DIRECTORY-P means file is a directory and -switches do not contain `d', so that a full listing is expected. - -This works by running a directory listing program -whose name is in the variable `insert-directory-program'. -If WILDCARD, it also runs the shell specified by `shell-file-name'." - ;; We need the directory in order to find the right handler. - (let ((handler (find-file-name-handler (expand-file-name file) - 'insert-directory))) - (if handler - (funcall handler 'insert-directory file switches - wildcard full-directory-p) - (if (eq system-type 'vax-vms) - (vms-read-directory file switches (current-buffer)) - (if wildcard - ;; Run ls in the directory of the file pattern we asked for. - (let ((default-directory - (if (file-name-absolute-p file) - (file-name-directory file) - (file-name-directory (expand-file-name file)))) - (pattern (file-name-nondirectory file)) - (beg 0)) - ;; Quote some characters that have special meanings in shells; - ;; but don't quote the wildcards--we want them to be special. - ;; We also currently don't quote the quoting characters - ;; in case people want to use them explicitly to quote - ;; wildcard characters. - (while (string-match "[ \t\n;<>&|()#$]" pattern beg) - (setq pattern - (concat (substring pattern 0 (match-beginning 0)) - "\\" - (substring pattern (match-beginning 0))) - beg (1+ (match-end 0)))) - (call-process shell-file-name nil t nil - "-c" (concat insert-directory-program - " -d " - (if (stringp switches) - switches - (mapconcat 'identity switches " ")) - " " - pattern))) - ;; SunOS 4.1.3, SVr4 and others need the "." to list the - ;; directory if FILE is a symbolic link. - (apply 'call-process - insert-directory-program nil t nil - (let (list) - (if (listp switches) - (setq list switches) - (if (not (equal switches "")) - (progn - ;; Split the switches at any spaces - ;; so we can pass separate options as separate args. - (while (string-match " " switches) - (setq list (cons (substring switches 0 - (match-beginning 0)) - list) - switches (substring switches - (match-end 0)))) - (setq list (cons switches list))))) - (append list - (list - (if full-directory-p - (concat (file-name-as-directory file) ".") - file)))))))))) - -(defun file-local-copy (file) - "Copy the file FILE into a temporary file on this machine. -Returns the name of the local copy, or nil, if FILE is directly -accessible." - (let* ((file (expand-file-name file)) - (handler (find-file-name-handler file 'file-local-copy))) - ;; Does nothing, if no handler. - (if handler - (funcall handler 'file-local-copy file)))) - -(defun file-truename (filename) - "Return the truename of FILENAME, which should be absolute. -The truename of a file name is found by chasing symbolic links -both at the level of the file and at the level of the directories -containing it, until no links are left at any level." - (if (or (string= filename "~") - (and (string= (substring filename 0 1) "~") - (string-match "~[^/]*" filename))) - (progn - (setq filename (expand-file-name filename)) - (if (string= filename "") - (setq filename "/")))) - (let ((handler (find-file-name-handler filename 'file-truename))) - ;; For file name that has a special handler, call handler. - ;; This is so that ange-ftp can save time by doing a no-op. - (if handler - (funcall handler 'file-truename filename) - (let ((dir (file-name-directory filename)) - target dirfile file-name-handler-alist) - ;; Get the truename of the directory. - (setq dirfile (directory-file-name dir)) - ;; If these are equal, we have the (or a) root directory. - (or (string= dir dirfile) - (setq dir (file-name-as-directory (file-truename dirfile)))) - (if (equal ".." (file-name-nondirectory filename)) - (directory-file-name (file-name-directory - (directory-file-name dir))) - (if (equal "." (file-name-nondirectory filename)) - (directory-file-name dir) - ;; Put it back on the file name. - (setq filename (concat dir (file-name-nondirectory filename))) - ;; Is the file name the name of a link? - (setq target (file-symlink-p filename)) - (if target - ;; Yes => chase that link, then start all over - ;; since the link may point to a directory name that uses links. - ;; We can't safely use expand-file-name here - ;; since target might look like foo/../bar where foo - ;; is itself a link. Instead, we handle . and .. above. - (if (file-name-absolute-p target) - (file-truename target) - (file-truename (concat dir target))) - ;; No, we are done! - filename))))))) - -(defun generate-new-buffer-name (name) - "Return a string which is the name of no existing buffer based on -NAME. If there is no live buffer named NAME, return NAME. Otherwise, -modify name by appending `<NUMBER>', incrementing NUMBER until an -unused name is found. Return that name." - (if (get-buffer name) - (let ((num 2) - attempt) - (while (progn - (setq attempt (concat name "<" (int-to-string num) ">")) - (get-buffer attempt)) - (setq num (1+ num))) - attempt) - name)) - -(defun abbreviate-file-name (filename) - "Return a version of FILENAME shortened using `directory-abbrev-alist'. -This also substitutes \"~\" for the user's home directory. -Type \\[describe-variable] directory-abbrev-alist RET for more information." - ;; Get rid of the prefixes added by the automounter. - (if (and (string-match automount-dir-prefix filename) - (file-exists-p (file-name-directory - (substring filename (1- (match-end 0)))))) - (setq filename (substring filename (1- (match-end 0))))) - (let ((tail directory-abbrev-alist)) - ;; If any elt of directory-abbrev-alist matches this name, - ;; abbreviate accordingly. - (while tail - (if (string-match (car (car tail)) filename) - (setq filename - (concat (cdr (car tail)) (substring filename (match-end 0))))) - (setq tail (cdr tail))) - ;; Compute and save the abbreviated homedir name. - ;; We defer computing this until the first time it's needed, to - ;; give time for directory-abbrev-alist to be set properly. - (or abbreviated-home-dir - (setq abbreviated-home-dir - (let ((abbreviated-home-dir "$foo")) - (concat "^" (abbreviate-file-name (expand-file-name "~")))))) - ;; If FILENAME starts with the abbreviated homedir, - ;; make it start with `~' instead. - (if (string-match abbreviated-home-dir filename) - (setq filename - (concat "~" - ;; If abbreviated-home-dir ends with a slash, - ;; don't remove the corresponding slash from - ;; filename. On MS-DOS and OS/2, you can have - ;; home directories like "g:/", in which it is - ;; important not to remove the slash. And what - ;; about poor root on Unix systems? - (if (eq ?/ (aref abbreviated-home-dir - (1- (length abbreviated-home-dir)))) - "/" - "") - (substring filename (match-end 0))))) - filename)) - -(defun file-newest-backup (filename) - "Return most recent backup file for FILENAME or nil if no backups exist." - (let* ((filename (expand-file-name filename)) - (file (file-name-nondirectory filename)) - (dir (file-name-directory filename)) - (comp (file-name-all-completions file dir)) - newest) - (while comp - (setq file (concat dir (car comp)) - comp (cdr comp)) - (if (and (backup-file-name-p file) - (or (null newest) (file-newer-than-file-p file newest))) - (setq newest file))) - newest)) - -;; This is used in various files. -;; The usage of bv-length is not very clean, -;; but I can't see a good alternative, -;; so as of now I am leaving it alone. -(defun backup-extract-version (fn) - "Given the name of a numeric backup file, return the backup number. -Uses the free variable `bv-length', whose value should be -the index in the name where the version number begins." - (if (and (string-match "[0-9]+~$" fn bv-length) - (= (match-beginning 0) bv-length)) - (string-to-int (substring fn bv-length -1)) - 0)) - -;; The standard V18 version of this function doesn't support -;; the arg KEEP-BACKUP-VERSION -(defun file-name-sans-versions (name &optional keep-backup-version) - "Return FILENAME sans backup versions or strings. -This is a separate procedure so your site-init or startup file can -redefine it. -If the optional argument KEEP-BACKUP-VERSION is non-nil, -we do not remove backup version numbers, only true file version numbers." - (let ((handler (find-file-name-handler name 'file-name-sans-versions))) - (if handler - (funcall handler 'file-name-sans-versions name keep-backup-version) - (substring name 0 - (if (eq system-type 'vax-vms) - ;; VMS version number is (a) semicolon, optional - ;; sign, zero or more digits or (b) period, option - ;; sign, zero or more digits, provided this is the - ;; second period encountered outside of the - ;; device/directory part of the file name. - (or (string-match ";[-+]?[0-9]*\\'" name) - (if (string-match "\\.[^]>:]*\\(\\.[-+]?[0-9]*\\)\\'" - name) - (match-beginning 1)) - (length name)) - (if keep-backup-version - (length name) - (or (string-match "\\.~[0-9]+~\\'" name) - (string-match "~\\'" name) - (length name)))))))) - -(defun member (x y) - "Like memq, but uses `equal' for comparison. -This is a subr in Emacs 19." - (while (and y (not (equal x (car y)))) - (setq y (cdr y))) - y) - -(defun compiled-function-p (x) - "Emacs 18 doesn't have these." - nil) - -;; punt -- this will at least allow handlers to work for this. -(defun set-visited-file-modtime (&optional time) - (error "set-visited-file-modtime not defined in emacs 18.")) - -(defun add-hook (hook function &optional append) - "Add to the value of HOOK the function FUNCTION. -FUNCTION is not added if already present. -FUNCTION is added (if necessary) at the beginning of the hook list -unless the optional argument APPEND is non-nil, in which case -FUNCTION is added at the end. - -HOOK should be a symbol, and FUNCTION may be any valid function. If -HOOK is void, it is first set to nil. If HOOK's value is a single -function, it is changed to a list of functions." - (or (boundp hook) (set hook nil)) - ;; If the hook value is a single function, turn it into a list. - (let ((old (symbol-value hook))) - (if (or (not (listp old)) (eq (car old) 'lambda)) - (set hook (list old)))) - (or (if (consp function) - ;; Clever way to tell whether a given lambda-expression - ;; is equal to anything in the hook. - (let ((tail (assoc (cdr function) (symbol-value hook)))) - (equal function tail)) - (memq function (symbol-value hook))) - (set hook - (if append - (nconc (symbol-value hook) (list function)) - (cons function (symbol-value hook)))))) - -;;; after-save.el (Now part of files.el in Gnu Emacs V19) - -;;; Copyright (C) 1990 Roland McGrath -;;; - -(or (fboundp 'real-save-buffer) - (fset 'real-save-buffer (symbol-function 'save-buffer))) - -(defvar after-save-hook nil - "A function or list of functions to be run after saving the current buffer.") - -(defun save-buffer (&optional args) - "Save the current buffer, and then run `after-save-buffer-hook'. -The hooks are only run if the buffer was actually written. -For more documentation, do \\[describe-function] real-save-buffer RET." - (interactive "p") - (let ((modp (buffer-modified-p))) - (real-save-buffer args) - (if modp - (run-hooks 'after-save-hook)))) - -;;; end of after-save - -;;;; -;;;; Correcting for V18 bugs, and hacking around stupidities. -;;;; - -;; The 18.57 version has a bug that causes C-x C-v RET (which usually -;; re-visits the current buffer) to fail on dired buffers. -;; Only the last statement was changed to avoid killing the current -;; buffer. -(defun find-alternate-file (filename) - "Find file FILENAME, select its buffer, kill previous buffer. -If the current buffer now contains an empty file that you just visited -\(presumably by mistake), use this command to visit the file you really want." - (interactive "FFind alternate file: ") - (and (buffer-modified-p) - (not buffer-read-only) - (not (yes-or-no-p (format "Buffer %s is modified; kill anyway? " - (buffer-name)))) - (error "Aborted")) - (let ((obuf (current-buffer)) - (ofile buffer-file-name) - (oname (buffer-name))) - (rename-buffer " **lose**") - (setq buffer-file-name nil) - (unwind-protect - (progn - (unlock-buffer) - (find-file filename)) - (cond ((eq obuf (current-buffer)) - (setq buffer-file-name ofile) - (lock-buffer) - (rename-buffer oname)))) - (or (eq (current-buffer) obuf) - (kill-buffer obuf)))) - -;; At least in Emacs 18.55 this defvar has been forgotten to be copied -;; from lpr.el into loaddefs.el - -(defvar lpr-command (if (eq system-type 'usg-unix-v) - "lp" "lpr") - "Shell command for printing a file") - - -;; buffer-disable-undo used to be called buffer-flush-undo in Emacs -;; 18.55: -(or (fboundp 'buffer-disable-undo) - (fset 'buffer-disable-undo 'buffer-flush-undo)) - -;;; end of emacs-19.el
--- a/lisp/efs/fixup.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/efs/fixup.el Mon Aug 13 09:23:06 2007 +0200 @@ -3,7 +3,7 @@ ;; ;; File: fixup.el ;; Release: $efs release: 1.15 $ -;; Version: $Revision: 1.1 $ +;; Version: #Revision: 1.1 $ ;; RCS: ;; Description: Fix up the load path for batch byte compilation of efs. ;; Author: Andy Norman, Dawn
--- a/lisp/efs/fn-handler.el Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,656 +0,0 @@ -;; -*-Emacs-Lisp-*- -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; File: fn-handler.el -;; Description: enhanced file-name-handler-alist support for pre-19.23 Emacs -;; Author: Sandy Rutherford <sandy@ibm550.sissa.it> -;; Created: Sat Mar 19 00:50:10 1994 by sandy on ibm550 -;; Modified: Tue Sep 13 20:59:19 1994 by sandy on ibm550 -;; Language: Emacs-Lisp -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - -;;; One of the problems with the file-name-handler-alist, is that when -;;; a handler gets called, and it has nothing to do for that function, -;;; the usual procedure is to remove the handler from the alist, and -;;; re-call the function. This is necessary to avoid an infinite -;;; recursion. However, if the function calling -;;; find-file-name-handler is not a primitive, there may be other lisp -;;; functions inside of it for which the handler does have some -;;; special actions specified. They won't run, because the let-bound -;;; value of file-name-handler-alist doesn't contain the handler. -;;; -;;; This problem was solved in Emacs 19.23 with the variables -;;; inhibit-file-name-handlers and inhibit-file-name-operation -;;; This file provides this solution to older versions of emacs. - - -(provide 'fn-handler) -(require 'efs-ovwrt) - -(or (boundp 'file-name-handler-alist) - (defvar file-name-handler-alist nil - "Association list of regexps for special file names and handlers.")) - -(defvar inhibit-file-name-handlers nil - "List of handlers \(symbols\) to be avoided by `find-file-name-handler'.") - -(defvar inhibit-file-name-operation nil - "Defines to which operation `inhibit-file-name-handlers applies' -Must be a synbol.") - -(defun find-file-name-handler (filename &optional operation) - "Return FILENAME1's handler function, if its syntax is handled specially. -Does not return handlers in `inhibit-file-name-handlers' list. -If there is no handler for FILENAME1, searches for one for FILENAME2. -Returns nil, if there is no handler for either file name. -A file name is handles specially if one of the regular expressions in -`file-name-handler-alist' matches it." - (let ((match-data (match-data))) - (unwind-protect - (catch 'handler - (mapcar (function - (lambda (x) - (and - (not - (and - (or (null operation) - (eq operation inhibit-file-name-operation)) - (memq (cdr x) inhibit-file-name-handlers))) - (string-match (car x) filename) - (throw 'handler (cdr x))))) - file-name-handler-alist) - nil) - (store-match-data match-data)))) - -;;; Overloads to supply the file-name-handler-alist - -(defun fn-handler-insert-file-contents (filename &optional visit &rest args) - "Documented as original." - (let* ((filename (expand-file-name filename)) - (handler (find-file-name-handler filename 'insert-file-contents))) - (if handler - (apply handler 'insert-file-contents filename visit args) - (let (file-name-handler-alist) - (apply 'fn-handler-real-insert-file-contents filename visit args))))) - -(efs-overwrite-fn "fn-handler" 'insert-file-contents - 'fn-handler-insert-file-contents) - -(defun fn-handler-directory-files (directory &optional full match &rest nosort) - "Documented as original." - (let ((handler (find-file-name-handler directory 'directory-files))) - (if handler - (apply handler 'directory-files directory full match nosort) - (let (file-name-handler-alist) - (apply 'fn-handler-real-directory-files - directory full match nosort))))) - -(efs-overwrite-fn "fn-handler" 'directory-files 'fn-handler-directory-files) - -(defun fn-handler-list-directory (dirname &optional verbose) - "Documented as original." - (interactive (let ((pfx current-prefix-arg)) - (list (read-file-name (if pfx "List directory (verbose): " - "List directory (brief): ") - nil default-directory nil) - pfx))) - (let ((handler (find-file-name-handler dirname 'list-directory))) - (if handler - (funcall handler 'list-directory dirname verbose) - (let (file-name-handler-alist) - (fn-handler-real-list-directory dirname verbose))))) - -(efs-overwrite-fn "fn-handler" 'list-directory 'fn-handler-list-directory) - -(defun fn-handler-file-directory-p (filename) - "Documented as original." - (let* ((filename (expand-file-name filename)) - (handler (find-file-name-handler filename 'file-directory-p))) - (if handler - (funcall handler 'file-directory-p filename) - (let (file-name-handler-alist) - (fn-handler-real-file-directory-p filename))))) - -(efs-overwrite-fn "fn-handler" ' file-directory-p 'fn-handler-file-directory-p) - -(defun fn-handler-file-writable-p (filename) - "Documented as original." - (let* ((filename (expand-file-name filename)) - (handler (find-file-name-handler filename 'file-writable-p))) - (if handler - (funcall handler 'file-writable-p filename) - (let (file-name-handler-alist) - (fn-handler-real-file-writable-p filename))))) - -(efs-overwrite-fn "fn-handler" 'file-writable-p 'fn-handler-file-writable-p) - -(defun fn-handler-file-readable-p (filename) - "Documented as original." - (let* ((filename (expand-file-name filename)) - (handler (find-file-name-handler filename 'file-readable-p))) - (if handler - (funcall handler 'file-readable-p filename) - (let (file-name-handler-alist) - (fn-handler-real-file-readable-p filename))))) - -(efs-overwrite-fn "fn-handler" 'file-readable-p 'fn-handler-file-readable-p) - -(defun fn-handler-file-symlink-p (filename) - "Documented as original." - (let* ((filename (expand-file-name filename)) - (handler (find-file-name-handler filename 'file-symlink-p))) - (if handler - (funcall handler 'file-symlink-p filename) - (let (file-name-handler-alist) - (fn-handler-real-file-symlink-p filename))))) - -(efs-overwrite-fn "fn-handler" 'file-symlink-p 'fn-handler-file-symlink-p) - -(defun fn-handler-delete-file (file) - "Documented as original" - (interactive (list (read-file-name "Delete-file: " nil nil t))) - (let* ((file (expand-file-name file)) - (handler (find-file-name-handler file 'delete-file))) - (if handler - (funcall handler 'delete-file file) - (let (file-name-handler-alist) - (fn-handler-real-delete-file file))))) - -(efs-overwrite-fn "fn-handler" 'delete-file 'fn-handler-delete-file) - -(defun fn-handler-file-exists-p (filename) - "Documented as original" - (let* ((filename (expand-file-name filename)) - (handler (find-file-name-handler filename 'file-exists-p))) - (if handler - (funcall handler 'file-exists-p filename) - (let (file-name-handler-alist) - (fn-handler-real-file-exists-p filename))))) - -(efs-overwrite-fn "fn-handler" 'file-exists-p 'fn-handler-file-exists-p) - -(defun fn-handler-write-region (start end filename &optional append visit) - "Documented as original" - ;; Use read-file-name, rather then interactive spec, - ;; to make it easier to get decent initial contents in the minibuffer. - (interactive - (progn - (or (mark) (error "The mark is not set now.")) - (list (min (point) (mark)) - (max (point) (mark)) - (read-file-name "Write region to file: ")))) - (let* ((filename (expand-file-name filename)) - (handler (or (find-file-name-handler filename 'write-region) - (and (stringp visit) - (find-file-name-handler (expand-file-name visit) - 'write-region))))) - (if handler - (funcall handler 'write-region start end filename append visit) - (let (file-name-handler-alist) - (fn-handler-real-write-region start end filename append visit))))) - -(efs-overwrite-fn "fn-handler" 'write-region - 'fn-handler-write-region) - -(defun fn-handler-verify-visited-file-modtime (buffer) - "Documented as original" - (let* ((file (buffer-file-name buffer)) - (handler (and file (find-file-name-handler - file - 'verify-visited-file-modtime)))) - (if handler - (funcall handler 'verify-visited-file-modtime buffer) - (let (file-name-handler-alist) - (fn-handler-real-verify-visited-file-modtime buffer))))) - -(efs-overwrite-fn "fn-handler" 'verify-visited-file-modtime - 'fn-handler-verify-visited-file-modtime) - -(defun fn-handler-backup-buffer () - "Documented as original" - (let ((handler (and buffer-file-name - (find-file-name-handler buffer-file-name - 'backup-buffer)))) - (if handler - (funcall handler 'backup-buffer) - ;; Don't let-bind file-name-handler-alist to nil, as backup-buffer - ;; is a lisp function and I want handlers to be available inside it. - (fn-handler-real-backup-buffer)))) - -(efs-overwrite-fn "fn-handler" 'backup-buffer 'fn-handler-backup-buffer) - -(defun fn-handler-copy-file (filename newname &optional ok-if-already-exists - keep-date) - "Documented as original" - ;; handler for filename takes precedence over the handler for newname. - (interactive - (let* ((from (read-file-name "Copy file: " nil nil t)) - (to (read-file-name (format "Copy %s to: " (abbreviate-file-name - from))))) - (list from to 0 current-prefix-arg))) - (let* ((filename (expand-file-name filename)) - (newname (expand-file-name newname)) - (handler (or (find-file-name-handler filename 'copy-file) - (find-file-name-handler newname 'copy-file)))) - (if handler - ;; Using the NOWAIT arg is a bit risky for other users of the - ;; handler-alist - (funcall handler 'copy-file filename newname ok-if-already-exists - keep-date) - (let (file-name-handler-alist) - (fn-handler-real-copy-file filename newname ok-if-already-exists - keep-date))))) - -(efs-overwrite-fn "fn-handler" 'copy-file 'fn-handler-copy-file) - -(defun fn-handler-file-newer-than-file-p (file1 file2) - "Documented as original" - ;; The handler for file2 takes precedence over the handler for file1. - (let* ((file1 (expand-file-name file1)) - (file2 (expand-file-name file2)) - (handler (or (find-file-name-handler file2 'file-newer-than-file-p) - (find-file-name-handler file1 'file-newer-than-file-p)))) - (if handler - (funcall handler 'file-newer-than-file-p file1 file2) - (let (file-name-handler-alist) - (fn-handler-real-file-newer-than-file-p file1 file2))))) - -(efs-overwrite-fn "fn-handler" 'file-newer-than-file-p - 'fn-handler-file-newer-than-file-p) - -(defun fn-handler-file-attributes (file) - "Documented as original" - (let* ((file (expand-file-name file)) - (handler (find-file-name-handler file 'file-attributes))) - (if handler - (funcall handler 'file-attributes file) - (let (file-name-handler-alist) - (fn-handler-real-file-attributes file))))) - -(efs-overwrite-fn "fn-handler" 'file-attributes 'fn-handler-file-attributes) - -(defun fn-handler-file-name-directory (file) - "Documented as original" - (let ((handler (find-file-name-handler file 'file-name-directory))) - (if handler - (funcall handler 'file-name-directory file) - (let (file-name-handler-alist) - (fn-handler-real-file-name-directory file))))) - -(efs-overwrite-fn "fn-handler" 'file-name-directory - 'fn-handler-file-name-directory) - -(defun fn-handler-rename-file (filename newname &optional ok-if-already-exists) - "Documented as original" - (interactive - (let* ((from (read-file-name "Rename file: " nil nil t)) - (to (read-file-name (format "Rename %s to: " (abbreviate-file-name - from))))) - (list from to 0))) - (let* ((filename (expand-file-name filename)) - (newname (expand-file-name newname)) - (handler (or (find-file-name-handler filename 'rename-file) - (find-file-name-handler newname 'rename-file)))) - (if handler - (funcall handler 'rename-file filename newname ok-if-already-exists) - (let (file-name-handler-alist) - (fn-handler-real-rename-file filename newname ok-if-already-exists))))) - -(efs-overwrite-fn "fn-handler" 'rename-file 'fn-handler-rename-file) - -(defun fn-handler-insert-directory (file switches - &optional wildcard full-directory-p) - "Documented as original" - (let* ((file (expand-file-name file)) - (handler (find-file-name-handler file 'insert-directory))) - (if handler - (funcall handler 'insert-directory file switches wildcard - full-directory-p) - (let (file-name-handler-alist) - (fn-handler-real-insert-directory file switches wildcard - full-directory-p))))) - -(efs-overwrite-fn "fn-handler" 'insert-directory 'fn-handler-insert-directory) - -(defun fn-handler-set-visited-file-modtime (&optional time) - "Sets the buffer's record of file modtime to the modtime of buffer-file-name. -With optional TIME, sets the modtime to TIME. This is an emacs 19 function. -In emacs 18, efs will make this work for remote files only." - (if buffer-file-name - (let ((handler (find-file-name-handler buffer-file-name - 'set-visited-file-modtime))) - (if handler - (funcall handler 'set-visited-file-modtime time) - (let (file-name-handler-alist) - (fn-handler-real-set-visited-file-modtime time)))))) - -(efs-overwrite-fn "fn-handler" 'set-visited-file-modtime - 'fn-handler-set-visited-file-modtime) - -(defun fn-handler-file-name-nondirectory (name) - "Documented as original" - (let ((handler (find-file-name-handler name 'file-name-nondirectory))) - (if handler - (funcall handler 'file-name-nondirectory name) - (let (file-name-handler-alist) - (fn-handler-real-file-name-nondirectory name))))) - -(efs-overwrite-fn "fn-handler" 'file-name-nondirectory - 'fn-handler-file-name-nondirectory) - -(defun fn-handler-file-name-as-directory (name) - "Documented as original" - (let ((handler (find-file-name-handler name 'file-name-as-directory))) - (if handler - (funcall handler 'file-name-as-directory name) - (let (file-name-handler-alist) - (fn-handler-real-file-name-as-directory name))))) - -(efs-overwrite-fn "fn-handler" 'file-name-as-directory - 'fn-handler-file-name-as-directory) - -(defun fn-handler-directory-file-name (directory) - "Documented as original" - (let ((handler (find-file-name-handler directory 'directory-file-name))) - (if handler - (funcall handler 'directory-file-name directory) - (let (file-name-handler-alist) - (fn-handler-real-directory-file-name directory))))) - -(efs-overwrite-fn "fn-handler" 'directory-file-name - 'fn-handler-directory-file-name) - -(defun fn-handler-get-file-buffer (file) - "Documented as original" - (let ((handler (find-file-name-handler file 'get-file-buffer))) - (if handler - (funcall handler 'get-file-buffer file) - (let (file-name-handler-alist) - (fn-handler-real-get-file-buffer file))))) - -(efs-overwrite-fn "fn-handler" 'get-file-buffer 'fn-handler-get-file-buffer) - -(defun fn-handler-create-file-buffer (file) - "Documented as original" - (let ((handler (find-file-name-handler file 'create-file-buffer))) - (if handler - (funcall handler 'create-file-buffer file) - (let (file-name-handler-alist) - (fn-handler-real-create-file-buffer file))))) - -(efs-overwrite-fn "fn-handler" 'create-file-buffer - 'fn-handler-create-file-buffer) - -(defun fn-handler-set-file-modes (file mode) - "Documented as original" - (let* ((file (expand-file-name file)) - (handler (find-file-name-handler file 'set-file-modes))) - (if handler - (funcall handler 'set-file-modes file mode) - (let (file-name-handler-alist) - (fn-handler-real-set-file-modes file mode))))) - -(efs-overwrite-fn "fn-handler" 'set-file-modes 'fn-handler-set-file-modes) - -(defun fn-handler-file-modes (file) - "Documented as original" - (let* ((file (expand-file-name file)) - (handler (find-file-name-handler file 'file-modes))) - (if handler - (funcall handler 'file-modes file) - (let (file-name-handler-alist) - (fn-handler-real-file-modes file))))) - -(efs-overwrite-fn "fn-handler" 'file-modes 'fn-handler-file-modes) - -(if (string-match emacs-version "Lucid") - - (progn - (defun fn-handler-abbreviate-file-name (filename &optional hack-homedir) - "Documented as original" - (let ((handler (find-file-name-handler filename - 'abbreviate-file-name))) - (if handler - (funcall handler 'abbreviate-file-name filename hack-homedir) - (let (file-name-handler-alist) - (fn-handler-real-abbreviate-file-name filename hack-homedir)))))) - - (defun fn-handler-abbreviate-file-name (filename) - "Documented as original" - (let ((handler (find-file-name-handler filename 'abbreviate-file-name))) - (if handler - (funcall handler 'abbreviate-file-name filename) - (let (file-name-handler-alist) - (fn-handler-real-abbreviate-file-name filename)))))) - -(efs-overwrite-fn "fn-handler" 'abbreviate-file-name - 'fn-handler-abbreviate-file-name) - -(defun fn-handler-file-name-sans-versions (filename - &optional keep-backup-version) - "Documented as original" - (let ((handler (find-file-name-handler filename 'file-name-sans-versions))) - (if handler - (funcall handler 'file-name-sans-versions filename - keep-backup-version) - (let (file-name-handler-alist) - (fn-handler-real-file-name-sans-versions filename - keep-backup-version))))) - -(efs-overwrite-fn "fn-handler" 'file-name-sans-versions - 'fn-handler-file-name-sans-versions) - -(if (fboundp 'make-directory-internal) ; not defined in lemacs 19.[67] - (progn - (defun fn-handler-make-directory-internal (dirname) - "Documented as original" - (let* ((dirname (expand-file-name dirname)) - (handler (find-file-name-handler dirname - 'make-directory-internal))) - (if handler - (funcall handler 'make-directory-internal dirname) - (let (file-name-handler-alist) - (fn-handler-real-make-directory-internal dirname))))) - - (efs-overwrite-fn "fn-handler" 'make-directory-internal - 'fn-handler-make-directory-internal))) - -(defun fn-handler-delete-directory (dirname) - "Documented as original" - (let* ((dirname (expand-file-name dirname)) - (handler (find-file-name-handler dirname 'delete-directory))) - (if handler - (funcall handler 'delete-directory dirname) - (let (file-name-handler-alist) - (fn-handler-real-delete-directory dirname))))) - -(efs-overwrite-fn "fn-handler" 'delete-directory 'fn-handler-delete-directory) - -(defun fn-handler-make-symbolic-link (target linkname - &optional ok-if-already-exists) - "Documented as original" - (interactive - (let (target) - (list - (setq target (read-string "Make symbolic link to file: ")) - (read-file-name (format "Make symbolic link to file %s: " target)) - 0))) - (let* ((linkname (expand-file-name linkname)) - (handler (or (find-file-name-handler linkname 'make-symbolic-link) - (find-file-name-handler target 'make-symbolic-link)))) - (if handler - (funcall handler 'make-symbolic-link - target linkname ok-if-already-exists) - (let (file-name-handler-alist) - (fn-handler-real-make-symbolic-link target linkname - ok-if-already-exists))))) - -(efs-overwrite-fn "fn-handler" 'make-symbolic-link - 'fn-handler-make-symbolic-link) - -(defun fn-handler-add-name-to-file (file newname &optional - ok-if-already-exists) - "Documented as original" - (interactive - (let (file) - (list - (setq file (read-file-name "Add name to file: " nil nil t)) - (read-file-name (format "Name to add to %s: " file)) - 0))) - (let* ((file (expand-file-name file)) - (newname (expand-file-name newname)) - (handler (or (find-file-name-handler newname 'add-name-to-file) - (find-file-name-handler file 'add-name-to-file)))) - (if handler - (funcall handler 'add-name-to-file file newname ok-if-already-exists) - (let (file-name-handler-alist) - (fn-handler-real-add-name-to-file file newname - ok-if-already-exists))))) - -(efs-overwrite-fn "fn-handler" 'add-name-to-file 'fn-handler-add-name-to-file) - -(defun fn-handler-recover-file (file) - "Documented as original" - (interactive "FRecover file: ") - (let* ((file (expand-file-name file)) - (handler (or (find-file-name-handler file 'recover-file) - (find-file-name-handler (let ((buffer-file-name file)) - (make-auto-save-file-name)) - 'recover-file)))) - (if handler - (funcall handler 'recover-file file) - (let (file-name-handler-alist) - (fn-handler-real-recover-file file))))) - -(efs-overwrite-fn "fn-handler" 'recover-file 'fn-handler-recover-file) - -(defun fn-handler-file-name-completion (file dir) - "Documented as original." - (let* ((dir (expand-file-name dir)) - (handler (find-file-name-handler dir 'file-name-completion))) - (if handler - (funcall handler 'file-name-completion file dir) - (let (file-name-handler-alist) - (fn-handler-real-file-name-completion file dir))))) - -(efs-overwrite-fn "fn-handler" 'file-name-completion - 'fn-handler-file-name-completion) - -(defun fn-handler-file-name-all-completions (file dir) - "Documented as original." - (let* ((dir (expand-file-name dir)) - (handler (find-file-name-handler dir 'file-name-all-completions))) - (if handler - (funcall handler 'file-name-all-completions file dir) - (let (file-name-handler-alist) - (fn-handler-real-file-name-all-completions file dir))))) - -(efs-overwrite-fn "fn-handler" 'file-name-all-completions - 'fn-handler-file-name-all-completions) - -(if (fboundp 'file-truename) - (progn - (defun fn-handler-file-truename (filename) - "Documented as original" - (let* ((fn (expand-file-name filename)) - (handler (find-file-name-handler filename 'file-truename))) - (if handler - (funcall handler 'file-truename filename) - (let (file-name-handler-alist) - (fn-handler-real-file-truename filename))))) - (efs-overwrite-fn "fn-handler" 'file-truename - 'fn-handler-file-truename))) - -(if (fboundp 'unhandled-file-name-directory) - (progn - (defun fn-handler-unhandled-file-name-directory (filename) - "Documented as original" - (let ((handler (find-file-name-handler - filename 'unhandled-file-name-directory))) - (if handler - (funcall handler 'unhandled-file-name-directory filename) - (let (file-name-handler-alist) - (fn-handler-real-unhandled-file-name-directory filename))))) - - (efs-overwrite-fn "fn-handler" 'unhandled-file-name-directory - 'fn-handler-unhandled-file-name-directory))) - - -;; We don't need the file-name-handler-alist for these. Inhibit it to -;; avoid an infinite recursion. Hope that this doesn't step -;; on any other packages' toes. -(defun fn-handler-expand-file-name (filename &optional default) - "Documented as original." - (let (file-name-handler-alist) - (fn-handler-real-expand-file-name filename default))) - -(efs-overwrite-fn "fn-handler" 'expand-file-name 'fn-handler-expand-file-name) - -(defun fn-handler-substitute-in-file-name (filename) - "Documented as original." - (let ((handler (find-file-name-handler filename 'substitute-in-file-name))) - (if handler - (funcall handler 'substitute-in-file-name filename) - (let (file-name-handler-alist) - (fn-handler-real-substitute-in-file-name filename))))) - -(efs-overwrite-fn "fn-handler" 'substitute-in-file-name - 'fn-handler-substitute-in-file-name) - -(if (fboundp 'file-executable-p) - (progn - (defun fn-handler-file-executable-p (file) - (let ((handler (find-file-name-handler file 'file-executable-p))) - (if handler - (funcall handler 'file-executable-p file) - (let (file-name-handler-alist) - (fn-handler-real-file-executable-p file))))) - (efs-overwrite-fn "fn-handler" 'file-executable-p - 'fn-handler-file-executable-p))) - -(if (fboundp 'file-accessible-directory-p) - (progn - (defun fn-handler-file-accessible-directory-p (file) - (let ((handler (find-file-name-handler file - 'file-accessible-directory-p))) - (if handler - (funcall handler 'file-accessible-directory-p file) - (let (file-name-handler-alist) - (fn-handler-real-file-accessible-directory-p file))))) - (efs-overwrite-fn "fn-handler" 'file-accessible-directory-p - 'fn-handler-file-accessible-directory-p))) - -(defun fn-handler-load (file &optional noerror nomessage nosuffix) - (let ((handler (find-file-name-handler file 'load))) - (if handler - (funcall handler 'load file noerror nomessage nosuffix) - (let (file-name-handler-alist) - (fn-handler-real-load file noerror nomessage nosuffix))))) - -(efs-overwrite-fn "fn-handler" 'load 'fn-handler-load) - -;; We don't need file-name-handlers for do-auto-save. -;; If it does try to access them there is a risk of an infinite recursion. -(defun fn-handler-do-auto-save (&rest args) - "Documented as original." - (let (file-name-handler-alist) - (apply 'fn-handler-real-do-auto-save args))) - -(efs-overwrite-fn "fn-handler" 'do-auto-save 'fn-handler-do-auto-save) - -(if (fboundp 'vc-registered) - (progn - (defun fn-handler-vc-registered (file) - "Documented as original." - (let ((handler (find-file-name-handler file 'vc-registered))) - (if handler - (funcall handler 'vc-registered file) - (let (file-name-handler-alist) - (fn-handler-real-vc-registered file))))) - - (efs-overwrite-fn "fn-handler" 'vc-registered - 'fn-handler-vc-registered))) - -;;; end of fn-handler.el
--- a/lisp/gnus/ChangeLog Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/ChangeLog Mon Aug 13 09:23:06 2007 +0200 @@ -1,3 +1,113 @@ +Mon Mar 24 16:57:26 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no> + + * gnus.el: Gnus v5.4.37 is released. + +Mon Mar 24 01:16:15 1997 Hrvoje Niksic <hniksic@srce.hr> + + * gnus-xmas.el (gnus-xmas-redefine): Use it. + + * gnus-xmas.el (gnus-xmas-summary-set-display-table): New function. + + * gnus-sum.el (gnus-summary-mode): Use it. + + * gnus-sum.el (gnus-summary-set-display-table): New function. + +Mon Mar 24 16:27:46 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-util.el (gnus-buffer-live-p): Reinstated. + +Mon Mar 24 01:24:27 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no> + + * gnus.el: Gnus v5.4.36 is released. + +Sun Mar 23 18:51:00 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-group.el (gnus-group-list-groups): Doc fix. + + * gnus-demon.el (gnus-inhibit-demon): New variable. + (gnus-demon): Use it. + +Sun Mar 23 18:42:55 1997 David Moore <dmoore@ucsd.edu> + + * gnus-nocem.el (gnus-nocem-already-running): New variable. + +Sun Mar 23 17:27:17 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-sum.el (gnus-select-newsgroup): Revert to old duplicate + behavior for nnvirtual groups. + + * gnus-util.el (gnus-buffer-live-p): Removed. + +Sat Mar 22 22:11:28 1997 Steven L Baur <steve@altair.xemacs.org> + + * gnus-msg.el (gnus-setup-message): Mark buffer unmodified as last + step of setting message buffer up. + + * message.el (message-kill-buffer): Make prompt look more like the + one in kill-buffer. + Only prompt if the buffer has been changed. + +Sun Mar 23 02:52:51 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no> + + * gnus.el: Gnus v5.4.35 is released. + +Sun Mar 23 01:09:23 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-art.el (gnus-read-save-file-name): Tweaked definition. + (gnus-summary-save-in-rmail): Use it. + (gnus-summary-save-in-file): Ditto. + (gnus-summary-save-in-mail): Ditto. + (gnus-summary-save-body-in-file): Ditto. + + * gnus-vm.el (gnus-summary-save-in-vm): Ditto. + + * gnus-sum.el (gnus-summary-enter-digest-group): Add group param. + + * gnus-art.el (gnus-split-methods): New default. + (gnus-article-nndoc-name): New function. + +Sat Mar 22 15:47:14 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * nnmh.el (nnmh-request-accept-article): Do 'junk. + * nnbabyl.el (nnbabyl-request-accept-article): Ditto. + * nnmbox.el (nnmbox-request-accept-article): Ditto. + * nnfolder.el (nnfolder-request-accept-article): Ditto. + +Sat Mar 22 15:42:53 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no> + + * gnus.el: Gnus v5.4.34 is released. + +Sat Mar 22 01:37:00 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-sum.el (gnus-summary-move-article): Understand 'junk. + + * nnml.el (nnml-request-accept-article): Return 'junk when legal. + + * gnus-sum.el (gnus-summary-respool-query): Message better, and + return right value. + + * nnmail.el (nnmail-split-abbrev-alist): New `to' and `from' + abbrevs. + +Wed Mar 19 19:36:25 1997 Dewey M. Sasser <dewey@newvision.com> + + * message.el (message-make-from): Changed so that + message-from-style value is captured from message buffer instead + of temp buffer. + +Sat Mar 22 00:47:39 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * gnus-srvr.el (gnus-browse-foreign-server): Understand server + names. + + * gnus-group.el (gnus-group-browse-foreign-server): Down methodize + the server. + +Thu Mar 20 22:49:16 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no> + + * nnfolder.el (nnfolder-read-folder): Do checking if there are new + articles after the last nnfolder marker. + Thu Mar 20 17:33:54 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no> * gnus.el: Gnus v5.4.33 is released.
--- a/lisp/gnus/gnus-art.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-art.el Mon Aug 13 09:23:06 2007 +0200 @@ -323,7 +323,8 @@ :type 'function) (defcustom gnus-split-methods - '((gnus-article-archive-name)) + '((gnus-article-archive-name) + (gnus-article-nndoc-name)) "Variable used to suggest where articles are to be saved. For instance, if you would like to save articles related to Gnus in the file \"gnus-stuff\", and articles related to VM in \"vm-stuff\", @@ -1393,60 +1394,80 @@ (set-buffer gnus-summary-buffer) (funcall gnus-default-article-saver filename))))) -(defun gnus-read-save-file-name (prompt default-name &optional filename) - (cond - ((eq filename 'default) - default-name) - (filename filename) - (t - (let* ((split-name (gnus-get-split-value gnus-split-methods)) - (prompt - (format prompt (if (and gnus-number-of-articles-to-be-saved - (> gnus-number-of-articles-to-be-saved 1)) - (format "these %d articles" - gnus-number-of-articles-to-be-saved) - "this article"))) - (file - ;; Let the split methods have their say. - (cond - ;; No split name was found. - ((null split-name) - (read-file-name - (concat prompt " (default " - (file-name-nondirectory default-name) ") ") - (file-name-directory default-name) - default-name)) - ;; A single split name was found - ((= 1 (length split-name)) - (let* ((name (car split-name)) - (dir (cond ((file-directory-p name) - (file-name-as-directory name)) - ((file-exists-p name) name) - (t gnus-article-save-directory)))) - (read-file-name - (concat prompt " (default " name ") ") - dir name))) - ;; A list of splits was found. - (t - (setq split-name (nreverse split-name)) - (let (result) - (let ((file-name-history (nconc split-name file-name-history))) - (setq result - (expand-file-name - (read-file-name - (concat prompt " (`M-p' for defaults) ") - gnus-article-save-directory - (car split-name)) - gnus-article-save-directory))) - (car (push result file-name-history))))))) - ;; Create the directory. - (gnus-make-directory (file-name-directory file)) - ;; If we have read a directory, we append the default file name. - (when (file-directory-p file) - (setq file (concat (file-name-as-directory file) - (file-name-nondirectory default-name)))) - ;; Possibly translate some characters. - (nnheader-translate-file-chars file))))) +(defun gnus-read-save-file-name (prompt &optional filename + function group headers variable) + (let ((default-name (funcall function group headers + (symbol-value variable))) + result) + (setq + result + (cond + ((eq filename 'default) + default-name) + (filename filename) + (t + (let* ((split-name (gnus-get-split-value gnus-split-methods)) + (prompt + (format prompt + (if (and gnus-number-of-articles-to-be-saved + (> gnus-number-of-articles-to-be-saved 1)) + (format "these %d articles" + gnus-number-of-articles-to-be-saved) + "this article"))) + (file + ;; Let the split methods have their say. + (cond + ;; No split name was found. + ((null split-name) + (read-file-name + (concat prompt " (default " + (file-name-nondirectory default-name) ") ") + (file-name-directory default-name) + default-name)) + ;; A single group name is returned. + ((stringp split-name) + (setq default-name + (funcall function split-name headers + (symbol-value variable))) + (read-file-name + (concat prompt " (default " + (file-name-nondirectory default-name) ") ") + (file-name-directory default-name) + default-name)) + ;; A single split name was found + ((= 1 (length split-name)) + (let* ((name (car split-name)) + (dir (cond ((file-directory-p name) + (file-name-as-directory name)) + ((file-exists-p name) name) + (t gnus-article-save-directory)))) + (read-file-name + (concat prompt " (default " name ") ") + dir name))) + ;; A list of splits was found. + (t + (setq split-name (nreverse split-name)) + (let (result) + (let ((file-name-history + (nconc split-name file-name-history))) + (setq result + (expand-file-name + (read-file-name + (concat prompt " (`M-p' for defaults) ") + gnus-article-save-directory + (car split-name)) + gnus-article-save-directory))) + (car (push result file-name-history))))))) + ;; Create the directory. + (gnus-make-directory (file-name-directory file)) + ;; If we have read a directory, we append the default file name. + (when (file-directory-p file) + (setq file (concat (file-name-as-directory file) + (file-name-nondirectory default-name)))) + ;; Possibly translate some characters. + (nnheader-translate-file-chars file))))) + (gnus-make-directory (file-name-directory result)) + (set variable result))) (defun gnus-article-archive-name (group) "Return the first instance of an \"Archive-name\" in the current buffer." @@ -1455,25 +1476,26 @@ (nnheader-concat gnus-article-save-directory (match-string 1))))) +(defun gnus-article-nndoc-name (group) + "If GROUP is an nndoc group, return the name of the parent group." + (when (eq (car (gnus-find-method-for-group group)) 'nndoc) + (gnus-group-get-parameter group 'save-article-group))) + (defun gnus-summary-save-in-rmail (&optional filename) "Append this article to Rmail file. Optional argument FILENAME specifies file name. Directory to save to is default to `gnus-article-save-directory'." (interactive) (gnus-set-global-variables) - (let ((default-name - (funcall gnus-rmail-save-name gnus-newsgroup-name - gnus-current-headers gnus-newsgroup-last-rmail))) - (setq filename (gnus-read-save-file-name - "Save %s in rmail file:" default-name filename)) - (gnus-make-directory (file-name-directory filename)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (gnus-output-to-rmail filename)))) - ;; Remember the directory name to save articles - (setq gnus-newsgroup-last-rmail filename))) + (setq filename (gnus-read-save-file-name + "Save %s in rmail file:" filename + gnus-rmail-save-name gnus-newsgroup-name + gnus-current-headers 'gnus-newsgroup-last-rmail)) + (gnus-eval-in-buffer-window gnus-save-article-buffer + (save-excursion + (save-restriction + (widen) + (gnus-output-to-rmail filename))))) (defun gnus-summary-save-in-mail (&optional filename) "Append this article to Unix mail file. @@ -1481,26 +1503,18 @@ Directory to save to is default to `gnus-article-save-directory'." (interactive) (gnus-set-global-variables) - (let ((default-name - (funcall gnus-mail-save-name gnus-newsgroup-name - gnus-current-headers gnus-newsgroup-last-mail))) - (setq filename (gnus-read-save-file-name - "Save %s in Unix mail file:" default-name filename)) - (setq filename - (expand-file-name filename - (and default-name - (file-name-directory default-name)))) - (gnus-make-directory (file-name-directory filename)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (if (and (file-readable-p filename) - (mail-file-babyl-p filename)) - (gnus-output-to-rmail filename t) - (gnus-output-to-mail filename))))) - ;; Remember the directory name to save articles. - (setq gnus-newsgroup-last-mail filename))) + (setq filename (gnus-read-save-file-name + "Save %s in Unix mail file:" filename + gnus-mail-save-name gnus-newsgroup-name + gnus-current-headers 'gnus-newsgroup-last-mail)) + (gnus-eval-in-buffer-window gnus-save-article-buffer + (save-excursion + (save-restriction + (widen) + (if (and (file-readable-p filename) + (mail-file-babyl-p filename)) + (gnus-output-to-rmail filename t) + (gnus-output-to-mail filename)))))) (defun gnus-summary-save-in-file (&optional filename overwrite) "Append this article to file. @@ -1508,22 +1522,18 @@ Directory to save to is default to `gnus-article-save-directory'." (interactive) (gnus-set-global-variables) - (let ((default-name - (funcall gnus-file-save-name gnus-newsgroup-name - gnus-current-headers gnus-newsgroup-last-file))) - (setq filename (gnus-read-save-file-name - "Save %s in file:" default-name filename)) - (gnus-make-directory (file-name-directory filename)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (when (and overwrite - (file-exists-p filename)) - (delete-file filename)) - (gnus-output-to-file filename)))) - ;; Remember the directory name to save articles. - (setq gnus-newsgroup-last-file filename))) + (setq filename (gnus-read-save-file-name + "Save %s in file:" filename + gnus-file-save-name gnus-newsgroup-name + gnus-current-headers 'gnus-newsgroup-last-file)) + (gnus-eval-in-buffer-window gnus-save-article-buffer + (save-excursion + (save-restriction + (widen) + (when (and overwrite + (file-exists-p filename)) + (delete-file filename)) + (gnus-output-to-file filename))))) (defun gnus-summary-write-to-file (&optional filename) "Write this article to a file. @@ -1538,22 +1548,18 @@ The directory to save in defaults to `gnus-article-save-directory'." (interactive) (gnus-set-global-variables) - (let ((default-name - (funcall gnus-file-save-name gnus-newsgroup-name - gnus-current-headers gnus-newsgroup-last-file))) - (setq filename (gnus-read-save-file-name - "Save %s body in file:" default-name filename)) - (gnus-make-directory (file-name-directory filename)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (narrow-to-region (point) (point-max))) - (gnus-output-to-file filename)))) - ;; Remember the directory name to save articles. - (setq gnus-newsgroup-last-file filename))) + (setq filename (gnus-read-save-file-name + "Save %s body in file:" filename + gnus-file-save-name gnus-newsgroup-name + gnus-current-headers 'gnus-newsgroup-last-file)) + (gnus-eval-in-buffer-window gnus-save-article-buffer + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (when (search-forward "\n\n" nil t) + (narrow-to-region (point) (point-max))) + (gnus-output-to-file filename))))) (defun gnus-summary-save-in-pipe (&optional command) "Pipe this article to subprocess."
--- a/lisp/gnus/gnus-demon.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-demon.el Mon Aug 13 09:23:06 2007 +0200 @@ -74,6 +74,8 @@ (defvar gnus-demon-idle-time 0) (defvar gnus-demon-handler-state nil) (defvar gnus-demon-last-keys nil) +(defvar gnus-inhibit-demon nil + "*If non-nil, no daemonic function will be run.") (eval-and-compile (autoload 'timezone-parse-date "timezone") @@ -172,10 +174,12 @@ (setq gnus-demon-idle-time 0) (setq gnus-demon-idle-has-been-called nil)) ;; Disable all daemonic stuff if we're in the minibuffer - (unless (window-minibuffer-p (selected-window)) + (when (and (not (window-minibuffer-p (selected-window))) + (not gnus-inhibit-demon)) ;; Then we go through all the handler and call those that are ;; sufficiently ripe. (let ((handlers gnus-demon-handler-state) + (gnus-inhibit-demon t) handler time idle) (while handlers (setq handler (pop handlers))
--- a/lisp/gnus/gnus-group.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-group.el Mon Aug 13 09:23:06 2007 +0200 @@ -819,7 +819,9 @@ "List newsgroups with level LEVEL or lower that have unread articles. Default is all subscribed groups. If argument UNREAD is non-nil, groups with no unread articles are also -listed." +listed. + +Also see the `gnus-group-use-permanent-levels' variable." (interactive (list (if current-prefix-arg (prefix-numeric-value current-prefix-arg) @@ -2841,36 +2843,37 @@ re-scanning. If ARG is non-nil and not a number, this will force \"hard\" re-reading of the active files from all servers." (interactive "P") - (run-hooks 'gnus-get-new-news-hook) + (let ((gnus-inhibit-demon t)) + (run-hooks 'gnus-get-new-news-hook) - ;; Read any slave files. - (unless gnus-slave - (gnus-master-read-slave-newsrc)) + ;; Read any slave files. + (unless gnus-slave + (gnus-master-read-slave-newsrc)) - ;; We might read in new NoCeM messages here. - (when (and gnus-use-nocem - (null arg)) - (gnus-nocem-scan-groups)) - ;; If ARG is not a number, then we read the active file. - (when (and arg (not (numberp arg))) - (let ((gnus-read-active-file t)) - (gnus-read-active-file)) - (setq arg nil) + ;; We might read in new NoCeM messages here. + (when (and gnus-use-nocem + (null arg)) + (gnus-nocem-scan-groups)) + ;; If ARG is not a number, then we read the active file. + (when (and arg (not (numberp arg))) + (let ((gnus-read-active-file t)) + (gnus-read-active-file)) + (setq arg nil) - ;; If the user wants it, we scan for new groups. - (when (eq gnus-check-new-newsgroups 'always) - (gnus-find-new-newsgroups))) + ;; If the user wants it, we scan for new groups. + (when (eq gnus-check-new-newsgroups 'always) + (gnus-find-new-newsgroups))) - (setq arg (gnus-group-default-level arg t)) - (if (and gnus-read-active-file (not arg)) - (progn - (gnus-read-active-file) - (gnus-get-unread-articles arg)) - (let ((gnus-read-active-file (if arg nil gnus-read-active-file))) - (gnus-get-unread-articles arg))) - (run-hooks 'gnus-after-getting-new-news-hook) - (gnus-group-list-groups (and (numberp arg) - (max (car gnus-group-list-mode) arg)))) + (setq arg (gnus-group-default-level arg t)) + (if (and gnus-read-active-file (not arg)) + (progn + (gnus-read-active-file) + (gnus-get-unread-articles arg)) + (let ((gnus-read-active-file (if arg nil gnus-read-active-file))) + (gnus-get-unread-articles arg))) + (run-hooks 'gnus-after-getting-new-news-hook) + (gnus-group-list-groups (and (numberp arg) + (max (car gnus-group-list-mode) arg))))) (defun gnus-group-get-new-news-this-group (&optional n) "Check for newly arrived news in the current group (and the N-1 next groups). @@ -3201,8 +3204,8 @@ "Address: " (mapcar (lambda (server) (list server)) gnus-secondary-servers))) - ;; We got a server name, so we find the method. - (gnus-server-to-method how))))) + ;; We got a server name. + how)))) (gnus-browse-foreign-server method)) (defun gnus-group-set-info (info &optional method-only-group part)
--- a/lisp/gnus/gnus-int.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-int.el Mon Aug 13 09:23:06 2007 +0200 @@ -331,7 +331,8 @@ (defun gnus-request-scan (group method) "Request a SCAN being performed in GROUP from METHOD. If GROUP is nil, all groups on METHOD are scanned." - (let ((method (if group (gnus-find-method-for-group group) method))) + (let ((method (if group (gnus-find-method-for-group group) method)) + (gnus-inhibit-demon t)) (funcall (gnus-get-function method 'request-scan) (and group (gnus-group-real-name group)) (nth 1 method)))) @@ -410,6 +411,7 @@ (defun gnus-close-backends () ;; Send a close request to all backends that support such a request. (let ((methods gnus-valid-select-methods) + (gnus-inhibit-demon t) func method) (while (setq method (pop methods)) (when (fboundp (setq func (intern
--- a/lisp/gnus/gnus-msg.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-msg.el Mon Aug 13 09:23:06 2007 +0200 @@ -172,7 +172,8 @@ (setq gnus-message-buffer (current-buffer)) (make-local-variable 'gnus-newsgroup-name) (run-hooks 'gnus-message-setup-hook)) - (gnus-configure-windows ,config t)))) + (gnus-configure-windows ,config t) + (set-buffer-modified-p nil)))) (defun gnus-inews-add-send-actions (winconf buffer article) (make-local-hook 'message-sent-hook)
--- a/lisp/gnus/gnus-nocem.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-nocem.el Mon Aug 13 09:23:06 2007 +0200 @@ -100,6 +100,7 @@ "Scan all NoCeM groups for new NoCeM messages." (interactive) (let ((groups gnus-nocem-groups) + (gnus-inhibit-demon t) group active gactive articles) (gnus-make-directory gnus-nocem-directory) ;; Load any previous NoCeM headers.
--- a/lisp/gnus/gnus-srvr.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-srvr.el Mon Aug 13 09:23:06 2007 +0200 @@ -530,8 +530,7 @@ ["Select" gnus-browse-read-group t] ["Next" gnus-browse-next-group t] ["Prev" gnus-browse-next-group t] - ["Exit" gnus-browse-exit t] - )) + ["Exit" gnus-browse-exit t])) (run-hooks 'gnus-browse-menu-hook))) (defvar gnus-browse-current-method nil) @@ -543,6 +542,8 @@ "Browse the server METHOD." (setq gnus-browse-current-method method) (setq gnus-browse-return-buffer return-buffer) + (when (stringp method) + (setq method (gnus-server-to-method method))) (let ((gnus-select-method method) groups group) (gnus-message 5 "Connecting to %s..." (nth 1 method))
--- a/lisp/gnus/gnus-sum.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-sum.el Mon Aug 13 09:23:06 2007 +0200 @@ -715,31 +715,6 @@ (defvar gnus-scores-exclude-files nil) -(defvar gnus-summary-display-table - ;; Change the display table. Odd characters have a tendency to mess - ;; up nicely formatted displays - we make all possible glyphs - ;; display only a single character. - - ;; We start from the standard display table, if any. - (let ((table (or (copy-sequence standard-display-table) - (make-display-table))) - ;; Nix out all the control chars... - (i 32)) - (while (>= (setq i (1- i)) 0) - (aset table i [??])) - ;; ... but not newline and cr, of course. (cr is necessary for the - ;; selective display). - (aset table ?\n nil) - (aset table ?\r nil) - ;; We nix out any glyphs over 126 that are not set already. - (let ((i 256)) - (while (>= (setq i (1- i)) 127) - ;; Only modify if the entry is nil. - (or (aref table i) - (aset table i [??])))) - table) - "Display table used in summary mode buffers.") - (defvar gnus-original-article nil) (defvar gnus-article-internal-prepare-hook nil) (defvar gnus-newsgroup-process-stack nil) @@ -1872,7 +1847,7 @@ (setq truncate-lines t) (setq selective-display t) (setq selective-display-ellipses t) ;Display `...' - (setq buffer-display-table gnus-summary-display-table) + (gnus-summary-set-display-table) (gnus-set-default-directory) (setq gnus-newsgroup-name group) (make-local-variable 'gnus-summary-line-format) @@ -2210,6 +2185,30 @@ (mouse-set-point e) (gnus-summary-next-page nil t)) +(defun gnus-summary-set-display-table () + ;; Change the display table. Odd characters have a tendency to mess + ;; up nicely formatted displays - we make all possible glyphs + ;; display only a single character. + + ;; We start from the standard display table, if any. + (let ((table (or (copy-sequence standard-display-table) + (make-display-table))) + ;; Nix out all the control chars... + (i 32)) + (while (>= (setq i (1- i)) 0) + (aset table i [??])) + ;; ... but not newline and cr, of course. (cr is necessary for the + ;; selective display). + (aset table ?\n nil) + (aset table ?\r nil) + ;; We nix out any glyphs over 126 that are not set already. + (let ((i 256)) + (while (>= (setq i (1- i)) 127) + ;; Only modify if the entry is nil. + (or (aref table i) + (aset table i [??])))) + (setq buffer-display-table table))) + (defun gnus-summary-setup-buffer (group) "Initialize summary buffer." (let ((buffer (concat "*Summary " group "*"))) @@ -3586,6 +3585,11 @@ "Select newsgroup GROUP. If READ-ALL is non-nil, all articles in the group are selected." (let* ((entry (gnus-gethash group gnus-newsrc-hashtb)) + ;;!!! Dirty hack; should be removed. + (gnus-summary-ignore-duplicates + (if (eq (car (gnus-find-method-for-group group)) 'nnvirtual) + t + gnus-summary-ignore-duplicates)) (info (nth 2 entry)) articles fetched-articles cached) @@ -6180,7 +6184,8 @@ gnus-current-article))) (ogroup gnus-newsgroup-name) (params (append (gnus-info-params (gnus-get-info ogroup)) - (list (cons 'to-group ogroup)))) + (list (cons 'to-group ogroup)) + (list (cons 'save-article-group ogroup)))) (case-fold-search t) (buf (current-buffer)) dig) @@ -6667,20 +6672,26 @@ (set-buffer copy-buf) ;; First put the article in the destination group. (gnus-request-article-this-buffer article gnus-newsgroup-name) - (setq art-group - (gnus-request-accept-article - to-newsgroup select-method (not articles))) - (setq new-xref (concat new-xref " " (car art-group) - ":" (cdr art-group))) - ;; Now we have the new Xrefs header, so we insert - ;; it and replace the new article. - (nnheader-replace-header "Xref" new-xref) - (gnus-request-replace-article - (cdr art-group) to-newsgroup (current-buffer)) - art-group))))) - (if (not art-group) - (gnus-message 1 "Couldn't %s article %s" - (cadr (assq action names)) article) + (when (consp (setq art-group + (gnus-request-accept-article + to-newsgroup select-method (not articles)))) + (setq new-xref (concat new-xref " " (car art-group) + ":" (cdr art-group))) + ;; Now we have the new Xrefs header, so we insert + ;; it and replace the new article. + (nnheader-replace-header "Xref" new-xref) + (gnus-request-replace-article + (cdr art-group) to-newsgroup (current-buffer)) + art-group)))))) + (cond + ((not art-group) + (gnus-message 1 "Couldn't %s article %s" + (cadr (assq action names)) article)) + ((and (eq art-group 'junk) + (eq action 'move)) + (gnus-summary-mark-article article gnus-canceled-mark) + (gnus-message 4 "Deleted article %s" article)) + (t (let* ((entry (or (gnus-gethash (car art-group) gnus-newsrc-hashtb) @@ -6755,7 +6766,7 @@ (gnus-summary-goto-subject article) (when (eq action 'move) - (gnus-summary-mark-article article gnus-canceled-mark))) + (gnus-summary-mark-article article gnus-canceled-mark)))) (gnus-summary-remove-process-mark article)) ;; Re-activate all groups that have been moved to. (while to-groups @@ -7068,7 +7079,7 @@ ;;; Respooling -(defun gnus-summary-respool-query () +(defun gnus-summary-respool-query (&optional silent) "Query where the respool algorithm would put this article." (interactive) (gnus-set-global-variables) @@ -7078,8 +7089,13 @@ (set-buffer gnus-original-article-buffer) (save-restriction (message-narrow-to-head) - (message "This message would go to %s" - (mapconcat 'car (nnmail-article-group 'identity) ", ")))))) + (let ((groups (nnmail-article-group 'identity))) + (unless silent + (if groups + (message "This message would go to %s" + (mapconcat 'car groups ", ")) + (message "This message would go to no groups")) + groups)))))) ;; Summary marking commands.
--- a/lisp/gnus/gnus-util.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-util.el Mon Aug 13 09:23:06 2007 +0200 @@ -524,7 +524,7 @@ (defun gnus-kill-all-overlays () "Delete all overlays in the current buffer." - (when (fboundp 'overlay-lists) + (unless gnus-xemacs (let* ((overlayss (overlay-lists)) (buffer-read-only nil) (overlays (nconc (car overlayss) (cdr overlayss))))
--- a/lisp/gnus/gnus-vm.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-vm.el Mon Aug 13 09:23:06 2007 +0200 @@ -87,24 +87,20 @@ (defun gnus-summary-save-in-vm (&optional folder) (interactive) - (let ((default-name - (funcall gnus-mail-save-name gnus-newsgroup-name - gnus-current-headers gnus-newsgroup-last-mail))) - (setq folder - (cond ((eq folder 'default) default-name) - (folder folder) - (t (gnus-read-save-file-name - "Save %s in VM folder:" default-name)))) - (gnus-make-directory (file-name-directory folder)) - (set-buffer gnus-original-article-buffer) + (setq folder + (cond ((eq folder 'default) default-name) + (folder folder) + (t (gnus-read-save-file-name + "Save %s in VM folder:" folder + gnus-mail-save-name gnus-newsgroup-name + gnus-current-headers 'gnus-newsgroup-last-mail)))) + (gnus-eval-in-buffer-window gnus-original-article-buffer (save-excursion (save-restriction (widen) (let ((vm-folder (gnus-vm-make-folder))) (vm-save-message folder) - (kill-buffer vm-folder)))) - ;; Remember the directory name to save articles. - (setq gnus-newsgroup-last-mail folder))) + (kill-buffer vm-folder)))))) (provide 'gnus-vm)
--- a/lisp/gnus/gnus-xmas.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus-xmas.el Mon Aug 13 09:23:06 2007 +0200 @@ -181,6 +181,26 @@ (gnus-horizontal-recenter) (select-window selected)))))) +(defun gnus-xmas-summary-set-display-table () + ;; Setup the display table -- like gnus-summary-setup-display-table, + ;; but done in an XEmacsish way. + (let ((table (make-display-table)) + ;; Nix out all the control chars... + (i 32)) + (while (>= (setq i (1- i)) 0) + (aset table i [??])) + ;; ... but not newline and cr, of course. (cr is necessary for the + ;; selective display). + (aset table ?\n nil) + (aset table ?\r nil) + ;; We nix out any glyphs over 126 that are not set already. + (let ((i 256)) + (while (>= (setq i (1- i)) 127) + ;; Only modify if the entry is nil. + (or (aref table i) + (aset table i [??])))) + (add-spec-to-specifier current-display-table table (current-buffer) nil))) + (defun gnus-xmas-add-hook (hook function &optional append local) (add-hook hook function)) @@ -442,7 +462,7 @@ (defun gnus-xmas-redefine () "Redefine lots of Gnus functions for XEmacs." - (fset 'gnus-summary-make-display-table 'ignore) + (fset 'gnus-summary-set-display-table 'gnus-xmas-summary-set-display-table) (fset 'gnus-visual-turn-off-edit-menu 'identity) (fset 'gnus-summary-recenter 'gnus-xmas-summary-recenter) (fset 'gnus-extent-start-open 'gnus-xmas-extent-start-open)
--- a/lisp/gnus/gnus.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/gnus.el Mon Aug 13 09:23:06 2007 +0200 @@ -226,7 +226,7 @@ :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "5.4.33" +(defconst gnus-version-number "5.4.37" "Version number for this version of Gnus.") (defconst gnus-version (format "Gnus v%s" gnus-version-number)
--- a/lisp/gnus/message.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/message.el Mon Aug 13 09:23:06 2007 +0200 @@ -113,7 +113,6 @@ :group 'message-buffers :type 'function) -;;;###autoload (defcustom message-fcc-handler-function 'message-output "*A function called to save outgoing articles. This function will be called with the name of the file to store the @@ -1656,7 +1655,8 @@ (defun message-kill-buffer () "Kill the current buffer." (interactive) - (when (yes-or-no-p "Kill the buffer? ") + (when (or (not (buffer-modified-p)) + (yes-or-no-p "Message modified; kill anyway? ")) (let ((actions message-kill-actions)) (kill-buffer (current-buffer)) (message-do-actions actions)))) @@ -2461,7 +2461,8 @@ (defun message-make-from () "Make a From header." - (let* ((login (message-make-address)) + (let* ((style message-from-style) + (login (message-make-address)) (fullname (or (and (boundp 'user-full-name) user-full-name) @@ -2471,11 +2472,11 @@ (save-excursion (message-set-work-buffer) (cond - ((or (null message-from-style) + ((or (null style) (equal fullname "")) (insert login)) - ((or (eq message-from-style 'angles) - (and (not (eq message-from-style 'parens)) + ((or (eq style 'angles) + (and (not (eq style 'parens)) ;; Use angles if no quoting is needed, or if parens would ;; need quoting too. (or (not (string-match "[^- !#-'*+/-9=?A-Z^-~]" fullname))
--- a/lisp/gnus/nnbabyl.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/nnbabyl.el Mon Aug 13 09:23:06 2007 +0200 @@ -335,10 +335,13 @@ (delete-region (point) (progn (forward-line 1) (point))))) (when nnmail-cache-accepted-message-ids (nnmail-cache-insert (nnmail-fetch-field "message-id"))) - (setq result (car (nnbabyl-save-mail - (if (stringp group) - (list (cons group (nnbabyl-active-number group))) - (nnmail-article-group 'nnbabyl-active-number))))) + (setq result + (if (stringp group) + (list (cons group (nnbabyl-active-number group))) + (nnmail-article-group 'nnbabyl-active-number))) + (if (null result) + (setq result 'junk) + (setq result (car (nnbabyl-save-mail result)))) (set-buffer nnbabyl-mbox-buffer) (goto-char (point-max)) (search-backward "\n\^_")
--- a/lisp/gnus/nnfolder.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/nnfolder.el Mon Aug 13 09:23:06 2007 +0200 @@ -225,7 +225,7 @@ (let ((bufs nnfolder-buffer-alist)) (save-excursion (while bufs - (if (not (buffer-live-p (nth 1 (car bufs)))) + (if (not (gnus-buffer-live-p (nth 1 (car bufs)))) (setq nnfolder-buffer-alist (delq (car bufs) nnfolder-buffer-alist)) (set-buffer (nth 1 (car bufs))) @@ -377,12 +377,14 @@ (delete-region (point) (progn (forward-line 1) (point)))) (when nnmail-cache-accepted-message-ids (nnmail-cache-insert (nnmail-fetch-field "message-id"))) - (setq result - (car (nnfolder-save-mail - (if (stringp group) - (list (cons group (nnfolder-active-number group))) - (setq art-group - (nnmail-article-group 'nnfolder-active-number))))))) + (setq result (if (stringp group) + (list (cons group (nnfolder-active-number group))) + (setq art-group + (nnmail-article-group 'nnfolder-active-number)))) + (if (null result) + (setq result 'junk) + (setq result + (car (nnfolder-save-mail result))))) (when last (save-excursion (nnfolder-possibly-change-folder (or (caar art-group) group)) @@ -682,6 +684,8 @@ (< maxid 2))) (goto-char (point-max)) (unless (re-search-backward marker nil t) + (goto-char (point-min))) + (when (nnmail-search-unix-mail-delim) (goto-char (point-min)))) ;; Keep track of the active number on our own, and insert it back
--- a/lisp/gnus/nnheader.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/nnheader.el Mon Aug 13 09:23:06 2007 +0200 @@ -57,8 +57,7 @@ (autoload 'mail-position-on-field "sendmail") (autoload 'message-remove-header "message") (autoload 'cancel-function-timers "timers") - (autoload 'gnus-point-at-eol "gnus-util") - (autoload 'gnus-buffer-live-p "gnus-util")) + (autoload 'gnus-point-at-eol "gnus-util")) ;;; Header access macros.
--- a/lisp/gnus/nnmail.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/nnmail.el Mon Aug 13 09:23:06 2007 +0200 @@ -393,7 +393,9 @@ (defcustom nnmail-split-abbrev-alist '((any . "from\\|to\\|cc\\|sender\\|apparently-to\\|resent-from\\|resent-to\\|resent-cc") - (mail . "mailer-daemon\\|postmaster\\|uucp")) + (mail . "mailer-daemon\\|postmaster\\|uucp") + (to . "to\\|cc\\|apparently-to\\|resent-to\\|resent-cc") + (from . "from\\|sender\\|resent-from")) "Alist of abbreviations allowed in `nnmail-split-fancy'." :group 'nnmail-split :type '(repeat (cons :format "%v" symbol regexp)))
--- a/lisp/gnus/nnmbox.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/nnmbox.el Mon Aug 13 09:23:06 2007 +0200 @@ -306,10 +306,12 @@ (delete-region (point) (progn (forward-line 1) (point)))) (when nnmail-cache-accepted-message-ids (nnmail-cache-insert (nnmail-fetch-field "message-id"))) - (setq result (nnmbox-save-mail - (if (stringp group) - (list (cons group (nnmbox-active-number group))) - (nnmail-article-group 'nnmbox-active-number))))) + (setq result (if (stringp group) + (list (cons group (nnmbox-active-number group))) + (nnmail-article-group 'nnmbox-active-number))) + (if (null result) + (setq result 'junk) + (setq result (car (nnmbox-save-mail result))))) (save-excursion (set-buffer nnmbox-mbox-buffer) (goto-char (point-max)) @@ -319,7 +321,7 @@ (nnmail-cache-close)) (nnmail-save-active nnmbox-group-alist nnmbox-active-file) (save-buffer)))) - (car result))) + result)) (deffoo nnmbox-request-replace-article (article group buffer) (nnmbox-possibly-change-newsgroup group)
--- a/lisp/gnus/nnmh.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/nnmh.el Mon Aug 13 09:23:06 2007 +0200 @@ -301,8 +301,10 @@ noinsert))) (and (nnmail-activate 'nnmh) - (car (nnmh-save-mail (nnmail-article-group 'nnmh-active-number) - noinsert)))) + (let ((resu|t (nnmail-article-group 'nnmh-active-number))) + (if (not result) + 'junk + (car (nnmh-save-mail result noinsert)))))) (when (and last nnmail-cache-accepted-message-ids) (nnmail-cache-close))))
--- a/lisp/gnus/nnml.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/gnus/nnml.el Mon Aug 13 09:23:06 2007 +0200 @@ -325,8 +325,9 @@ (and last (nnml-save-nov)))) (and (nnmail-activate 'nnml) - (setq result (car (nnml-save-mail - (nnmail-article-group 'nnml-active-number)))) + (if (not (setq result (nnmail-article-group 'nnml-active-number))) + (setq result 'junk) + (setq result (car (nnml-save-mail result)))) (when last (nnmail-save-active nnml-group-alist nnml-active-file) (when nnmail-cache-accepted-message-ids
--- a/lisp/hm--html-menus/ANNOUNCEMENT Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/ANNOUNCEMENT Mon Aug 13 09:23:06 2007 +0200 @@ -1,9 +1,9 @@ Hello, -I've written a new version (5.3) of my html package for the XEmacs +I've written a new version (5.5) of my html package for the XEmacs and the GNU Emacs 19. The name of the package is: - hm--html-menus-5.3.tar.gz + hm--html-menus-5.5.tar.gz With this package it is very easy to write html pages for the World Wide Web (WWW). Eg: In most cases the user gets help to construct a specific @@ -25,9 +25,8 @@ - a lot of bug fixes Read the NEWS file to see news in detail... -You should find hm--html-menus-5.3.tar.gz on the following ftp server: +You should find hm--html-menus-5.5.tar.gz on the following ftp server: sunsite.unc.edu in /pub/Linux/apps/editors/emacs/ - ftp.rrzn.uni-hannover.de in /pub/unix/editors/lemacs/contrib ftp.tnt.uni-hannover.de in /pub/editors/xemacs/contrib It may take some time, before the package is copied by the ftp admins @@ -40,20 +39,16 @@ can be used together with another html major mode, like the psgml-html mode in the XEmacs 19.14. -NOTE: This version is not tested with the Emacs 19. One of the next -releases in the near future will be a bug fix only release for the -Emacs 19. So please report any bugs to muenkel@tnt.uni-hannover.de. - The package provides functions to insert the following stuff in html-pages: 1. Anchors: relative links, general link; html link, info link, gopher link, file link; - ftp link, news link, mail link, wais (direct) link, + ftp link, news link, mailbox link, mailto link, wais (direct) link, wais (gateway) link; proggate link, local proggate link, link target; 2. Frame elements: - full html frame with doctype, html, head, body, title, + full html frame with doctype, doctype, html, head, body, title, header and signature elements or only the single elements; meta, isindex, link and base element; html 'created'- and 'changed'- comments; @@ -61,20 +56,20 @@ 3. Structure elements: menu or list item, menu, unordered list, ordered list, directory list; description list, description title, description entry; - new paragraph, new line, horizontal rule, document division, table, table title, table header, table row, table entry; + new paragraph, new line, horizontal rule, document division; 4. for formatting paragraphs: - without links, with links, blockquote, listing, abstract; - basefont, font, center; + preformated, blockquote; + basefont, font, center, style; + html comment; 5. formatting: bold, italic, underline, typewriter, strikethru, super and subscript, emphasized, strong, small, big, definition, keyboard, variable, code, sample, citation, - html comment; 6. include: top aligned image, middle aligned image, bottom aligned image; general image element, map, area and all together; - applet, parameter; + applet, parameter, script; 7. forms: form; text, password, isindex, integer, float, date, url, scribble fields; @@ -134,5 +129,3 @@ Heiko - -
--- a/lisp/hm--html-menus/NEWS Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/NEWS Mon Aug 13 09:23:06 2007 +0200 @@ -1,3 +1,50 @@ +25.03.97 + Fixed a bug in `hm--html-search-place-for-element-in-head'. + Fixed bugs in `hm--html-add-base' and `hm--html-add-isindex'. + Renamed all calls to `hm--html-add-mail-link*' to + `hm--html-add-mail-box-link*' - this fixed bugs in the menus and + keybindings. + Fixed `hm--html-frame-template-file'. + Fixed some keybinding bugs. + -- BUILDED the version 5.5 of the package -- +24.03.97 + Added the function `mouse-event-p' for the Emacs 19 to adapt.el. + The internal-drag-and-drop package uses know the function + `file-remote-p' instead of `ange-ftp-ftp-path'. If this + function is not available in an emacs, the function will be + defined and will use the function `ange-ftp-ftp-path'. + Fixed bugs in `idd-mouse-drag-and-drop-click' for the Emacs 19. +23.03.97 + Fixed some bugs, so that the package is now again loadable + in the Emacs 19 (19.34). + Changed popup-menu-up-p to popup-up-p, menu-event-p to + misc-user-event-p. + Fixed some other XEmacs compilation bugs. + Fixed bugs in `hm--html-add-isindex' and `hm--html-add-base'. + Moved the commands `hm--html-add-server-side-include-file', + `hm--html-add-server-side-include-command' and + `hm--html-add-server-side-include-command-with-isindex-parameter' + to hm--html-not-standard.el. + Fixed a bug in `hm--html-add-document-division-to-region'. + Deleted some obsolete stuff in `hm--html-add-link'. + Fixed bugs in `hm--html-add-basefont', `hm--html-add-mail-box-link', + `hm--html-add-mail-box-link-to-region', `idd-list-1-subset-of-list-2', + `idd-same-elements-p', `idd-start-mouse-drag-and-drop', + `idd-mouse-drag-and-drop-click', `idd-if-minor-mode-p', + `idd-if-modifiers-p' and `tmpl-read-template-filename'. +22.03.97 + Fixed some documentation bugs in tmpl-minor-mode.el. + Changed the key bindings in the tmpl-minor-mode. They are now + using all the prefix C-c C-c. + Fixed some documentation bugs in internal-drag-and-drop.el. + Added a package documentation as Texinfo file. It documents also + the included packages for internal drag and drop and for + templates. + -- BUILDED the version 5.4 of the package -- +18.03.97 + Applied a patch from Martin Buchholz <mrb@Eng.Sun.COM>, + to fix some spelling errors. + Changed the value of the variable `tmpl-sign' to \000. 25.02.97 Fixed two bugs, which occured during loading the mode after the psgml-html-mode.
--- a/lisp/hm--html-menus/README Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/README Mon Aug 13 09:23:06 2007 +0200 @@ -1,4 +1,4 @@ -This README file describes the emacs lisp package hm--html-menus-5.3. +This README file describes the emacs lisp package hm--html-menus-5.5. The package provides functions and various popup and pulldown menus for a html mode called hm--html-mode, a mode for writing html pages. @@ -27,12 +27,6 @@ and on PC's with linux. But it should work also on other (possibly only UNIX ?) platforms. -NOTE: The current release isn't tested with the Emacs 19 (5.0 is but -5.1 to 5.3 are not). One of the next releases in the near future :-) will be a -bug fix only release for the Emacs 19. So please report any bugs to -muenkel@tnt.uni-hannover.de to shorten the time until the Emacs 19 -related bugs are fixed. - Read the file README-EMACS-19, if you want to use this package with GNU Emacs 19. @@ -62,19 +56,17 @@ of the hm--html-mode; this is now the main file of the package; hm--html-not-standard.el : provides functions to insert some - non standard hteml elements; + non standard html elements; this file is not evaluated by default; hm--html-configuration.el : configuration file for the html mode; choose this as system configuration file; hm--html-drag-and-drop.el : defines the HTML- specific functions for the drag and drop interface; -hm--html-indentation.el : defines functions for the indentation of - HTML elements; hm--date.el : defines the function hm--date, which returns the date in the format "day-month-year" like "30-Jun-1993". html-view.el : Ron Tapia's html-view.el to view html-pages - in the Xmosaic; it is patched for use + in the Xmosaic; it is patched for the use with the xemacs; internal-drag-and-drop.el : provides the general (html-mode independend functions) of the drag and @@ -85,7 +77,7 @@ with this mode you can expand templates, which are described in the file templates-syntax.doc (look at the files - command-description.tmpl and + command-description.html.tmpl and frame.html.tmpl for examples); templates can be expanded automatically, if you include a file with templates via the @@ -94,7 +86,9 @@ command-description.html.tmpl : Templatefile for the use with the tmpl-minor-mode; frame.html.tmpl : Templatefile, provides a simple frame; - +doc/hm--html-mode.texinfo : Package documentation in the Texinfo format; +doc/umlaute.texinfo : Texinfo include file for german vowel + mutation (deutsche Umlaute); @@ -104,7 +98,7 @@ Note: In this version the setting of the environment variables HTML_CONFIG_FILE and HTML_USER_CONFIG_FILE are no longer necessary, -if you put the user configuration file in the home directrory and +if you put the user configuration file in the home directory and the system configuration file in one of the load path directories of your XEmacs or Emacs 19.
--- a/lisp/hm--html-menus/adapt.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/adapt.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,6 +1,6 @@ -;;; $Id: adapt.el,v 1.2 1997/02/15 22:21:03 steve Exp $ +;;; $Id: adapt.el,v 1.3 1997/03/28 02:28:41 steve Exp $ ;;; -;;; Copyright (C) 1993, 1994, 1995 Heiko Muenkel +;;; Copyright (C) 1993 - 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de ;;; ;;; This program is free software; you can redistribute it and/or modify @@ -20,7 +20,7 @@ ;;; ;;; Description: ;;; -;;; General functions to port Lucid Emacs to GNU Emacs 19. +;;; General functions to port XEmacs functions to GNU Emacs 19. ;;; ;;; Installation: ;;; @@ -47,7 +47,7 @@ (not (adapt-xemacsp)) (string= (substring emacs-version 0 2) "19"))) -;;; Functions, which doesn't exist in both emacses +;;; Functions, which don't exist in both emacs versions (defun adapt-region-active-p () "Returns t, if a region is active." @@ -55,7 +55,19 @@ (mark) mark-active)) +(if (not (fboundp 'file-remote-p)) + (defun file-remote-p (file) + "Test wether file resides on the local system. +The special value 'unknown is returned if no remote file acess package +has been loaded." + (if (not (featurep 'ange-ftp)) + (require 'ange-ftp)) + (if (not (fboundp 'ange-ftp-ftp-p)) + nil ; better than nothing, if no ange-ftp-ftp-p exists + (ange-ftp-ftp-path file)))) + +;;; Functions, which don't exist in the Emacs 19 (if (adapt-emacs19p) (progn (load-library "lucid") @@ -238,6 +250,20 @@ (and (button-event-p obj) (not (button-press-event-p obj))))) + (if (not (fboundp 'button-click-event-p)) + (defun button-click-event-p (obj) + "True if OBJ is a click event obkect." + ;; only for the Emacs 19 + ;; doesn't exist and can't (?) exist in the XEmacs + (and (button-event-p obj) + (member 'click (event-modifiers obj))))) + + (if (not (fboundp 'mouse-event-p)) + (defun mouse-event-p (obj) + "True if OBJ is a button-press, button-release, or mouse-motion event object." + (or (button-event-p obj) + (member 'drag (event-modifiers obj))))) + (if (not (fboundp 'event-window)) (defun event-window (event) "Return the window of the given mouse event. @@ -316,6 +342,9 @@ (if (not (fboundp 'redraw-modeline)) (defalias 'redraw-modeline 'force-mode-line-update)) + (if (not (fboundp 'mouse-track)) + (defalias 'mouse-track 'mouse-drag-region)) + ))
--- a/lisp/hm--html-menus/hm--html-configuration.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/hm--html-configuration.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,6 +1,6 @@ ;;; hm--html-configuration.el - Configurationfile for the html-mode ;;; -;;; $Id: hm--html-configuration.el,v 1.4 1997/02/27 06:08:08 steve Exp $ +;;; $Id: hm--html-configuration.el,v 1.5 1997/03/28 02:28:41 steve Exp $ ;;; ;;; Copyright (C) 1993 - 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -24,7 +24,7 @@ ;;; ;;; This file is for the system wide configuration of the html mode. ;;; User specific configuration should be done in the file -;;; ~/.hm--html-configuration.el, which preceeds the settings in +;;; ~/.hm--html-configuration.el, which precedes the settings in ;;; this file. ;;; All settings in this file are done with defvar's, therefore ;;; you could overwrite them also with the function setq in your @@ -191,6 +191,10 @@ ) "*Alist with hostnames and ports for the gopher server.") +(defvar hm--html-gopher-hostname:port-default + "newsserver.rrzn.uni-hannover.de:70" + "*Default hostname with port for the gopher server.") + (defvar hm--html-gopher-doctype-alist '(("/1") ("/11") ("/00")) @@ -199,10 +203,6 @@ (defvar hm--html-gopher-doctype-default "/1" "*Default doctype string for the gopher server.") -(defvar hm--html-gopher-hostname:port-default - "newsserver.rrzn.uni-hannover.de:70" - "*Default hostname with port for the gopher server.") - (defvar hm--html-gopher-anchor-alist '(("veronica") ("Wide%20Area%20Information%20Services%20databases") @@ -338,7 +338,7 @@ (defvar hm--html-frame-template-file (concat data-directory "../lisp/hm--html-menus/" - "frame.tmpl") + "frame.html.tmpl") "File, which is used as template for a html frame.") (defvar hm--html-automatic-expand-templates t @@ -381,7 +381,7 @@ ;;; Keybindings: (defvar hm--html-bind-latin-1-char-entities t - "Set this to nil, if you don't want to use the ISO Latin 1 charcter entities. + "Set this to nil, if you don't want to use the ISO Latin 1 character entities. This is only useful, if `hm--html-use-old-keymap' is set to nil. It is only used during loading the html package the first time.") @@ -410,7 +410,7 @@ (((idd-if-local-file-p . t)) hm--html-idd-add-file-link-to-buffer))) "The action list for the destination mode `hm--html-mode'. -Look at the description of the variable idd-actions") +Look at the description of the variable idd-actions.") ;;; The font lock keywords @@ -458,7 +458,7 @@ "*Hook variable to execute functions after loading the package.") (defvar hm--html-mode-hook nil - "This hook will be called each time, when the hm--html-mode is invoked.") + "*This hook will be called each time, when the hm--html-mode is invoked.") ;;; For the file html-view.el @@ -466,7 +466,7 @@ ;;; Look at that file, if you've trouble with the functions ;;; to preview the html document with the Mosaic (defvar html-view-mosaic-command "/sol/www/bin/mosaic" - "The command that runs Mosaic on your system") + "The command that runs Mosaic on your system.") (defvar html-sigusr1-signal-value 16 "Value for the SIGUSR1 signal on your system. @@ -620,7 +620,7 @@ ("script" (:hm--html-two-element-tag t)) ) "An alist with tag names known by the `hm--html-mode'. -CURRENTLY THIS LIST CONTAINS NOT ALL TAGS!!!!. +CURRENTLY THIS LIST MIGHT NOT CONTAIN ALL TAGS!!!!. It is used to determine, if a tag is a one element tag or not.
--- a/lisp/hm--html-menus/hm--html-keys.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/hm--html-keys.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,4 +1,4 @@ -;;; $Id: hm--html-keys.el,v 1.4 1997/02/27 06:08:09 steve Exp $ +;;; $Id: hm--html-keys.el,v 1.5 1997/03/28 02:28:41 steve Exp $ ;;; ;;; Copyright (C) 1995, 1996, 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -56,7 +56,7 @@ (define-key hm--html-noregion-anchor-map "f" 'hm--html-add-file-link) (define-key hm--html-noregion-anchor-map "\C-f" 'hm--html-add-ftp-link) (define-key hm--html-noregion-anchor-map "n" 'hm--html-add-news-link) - (define-key hm--html-noregion-anchor-map "m" 'hm--html-add-mail-link) + (define-key hm--html-noregion-anchor-map "m" 'hm--html-add-mail-box-link) (define-key hm--html-noregion-anchor-map [(control m)] 'hm--html-add-mailto-link) (define-key hm--html-noregion-anchor-map "w" 'hm--html-add-direct-wais-link) @@ -84,7 +84,7 @@ (define-key hm--html-region-anchor-map "\C-f" 'hm--html-add-ftp-link-to-region) (define-key hm--html-region-anchor-map "n" 'hm--html-add-news-link-to-region) - (define-key hm--html-region-anchor-map "m" 'hm--html-add-mail-link-to-region) + (define-key hm--html-region-anchor-map "m" 'hm--html-add-mail-box-link-to-region) (define-key hm--html-region-anchor-map [(control m)] 'hm--html-add-mailto-link-to-region) (define-key hm--html-region-anchor-map @@ -229,13 +229,13 @@ (define-key hm--html-noregion-formating-paragraph-map "b" 'hm--html-add-blockquote) (define-key hm--html-noregion-formating-paragraph-map - "C-b" 'hm--html-add-basefont) + "\C-b" 'hm--html-add-basefont) (define-key hm--html-noregion-formating-paragraph-map "f" 'hm--html-add-font) (define-key hm--html-noregion-formating-paragraph-map "c" 'hm--html-add-center) (define-key hm--html-noregion-formating-paragraph-map - "C-c" 'hm--html-add-comment-to-region) + "\C-c" 'hm--html-add-comment) ; (define-key hm--html-noregion-formating-paragraph-map ; "l" 'hm--html-add-listing) ; (define-key hm--html-noregion-formating-paragraph-map @@ -255,13 +255,13 @@ (define-key hm--html-region-formating-paragraph-map "b" 'hm--html-add-blockquote-to-region) (define-key hm--html-region-formating-paragraph-map - "C-b" 'hm--html-add-basefont-to-region) + "\C-b" 'hm--html-add-basefont-to-region) (define-key hm--html-region-formating-paragraph-map "f" 'hm--html-add-font-to-region) (define-key hm--html-region-formating-paragraph-map "c" 'hm--html-add-center-to-region) (define-key hm--html-region-formating-paragraph-map - "C-c" 'hm--html-add-comment-to-region) + "\C-c" 'hm--html-add-comment-to-region) ; (define-key hm--html-region-formating-paragraph-map ; "l" 'hm--html-add-listing-to-region) ; (define-key hm--html-region-formating-paragraph-map
--- a/lisp/hm--html-menus/hm--html-menu.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/hm--html-menu.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,6 +1,6 @@ ;;; hm--html-menu --- A menu for the hm--html-mode. ;;; -;;; $Id: hm--html-menu.el,v 1.4 1997/02/27 06:08:09 steve Exp $ +;;; $Id: hm--html-menu.el,v 1.5 1997/03/28 02:28:41 steve Exp $ ;;; ;;; Copyright (C) 1993 - 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -64,7 +64,7 @@ "----" ["Ftp link..." hm--html-add-ftp-link t] ["News link..." hm--html-add-news-link t] - ["Mailbox link..." hm--html-add-mail-link t] + ["Mailbox link..." hm--html-add-mail-box-link t] ["Mailto link..." hm--html-add-mailto-link t] ["Wais link (direct)..." hm--html-add-direct-wais-link t] ["Wais link (gateway)..." hm--html-add-wais-link t] @@ -189,7 +189,7 @@ ; ("Literature" ; ["Quote" hm--html-add-quote t] ; ["Acronym" hm--html-add-acronym t] -; ["Abbrevation" hm--html-add-abbrevation t] +; ["Abbreviation" hm--html-add-abbreviation t] ; ["Citation" hm--html-add-citation t] ; ["Literature" hm--html-add-literature t] ; ["Publication" hm--html-add-publication t] @@ -312,7 +312,7 @@ "----" ["Ftp link..." hm--html-add-ftp-link-to-region t] ["News link..." hm--html-add-news-link-to-region t] - ["Mailbox link..." hm--html-add-mail-link-to-region t] + ["Mailbox link..." hm--html-add-mail-box-link-to-region t] ["Mailto link..." hm--html-add-mailto-link-to-region t] ["WAIS link (direct)..." hm--html-add-direct-wais-link-to-region t] ["WAIS link (gateway)..." hm--html-add-wais-link-to-region t] @@ -534,7 +534,9 @@ (if (and current-menubar (not (assoc menu-name current-menubar))) (progn (set-buffer-menubar (copy-sequence current-menubar)) - (add-submenu nil (cons menu-name (cdr hm--html-pulldown-menu)) "HTML")))) + (add-submenu nil + (cons menu-name (cdr hm--html-pulldown-menu)) + "HTML")))) (defun hm--install-html-menu (menu-name) (if (eq major-mode 'hm--html-mode) @@ -688,9 +690,9 @@ (car menudesc) ; "==") ; (cdr menudesc))) ; - (while (popup-menu-up-p) + (while (popup-up-p) (setq event (next-command-event event)) - (cond ((menu-event-p event) + (cond ((misc-user-event-p event) (cond ((eq (event-object event) 'abort) (signal 'quit nil))
--- a/lisp/hm--html-menus/hm--html-mode.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/hm--html-mode.el Mon Aug 13 09:23:06 2007 +0200 @@ -2,7 +2,7 @@ ;;; ;;; Keywords: hypermedia languages help docs wp ;;; -;;; $Id: hm--html-mode.el,v 1.4 1997/02/27 06:08:09 steve Exp $ +;;; $Id: hm--html-mode.el,v 1.5 1997/03/28 02:28:42 steve Exp $ ;;; ;;; Copyright (C) 1996, 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -68,21 +68,29 @@ (require 'font-lock) +(require 'cl) (require 'adapt) (require 'hm--date) (require 'hm--html) +;(require 'hm--html-not-standard) (eval-when-compile (require 'hm--html-configuration)) (hm--html-load-config-files) (require 'hm--html-indentation) -(require 'hm--html-keys) (defvar hm--html-minor-mode nil "Non-nil, if the `hm--html-minor-mode' is active.") (require 'hm--html-menu) + +(require 'hm--html-keys) + +;(defvar hm--html-minor-mode nil +; "Non-nil, if the `hm--html-minor-mode' is active.") +; +;(require 'hm--html-menu) (require 'hm--html-drag-and-drop) @@ -91,7 +99,7 @@ (defconst hm--html-menus-package-name "hm--html-menus") -(defconst hm--html-menus-package-version "5.3") +(defconst hm--html-menus-package-version "5.5") ;;; Generate the help buffer faces
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/hm--html-menus/hm--html-not-standard.el Mon Aug 13 09:23:06 2007 +0200 @@ -0,0 +1,439 @@ +;;; hm--html-not-standard.el +;;; v1.00; 22-Feb-1997 +;;; Copyright (C) 1997 Heiko Muenkel +;;; email: muenkel@tnt.uni-hannover.de +;;; +;;; This program is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 2, or (at your option) +;;; any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program; if not, write to the Free Software +;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +;;; +;;; +;;; Description: +;;; +;;; This file contains lisp code for the insertation of non standard +;;; HTML 3.2 elements. I don't think, that's a good idea to use this +;;; elements in any HTML documents :-) +;;; +;;; Installation: +;;; +;;; Put this file in one of your load path directories. +;;; +;;; Put a (require 'hm--html-not-standard) in your .emacs +;;; +;;; Look at the files hm--html-mode.el and hm--html-configuration +;;; for further installation points. +;;; + +;(require 'hm--html-mode) + +(defun hm--html-add-server-side-include-command-with-parameter (command + parameter) + "This function adds a server side include command directive in the buffer. +The directive is only supported by the NCSA http daemon." + (interactive (list + (completing-read + "Include Command: " + hm--html-server-side-include-command-with-parameter-alist) + (read-string "Parameterlist sepearted by '?': "))) + (if (string= command "") + (error "ERROR: No command specified !") + (if (string= parameter "") + (error "ERROR: No parameter specified !") + (if (= ?| (string-to-char command)) + (if (= ?? (string-to-char parameter)) + (insert "<INC SRVURL \"" command parameter "\">") + (insert "<INC SRVURL \"" command "?" parameter "\">")) + (if (= ?? (string-to-char parameter)) + (insert "<INC SRVURL \"|" command parameter "\">") + (insert "<INC SRVURL \"|" command "?" parameter "\">")))))) + + +(defun hm--html-add-server-side-include-command-with-isindex-parameter + (command) + "This function adds a server side include command directive in the buffer. +The include command uses the \"isindex\"- parameter for the specified command." + (interactive (list + (completing-read "Include Command: " + hm--html-server-side-include-command-alist))) + (hm--html-add-server-side-include-command command t)) + + +(defun hm--html-add-server-side-include-command (command &optional srvurl) + "This function adds a server side include command directive in the buffer. +The directive is only supported by the NCSA http daemon. +If SRVURL is t, then the attribute srvurl instead of srv is used for the +include command. With srvurl, the include command uses the \"isindex\"- +parameter for the specified command." + (interactive (list + (completing-read "Include Command: " + hm--html-server-side-include-command-alist))) + (let ((attribute (if srvurl "SRVURL" "SRV"))) + (if (string= command "") + (error "ERROR: No command specified !") + (if (= ?| (string-to-char command)) + (insert "<INC " attribute" \"" command "\">") + (insert "<INC " attribute " \"|" command "\">"))))) + + +(defun hm--html-add-server-side-include-file (file) + "This function adds a server side include file directive in the buffer. +The directive is only supported by the NCSA http daemon." + (interactive "FInclude File: ") + (if (string= file "") + (error "ERROR: No filename specified !") + (insert "<INC SRV \"" file "\">"))) + + +(defun hm--html-add-plaintext () + "Adds the HTML tags for plaintext." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline + "<XMP>" + 'hm--html-insert-end-tag-with-newline + "</XMP>")) + + +(defun hm--html-add-plaintext-to-region () + "Adds the HTML tags for plaintext to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag-with-newline + "<XMP>" + 'hm--html-insert-end-tag-with-newline + "</XMP>")) + + +(defun hm--html-add-abstract () + "Adds the HTML tags for abstract text at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline + "<ABSTRACT>" + 'hm--html-insert-end-tag-with-newline + "</ABSTRACT>")) + + +(defun hm--html-add-abstract-to-region () + "Adds the HTML tags for abstract text to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag-with-newline + "<ABSTRACT>" + 'hm--html-insert-end-tag-with-newline + "</ABSTRACT>")) + + +(defun hm--html-add-quote () + "Adds the HTML tags for Quote at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<Q>" + 'hm--html-insert-end-tag + "</Q>")) + + +(defun hm--html-add-quote-to-region () + "Adds the HTML tags for Quote to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<Q>" + 'hm--html-insert-end-tag + "</Q>")) + + +(defun hm--html-add-person () + "Adds the HTML tags for Person at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<PERSON>" + 'hm--html-insert-end-tag + "</PERSON>")) + + +(defun hm--html-add-person-to-region () + "Adds the HTML tags for Person to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<PERSON>" + 'hm--html-insert-end-tag + "</PERSON>")) + + +(defun hm--html-add-instance () + "Adds the HTML tags for Instance at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<INS>" + 'hm--html-insert-end-tag + "</INS>")) + + +(defun hm--html-add-instance-to-region () + "Adds the HTML tags for Instance to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<INS>" + 'hm--html-insert-end-tag + "</INS>")) + + +(defun hm--html-add-publication () + "Adds the HTML tags for Publication at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<PUB>" + 'hm--html-insert-end-tag + "</PUB>")) + + +(defun hm--html-add-publication-to-region () + "Adds the HTML tags for Publication to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<PUB>" + 'hm--html-insert-end-tag + "</PUB>")) + + +(defun hm--html-add-author () + "Adds the HTML tags for Author at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<AUTHOR>" + 'hm--html-insert-end-tag + "</AUTHOR>")) + + +(defun hm--html-add-author-to-region () + "Adds the HTML tags for Author to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<AUTHOR>" + 'hm--html-insert-end-tag + "</AUTHOR>")) + + +(defun hm--html-add-editor () + "Adds the HTML tags for Editor at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<EDITOR>" + 'hm--html-insert-end-tag + "</EDITOR>")) + + +(defun hm--html-add-editor-to-region () + "Adds the HTML tags for Editor to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<EDITOR>" + 'hm--html-insert-end-tag + "</EDITOR>")) + + +(defun hm--html-add-credits () + "Adds the HTML tags for Credits at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<CREDITS>" + 'hm--html-insert-end-tag + "</CREDITS>")) + + +(defun hm--html-add-credits-to-region () + "Adds the HTML tags for Credits to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<CREDITS>" + 'hm--html-insert-end-tag + "</CREDITS>")) + + +(defun hm--html-add-copyright () + "Adds the HTML tags for Copyright at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<COPYRIGHT>" + 'hm--html-insert-end-tag + "</COPYRIGHT>")) + + +(defun hm--html-add-copyright-to-region () + "Adds the HTML tags for Copyright to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<COPYRIGHT>" + 'hm--html-insert-end-tag + "</COPYRIGHT>")) + + +(defun hm--html-add-isbn () + "Adds the HTML tags for ISBN at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<ISBN>" + 'hm--html-insert-end-tag + "</ISBN>")) + + +(defun hm--html-add-isbn-to-region () + "Adds the HTML tags for ISBN to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<ISBN>" + 'hm--html-insert-end-tag + "</ISBN>")) + + +(defun hm--html-add-acronym () + "Adds the HTML tags for Acronym at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<ACRONYM>" + 'hm--html-insert-end-tag + "</ACRONYM>")) + + +(defun hm--html-add-acronym-to-region () + "Adds the HTML tags for Acronym to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<ACRONYM>" + 'hm--html-insert-end-tag + "</ACRONYM>")) + + +(defun hm--html-add-abbrevation () + "Adds the HTML tags for Abbrevation at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<ABBREV>" + 'hm--html-insert-end-tag + "</ABBREV>")) + + +(defun hm--html-add-abbrev-to-region () + "Adds the HTML tags for Abbrev to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<ABBREV>" + 'hm--html-insert-end-tag + "</ABBREV>")) + + +(defun hm--html-add-command () + "Adds the HTML tags for Command at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<CMD>" + 'hm--html-insert-end-tag + "</CMD>")) + + +(defun hm--html-add-command-to-region () + "Adds the HTML tags for Command to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<CMD>" + 'hm--html-insert-end-tag + "</CMD>")) + + +(defun hm--html-add-argument () + "Adds the HTML tags for Argument at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<ARG>" + 'hm--html-insert-end-tag + "</ARG>")) + + +(defun hm--html-add-argument-to-region () + "Adds the HTML tags for Argument to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<ARG>" + 'hm--html-insert-end-tag + "</ARG>")) + + +(defun hm--html-add-literature () + "Adds the HTML tags for Literature at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<LIT>" + 'hm--html-insert-end-tag + "</LIT>")) + + +(defun hm--html-add-literature-to-region () + "Adds the HTML tags for Literature to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<LIT>" + 'hm--html-insert-end-tag + "</LIT>")) + + +(defun hm--html-add-footnote () + "Adds the HTML tags for Footnote at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<FOOTNOTE>" + 'hm--html-insert-end-tag + "</FOOTNOTE>")) + + +(defun hm--html-add-footnote-to-region () + "Adds the HTML tags for Footnote to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<FOOTNOTE>" + 'hm--html-insert-end-tag + "</FOOTNOTE>")) + + +(defun hm--html-add-margin () + "Adds the HTML tags for Margin at the point in the current buffer." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag + "<MARGIN>" + 'hm--html-insert-end-tag + "</MARGIN>")) + + +(defun hm--html-add-margin-to-region () + "Adds the HTML tags for Margin to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag + "<MARGIN>" + 'hm--html-insert-end-tag + "</MARGIN>")) + + +(defun hm--html-add-listing () + "Adds the HTML tags for listing." + (interactive) + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline + "<LISTING>" + 'hm--html-insert-end-tag-with-newline + "</LISTING>")) + + +(defun hm--html-add-listing-to-region () + "Adds the HTML tags for listing to the region." + (interactive) + (hm--html-add-tags-to-region 'hm--html-insert-start-tag-with-newline + "<LISTING>" + 'hm--html-insert-end-tag-with-newline + "</LISTING>")) + + +(provide 'hm--html-not-standard)
--- a/lisp/hm--html-menus/hm--html.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/hm--html.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,4 +1,4 @@ -;;; $Id: hm--html.el,v 1.4 1997/02/27 06:08:10 steve Exp $ +;;; $Id: hm--html.el,v 1.5 1997/03/28 02:28:42 steve Exp $ ;;; ;;; Copyright (C) 1993 - 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -153,7 +153,7 @@ "Adds the HTML tag for a basefont." (interactive (list (hm--html-read-font-size t))) (hm--html-add-tags 'hm--html-insert-start-tag - (concate "<BASEFONT SIZE=" size ">"))) + (concat "<BASEFONT SIZE=" size ">"))) (defun hm--html-add-line-break () "Adds the HTML tag for a line break." @@ -207,13 +207,14 @@ (point) (goto-char (point-min)) (if (re-search-forward - (concat "\\(<title\\)\\|\\(<head\\)\\|\\(<html\\)\\|" - "\\(<isindex\\)\\|\\(<base\\)\\|\\(<link\\)\\|" - "\\(<meta") + (concat ;"\\(<title\\)\\|\\(<head\\)\\|\\(<html\\)\\|" + "\\(<title\\)\\|" + "\\(<isindex\\)\\|\\(<base\\)\\|\\(<link\\)\\|" + "\\(<meta\\)") end-point t) (beginning-of-line) - point)))) + end-point)))) (defun hm--html-add-isindex (prompt) "Inserts the isindex tag. PROMPT is the value of the prompt attribute." @@ -226,17 +227,18 @@ (setq head-end-point (when (re-search-forward "\\(</head\\)\\|\\(<body\\)\\|\\(</html\\)") (beginning-of-line) - (point)))) - (cond ((re-search-forward "<isindex[^>]*>" head-end-point t) - (delete-region (match-beginning 0) (match-end 0))) - (t (goto-char point) - (hm--html-search-place-for-element-in-head head-end-point))) - (hm--html-add-tags 'hm--html-insert-start-tag - (concat "<ISINDEX " - (if (and prompt - (not (string= prompt ""))) - (concat " PROMPT=\"" prompt "\">") - ">"))))) + (point))) + (goto-char (point-min)) + (cond ((re-search-forward "<isindex[^>]*>" head-end-point t) + (delete-region (match-beginning 0) (match-end 0))) + (t (goto-char point) + (hm--html-search-place-for-element-in-head head-end-point))) + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline + (concat "<ISINDEX " + (if (and prompt + (not (string= prompt ""))) + (concat " PROMPT=\"" prompt "\">") + ">")))))) (defun hm--html-add-base (href) "Inserts the base tag. HREF is the value of the href attribute." @@ -253,17 +255,18 @@ (setq head-end-point (when (re-search-forward "\\(</head\\)\\|\\(<body\\)\\|\\(</html\\)") (beginning-of-line) - (point)))) - (cond ((re-search-forward "<base[^>]*>" head-end-point t) - (delete-region (match-beginning 0) (match-end 0))) - (t (goto-char point) - (hm--html-search-place-for-element-in-head head-end-point))) - (hm--html-add-tags 'hm--html-insert-start-tag - (concat "<BASE " - (if (and href - (not (string= href ""))) - (concat " HREF=\"" href "\">") - ">"))))) + (point))) + (goto-char (point-min)) + (cond ((re-search-forward "<base[^>]*>" head-end-point t) + (delete-region (match-beginning 0) (match-end 0))) + (t (goto-char point) + (hm--html-search-place-for-element-in-head head-end-point))) + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline + (concat "<BASE " + (if (and href + (not (string= href ""))) + (concat " HREF=\"" href "\">") + ">")))))) (defun hm--html-add-meta (name content &optional name-instead-of-http-equiv) "Inserts the meta tag." @@ -280,7 +283,7 @@ (point))) (goto-char point) (hm--html-search-place-for-element-in-head head-end-point) - (hm--html-add-tags 'hm--html-insert-start-tag + (hm--html-add-tags 'hm--html-insert-start-tag-with-newline (concat "<META " (if name-instead-of-http-equiv "NAME=\"" @@ -442,6 +445,10 @@ "\nCOORDS=\"" coords "\"" ">"))) + +(when (adapt-emacs19p) + (defvar :ask ':ask)) + (defvar hm--html-use-image-as-map ':ask "Internal variable of `hm--html-add-image'. nil => insert the image element without an usemap attribute. @@ -549,43 +556,6 @@ "\">"))) -(defun hm--html-add-server-side-include-file (file) - "This function adds a server side include file directive in the buffer. -The directive is only supported by the NCSA http daemon." - (interactive "FInclude File: ") - (let ((start (point))) - (if (string= file "") - (error "ERROR: No filename specified !") - (insert "<INC SRV \"" file "\">")))) - - -(defun hm--html-add-server-side-include-command-with-isindex-parameter - (command) - "This function adds a server side include command directive in the buffer. -The include command uses the \"isindex\"- parameter for the specified command." - (interactive (list - (completing-read "Include Command: " - hm--html-server-side-include-command-alist))) - (hm--html-add-server-side-include-command command t)) - - -(defun hm--html-add-server-side-include-command (command &optional srvurl) - "This function adds a server side include command directive in the buffer. -The directive is only supported by the NCSA http daemon. -If SRVURL is t, then the attribute srvurl instead of srv is used for the -include command. With srvurl, the include command uses the \"isindex\"- -parameter for the specified command." - (interactive (list - (completing-read "Include Command: " - hm--html-server-side-include-command-alist))) - (let ((start (point)) - (attribute (if srvurl "SRVURL" "SRV"))) - (if (string= command "") - (error "ERROR: No command specified !") - (if (= ?| (string-to-char command)) - (insert "<INC " attribute" \"" command "\">") - (insert "<INC " attribute " \"|" command "\">"))))) - ;;; Functions, which adds tags of the form <starttag> ... </endtag> @@ -865,7 +835,7 @@ "</DIV>")) -(defun hm--html-add-document-division-to-region () +(defun hm--html-add-document-division-to-region (alignment) "Adds the HTML tags for document division to the region." (interactive (list (hm--html-read-alignment "Alignment of the division: "))) (hm--html-add-tags-to-region 'hm--html-insert-start-tag-with-newline @@ -1071,7 +1041,7 @@ "</FONT>")) -(defun hm--html-add-font-to-region () +(defun hm--html-add-font-to-region (size color) "Adds the HTML tags for Font to the region." (interactive (list (hm--html-read-font-size) (hm--html-read-font-color))) @@ -1975,58 +1945,58 @@ value and an example string. The ANCHOR-PARAMETER-LIST has as an additional element an anchor seperator string. All these elements are used to read and construct the link." - (let ((point nil)) - (save-window-excursion - (let ((html-buffer (current-buffer)) - (html-help-buffer (hm--html-generate-add-link-help-buffer - scheme-parameter-list - host-name:port-parameter-list - servername:port-parameter-list - path+file-parameter-list - anchor-parameter-list)) - (scheme (hm--html-completing-read scheme-parameter-list)) - (hostname:port (hm--html-completing-read - host-name:port-parameter-list)) - (servername:port (hm--html-completing-read - servername:port-parameter-list)) - (path+file (hm--html-read-filename path+file-parameter-list)) - (anchor (hm--html-completing-read anchor-parameter-list)) -; (hrefname (setq html-link-counter (1+ html-link-counter))) - (anchor-seperator - (hm--html-get-anchor-seperator-from-parameter-list - anchor-parameter-list))) - (if (not (string= scheme "")) - (if (string= hostname:port "") - (setq scheme (concat scheme ":")) - (setq scheme (concat scheme "://")))) - (if (and (not (string= hostname:port "")) - (not (string= servername:port "")) - (not (string= (substring servername:port 0 1) "/"))) - (setq servername:port (concat "/" servername:port))) - (if (and (not (string= path+file "")) - (not (string= "/" (substring path+file 0 1)))) - (setq path+file (concat "/" path+file))) - (if (not (string= anchor "")) - (setq anchor (concat anchor-seperator anchor))) - (kill-buffer html-help-buffer) - (pop-to-buffer html-buffer) - (eval (list function-add-tags - ''hm--html-insert-start-tag - (concat "<A" +; (let ((point nil)) + (save-window-excursion + (let ((html-buffer (current-buffer)) + (html-help-buffer (hm--html-generate-add-link-help-buffer + scheme-parameter-list + host-name:port-parameter-list + servername:port-parameter-list + path+file-parameter-list + anchor-parameter-list)) + (scheme (hm--html-completing-read scheme-parameter-list)) + (hostname:port (hm--html-completing-read + host-name:port-parameter-list)) + (servername:port (hm--html-completing-read + servername:port-parameter-list)) + (path+file (hm--html-read-filename path+file-parameter-list)) + (anchor (hm--html-completing-read anchor-parameter-list)) +; (hrefname (setq html-link-counter (1+ html-link-counter))) + (anchor-seperator + (hm--html-get-anchor-seperator-from-parameter-list + anchor-parameter-list))) + (if (not (string= scheme "")) + (if (string= hostname:port "") + (setq scheme (concat scheme ":")) + (setq scheme (concat scheme "://")))) + (if (and (not (string= hostname:port "")) + (not (string= servername:port "")) + (not (string= (substring servername:port 0 1) "/"))) + (setq servername:port (concat "/" servername:port))) + (if (and (not (string= path+file "")) + (not (string= "/" (substring path+file 0 1)))) + (setq path+file (concat "/" path+file))) + (if (not (string= anchor "")) + (setq anchor (concat anchor-seperator anchor))) + (kill-buffer html-help-buffer) + (pop-to-buffer html-buffer) + (eval (list function-add-tags + ''hm--html-insert-start-tag + (concat "<A" ; "<A Name=" ; hrefname - " HREF=\"" - scheme - hostname:port - servername:port - path+file - anchor - "\">") - ''hm--html-insert-end-tag - "</A>"))) - (setq point (point)))) - (goto-char (point))) - + " HREF=\"" + scheme + hostname:port + servername:port + path+file + anchor + "\">") + ''hm--html-insert-end-tag + "</A>"))) +; (setq point (point)))) +; (goto-char (point))) + )) (defun hm--html-add-info-link-1 (function-add-tags) "Internal function. Adds the HTML tags for a link on a GNU Info file." @@ -2503,7 +2473,7 @@ (defun hm--html-make-newsgroup-alist () "Makes a hm--html-make-newsgroup-alist from a .newsrc.el file. The function looks at the environment variable NNTPSERVER. -If this variable exists, it trys to open the file with the Name +If this variable exists, it tries to open the file with the Name ~/$NNTPSERVER.el. If this file exists, the alist of the file is returned as the newsgroup-alist. If the file doesn't exist, it tries to use the file ~/$NNTPSERVER to make the alist. The function @@ -2623,13 +2593,13 @@ (defun hm--html-add-mail-box-link () "Adds the HTML tags for a link to a mail box." (interactive) - (hm--html-add-mail-link-1 'hm--html-add-tags)) + (hm--html-add-mail-box-link-1 'hm--html-add-tags)) (defun hm--html-add-mail-box-link-to-region () "Adds the HTML tags for a link to a mail box to the region." (interactive) - (hm--html-add-mail-link-1 'hm--html-add-tags-to-region)) + (hm--html-add-mail-box-link-1 'hm--html-add-tags-to-region)) (defun hm--html-add-mailto-link-1 (function-add-tags) @@ -2801,25 +2771,25 @@ (if (not (search-forward "</title>" end-of-head t)) (if (not noerror) (error "ERROR: Please insert a title in the document !")) - (let ((end-of-title-position (point))) - (if (search-forward "<!-- Created by: " end-of-head t) - (if (yes-or-no-p - "Replace the old comment \"<!-- Created by: \" ") - (progn - (goto-char (match-beginning 0)) - (kill-line) - (hm--html-add-comment) - (insert "Created by: " - (or hm--html-username (user-full-name)) - ", " - (hm--date)))) - (newline) - (hm--html-add-comment) - (insert "Created by: " - (or hm--html-username (user-full-name)) - ", " - (hm--date) - ))))))) +; (let ((end-of-title-position (point))) + (if (search-forward "<!-- Created by: " end-of-head t) + (if (yes-or-no-p + "Replace the old comment \"<!-- Created by: \" ") + (progn + (goto-char (match-beginning 0)) + (kill-line) + (hm--html-add-comment) + (insert "Created by: " + (or hm--html-username (user-full-name)) + ", " + (hm--date)))) + (newline) + (hm--html-add-comment) + (insert "Created by: " + (or hm--html-username (user-full-name)) + ", " + (hm--date) + )))))) (defun hm--html-insert-changed-comment-1 (newline username)
--- a/lisp/hm--html-menus/internal-drag-and-drop.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/internal-drag-and-drop.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,4 +1,4 @@ -;;; $Id: internal-drag-and-drop.el,v 1.2 1997/02/15 22:21:05 steve Exp $ +;;; $Id: internal-drag-and-drop.el,v 1.3 1997/03/28 02:28:42 steve Exp $ ;;; ;;; Copyright (C) 1996, 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -92,7 +92,7 @@ [(meta control mouse-3)] [(meta control button3)]) "The mouse keys for the command `idd-help-mouse-drag-and-drop'. -The command `idd-mouse-drag-and-drop' is bound during the loading +The command `idd-help-mouse-drag-and-drop' is bound during the loading of the package internal-drag-and-drop to this keys in the global key map. @@ -291,9 +291,9 @@ actions '(0 . nil))) -(autoload 'ange-ftp-ftp-path "ange-ftp" - "Parse PATH according to ange-ftp-path-format (which see). -Returns a list (HOST USER PATH), or nil if PATH does not match the format.") +;(autoload 'ange-ftp-ftp-path "ange-ftp" +; "Parse PATH according to ange-ftp-path-format (which see). +;Returns a list (HOST USER PATH), or nil if PATH does not match the format.") (defun idd-set-point (source-or-destination) "Sets the point and buffer to SOURCE-OR-DESTINATION." @@ -366,7 +366,7 @@ (defun idd-if-minor-mode-p (source-or-destination minor-mode-variable) "Checks, if the variable MINOR-MODE-VARIABLE is t in SOURCE-OR-DESTINATION. MINOR-MODE-VARIABLE is the name of the variable!." - (idd-variable-non-nil-p source-or-destination minor-mode-variable)) + (idd-if-variable-non-nil-p source-or-destination minor-mode-variable)) (defun idd-get-dired-filename-from-line (source-or-destination) "Returns the filename form the line in a dired buffer. @@ -412,7 +412,8 @@ is returned. Otherwise nil is returned." (let ((filename (idd-get-local-filename source-or-destination))) (if (and filename - (not (ange-ftp-ftp-path filename))) +; (not (ange-ftp-ftp-path filename))) + (not (file-remote-p filename))) (if value 1 nil) (if value nil 1)))) @@ -427,14 +428,14 @@ (defun idd-list-1-subset-of-list-2 (list-1 list-2) "Returns t, if LIST-1 is a subset of LIST-2." (cond ((not list-1)) - ((member (car list-1 list-2)) + ((member (car list-1) list-2) (idd-list-1-subset-of-list-2 (cdr list-1) list-2)) (t nil))) -(defun idd-same-modifiers (list-1 list-2) +(defun idd-same-elements-p (list-1 list-2) "Returns t, if both list have the same modifiers." - (and (length list-1 list-2) - (idd-list-1-subset-of-list-2 list-1-list-2))) + (and (= (length list-1) (length list-2)) + (idd-list-1-subset-of-list-2 list-1 list-2))) (defun idd-if-modifiers-p (source-or-destination modifiers) "Checks, if the MODIFIERS hold during selecting the SOURCE-OR-DESTINATION. @@ -447,7 +448,7 @@ (cond ((not modifiers) (if event-modifiers nil 1)) ((listp modifiers) - (if (idd-same-elements modifiers event-modifiers) + (if (idd-same-elements-p modifiers event-modifiers) 1 nil)) (t (if event-modifiers 1 nil))))) @@ -566,7 +567,7 @@ This command could be used to start a drag and drop command without a button event. Therefore this should not be bind direct to a mouse button." (interactive) - (let ((destination-event) + (let ((source-event) (drag-and-drop-message "Drag&Drop: Click on the source!")) (message drag-and-drop-message) (setq source-event @@ -670,7 +671,6 @@ (dispatch-event (next-command-event))) (setq destination-event (next-command-event nil drag-and-drop-message)) -(setq heiko source-event) (message "") (cond ((button-press-event-p destination-event) (mouse-track destination-event) @@ -688,6 +688,20 @@ (idd-call-action (idd-get-action source destination idd-actions) source destination))) + ((and (adapt-emacs19p) + (button-click-event-p destination-event)) + (setq destination (idd-get-source-or-destination-alist + destination-event)) + (idd-set-point destination) + (if idd-help-instead-of-action + (idd-display-help-about-action (idd-get-action source + destination + idd-actions) + source + destination) + (idd-call-action (idd-get-action source destination idd-actions) + source + destination))) (t (message "Wrong event! Exit drag and drop.") nil)))) (defun idd-help-start-action (event)
--- a/lisp/hm--html-menus/tmpl-minor-mode.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/hm--html-menus/tmpl-minor-mode.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,6 +1,6 @@ ;;; tmpl-minor-mode.el --- Template Minor Mode ;;; -;;; $Id: tmpl-minor-mode.el,v 1.3 1997/03/04 02:29:42 steve Exp $ +;;; $Id: tmpl-minor-mode.el,v 1.4 1997/03/28 02:28:43 steve Exp $ ;;; ;;; Copyright (C) 1993 - 1997 Heiko Muenkel ;;; email: muenkel@tnt.uni-hannover.de @@ -61,8 +61,8 @@ (defvar tmpl-template-dir-list nil "*A list of directories with the template files. -If it is nil, then the default-directory is used. -If more the one directories are given, then the +If it is nil, then the default-directory will be used. +If more than one directory is given, then the template filenames should differ in all directories. This variable is used in the commands for inserting templates. @@ -388,8 +388,8 @@ ;;;###autoload (defun tmpl-expand-templates-in-region (&optional begin end) - "Expand the templates in the region from BEGIN to END. -If BEGIN and and are nil, then the current region is used." + "Expands the templates in the region from BEGIN to END. +If BEGIN and END are nil, then the current region is used." (interactive) (tmpl-save-excursion (narrow-to-region (or begin (region-beginning)) @@ -402,13 +402,13 @@ ;;;###autoload (defun tmpl-expand-templates-in-buffer () - "Expand all templates in the current buffer." + "Expands all templates in the current buffer." (interactive) (tmpl-expand-templates-in-region (point-min) (point-max))) (defun tmpl-escape-tmpl-sign-in-region (&optional begin end) - "Escape all `tmpl-sign' with a `tmpl-sign' in the region from BEGIN to END. + "Escapes all `tmpl-sign' with a `tmpl-sign' in the region from BEGIN to END. If BEGIN and END are nil, then the active region between mark and point is used." (interactive) @@ -483,7 +483,6 @@ (table nil) (file nil) (answer nil) - (start nil) (anser-not-ok t) (internal-history (mapcar '(lambda (path) (file-name-nondirectory path)) @@ -522,15 +521,15 @@ (defun tmpl-insert-template-file-from-fixed-dirs (file) "Inserts a template FILE and expands it, if `tmpl-automatic-expand' is t. This command tries to read the template file from a list of -predefined directries (look at `tmpl-template-dir-list') and it filters -the contents of this directories with the regular expression +predefined directories (look at `tmpl-template-dir-list') and it filters +the contents of these directories with the regular expression `tmpl-filter-regexp' (look also at this variable). The command uses a history variable, which could be changed with the variable `tmpl-history-variable-name'. -The user of the command is able to change interactive to another +The user of the command is able to change interactively to another directory by entering at first the string \"Change the directory\". -This maybe to difficult for the user. Therefore another command +This may be too difficult for the user. Therefore another command called `tmpl-insert-template-file' exist, which doesn't use fixed directories and filters." (interactive @@ -545,7 +544,7 @@ ;;;###autoload (defun tmpl-insert-template-file (file) - "Insert a template FILE and expand it, if `tmpl-automatic-expand' is t. + "Inserts a template FILE and expand it, if `tmpl-automatic-expand' is t. Look also at `tmpl-template-dir-list', to specify a default template directory. You should also take a look at `tmpl-insert-template-file-from-fixed-dirs' which has additional advantages (and disadvantages :-). @@ -622,23 +621,24 @@ (if (adapt-xemacsp) (defun tmpl-define-minor-mode-keymap () "Defines the minor mode keymap." - (define-key tmpl-minor-mode-map [(control c) x] + (define-key tmpl-minor-mode-map [(control c) (control c) x] 'tmpl-expand-templates-in-region) - (define-key tmpl-minor-mode-map [(control c) (control x)] + (define-key tmpl-minor-mode-map [(control c) (control c) (control x)] 'tmpl-expand-templates-in-buffer) - (define-key tmpl-minor-mode-map [(control c) escape] + (define-key tmpl-minor-mode-map [(control c) (control c) e] 'tmpl-escape-tmpl-sign-in-region) - (define-key tmpl-minor-mode-map [(control c) (control escape)] + (define-key tmpl-minor-mode-map + [(control c) (control c) (control e)] 'tmpl-escape-tmpl-sign-in-buffer)) (defun tmpl-define-minor-mode-keymap () "Defines the minor mode keymap." - (define-key tmpl-minor-mode-map [?\C-c ?x] + (define-key tmpl-minor-mode-map [?\C-c ?\C-c ?x] 'tmpl-expand-templates-in-region) - (define-key tmpl-minor-mode-map [?\C-c ?\C-x] + (define-key tmpl-minor-mode-map [?\C-c ?\C-c ?\C-x] 'tmpl-expand-templates-in-buffer) - (define-key tmpl-minor-mode-map [?\C-c escape] + (define-key tmpl-minor-mode-map [?\C-c ?\C-c ?e] 'tmpl-escape-tmpl-sign-in-region) - (define-key tmpl-minor-mode-map [?\C-c C-escape] + (define-key tmpl-minor-mode-map [?\C-c ?\C-c ?\C-e] 'tmpl-escape-tmpl-sign-in-buffer)) )
--- a/lisp/modes/cc-mode.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/modes/cc-mode.el Mon Aug 13 09:23:06 2007 +0200 @@ -6,8 +6,8 @@ ;; 1987 Dave Detlefs and Stewart Clamen ;; 1985 Richard M. Stallman ;; Created: a long, long, time ago. adapted from the original c-mode.el -;; Version: 4.387 -;; Last Modified: 1997/03/21 20:25:33 +;; Version: 4.388 +;; Last Modified: 1997/03/25 03:19:17 ;; Keywords: c languages oop ;; NOTE: Read the commentary below for the right way to submit bug reports! @@ -4050,7 +4050,7 @@ (if (looking-at "typedef[^_]") (progn (forward-sexp 1) (c-forward-syntactic-ws indent-point))) - (setq placeholder (c-point 'bol)) + (setq placeholder (c-point 'boi)) (and (or (looking-at "enum[ \t\n]+") (= char-before-ip ?=)) (save-excursion @@ -5203,7 +5203,7 @@ ;; defuns for submitting bug reports -(defconst c-version "4.387" +(defconst c-version "4.388" "CC Mode version number.") (defconst c-mode-help-address "bug-gnu-emacs@prep.ai.mit.edu, cc-mode-help@python.org"
--- a/lisp/modes/sendmail.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/modes/sendmail.el Mon Aug 13 09:23:06 2007 +0200 @@ -312,12 +312,13 @@ (put 'user-mail-address 'saved-value (list user-mail-address)) (put 'query-user-mail-address 'saved-value '(nil)) - (custom-save-all))) - (if user-mail-address - user-mail-address - (setq user-mail-address (concat (user-login-name) "@" - (or mail-host-address - (system-name))))))) + (require 'cus-edit) + (custom-save-all)))) + (if user-mail-address + user-mail-address + (setq user-mail-address (concat (user-login-name) "@" + (or mail-host-address + (system-name)))))) (defun mail-setup (to subject in-reply-to cc replybuffer actions) (or mail-default-reply-to
--- a/lisp/modes/view-less.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/modes/view-less.el Mon Aug 13 09:23:06 2007 +0200 @@ -51,6 +51,7 @@ "Non-nil when view-mode is active. Call `view-mode' to toggle.") (make-variable-buffer-local 'view-minor-mode) +;;;###autoload (defvar view-minor-mode-map (let ((map (make-keymap))) (set-keymap-name map 'view-minor-mode-map) @@ -99,6 +100,7 @@ (add-minor-mode 'view-minor-mode " View" view-minor-mode-map) +;;;###autoload (defvar view-mode-map (let ((map (copy-keymap view-minor-mode-map))) (set-keymap-name map 'view-mode-map)
--- a/lisp/mule/canna.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/mule/canna.el Mon Aug 13 09:23:06 2007 +0200 @@ -49,6 +49,8 @@ ;; added by MORIOKA Tomohiko <morioka@jaist.ac.jp>, 1996/6/18 (defvar running-xemacs (string-match "XEmacs" emacs-version)) +(if running-xemacs (require 'overlay)) + (if running-xemacs (progn (defun self-insert-string (string) @@ -935,7 +937,9 @@ (eq hilit-background-mode 'dark)) (string-match "on\\|t" - (or (x-get-resource "ReverseVideo" "reverseVideo") + (or (if running-xemacs + (x-get-resource "ReverseVideo" "reverseVideo" 'string) + (x-get-resource "ReverseVideo" "reverseVideo")) ""))) 'reverse) ;$BH?E>$7$F$$$k$J$i(B 'reverse (t 'normal)))
--- a/lisp/ns/ns-init.el Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -;;; ns-init.el --- runtime initialization for the NeXTstep window system -;; Copyright (C) 1995 NO ONE YET - -;; Author: XEmacs -;; Keywords: terminals - -;; This file is part of XEmacs. - -;; XEmacs is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; XEmacs is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the Free -;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -;;; Commentary: - -;; ns-init.el: this file is loaded from ../lisp/startup.el when it -;; recognizes that NeXTstep is to be used. The NeXTstep display is -;; opened and hooks are set for popping up the initial window. - -;; startup.el will then examine startup files, and eventually call the -;; hooks which create the first window (s). - -;;; Code: - -;;; ns-init.el ends here
--- a/lisp/packages/apropos.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/packages/apropos.el Mon Aug 13 09:23:06 2007 +0200 @@ -562,9 +562,7 @@ (apropos-print-doc 'describe-variable 2 "Variable" do-keys) (apropos-print-doc 'apropos-describe-plist 3 - "Plist" nil)))) - (when temp-buffer-shrink-to-fit - (shrink-window-if-larger-than-buffer (get-buffer-window "*Apropos*")))) + "Plist" nil))))) (prog1 apropos-accumulator (setq apropos-accumulator ()))) ; permit gc
--- a/lisp/packages/compile.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/packages/compile.el Mon Aug 13 09:23:06 2007 +0200 @@ -109,7 +109,45 @@ (defvar compilation-num-errors-found) -(defvar compilation-error-regexp-alist +(defvar compilation-error-regexp-systems-list 'all + "This is either the symbol `all', or a list of systems for which +compilation error regexps should be included in +`compilation-error-regexp-alist'. + +The list of known systems is: + gnu: but of course + lcc: Lucid compilers + ada: Ada compilers + of: Using tool that says line xx of foo.c + comma: Using tool that says \"foo.c\", line 12 + 4bsd: Using 4bsd + msft: Using microsoft + borland: Using Borland + mips: Using Mips + sgi: Using SGI + cray: Using Cray + ibm: IBM C compilers + aix: the operating system + ultrix: the operating system + +See also the variable `compilation-error-regexp-alist-alist'.") + +(defun compilation-build-compilation-error-regexp-alist () + (interactive) + (setq compilation-error-regexp-alist + (apply 'append + (mapcar + '(lambda (elt) + (if (or (not (consp compilation-error-regexp-systems-list)) + (and (consp (car elt)) + (intersection (car elt) + compilation-error-regexp-systems-list)) + (memq (car elt) compilation-error-regexp-systems-list)) + (cdr elt) + nil)) + compilation-error-regexp-alist-alist)))) + +(defvar compilation-error-regexp-alist-alist '( ;; NOTE! See also grep-regexp-alist, below. @@ -125,52 +163,68 @@ ;; We'll insist that the number be followed by a colon or closing ;; paren, because otherwise this matches just about anything ;; containing a number with spaces around it. + ((4bsd gnu) ("\ \\([a-zA-Z]?:?[^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\)\\([) \t]\\|\ :\\([^0-9\n]\\|\\([0-9]+:\\)\\)\\)" 1 2 5) + ) ;; Microsoft C/C++: ;; keyboard.c(537) : warning C4005: 'min' : macro redefinition ;; d:\tmp\test.c(23) : error C2143: syntax error : missing ';' before 'if' + (msft ("\\(\\([a-zA-Z]:\\)?[^:( \t\n-]+\\)[:(][ \t]*\\([0-9]+\\)[:) \t]" 1 3) + ) ;; Borland C++: ;; Error ping.c 15: Unable to open include file 'sys/types.h' ;; Warning ping.c 68: Call to function 'func' with no prototype + (borland ("\\(Error\\|Warning\\) \\([a-zA-Z]?:?[^:( \t\n]+\\)\ \\([0-9]+\\)\\([) \t]\\|:[^0-9\n]\\)" 2 3) + ) ;; 4.3BSD lint pass 2 ;; strcmp: variable # of args. llib-lc(359) :: /usr/src/foo/foo.c(8) + (4bsd ("[^\n]*[ \t:]\\([a-zA-Z]?:?[^:( \t\n]+\\)[:(](+[ \t]*\\([0-9]+\\))[:) \t]*$" 1 2) + ) ;; 4.3BSD lint pass 3 ;; bloofle defined( /users/wolfgang/foo.c(4) ), but never used ;; This used to be ;; ("[ \t(]+\\([a-zA-Z]?:?[^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]+" 1 2) ;; which is regexp Impressionism - it matches almost anything! + (4bsd ("[^\n]*([ \t]*\\([a-zA-Z]?:?[^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\))" 1 2) + ) ;; MIPS lint pass<n>; looks good for SunPro lint also ;; TrimMask (255) in solomon.c may be indistinguishable from TrimMasks (93) in solomon.c due to truncation + (mips ("[^ \n]+ (\\([0-9]+\\)) in \\([^ \n]+\\)" 2 1) ;; name defined but never used: LinInt in cmap_calc.c(199) ("[^\n]*in \\([^(\n]+\\)(\\([0-9]+\\))$" 1 2) + ) ;; Ultrix 3.0 f77: ;; fort: Severe: addstf.f, line 82: Missing operator or delimiter symbol ;; Some SGI cc version: ;; cfe: Warning 835: foo.c, line 2: something + ((sgi ultrix) ("\\(cfe\\|fort\\): [^:\n]*: \\([^ \n]*\\), line \\([0-9]+\\):" 2 3) + ) ;; Error on line 3 of t.f: Execution error unclassifiable statement ;; Unknown who does this: ;; Line 45 of "foo.c": bloofle undefined ;; Absoft FORTRAN 77 Compiler 3.1.3 ;; error on line 19 of fplot.f: spelling error? ;; warning on line 17 of fplot.f: data type is undefined for variable d + (of ("\\(\\|[^\n]* on \\)[Ll]ine[ \t]+\\([0-9]+\\)[ \t]+\ of[ \t]+\"?\\([a-zA-Z]?:?[^\":\n]+\\)\"?:" 3 2) + ) ;; Apollo cc, 4.3BSD fc: ;; "foo.f", line 3: Error: syntax error near end of statement @@ -184,55 +238,83 @@ ;; "foo.adb", line 2(11): warning: file name does not match ... ;; IBM AIX xlc compiler: ;; "src/swapping.c", line 30.34: 1506-342 (W) "/*" detected in comment. + (comma ("[^\n]*\"\\([^,\" \n\t]+\\)\", lines? \ \\([0-9]+\\)\\([\(.]\\([0-9]+\\)\)?\\)?[:., (-]" 1 2 4) + ) ;; MIPS RISC CC - the one distributed with Ultrix: ;; ccom: Error: foo.c, line 2: syntax error ;; DEC AXP OSF/1 cc ;; /usr/lib/cmplrs/cc/cfe: Error: foo.c: 1: blah blah + ((mips ultrix) ("[^\n]*rror: \\([^,\" \n\t]+\\)[,:] \\(line \\)?\\([0-9]+\\):" 1 3) + ) ;; IBM AIX PS/2 C version 1.1: ;; ****** Error number 140 in line 8 of file errors.c ****** + (aix ("[^\n]*in line \\([0-9]+\\) of file \\([^ \n]+[^. \n]\\)\\.? " 2 1) + ) ;; IBM AIX lint is too painful to do right this way. File name ;; prefixes entire sections rather than being on each line. ;; Lucid Compiler, lcc 3.x ;; E, file.cc(35,52) Illegal operation on pointers + (lcc ("[EW], \\([^(\n]*\\)(\\([0-9]+\\),[ \t]*\\([0-9]+\\)" 1 2 3) + ) ;; GNU messages with program name and optional column number. + (gnu ("[a-zA-Z]?:?[^0-9 \n\t:]+:[ \t]*\\([^ \n\t:]+\\):\ \\([0-9]+\\):\\(\\([0-9]+\\)[: \t]\\)?" 1 2 4) + ) ;; GNU messages with program name and optional column number ;; and a severity letter after that. nsgmls makes them. + (gnu ("[^0-9 \n\t:]+:[ \t]*\\([^ \n\t:]+\\):\ \\([0-9]+\\):\\(\\([0-9]+\\):\\)?[A-Za-z]:" 1 2 4) + ) ;; jwz: ;; IRIX 5.2 ;; cfe: Warning 712: foo.c, line 2: illegal combination of pointer and ... + (sgi ("[^\n]* \\([^ \n,\"]+\\), line \\([0-9]+\\):" 1 2) + ) ;; IRIX 5.2 ;; cfe: Warning 600: xfe.c: 170: Not in a conditional directive while ... + (sgi ("[^\n]*: \\([^ \n,\"]+\\): \\([0-9]+\\):" 1 2) + ) ;; Cray C compiler error messages + (cray ("\\(cc\\| cft\\)-[0-9]+ c\\(c\\|f77\\): ERROR \\([^,\n]+, \\)* File = \\([^,\n]+\\), Line = \\([0-9]+\\)" 4 5) + ) ;; IBM C/C++ Tools 2.01: ;; foo.c(2:0) : informational EDC0804: Function foo is not referenced. ;; foo.c(3:8) : warning EDC0833: Implicit return statement encountered. ;; foo.c(5:5) : error EDC0350: Syntax error. + (ibm ("\\([^( \n\t]+\\)(\\([0-9]+\\):\\([0-9]+\\)) : " 1 2 3) + ) ;; Sun ada (VADS, Solaris): ;; /home3/xdhar/rcds_rc/main.a, line 361, char 6:syntax error: "," inserted + (ada ("\\([^, \n\t]+\\), line \\([0-9]+\\), char \\([0-9]+\\)[:., \(-]" 1 2 3) ) + ) + "Alist of (system regexp-alist) for building +`compilation-error-regexp-alist'. SYSTEM is either a system identifier, +or a list of system identifiers. See the variable +`compilation-error-regexp-systems-list'") + +(defvar compilation-error-regexp-alist nil "Alist that specifies how to match errors in compiler output. Each elt has the form (REGEXP FILE-IDX LINE-IDX [COLUMN-IDX FILE-FORMAT...]) If REGEXP matches constrained to the beginning of the line, the @@ -243,7 +325,13 @@ to try; %s in the string is replaced by the text matching the FILE-IDX'th subexpression. Note previously REGEXP was not constrained to the beginning of the line, so old patterns without leading `^' or `\\n' -may now require a leading `.*'.") +may now require a leading `.*'. + +Note that this now gets set by the function +`compilation-build-compilation-error-regexp-alist' using the +value of the variable `compilation-error-regexp-alist-alist'") + +(compilation-build-compilation-error-regexp-alist) (defvar compilation-read-command t "If not nil, M-x compile reads the compilation command to use. @@ -333,6 +421,10 @@ (put 'compilation-mode 'font-lock-defaults '(compilation-font-lock-keywords t)) +(defvar compilation-mouse-motion-initiate-parsing t + "When set to a non-nil value, mouse motion over the compilation/grep output +buffer may initiate parsing of the error messages or grep hits") + ;;;###autoload (defun compile (command) @@ -678,8 +770,9 @@ (let* ((p (point)) (e (progn (end-of-line) (point))) (l (progn - (if (or (eq compilation-error-list 't) - (>= p compilation-parsing-end)) + (if (and compilation-mouse-motion-initiate-parsing + (or (eq compilation-error-list 't) + (>= p compilation-parsing-end))) ;; #### Does it suck too badly to have mouse-movement ;; #### over a buffer parse errors in that buffer?? (save-window-excursion @@ -1507,7 +1600,8 @@ regexp enter-group leave-group error-group alist subexpr error-regexp-groups (found-desired nil) - (compilation-num-errors-found 0)) + (compilation-num-errors-found 0) + (message-freq (max 1 (/ (count-lines (point-min) (point-max)) 50)))) ;; Don't reparse messages already seen at last parse. (goto-char compilation-parsing-end) @@ -1746,15 +1840,19 @@ (t (error "compilation-parse-errors: known groups didn't match!"))) - (message "Parsing error messages...%d (%.0f%% of buffer)" - compilation-num-errors-found - ;; Use floating-point because (* 100 (point)) frequently - ;; exceeds the range of Emacs Lisp integers. - (/ (* 100.0 (point)) (point-max))) + (when (= (% compilation-num-errors-found message-freq) 0) + (message "Parsing error messages...%d (%.0f%% of buffer)" + compilation-num-errors-found + ;; Use floating-point because (* 100 (point)) frequently + ;; exceeds the range of Emacs Lisp integers. + (/ (* 100.0 (point)) (point-max)))) - (and limit-search (>= (point) limit-search) - ;; The user wanted a specific error, and we're past it. - (setq found-desired t))) +;;; This is broken - it foils the logic above which is supposed to ensure +;;; that all errors for the current file are found before we quit. +; (and limit-search (>= (point) limit-search) +; ;; The user wanted a specific error, and we're past it. +; (setq found-desired t)) + ) (setq compilation-parsing-end (if found-desired (point) ;; We have searched the whole buffer.
--- a/lisp/packages/etags.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/packages/etags.el Mon Aug 13 09:23:06 2007 +0200 @@ -815,6 +815,19 @@ (autoload 'get-symbol-syntax-table "symbol-syntax") +(require 'backquote) + +(defmacro with-caps-disable-folding (string &rest body) "\ +Eval BODY with `case-fold-search' let to nil if STRING contains +uppercase letters and `search-caps-disable-folding' is t." + `(let ((case-fold-search + (if (and case-fold-search search-caps-disable-folding) + (isearch-no-upper-case-p ,string) + case-fold-search))) + ,@body)) +(put 'with-caps-disable-folding 'lisp-indent-function 1) +(put 'with-caps-disable-folding 'edebug-form-spec '(form body)) + (defun find-tag-internal (tagname) (let ((next (null tagname)) (exact (or tags-always-exact (consp tagname))) @@ -853,60 +866,61 @@ (t (setq tag-target tagname) (setq syn-tab (syntax-table)))) - (save-excursion - (catch 'found - (while tag-tables - (set-buffer (get-tag-table-buffer (car tag-tables))) - (bury-buffer (current-buffer)) - (goto-char (or tag-table-point (point-min))) - (setq tag-table-point nil) - (let ((osyn (syntax-table)) - case-fold-search) - (set-syntax-table syn-tab) - (unwind-protect - ;; **** should there be support for non-regexp tag searches? - (while (re-search-forward tag-target nil t) - (if (looking-at "[^\n\C-?]*\C-?") - (throw 'found t))) - (set-syntax-table osyn))) - (setq tag-tables (cdr tag-tables))) - (error "No %sentries %s %s" - (if next "more " "") - (if exact "matching" "containing") - tagname)) - (search-forward "\C-?") - (setq file (expand-file-name (file-of-tag) - ;; XEmacs change: this needs to be - ;; relative to the - (or (file-name-directory (car tag-tables)) - "./"))) - (setq linebeg - (buffer-substring (1- (point)) - (save-excursion (beginning-of-line) (point)))) - (search-forward ",") - (setq startpos (read (current-buffer))) - (setq last-tag-data (nconc (list tagname (point)) tag-tables))) - (setq buf (find-file-noselect file)) - (save-excursion - (set-buffer buf) + (with-caps-disable-folding tag-target (save-excursion - (save-restriction - (widen) - (setq offset 1000) - (setq pat (concat "^" (regexp-quote linebeg))) - (or startpos (setq startpos (point-min))) - (while (and (not found) - (progn - (goto-char (- startpos offset)) - (not (bobp)))) - (setq found (re-search-forward pat (+ startpos offset) t)) - (setq offset (* 3 offset))) - (or found - (re-search-forward pat nil t) - (error "%s not found in %s" pat file)) - (beginning-of-line) - (setq startpos (point))))) - (cons buf startpos))) + (catch 'found + (while tag-tables + (set-buffer (get-tag-table-buffer (car tag-tables))) + (bury-buffer (current-buffer)) + (goto-char (or tag-table-point (point-min))) + (setq tag-table-point nil) + (let ((osyn (syntax-table)) + case-fold-search) + (set-syntax-table syn-tab) + (unwind-protect + ;; **** should there be support for non-regexp tag searches? + (while (re-search-forward tag-target nil t) + (if (looking-at "[^\n\C-?]*\C-?") + (throw 'found t))) + (set-syntax-table osyn))) + (setq tag-tables (cdr tag-tables))) + (error "No %sentries %s %s" + (if next "more " "") + (if exact "matching" "containing") + tagname)) + (search-forward "\C-?") + (setq file (expand-file-name (file-of-tag) + ;; XEmacs change: this needs to be + ;; relative to the + (or (file-name-directory (car tag-tables)) + "./"))) + (setq linebeg + (buffer-substring (1- (point)) + (save-excursion (beginning-of-line) (point)))) + (search-forward ",") + (setq startpos (read (current-buffer))) + (setq last-tag-data (nconc (list tagname (point)) tag-tables))) + (setq buf (find-file-noselect file)) + (save-excursion + (set-buffer buf) + (save-excursion + (save-restriction + (widen) + (setq offset 1000) + (setq pat (concat "^" (regexp-quote linebeg))) + (or startpos (setq startpos (point-min))) + (while (and (not found) + (progn + (goto-char (- startpos offset)) + (not (bobp)))) + (setq found (re-search-forward pat (+ startpos offset) t)) + (setq offset (* 3 offset))) + (or found + (re-search-forward pat nil t) + (error "%s not found in %s" pat file)) + (beginning-of-line) + (setq startpos (point))))) + (cons buf startpos)))) ;;;###autoload (defun find-tag (tagname &optional other-window) @@ -1176,6 +1190,7 @@ (null tags-loop-operate) (message "Scanning file %s...found" buffer-file-name)))) + ;;;###autoload (defun tags-search (regexp &optional file-list-form) "Search through all files listed in tags table for match for REGEXP. @@ -1185,16 +1200,15 @@ See documentation of variable `tag-table-alist'." (interactive "sTags search (regexp): ") (if (and (equal regexp "") - (eq (car tags-loop-scan) 're-search-forward) + (eq (car tags-loop-scan) 'with-caps-disable-folding) (null tags-loop-operate)) ;; Continue last tags-search as if by M-,. (tags-loop-continue nil) - (setq tags-loop-scan - (list 're-search-forward regexp nil t) + (setq tags-loop-scan `(with-caps-disable-folding ,regexp + (re-search-forward ,regexp nil t)) tags-loop-operate nil) (tags-loop-continue (or file-list-form t)))) - - + ;;;###autoload (defun tags-query-replace (from to &optional delimited file-list-form) "Query-replace-regexp FROM with TO through all files listed in tags table. @@ -1205,14 +1219,14 @@ See documentation of variable `tag-table-alist'." (interactive "sTags query replace (regexp): \nsTags query replace %s by: \nP") - (setq tags-loop-scan (list 'prog1 - (list 'if (list 're-search-forward from nil t) - ;; When we find a match, move back - ;; to the beginning of it so perform-replace - ;; will see it. - '(goto-char (match-beginning 0)))) + (setq tags-loop-scan `(with-caps-disable-folding ,from + (if (re-search-forward ,from nil t) + ;; When we find a match, move back + ;; to the beginning of it so perform-replace + ;; will see it. + (progn (goto-char (match-beginning 0)) t))) tags-loop-operate (list 'perform-replace from to t t delimited)) - (tags-loop-continue (or file-list-form t))) + (tags-loop-continue (or file-list-form t))) ;; Miscellaneous @@ -1223,7 +1237,8 @@ "Display list of tags in file FILE. FILE should not contain a directory spec unless it has one in the tag table." - (interactive "sList tags (in file): ") + (interactive "fList tags (in file): ") + (setq string (expand-file-name string)) (with-output-to-temp-buffer "*Tags List*" (princ "Tags in file ") (princ string)
--- a/lisp/packages/func-menu.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/packages/func-menu.el Mon Aug 13 09:23:06 2007 +0200 @@ -779,7 +779,7 @@ ;; "^@[A-Za-z]*[({]\\([A-Za-z0-9:;&-]*\\)," ;; Christoph Wedler <wedler@fmi.uni-passau.de> ;; According to the LaTeX Companion, this should be - "^@[A-Za-z]*[({]\\([A-Za-z][^ \t\n\"#%'()={}]*\\)," + "^@[A-Za-z]*[({]\\([A-Za-z][^ \t\n\"#%'(),={}]*\\)," "Expression to get bibtex citation headers.") ;;; SGML
--- a/lisp/packages/hyper-apropos.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/packages/hyper-apropos.el Mon Aug 13 09:23:06 2007 +0200 @@ -157,6 +157,8 @@ ;; movement (define-key map " " 'scroll-up) (define-key map "b" 'scroll-down) + (define-key map [delete] 'scroll-down) + (define-key map [backspace] 'scroll-down) (define-key map "/" 'isearch-forward) (define-key map "?" 'isearch-backward) ;; follow links @@ -182,6 +184,8 @@ ;; slightly different scrolling... (define-key map " " 'hypropos-scroll-up) (define-key map "b" 'hypropos-scroll-down) + (define-key map [delete] 'hypropos-scroll-down) + (define-key map [backspace] 'hypropos-scroll-down) ;; act on the current line... (define-key map "w" 'hypropos-where-is) (define-key map "i" 'hypropos-invoke-fn)
--- a/lisp/packages/info.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/packages/info.el Mon Aug 13 09:23:06 2007 +0200 @@ -1638,8 +1638,8 @@ (save-window-excursion (info) (condition-case nil - (Info-find-node "elisp" "Top") - (error (Info-find-node "lispref" "Top"))) + (Info-find-node "lispref" "Top") + (error (Info-find-node "elisp" "Top"))) (Info-index (symbol-name func))) (pop-to-buffer "*info*"))
--- a/lisp/packages/terminal.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/packages/terminal.el Mon Aug 13 09:23:06 2007 +0200 @@ -1018,9 +1018,10 @@ (progn (goto-char (point-max)) (recenter -1))))))) -(defvar te-stty-string "stty -nl new dec echo" - "Command string (to be interpreted by \"sh\") which sets the modes -of the virtual terminal to be appropriate for interactive use.") +(defvar te-stty-string "stty -nl erase '^?' kill '^u' intr '^c' echo pass8" + "Shell command to set terminal modes for terminal emulator.") +;; This used to have `new' in it, but that loses outside BSD +;; and it's apparently not needed in BSD. (defvar explicit-shell-file-name nil "*If non-nil, is file name to use for explicitly requested inferior shell.")
--- a/lisp/packages/time.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/packages/time.el Mon Aug 13 09:23:06 2007 +0200 @@ -23,6 +23,10 @@ ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ;; 02111-1307, USA. +;;; Version: 1.10 (I choose the version number starting at 1.1 +;;; to indicate that 1.0 was the old version +;;; before I hacked away on it -jtl) + ;;; Synched up with: Not synched with FSF. ;;; Commentary: @@ -34,10 +38,17 @@ ;; This uses the XEmacs timeout-event mechanism, via a version ;; of Kyle Jones' itimer package. -;;; JTL: This is in a wide part reworked for XEmacs so it won't use +;;; jtl: This is in a wide part reworked for XEmacs so it won't use ;;; the old mechanism for specifying what is to be displayed. ;;; The starting variable to look at is `display-time-form-list' +;;; It's more advanced features include heavy use of `balloon-help' a +;;; package again written by Kyle Jones. You need to load this +;;; explicitely on your own because I don't think a package should make +;;; decisions which have a global effect (if you want to use it, a +;;; (require 'balloon-help) in your .emacs should work. But look at the +;;; documentation in balloon-help.el itself). + ;;; Thanks to Mike Scheidler for the idea to make the time led's fore- and ;;; background color customizable @@ -50,13 +61,6 @@ in the XEmacs mode line or echo area." :group 'applications) -(defcustom display-time-compatible nil - "*This variable may be set to t to get the old behaviour of display-time. -This means no display of a spiffy mail icon or use of the -display-time-form-list instead of the old display-time-string-form." - :group 'display-time - :type 'boolean) - (defcustom display-time-mail-file nil "*File name of mail inbox file, for indicating existence of new mail. Non-nil and not a string means don't check for mail. nil means use @@ -98,8 +102,8 @@ "Time when mail file's file system was recorded to be down. If that file system seems to be up, the value is nil.") -(defcustom display-time-ignore-read-mail nil - "*Non-nil means displays the mail icon on any non-empty mailbox." +(defcustom display-time-ignore-read-mail t + "*Non-nil means display the mail icon on any non-empty mailbox." :group 'display-time :type 'boolean) @@ -155,7 +159,7 @@ :group 'display-time :type 'boolean) -(defvar display-time-icons-dir (concat data-directory "time/")) +(defvar display-time-icons-dir (concat data-directory "time/")) (defcustom display-time-mail-sign-string " Mail" "The string used as mail indicator in the echo area @@ -164,7 +168,7 @@ :group 'display-time :type 'string) -(defcustom display-time-no-mail-sign-string "" +(defcustom display-time-no-mail-sign-string "" "The string used as no-mail indicator in the echo area (and in the modeline if display-time-show-icons-maybe is nil) if display-time-echo-area is t" @@ -196,6 +200,112 @@ (const transparent) (string :tag "Color"))) +(defcustom display-time-mail-balloon 'display-time-mail-balloon + "What to use to generate the ballon frame of the \"mail\" glyph +if balloon-help is loaded. This can be the function +display-time-mail-balloon, nil or a string." + :group 'display-time + :type '(choice (const display-time-mail-balloon) + (const nil) + (string))) + +(defcustom display-time-no-mail-balloon "No mail is good mail." + "The string used in the ballon frame of the \"no mail\" glyph +if balloon-help is loaded. This can also be nil" + :group 'display-time + :type '(choice (const nil) + (string))) + +(defcustom display-time-mail-balloon-show-gnus-group nil + "Show the mail group gnus would put this message in. +This is only useful if you use gnus to read your mail and have set the variable +nnmail-split-methods to split your incoming mail into different groups. +Look at the documentation for gnus. If you don't know what we're talking about, +don't care and leave this set to nil" + :group 'display-time + :type 'boolean) + +(defface display-time-mail-balloon-enhance-face '((t (:background "orange"))) + "Face used for entries in the mail balloon which match the regexp +display-time-mail-balloon-enhance" + :group 'display-time) + +(defface display-time-mail-balloon-gnus-group-face '((t (:foreground "blue"))) + "Face used for the gnus group entry in the mail balloon +if display-time-mail-balloon-show-gnus-group is t (see the documentation there +before you set it to t)" + :group 'display-time) + +(defcustom display-time-mail-balloon-max-displayed 10 + "The maximum number of messaged which are displayed in the mail balloon. +You need to have balloon-help loaded to use this." + :group 'display-time + :type 'number) + +(defcustom display-time-mail-balloon-from-width 20 + "The width of the `From:' part of the mail balloon. +You need to have ballon-help loaded to use this" + :group 'display-time + :type 'number) + +(defcustom display-time-mail-balloon-subject-width 25 + "The width of the `Subject:' part of the mail balloon. +You need to have ballon-help loaded to use this" + :group 'display-time + :type 'number) + +(defcustom display-time-mail-balloon-gnus-split-width 10 + "The width of the `Gnus Mail Group' part of the mail balloon. +This denotes the mail group gnus would decide to put this message in. +For getting this information, it consults the relevant variables from gnus +(nnmail-split-methods). +You need to have ballon-help loaded to use this" + :group 'display-time + :type 'number) + +(defcustom display-time-mail-balloon-enhance nil + "A list of regular expressions describing which messages should be highlighted +in the mail balloon. The regexp will be matched against the complete header block +of an email. You need to load balloon-help to use this" + :group 'display-time + :type '(repeat (string :tag "Regexp"))) + +(defcustom display-time-mail-balloon-suppress nil + "A list of regular expressions describing which messages should be completely suppressed +in the mail balloon. The regexp will be matched against the complete header block +of an email. It will only take effect if the message is not matched already +by display-time-mail-balloon-enhance. +You need to load balloon-help to use this" + :group 'display-time + :type '(repeat (string :tag "Regexp"))) + +(defcustom display-time-mail-balloon-enhance-gnus-group nil + "A list of regular expressions describing which messages should be highlighted +in the mail balloon. The regexp will be matched against the group gnus would stuff +this message into. It will only take effect if the message is not matched already +by display-time-mail-balloon-suppress. + +This requires display-time-mail-balloon-show-gnus-group to be t +and balloon-help to be loaded" + :group 'display-time + :type '(repeat (string :tag "Regexp"))) + +(defcustom display-time-mail-balloon-suppress-gnus-group nil + "A list of regular expressions describing which messages should be completely suppressed +in the mail balloon. The regexp will be matched against the group gnus would stuff +this message into. It will only take effect if the message is not matched already +by display-time-mail-balloon-enhance or display-time-mail-balloon-enhance-gnus-group. + +This requires display-time-mail-balloon-show-gnus-group to be t +and balloon-help to be loaded" + :group 'display-time + :type '(repeat (string :tag "Regexp"))) + +(defvar display-time-spool-file-modification nil) + +(defvar display-time-mail-header nil) + +(defvar display-time-temp-buffer " *Display-time-temp-buffer*") (defvar display-time-display-pad-old nil) @@ -216,6 +326,15 @@ (number :tag "Threshold 5") (number :tag "Threshold 6"))) +(defcustom display-time-compatible nil + "*This variable may be set to t to get the old behaviour of display-time. +It should be considered obsolete and only be used if you really want the +old behaviour (eq. you made extensive customizations yourself). +This means no display of a spiffy mail icon or use of the +display-time-form-list instead of the old display-time-string-form." + :group 'display-time + :type 'boolean) + (defun display-time-string-to-char-list (str) (mapcar (function identity) str)) @@ -275,8 +394,8 @@ (not (equal display-time-display-time-foreground display-time-display-time-fg-old)))) (progn - (setq display-time-1-glyph - (cons (make-extent nil nil) + (setq display-time-1-glyph + (cons (make-extent nil nil) (make-glyph (concat display-time-icons-dir "1.xpm")))) (setq display-time-2-glyph (cons (make-extent nil nil) @@ -325,9 +444,13 @@ (defvar display-time-mail-sign (cons (make-extent nil nil) (make-glyph (concat display-time-icons-dir "letter.xpm")))) + (set-extent-property (car display-time-mail-sign) 'balloon-help + 'display-time-mail-balloon) (defvar display-time-no-mail-sign (cons (make-extent nil nil) (make-glyph (concat display-time-icons-dir "no-letter.xpm")))) + (set-extent-property (car display-time-no-mail-sign) 'balloon-help + display-time-no-mail-balloon) (defvar display-time-1-glyph nil) (defvar display-time-2-glyph nil) (defvar display-time-3-glyph nil) @@ -362,14 +485,26 @@ (defun display-time-convert-num (time-string &optional textual) (let ((list (display-time-string-to-char-list time-string)) - elem tmp) + elem tmp balloon-help balloon-ext) (if (not (display-time-can-do-graphical-display textual)) time-string (display-time-generate-time-glyphs) + (setq balloon-help + (format "%s, %s %s %s %s" dayname day monthname year + (concat " Average load:" + (if (not (equal load "")) + load + " 0")))) + (setq balloon-ext (make-extent 0 (length balloon-help) balloon-help)) + (set-extent-property balloon-ext 'face 'red) + (set-extent-property balloon-ext 'duplicable 't) (while (setq elem (pop list)) - (push (eval (intern-soft (concat "display-time-" + (setq elem + (eval (intern-soft (concat "display-time-" (char-to-string elem) - "-glyph"))) tmp)) - (reverse tmp)))) + "-glyph")))) + (set-extent-property (car elem) 'balloon-help balloon-help) + (push elem tmp)) + (reverse tmp)))) (defun display-time-convert-load (load-string &optional textual) (let ((load-number (string-to-number load-string)) @@ -381,16 +516,15 @@ (cons 2.5 (cadr (cdddr display-time-load-list))) (cons 3.0 (caddr (cdddr display-time-load-list))) (cons 100000 100000))) - result elem) + elem load-elem) (if (not (display-time-can-do-graphical-display textual)) load-string (display-time-generate-load-glyphs) (while (>= load-number (cdr (setq elem (pop alist)))) - (setq result (eval (intern-soft (concat - "display-time-load-" - (number-to-string (car elem)) - "-glyph"))))) - result))) + (setq load-elem elem)) + (eval (intern-soft (concat "display-time-load-" + (number-to-string (car load-elem)) + "-glyph")))))) (defun display-time-convert-am-pm (ampm-string &optional textual) (if (not (display-time-can-do-graphical-display textual)) @@ -398,24 +532,206 @@ (cond ((equal ampm-string "am") display-time-am-glyph) ((equal ampm-string "pm") display-time-pm-glyph)))) +(defun display-time-mail-balloon (&rest ciao) + (let* ((mail-spool-file (or display-time-mail-file + (getenv "MAIL") + (concat rmail-spool-directory + (user-login-name)))) + (show-split (and display-time-mail-balloon-show-gnus-group + (or (featurep 'nnmail) (require 'nnmail)))) + (display-time-mail-balloon-gnus-split-width + (if (not show-split) 0 + (+ 3 display-time-mail-balloon-gnus-split-width))) ; <space>[...] -> +3 + (mod (nth 5 (file-attributes mail-spool-file))) + header header-ext) + (setq header "You have mail:") + (setq header-ext + (make-extent 0 (length header) header)) + (set-extent-property header-ext 'face 'red) + (set-extent-property header-ext 'duplicable t) + (setq header (concat header "\n" + (make-string (+ display-time-mail-balloon-from-width + display-time-mail-balloon-subject-width + display-time-mail-balloon-gnus-split-width + 3) (string-to-char "-")))) + (if (not (equal + mod display-time-spool-file-modification)) + (progn + (setq display-time-spool-file-modification mod) + (setq display-time-mail-header + (display-time-scan-mail-file mail-spool-file show-split)))) + (setq header (concat header display-time-mail-header)) + )) + + +(defun display-time-scan-mail-file (file show-split) + (let ((mail-headers "") + (nntp-server-buffer (get-buffer-create " *Display-Time-Split-Buffer*")) + (suppress-count 0) + (not-displayed 0) + (i 0) + (suppress-list display-time-mail-balloon-suppress) + (enhance-list display-time-mail-balloon-enhance) + (gnus-suppress-list display-time-mail-balloon-suppress-gnus-group) + (gnus-enhance-list display-time-mail-balloon-enhance-gnus-group) + mail-headers-list start end from subject gnus-group tmp + suppress enhance line line-ext + gnus-suppress-reg gnus-enhance-reg suppress-reg enhance-reg) + + (erase-buffer (get-buffer-create display-time-temp-buffer)) + (message "Scanning spool file...") + (while (setq tmp (pop enhance-list)) + (setq enhance-reg + (if (car enhance-list) (concat enhance-reg tmp "\\|") + (concat enhance-reg tmp)))) + (while (setq tmp (pop suppress-list)) + (setq suppress-reg + (if (car suppress-list) (concat suppress-reg tmp "\\|") + (concat suppress-reg tmp)))) + (while (setq tmp (pop gnus-enhance-list)) + (setq gnus-enhance-reg + (if (car gnus-enhance-list) (concat gnus-enhance-reg tmp "\\|") + (concat gnus-enhance-reg tmp)))) + (while (setq tmp (pop gnus-suppress-list)) + (setq gnus-suppress-reg + (if (car gnus-suppress-list) (concat gnus-suppress-reg tmp "\\|") + (concat gnus-suppress-reg tmp)))) + (save-excursion + (set-buffer display-time-temp-buffer) + (setq case-fold-search nil) + (insert-file-contents file) + (goto-char (point-min)) + (while (setq start (re-search-forward "^From " nil t)) + (save-excursion + (setq end (re-search-forward "^$" nil t)) + (narrow-to-region start end) + (goto-char (point-min)) + (setq enhance + (save-excursion + (if display-time-mail-balloon-enhance + (re-search-forward enhance-reg nil t)))) + (if show-split + (save-excursion + (setq point (point-min)) + (nnmail-article-group '(lambda (name) (setq gnus-group name))))) + + (if enhance () ; this takes prejudice over everything else + (setq suppress ; maybe set suppress only if not already enhanced + (save-excursion + (if display-time-mail-balloon-suppress + (re-search-forward suppress-reg nil t)))) + (if suppress () + (or (setq enhance ;;maybe we enhance because of the gnus group name + (save-excursion + (if (and show-split gnus-group + display-time-mail-balloon-enhance-gnus-group) + (string-match gnus-enhance-reg gnus-group)))) + (setq suppress ;; if we didn't enhance then maybe we have to suppress it? + (save-excursion + (if (and show-split gnus-group + display-time-mail-balloon-suppress-gnus-group) + (string-match gnus-suppress-reg gnus-group))))))) + + (setq from + (save-excursion + (re-search-forward "^From: \\(.*\\)" nil t) + (mail-extract-address-components (match-string 1)))) + (setq subject + (save-excursion + (re-search-forward "^Subject: \\(.*\\)" nil t) + (match-string 1))) + (if suppress (setq suppress-count (1+ suppress-count)) + (if (car from) (setq from (car from)) + (setq from (cadr from))) + (if (> (length from) display-time-mail-balloon-from-width) + (setq from (substring from 0 + display-time-mail-balloon-from-width))) + (if (> (length subject) display-time-mail-balloon-subject-width) + (setq subject (substring subject 0 + display-time-mail-balloon-subject-width))) + (if (and show-split gnus-group + (> (length gnus-group) + (- display-time-mail-balloon-gnus-split-width 3))) + (setq gnus-group (substring gnus-group 0 + (- display-time-mail-balloon-gnus-split-width 3)))) + + (setq line (format (concat + "\n%-"(number-to-string + display-time-mail-balloon-from-width) + "s [%-"(number-to-string + display-time-mail-balloon-subject-width) + "s]") + from subject)) + (if (and show-split gnus-group) + (setq line (concat line + (format + (concat + "-> %" (number-to-string + (- display-time-mail-balloon-gnus-split-width 3)) + "s") gnus-group)))) + (if enhance + (progn + (setq line-ext (make-extent 1 (length line) line)) + (set-extent-property line-ext 'face + 'display-time-mail-balloon-enhance-face) + (set-extent-property line-ext 'duplicable t) + (set-extent-property line-ext 'end-open t))) + (if (and show-split gnus-group) + (progn + (setq line-ext (make-extent (- (length line) + display-time-mail-balloon-gnus-split-width) + (length line) line)) + (set-extent-property line-ext 'face + 'display-time-mail-balloon-gnus-group-face) + (set-extent-property line-ext 'duplicable t) + (set-extent-property line-ext 'end-open t))) + (push line mail-headers-list)) + (setq point (point-max)) + (setq suppress nil + gnus-group nil + enhance nil) + (widen) + ))) + (if (> (length mail-headers-list) display-time-mail-balloon-max-displayed) + (setq not-displayed (- (length mail-headers-list) + display-time-mail-balloon-max-displayed))) + (while (< i display-time-mail-balloon-max-displayed) + (setq mail-headers (concat mail-headers (pop mail-headers-list))) + (setq i (1+ i))) + (if (and (equal mail-headers "") (> suppress-count 0)) + (setq mail-headers "\nOnly junk mail...")) + (concat mail-headers "\n" + (make-string (+ display-time-mail-balloon-from-width + display-time-mail-balloon-subject-width + display-time-mail-balloon-gnus-split-width + 3) (string-to-char "-")) + "\n" + (if (> not-displayed 0) + (concat "More: " (number-to-string not-displayed)"\n")) + (if (> suppress-count 0) + (concat "Suppressed: " (number-to-string suppress-count))) + ))) + (defun display-time-mail-sign (&optional textual) "*A function giving back the object indicating 'mail' which is the value of display-time-mail-sign when running under X, display-time-echo-area is nil and display-time-show-icons-maybe is t. -It is the value of display-time-mail-sign-string otherwise." +It is the value of display-time-mail-sign-string otherwise or when +the optional parameter TEXTUAL is non-nil." (if (not (display-time-can-do-graphical-display textual)) display-time-mail-sign-string - display-time-mail-sign)) + (list " " display-time-mail-sign " "))) (defun display-time-no-mail-sign (&optional textual) "*A function giving back the object indicating 'no mail' which is the value of display-time-no-mail-sign when running under X, display-time-echo-area is nil and display-time-show-icons-maybe is t. -It is the value of display-time-no-mail-sign-string otherwise." +It is the value of display-time-no-mail-sign-string otherwise or when +the optional parameter TEXTUAL is non-nil." (if (not (display-time-can-do-graphical-display textual)) display-time-no-mail-sign-string - display-time-no-mail-sign)) + (list " " display-time-no-mail-sign " "))) (defcustom display-time-form-list (list 'date 'time 'load 'mail)
--- a/lisp/prim/about.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/about.el Mon Aug 13 09:23:06 2007 +0200 @@ -157,7 +157,7 @@ (toggle-read-only 0) (let ((rest (if who-to-load (list who-to-load) - '(steve mrb cthomp wing stig jwz mly vladimir baw piper bw wmperry kyle larsi jens))) + '(steve mrb cthomp wing stig jwz mly vladimir baw piper bw wmperry kyle larsi jens jareth))) (got-error nil)) (while rest (let* ((who (car rest)) @@ -302,6 +302,7 @@ ('kyle "About Kyle Jones") ('larsi "About Lars Magne Ingebrigtsen") ('jens "About Jens Lautenbacher") + ('jareth "About Jareth Hein") ('others "About Everyone") ('features "New XEmacs Features") ('history "XEmacs History") @@ -804,6 +805,23 @@ (insert " to go back to the previous page.\n") ) + ((eq xref 'jens) + (about-face "P E Jareth Hein" 'bold) + (insert " <jhod@jhod@po.iijnet.or.jp> + + Jareth Hein is a mountain boy who abandoned his home state of + Colorado for the perpetual state of chaos known as Tokyo in a + failed attempt to become a cel-animator, and a more successful + one to become a computer-game programmer. As he happens to be + bilingual (guess which two?) he's been doing quite a bit of + MULE hacking. He's also getting his hands dirty in the graphics + areas as well.") + + (insert "\n\n\tClick ") + (about-xref "here" prev-page "Return to previous page") + (insert " to go back to the previous page.\n") + ) + ((eq xref 'others) (insert "Click ") (about-xref "here" 'about "Return to previous page") @@ -884,6 +902,15 @@ the exams and XEmacs betas are released at a high rate this may take some time... + ") (about-xref "Jareth Hein" 'jens "Find out more about Jareth Hein") (insert " <jhod@jhod@po.iijnet.or.jp> + Jareth Hein is a mountain boy who abandoned his home state of + Colorado for the perpetual state of chaos known as Tokyo in a + failed attempt to become a cel-animator, and a more successful + one to become a computer-game programmer. As he happens to be + bilingual (guess which two?) he's been doing quite a bit of + MULE hacking. He's also getting his hands dirty in the graphics + areas as well. + Darrell Kindred <Darrell.Kindred@cmu.edu> Unofficial maintainer of the xemacs-beta list of extant bugs and contributor of an extraordinary number of important bug @@ -1012,7 +1039,6 @@ Derek Harding <dharding@lssec.bt.co.uk> Michael Harnois <mharnois@sbt.net> John Haxby <J.Haxby@isode.com> - Jareth \"JHod\" Hein <jhod@po.iijnet.or.jp> Benedikt Heinen <beh@icemark.thenet.ch> Stephan Herrmann <sh@first.gmd.de> Charles Hines <chuck_hines@VNET.IBM.COM>
--- a/lisp/prim/auto-autoloads.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/auto-autoloads.el Mon Aug 13 09:23:06 2007 +0200 @@ -999,7 +999,7 @@ ;;;*** -;;;### (autoloads (custom-make-dependencies custom-menu-update custom-buffer-create customize-apropos customize-customized customize-face customize-variable customize) "cus-edit" "custom/cus-edit.el") +;;;### (autoloads (custom-make-dependencies custom-menu-update custom-save-all custom-buffer-create customize-apropos customize-customized customize-face customize-variable customize) "cus-edit" "custom/cus-edit.el") (autoload 'customize "cus-edit" "\ Customize SYMBOL, which must be a customization group." t nil) @@ -1025,6 +1025,9 @@ SYMBOL is a customization option, and WIDGET is a widget for editing that option." nil nil) +(autoload 'custom-save-all "cus-edit" "\ +Save all customizations in `custom-file'." nil nil) + (autoload 'custom-menu-update "cus-edit" "\ Update customize menu." t nil) @@ -1462,16 +1465,27 @@ ;;;*** -;;;### (autoloads nil "efs-cu" "efs/efs-cu.el") +;;;### (autoloads (efs-ftp-path) "efs-cu" "efs/efs-cu.el") (defvar efs-path-root-regexp "^/[^/:]+:" "\ Regexp to match the `/user@host:' root of an efs full path.") -;;;*** - -;;;### (autoloads nil "efs-dump" "efs/efs-dump.el") - -(setq file-name-handler-alist (cons (cons efs-path-root-regexp 'efs-file-handler-function) file-name-handler-alist)) +(autoload 'efs-ftp-path "efs-cu" "\ +Parse PATH according to efs-path-regexp. +Returns a list (HOST USER PATH), or nil if PATH does not match the format." nil nil) + +;;;*** + +;;;### (autoloads (remote-path-file-handler-function) "efs-dump" "efs/efs-dump.el") + +(defvar allow-remote-paths t "\ +*Set this to nil if you don't want remote paths to access +remote files.") + +(or (assoc efs-path-root-regexp file-name-handler-alist) (setq file-name-handler-alist (cons (cons efs-path-root-regexp 'remote-path-file-handler-function) file-name-handler-alist))) + +(autoload 'remote-path-file-handler-function "efs-dump" "\ +Function to call special file handlers for remote files." nil nil) ;;;*** @@ -1493,7 +1507,12 @@ ;;;*** -;;;### (autoloads (efs-file-handler-function efs-nslookup-host) "efs" "efs/efs.el") +;;;### (autoloads (efs-file-handler-function efs-nslookup-host efs-display-ftp-activity) "efs" "efs/efs.el") + +(autoload 'efs-display-ftp-activity "efs" "\ +Displays the number of active background ftp sessions in the modeline. +Uses the variable `efs-mode-line-format' to determine how this will be +displayed." t nil) (autoload 'efs-nslookup-host "efs" "\ Attempt to resolve the given HOSTNAME using nslookup if possible." t nil) @@ -2286,8 +2305,6 @@ ;;;### (autoloads (unbold-region bold-region message-news-other-frame message-news-other-window message-mail-other-frame message-mail-other-window message-bounce message-resend message-forward message-recover message-supersede message-cancel-news message-followup message-wide-reply message-reply message-news message-mail message-mode) "message" "gnus/message.el") -(defcustom message-fcc-handler-function 'message-output "*A function called to save outgoing articles.\nThis function will be called with the name of the file to store the\narticle in. The default function is `message-output' which saves in Unix\nmailbox format." :type '(radio (function-item message-output) (function :tag "Other")) :group 'message-sending) - (defcustom message-from-style 'default "*Specifies how \"From\" headers look.\n\nIf `nil', they contain just the return address like:\n king@grassland.com\nIf `parens', they look like:\n king@grassland.com (Elvis Parsley)\nIf `angles', they look like:\n Elvis Parsley <king@grassland.com>\n\nOtherwise, most addresses look like `angles', but they look like\n`parens' if `angles' would need quoting and `parens' would not." :type '(choice (const :tag "simple" nil) (const parens) (const angles) (const default)) :group 'message-headers) (defcustom message-signature-separator "^-- *$" "Regexp matching the signature separator." :type 'regexp :group 'message-various) @@ -2505,29 +2522,29 @@ ;;;### (autoloads (tmpl-insert-template-file tmpl-insert-template-file-from-fixed-dirs tmpl-expand-templates-in-buffer tmpl-expand-templates-in-region) "tmpl-minor-mode" "hm--html-menus/tmpl-minor-mode.el") (autoload 'tmpl-expand-templates-in-region "tmpl-minor-mode" "\ -Expand the templates in the region from BEGIN to END. -If BEGIN and and are nil, then the current region is used." t nil) +Expands the templates in the region from BEGIN to END. +If BEGIN and END are nil, then the current region is used." t nil) (autoload 'tmpl-expand-templates-in-buffer "tmpl-minor-mode" "\ -Expand all templates in the current buffer." t nil) +Expands all templates in the current buffer." t nil) (autoload 'tmpl-insert-template-file-from-fixed-dirs "tmpl-minor-mode" "\ Inserts a template FILE and expands it, if `tmpl-automatic-expand' is t. This command tries to read the template file from a list of -predefined directries (look at `tmpl-template-dir-list') and it filters -the contents of this directories with the regular expression +predefined directories (look at `tmpl-template-dir-list') and it filters +the contents of these directories with the regular expression `tmpl-filter-regexp' (look also at this variable). The command uses a history variable, which could be changed with the variable `tmpl-history-variable-name'. -The user of the command is able to change interactive to another +The user of the command is able to change interactively to another directory by entering at first the string \"Change the directory\". -This maybe to difficult for the user. Therefore another command +This may be too difficult for the user. Therefore another command called `tmpl-insert-template-file' exist, which doesn't use fixed directories and filters." t nil) (autoload 'tmpl-insert-template-file "tmpl-minor-mode" "\ -Insert a template FILE and expand it, if `tmpl-automatic-expand' is t. +Inserts a template FILE and expand it, if `tmpl-automatic-expand' is t. Look also at `tmpl-template-dir-list', to specify a default template directory. You should also take a look at `tmpl-insert-template-file-from-fixed-dirs' which has additional advantages (and disadvantages :-). @@ -3885,7 +3902,7 @@ ;;;### (autoloads (ksh-mode) "ksh-mode" "modes/ksh-mode.el") (autoload 'ksh-mode "ksh-mode" "\ -ksh-mode $Revision: 1.17 $ - Major mode for editing (Bourne, Korn or Bourne again) +ksh-mode $Revision: 1.18 $ - Major mode for editing (Bourne, Korn or Bourne again) shell scripts. Special key bindings and commands: \\{ksh-mode-map} @@ -5240,7 +5257,7 @@ (autoload 'vhdl-mode "vhdl-mode" "\ Major mode for editing VHDL code. -vhdl-mode $Revision: 1.17 $ +vhdl-mode $Revision: 1.18 $ To submit a problem report, enter `\\[vhdl-submit-bug-report]' from a vhdl-mode buffer. This automatically sets up a mail buffer with version information already added. You just need to add a description of the @@ -5260,6 +5277,10 @@ ;;;### (autoloads (auto-view-mode view-major-mode view-mode view-minor-mode view-buffer-other-window view-file-other-window view-buffer view-file) "view-less" "modes/view-less.el") +(defvar view-minor-mode-map (let ((map (make-keymap))) (set-keymap-name map 'view-minor-mode-map) (suppress-keymap map) (define-key map "-" 'negative-argument) (define-key map " " 'scroll-up) (define-key map "f" 'scroll-up) (define-key map "" 'scroll-down) (define-key map "b" 'scroll-down) (define-key map 'backspace 'scroll-down) (define-key map " " 'view-scroll-lines-up) (define-key map "\n" 'view-scroll-lines-up) (define-key map "e" 'view-scroll-lines-up) (define-key map "j" 'view-scroll-lines-up) (define-key map "y" 'view-scroll-lines-down) (define-key map "k" 'view-scroll-lines-down) (define-key map "d" 'view-scroll-some-lines-up) (define-key map "u" 'view-scroll-some-lines-down) (define-key map "r" 'recenter) (define-key map "t" 'toggle-truncate-lines) (define-key map "N" 'view-buffer) (define-key map "E" 'view-file) (define-key map "P" 'view-buffer) (define-key map "!" 'shell-command) (define-key map "|" 'shell-command-on-region) (define-key map "=" 'what-line) (define-key map "?" 'view-search-backward) (define-key map "h" 'view-mode-describe) (define-key map "s" 'view-repeat-search) (define-key map "n" 'view-repeat-search) (define-key map "/" 'view-search-forward) (define-key map "\\" 'view-search-backward) (define-key map "g" 'view-goto-line) (define-key map "G" 'view-last-windowful) (define-key map "%" 'view-goto-percent) (define-key map "p" 'view-goto-percent) (define-key map "m" 'point-to-register) (define-key map "'" 'register-to-point) (define-key map "C" 'view-cleanup-backspaces) (define-key map "" 'view-quit) (define-key map "" 'view-quit-toggle-ro) (define-key map "q" 'view-quit) map)) + +(defvar view-mode-map (let ((map (copy-keymap view-minor-mode-map))) (set-keymap-name map 'view-mode-map) map)) + (autoload 'view-file "view-less" "\ Find FILE, enter view mode. With prefix arg OTHER-P, use other window." t nil)
--- a/lisp/prim/custom-load.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/custom-load.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,6 +1,6 @@ (put 'gnus-start 'custom-loads '("gnus-group" "gnus-int" "gnus-start" "gnus-util" "gnus")) (put 'extensions 'custom-loads '("wid-edit")) -(put 'message 'custom-loads '("message" "sendmail")) +(put 'message 'custom-loads '("message" "highlight-headers" "sendmail")) (put 'gnus-score-expire 'custom-loads '("gnus-kill" "gnus-score")) (put 'gnus-score-kill 'custom-loads '("gnus-kill")) (put 'gnus-message 'custom-loads '("message")) @@ -19,7 +19,7 @@ (put 'earcon 'custom-loads '("earcon")) (put 'gnus-group-foreign 'custom-loads '("gnus-group")) (put 'gnus-article-washing 'custom-loads '("gnus-art")) -(put 'mail 'custom-loads '("gnus" "message")) +(put 'mail 'custom-loads '("gnus" "message" "highlight-headers")) (put 'gnus-summary-exit 'custom-loads '("gnus-sum")) (put 'gnus-article-saving 'custom-loads '("gnus-art")) (put 'gnus-extract-view 'custom-loads '("gnus-sum" "gnus-uu")) @@ -31,7 +31,7 @@ (put 'display-time 'custom-loads '("time")) (put 'hypermedia 'custom-loads '("wid-edit" "w3-cus")) (put 'w3-advanced 'custom-loads '("w3-cus")) -(put 'w3-menus 'custom-loads '("w3-cus")) +(put 'w3-menus 'custom-loads '("w3-cus" "w3-menu")) (put 'gnus-summary-mail 'custom-loads '("gnus-sum")) (put 'gnus-score-default 'custom-loads '("gnus-score" "gnus-sum")) (put 'nnmail-expire 'custom-loads '("nnmail")) @@ -87,13 +87,14 @@ (put 'gnus-summary-format 'custom-loads '("gnus-sum")) (put 'gnus-score-decay 'custom-loads '("gnus-score")) (put 'gnus-extract-post 'custom-loads '("gnus-uu")) -(put 'faces 'custom-loads '("cus-edit" "wid-edit" "gnus" "message")) +(put 'faces 'custom-loads '("cus-edit" "wid-edit" "gnus" "message" "highlight-headers")) (put 'gnus-various 'custom-loads '("gnus-sum")) (put 'gnus-article-highlight 'custom-loads '("gnus-art")) (put 'emacs 'custom-loads '("cus-edit" "dired-faces" "ssl")) (put 'processes 'custom-loads '("comint-xemacs")) -(put 'news 'custom-loads '("gnus" "message")) +(put 'news 'custom-loads '("gnus" "message" "highlight-headers")) (put 'w3-hooks 'custom-loads '("w3-cus")) +(put 'highlight-headers 'custom-loads '("highlight-headers")) (put 'message-insertion 'custom-loads '("message")) (put 'wp 'custom-loads '("cus-edit")) (put 'message-faces 'custom-loads '("message"))
--- a/lisp/prim/files.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/files.el Mon Aug 13 09:23:06 2007 +0200 @@ -2940,12 +2940,10 @@ (error "Apparently circular symlink path")))) ;; Suggested by Michael Kifer <kifer@CS.SunySB.EDU> -(defun file-remote-p (file) - "Test whether file resides on the local system. -The special value 'unknown is returned if no remote file access package -has been loaded." - (cond ((featurep 'ange-ftp) (ange-ftp-ftp-path file-name)) - (t (require 'efs) - (efs-ftp-path file-name)))) +(defun file-remote-p (file-name) + "Test whether FILE-NAME is looked for on a remote system." + (cond ((not allow-remote-paths) nil) + ((featurep 'ange-ftp) (ange-ftp-ftp-path file-name)) + (t (efs-ftp-path file-name)))) ;;; files.el ends here
--- a/lisp/prim/frame.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/frame.el Mon Aug 13 09:23:06 2007 +0200 @@ -1034,6 +1034,9 @@ (defvar temp-buffer-shrink-to-fit t "*When non-nil resize temporary output buffers to minimize blank lines.") +(defvar temp-buffer-max-height .5 + "*Proportion of frame to use for temp windows.") + (defun show-temp-buffer-in-current-frame (buffer) "For use as the value of temp-buffer-show-function: always displays the buffer in the current frame, regardless of the behavior @@ -1048,7 +1051,12 @@ (set-window-start window 1) ; obeys narrowing (set-window-point window 1) (when temp-buffer-shrink-to-fit - (shrink-window-if-larger-than-buffer window)) + (let* ((temp-window-size (round (* temp-buffer-max-height + (frame-height (window-frame window))))) + (size (window-displayed-height window))) + (when (< size temp-window-size) + (enlarge-window (- temp-window-size size) nil window))) + (shrink-window-if-larger-than-buffer window)) nil))) (setq pre-display-buffer-function 'get-frame-for-buffer)
--- a/lisp/prim/help.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/help.el Mon Aug 13 09:23:06 2007 +0200 @@ -344,8 +344,6 @@ This just displays the buffer in another window, rather than selecting the window.") -(defvar help-window-max-height .5 - "*Proportion of frame to use for help windows.") ;; Use this function for displaying help when C-h something is pressed ;; or in similar situations. Do *not* use it when you are displaying ;; a help message and then prompting for input in the minibuffer -- @@ -387,14 +385,7 @@ (substitute-command-keys "Type \\[delete-other-windows] to remove help window, \\[scroll-other-window] to scroll the help."))) (t (message - (substitute-command-keys "Type \\[switch-to-buffer-other-window] to restore the other window, \\[scroll-other-window] to scroll the help.")))) - (when temp-buffer-shrink-to-fit - (let* ((help-window-size (round (* help-window-max-height - (frame-height (window-frame helpwin))))) - (size (window-displayed-height helpwin))) - (if (< size help-window-size) - (enlarge-window (- help-window-size size) nil helpwin))) - (shrink-window-if-larger-than-buffer helpwin)))))))) + (substitute-command-keys "Type \\[switch-to-buffer-other-window] to restore the other window, \\[scroll-other-window] to scroll the help.")))))))))) (defun describe-key (key) "Display documentation of the function invoked by KEY.
--- a/lisp/prim/isearch-mode.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/isearch-mode.el Mon Aug 13 09:23:06 2007 +0200 @@ -384,7 +384,9 @@ ;; good way to fix it, though. -hniksic (defun isearch-mode-help () (interactive "_") - (describe-function 'isearch-forward) + (let ((w (selected-window))) + (describe-function 'isearch-forward) + (select-window w)) (isearch-update))
--- a/lisp/prim/lisp.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/lisp.el Mon Aug 13 09:23:06 2007 +0200 @@ -326,10 +326,7 @@ (setq list (cdr list))) (setq list (nreverse new)))) (with-output-to-temp-buffer "*Completions*" - (display-completion-list list)) - (when temp-buffer-shrink-to-fit - (shrink-window-if-larger-than-buffer - (get-buffer-window "*Completions*")))) + (display-completion-list list))) (message "Making completion list...%s" "done"))))) ;;; lisp.el ends here
--- a/lisp/prim/mouse.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/mouse.el Mon Aug 13 09:23:06 2007 +0200 @@ -400,6 +400,13 @@ ;;; mouse/selection tracking ;;; generalized mouse-track +(defvar default-mouse-track-normalize-point-function + 'default-mouse-track-normalize-point + "Function called to normalize position of point. +Called with two arguments: TYPE depends on the number of times that the +mouse has been clicked and is a member of `default-mouse-track-type-list', +FORWARDP determines the direction in which the point should be moved.") + (defvar mouse-track-down-hook nil "Function or functions called when the user presses the mouse. This hook is invoked by `mouse-track'; thus, it will not be called @@ -790,8 +797,8 @@ (defun default-mouse-track-next-move (min-anchor max-anchor extent) (let ((anchor (if (<= (point) min-anchor) max-anchor min-anchor))) - (default-mouse-track-normalize-point - default-mouse-track-type (> (point) anchor)) + (funcall default-mouse-track-normalize-point-function + default-mouse-track-type (> (point) anchor)) (if (consp extent) (default-mouse-track-next-move-rect anchor (point) extent) (if extent @@ -1015,12 +1022,14 @@ (let ((anchor (default-mouse-track-anchor adjust previous-point))) (setq default-mouse-track-min-anchor (save-excursion (goto-char anchor) - (default-mouse-track-normalize-point + (funcall + default-mouse-track-normalize-point-function default-mouse-track-type nil) (point))) (setq default-mouse-track-max-anchor (save-excursion (goto-char anchor) - (default-mouse-track-normalize-point + (funcall + default-mouse-track-normalize-point-function default-mouse-track-type t) (point)))) ;;
--- a/lisp/prim/overlay.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/overlay.el Mon Aug 13 09:23:06 2007 +0200 @@ -177,7 +177,7 @@ (setq before (append before (list overlay))) (setq after (append after (list overlay))))))) (extent-list)) - (list before after))) + (cons before after))) (defun overlay-recenter (pos) "Recenter the overlays of the current buffer around position POS."
--- a/lisp/prim/startup.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/prim/startup.el Mon Aug 13 09:23:06 2007 +0200 @@ -771,7 +771,7 @@ (goto-char (point-min)) (when (re-search-forward " \\[Lucid\\]" nil t) (delete-region (match-beginning 0) (match-end 0))) - (when (re-search-forward "[^(].*-.*-" nil t) + (when (re-search-forward "[^(][^)]*-[^)]*-" nil t) (delete-region (1+ (match-beginning 0)) (match-end 0)) (insert "(")) (goto-char (point-max))
--- a/lisp/psgml/ChangeLog Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/psgml/ChangeLog Mon Aug 13 09:23:06 2007 +0200 @@ -1,3 +1,7 @@ +Sat Mar 22 19:58:27 1997 Steven L Baur <steve@altair.xemacs.org> + + * psgml-html.el (html-mode): Too many backslashes in DOCSTRING. + Wed Mar 19 22:58:40 1997 Steven L Baur <steve@altair.xemacs.org> * psgml-html.el (html-helper-address-string): Use
--- a/lisp/psgml/psgml-html.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/psgml/psgml-html.el Mon Aug 13 09:23:06 2007 +0200 @@ -157,7 +157,7 @@ "Major mode for editing HTML documents. This is based on PSGML mode, and has a sophisticated SGML parser in it. It knows how to properly indent HTML/SGML documents, and it can do - a form of document validation (use \\[sgml-next-trouble-spot\\] to find + a form of document validation (use \\[sgml-next-trouble-spot] to find the next error in your document). Commands beginning with C-z insert various types of HTML tags (prompting for the required information); to iconify or suspend,
--- a/lisp/tm/gnus-sum-mime.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/tm/gnus-sum-mime.el Mon Aug 13 09:23:06 2007 +0200 @@ -5,7 +5,7 @@ ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp> ;; Created: 1996/8/6 ;; Version: -;; $Id: gnus-sum-mime.el,v 1.4 1997/03/16 03:05:46 steve Exp $ +;; $Id: gnus-sum-mime.el,v 1.5 1997/03/28 02:29:05 steve Exp $ ;; Keywords: news, MIME, multimedia, multilingual, encoded-word ;; This file is not part of GNU Emacs yet. @@ -56,12 +56,11 @@ (goto-char (point-min)) (while (< (point)(point-max)) (decode-mime-charset-region (point) - (progn - (end-of-line) - (point)) + (point-at-eol) charset) (end-of-line) - (forward-char) + (let ((signal-error-on-buffer-boundary nil)) + (forward-char)) )))
--- a/lisp/tm/tm-play.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/tm/tm-play.el Mon Aug 13 09:23:06 2007 +0200 @@ -4,7 +4,7 @@ ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp> ;; Created: 1995/9/26 (separated from tm-view.el) -;; Version: $Id: tm-play.el,v 1.4 1997/03/16 03:05:47 steve Exp $ +;; Version: $Id: tm-play.el,v 1.5 1997/03/28 02:29:06 steve Exp $ ;; Keywords: mail, news, MIME, multimedia ;; This file is part of tm (Tools for MIME). @@ -423,7 +423,8 @@ ;;; @ rot13-47 ;;; -(require 'view) +(unless (boundp 'view-mode-map) + (require 'view)) (defconst mime-view-text/plain-mode-map (copy-keymap view-mode-map)) (define-key mime-view-text/plain-mode-map
--- a/lisp/utils/highlight-headers.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/utils/highlight-headers.el Mon Aug 13 09:23:06 2007 +0200 @@ -39,48 +39,31 @@ ;; highlight-headers-citation-regexp matches lines of quoted text ;; highlight-headers-citation-header-regexp matches headers for quoted text -(if (find-face 'message-headers) - nil - (make-face 'message-headers) - (or (face-differs-from-default-p 'message-headers) - (copy-face 'bold 'message-headers))) +(defgroup highlight-headers nil + "Fancify rfc822 documents." + :group 'faces + :group 'mail + :group 'news) -(if (find-face 'message-header-contents) - nil - (make-face 'message-header-contents) - (or (face-differs-from-default-p 'message-header-contents) - (copy-face 'italic 'message-header-contents))) +(defface message-headers '((t (:bold t))) + "Face used for header part before colon." + :group 'highlight-headers) -(if (find-face 'message-highlighted-header-contents) - nil - (make-face 'message-highlighted-header-contents) - (or (face-differs-from-default-p 'message-highlighted-header-contents) - (progn - (copy-face 'message-header-contents - 'message-highlighted-header-contents) - ;; Most people seem not to like underlining, so change - ;; the font instead. - ;; (set-face-underline-p 'message-highlighted-header-contents t) - (or (make-face-bold 'message-highlighted-header-contents) - (make-face-unbold 'message-highlighted-header-contents) - (make-face-italic 'message-highlighted-header-contents) - (make-face-unitalic 'message-highlighted-header-contents)) - ))) +(defface message-header-contents '((t (:italic t))) + "Face used for header part after colon." + :group 'highlight-headers) + +(defface message-highlighted-header-contents '((t (:italic t :bold t))) + "Face used for contents of \"special\" headers." + :group 'highlight-headers) -(if (find-face 'message-cited-text) - nil - (make-face 'message-cited-text) - (or (face-differs-from-default-p 'message-cited-text) - (copy-face 'italic 'message-cited-text))) +(defface message-cited-text '((t (:italic t))) + "Face used for cited text." + :group 'highlight-headers) -(if (find-face 'x-face) - nil - (make-face 'x-face) - (or (face-differs-from-default-p 'x-face) - (progn - (copy-face 'message-highlighted-header-contents 'x-face) - (set-face-background 'x-face "white") - (set-face-foreground 'x-face "black")))) +(defface x-face '((t (:background "white" :foreground "black"))) + "Face used for X-Face icon." + :group 'highlight-headers) ;;(condition-case nil ;; (face-name 'message-addresses)
--- a/lisp/utils/mail-utils.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/utils/mail-utils.el Mon Aug 13 09:23:06 2007 +0200 @@ -144,7 +144,7 @@ "") (concat (regexp-quote (user-login-name)) "\\>")))) - (let ((match (concat "\\(^\\|,\\)[ \t\n]*\\([^,\n]*!\\|\\)\\(" + (let ((match (concat "\\(^\\|,\\)[ \t\n]*\\([^,\n]*[!<]\\|\\)\\(" rmail-dont-reply-to-names "\\)")) (case-fold-search t)
--- a/lisp/version.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/version.el Mon Aug 13 09:23:06 2007 +0200 @@ -25,7 +25,7 @@ (defconst emacs-version "20.1" "Version numbers of this version of Emacs.") -(setq emacs-version (purecopy (concat emacs-version " XEmacs Lucid (beta9)"))) +(setq emacs-version (purecopy (concat emacs-version " XEmacs Lucid (beta10)"))) (defconst emacs-major-version (progn (or (string-match "^[0-9]+" emacs-version)
--- a/lisp/vm/vm-autoload.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/vm/vm-autoload.el Mon Aug 13 09:23:06 2007 +0200 @@ -2192,7 +2192,7 @@ (autoload (quote vm-mode) "vm-startup" "Major mode for reading mail. -This is VM 6.21. +This is VM 6.22. Commands: h - summarize folder contents
--- a/lisp/vm/vm-folder.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/vm/vm-folder.el Mon Aug 13 09:23:06 2007 +0200 @@ -2611,26 +2611,26 @@ nil (write-region opoint-max (point-max) buffer-file-name t t) (vm-increment vm-modification-counter) - (set-buffer-modified-p old-buffer-modified-p) - (kill-buffer crash-buf) - (if (not (stringp vm-keep-crash-boxes)) - (vm-error-free-call 'delete-file crash-box) - (let ((time (decode-time (current-time))) - name) + (set-buffer-modified-p old-buffer-modified-p)) + (kill-buffer crash-buf) + (if (not (stringp vm-keep-crash-boxes)) + (vm-error-free-call 'delete-file crash-box) + (let ((time (decode-time (current-time))) + name) + (setq name + (expand-file-name (format "Z-%02d-%02d-%05d" + (nth 4 time) + (nth 3 time) + (% (vm-abs (random)) 100000)) + vm-keep-crash-boxes)) + (while (file-exists-p name) (setq name (expand-file-name (format "Z-%02d-%02d-%05d" (nth 4 time) (nth 3 time) (% (vm-abs (random)) 100000)) - vm-keep-crash-boxes)) - (while (file-exists-p name) - (setq name - (expand-file-name (format "Z-%02d-%02d-%05d" - (nth 4 time) - (nth 3 time) - (% (vm-abs (random)) 100000)) - vm-keep-crash-boxes))) - (rename-file crash-box name)))) + vm-keep-crash-boxes))) + (rename-file crash-box name))) got-mail )))) (defun vm-compute-spool-files ()
--- a/lisp/vm/vm-mime.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/vm/vm-mime.el Mon Aug 13 09:23:06 2007 +0200 @@ -2578,10 +2578,13 @@ (delete-char 1))) ((stringp object) (let ((coding-system-for-read 'no-conversion)) - (insert-before-markers " ") - (forward-char -1) - (insert-file-contents-literally object) - (delete-char 1)))) + (if (vm-xemacs-p) + (insert-file-contents-literally object) + (insert-before-markers " ") + (forward-char -1) + (insert-file-contents-literally object) + (goto-char (point-max)) + (delete-char -1))))) ;; gather information about the object from the extent. (if (setq already-mimed (vm-extent-property e 'vm-mime-encoded)) (setq layout (vm-mime-parse-entity
--- a/lisp/vm/vm-startup.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/vm/vm-startup.el Mon Aug 13 09:23:06 2007 +0200 @@ -275,7 +275,7 @@ (defun vm-mode (&optional read-only) "Major mode for reading mail. -This is VM 6.21. +This is VM 6.22. Commands: h - summarize folder contents
--- a/lisp/vm/vm-version.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/vm/vm-version.el Mon Aug 13 09:23:06 2007 +0200 @@ -2,7 +2,7 @@ (provide 'vm-version) -(defconst vm-version "6.21" +(defconst vm-version "6.22" "Version number of VM.") (defun vm-version ()
--- a/lisp/vms/vms-patch.el Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -;;; vms-patch.el --- override parts of files.el for VMS. -;; Keywords: vms - -;; Copyright (C) 1986 Free Software Foundation, Inc. - -;; This file is part of XEmacs. - -;; XEmacs is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; XEmacs is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the Free -;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - - -;;; Functions that need redefinition - -;;; VMS file names are upper case, but buffer names are more -;;; convenient in lower case. - -(defun create-file-buffer (filename) - "Create a suitably named buffer for visiting FILENAME, and return it. -FILENAME (sans directory) is used unchanged if that name is free; -otherwise a string <2> or <3> or ... is appended to get an unused name." - (generate-new-buffer (downcase (file-name-nondirectory filename)))) - -;;; Given a string FN, return a similar name which is a legal VMS filename. -;;; This is used to avoid invalid auto save file names. -(defun make-legal-file-name (fn) - (setq fn (copy-sequence fn)) - (let ((dot nil) (indx 0) (len (length fn)) chr) - (while (< indx len) - (setq chr (aref fn indx)) - (cond - ((eq chr ?.) (if dot (aset fn indx ?_) (setq dot t))) - ((not (or (and (>= chr ?a) (<= chr ?z)) (and (>= chr ?A) (<= chr ?Z)) - (and (>= chr ?0) (<= chr ?9)) - (eq chr ?$) (eq chr ?_) (and (eq chr ?-) (> indx 0)))) - (aset fn indx ?_))) - (setq indx (1+ indx)))) - fn) - -;;; Auto save filesnames start with _$ and end with $. - -(defun make-auto-save-file-name () - "Return file name to use for auto-saves of current buffer. -Does not consider auto-save-visited-file-name; that is checked -before calling this function. -This is a separate function so your .emacs file or site-init.el can redefine it. -See also auto-save-file-name-p." - (if buffer-file-name - (concat (file-name-directory buffer-file-name) - "_$" - (file-name-nondirectory buffer-file-name) - "$") - (expand-file-name (concat "_$_" (make-legal-file-name (buffer-name)) "$")))) - -(defun auto-save-file-name-p (filename) - "Return t if FILENAME can be yielded by make-auto-save-file-name. -FILENAME should lack slashes. -This is a separate function so your .emacs file or site-init.el can redefine it." - (string-match "^_\\$.*\\$" filename)) - -(defun vms-suspend-resume-hook () - "When resuming suspended Emacs, check for file to be found. -If the logical name `EMACS_FILE_NAME' is defined, `find-file' that file." - (let ((file (vms-system-info "LOGICAL" "EMACS_FILE_NAME"))) - (if file (find-file file)))) - -(setq suspend-resume-hook 'vms-suspend-resume-hook) - -(defun vms-suspend-hook () - "Don't allow suspending if logical name `DONT_SUSPEND_EMACS' is defined." - (if (vms-system-info "LOGICAL" "DONT_SUSPEND_EMACS") - (error "Can't suspend this emacs")) - nil) - -(setq suspend-hook 'vms-suspend-hook) - -(defun vms-read-directory (dirname switches buffer) - (save-excursion - (set-buffer buffer) - (subprocess-command-to-buffer - (concat "DIRECTORY " switches " " dirname) - buffer) - (goto-char (point-min)) - ;; Remove all the trailing blanks. - (while (search-forward " \n") - (forward-char -1) - (delete-horizontal-space)) - (goto-char (point-min)))) - -(setq dired-listing-switches - "/SIZE/DATE/OWNER/WIDTH=(FILENAME=32,SIZE=5)")
--- a/lisp/vms/vmsproc.el Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -;;; vmsproc.el --- run asynchronous VMS subprocesses under Emacs - -;; Copyright (C) 1986 Free Software Foundation, Inc. - -;; Author: Mukesh Prasad -;; Maintainer: FSF -;; Keywords: vms - -;; This file is part of XEmacs. - -;; XEmacs is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; XEmacs is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the Free -;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -;;; Code: - -(defvar display-subprocess-window nil - "If non-nil, the suprocess window is displayed whenever input is received.") - -(defvar command-prefix-string "$ " - "String to insert to distinguish commands entered by user.") - -(defvar subprocess-running nil) -(defvar command-mode-map nil) - -(if command-mode-map - nil - (setq command-mode-map (make-sparse-keymap)) - (define-key command-mode-map "\C-m" 'command-send-input) - (define-key command-mode-map "\C-u" 'command-kill-line)) - -(defun subprocess-input (name str) - "Handles input from a subprocess. Called by Emacs." - (if display-subprocess-window - (display-buffer subprocess-buf)) - (let ((old-buffer (current-buffer))) - (set-buffer subprocess-buf) - (goto-char (point-max)) - (insert str) - (insert ?\n) - (set-buffer old-buffer))) - -(defun subprocess-exit (name) - "Called by Emacs upon subprocess exit." - (setq subprocess-running nil)) - -(defun start-subprocess () - "Spawns an asynchronous subprocess with output redirected to -the buffer *COMMAND*. Within this buffer, use C-m to send -the last line to the subprocess or to bring another line to -the end." - (if subprocess-running - (return t)) - (setq subprocess-buf (get-buffer-create "*COMMAND*")) - (save-excursion - (set-buffer subprocess-buf) - (use-local-map command-mode-map)) - (setq subprocess-running (spawn-subprocess 1 'subprocess-input - 'subprocess-exit)) - ;; Initialize subprocess so it doesn't panic and die upon - ;; encountering the first error. - (and subprocess-running - (send-command-to-subprocess 1 "ON SEVERE_ERROR THEN CONTINUE"))) - -(defun subprocess-command-to-buffer (command buffer) - "Execute COMMAND and redirect output into BUFFER." - (let (cmd args) - (setq cmd (substring command 0 (string-match " " command))) - (setq args (substring command (string-match " " command))) - (call-process cmd nil buffer nil "*dcl*" args))) -;BUGS: only the output up to the end of the first image activation is trapped. -; (if (not subprocess-running) -; (start-subprocess)) -; (save-excursion -; (set-buffer buffer) -; (let ((output-filename (concat "SYS$SCRATCH:OUTPUT-FOR-" -; (getenv "USER") ".LISTING"))) -; (while (file-exists-p output-filename) -; (delete-file output-filename)) -; (define-logical-name "SYS$OUTPUT" (concat output-filename "-NEW")) -; (send-command-to-subprocess 1 command) -; (send-command-to-subprocess 1 (concat -; "RENAME " output-filename -; "-NEW " output-filename)) -; (while (not (file-exists-p output-filename)) -; (sleep-for 1)) -; (define-logical-name "SYS$OUTPUT" nil) -; (insert-file output-filename) -; (delete-file output-filename)))) - -(defun subprocess-command () - "Starts asynchronous subprocess if not running and switches to its window." - (interactive) - (if (not subprocess-running) - (start-subprocess)) - (and subprocess-running - (progn (pop-to-buffer subprocess-buf) (goto-char (point-max))))) - -(defun command-send-input () - "If at last line of buffer, sends the current line to -the spawned subprocess. Otherwise brings back current -line to the last line for resubmission." - (interactive) - (beginning-of-line) - (let ((current-line (buffer-substring (point) - (progn (end-of-line) (point))))) - (if (eobp) - (progn - (if (not subprocess-running) - (start-subprocess)) - (if subprocess-running - (progn - (beginning-of-line) - (send-command-to-subprocess 1 current-line) - (if command-prefix-string - (progn (beginning-of-line) (insert command-prefix-string))) - (next-line 1)))) - ;; else -- if not at last line in buffer - (end-of-buffer) - (backward-char) - (next-line 1) - (if (string-equal command-prefix-string - (substring current-line 0 (length command-prefix-string))) - (insert (substring current-line (length command-prefix-string))) - (insert current-line))))) - -(defun command-kill-line() - "Kills the current line. Used in command mode." - (interactive) - (beginning-of-line) - (kill-line)) - -(define-key esc-map "$" 'subprocess-command) - -;;; vmsproc.el ends here
--- a/lisp/vms/vmsx.el Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +0,0 @@ -;;; vmsx.el --- run asynchronous VMS subprocesses under Emacs - -;; Copyright (C) 1986 Free Software Foundation, Inc. - -;; Author: Mukesh Prasad -;; Maintainer: FSF -;; Keywords: vms - -;; This file is part of XEmacs. - -;; XEmacs is free software; you can redistribute it and/or modify it -;; under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; XEmacs is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the Free -;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -;;; Code: - -(defvar display-subprocess-window nil - "If non-nil, the suprocess window is displayed whenever input is received.") - -(defvar command-prefix-string "$ " - "String to insert to distinguish commands entered by user.") - -(defvar subprocess-running nil) -(defvar command-mode-map nil) - -(if command-mode-map - nil - (setq command-mode-map (make-sparse-keymap)) - (define-key command-mode-map "\C-m" 'command-send-input) - (define-key command-mode-map "\C-u" 'command-kill-line)) - -(defun subprocess-input (name str) - "Handles input from a subprocess. Called by Emacs." - (if display-subprocess-window - (display-buffer subprocess-buf)) - (let ((old-buffer (current-buffer))) - (set-buffer subprocess-buf) - (goto-char (point-max)) - (insert str) - (insert ?\n) - (set-buffer old-buffer))) - -(defun subprocess-exit (name) - "Called by Emacs upon subprocess exit." - (setq subprocess-running nil)) - -(defun start-subprocess () - "Spawns an asynchronous subprocess with output redirected to -the buffer *COMMAND*. Within this buffer, use C-m to send -the last line to the subprocess or to bring another line to -the end." - (if subprocess-running - (return t)) - (setq subprocess-buf (get-buffer-create "*COMMAND*")) - (save-excursion - (set-buffer subprocess-buf) - (use-local-map command-mode-map)) - (setq subprocess-running (spawn-subprocess 1 'subprocess-input - 'subprocess-exit)) - ;; Initialize subprocess so it doesn't panic and die upon - ;; encountering the first error. - (and subprocess-running - (send-command-to-subprocess 1 "ON SEVERE_ERROR THEN CONTINUE"))) - -(defvar subprocess-command-to-buffer-tmpdir "SYS$SCRATCH:" - "*Put temporary files from subprocess-command-to-buffer here.") - -(defun subprocess-command-to-buffer (command buffer) - "Execute command and redirect output into buffer. - -BUGS: only the output up to the end of the first image activation is trapped." - (if (not subprocess-running) - (start-subprocess)) - (save-excursion - (set-buffer buffer) - (let ((output-filename - (concat subprocess-command-to-buffer-tmpdir - "OUTPUT-FOR-" (getenv "USER") ".LISTING"))) - (while (file-attributes output-filename) - (delete-file output-filename)) - (send-command-to-subprocess 1 (concat "DEFINE/USER SYS$OUTPUT " - output-filename "-NEW")) - (send-command-to-subprocess 1 command) - (send-command-to-subprocess 1 (concat "RENAME " output-filename - "-NEW " output-filename)) - (while (not (file-attributes output-filename)) - (sleep-for 2)) - (insert-file output-filename)))) - -(defun subprocess-command () - "Starts asynchronous subprocess if not running and switches to its window." - (interactive) - (if (not subprocess-running) - (start-subprocess)) - (and subprocess-running - (progn (pop-to-buffer subprocess-buf) (goto-char (point-max))))) - -(defun command-send-input () - "If at last line of buffer, sends the current line to -the spawned subprocess. Otherwise brings back current -line to the last line for resubmission." - (interactive) - (beginning-of-line) - (let ((current-line (buffer-substring (point) - (progn (end-of-line) (point))))) - (if (eobp) - (progn - (if (not subprocess-running) - (start-subprocess)) - (if subprocess-running - (progn - (beginning-of-line) - (send-command-to-subprocess 1 current-line) - (if command-prefix-string - (progn (beginning-of-line) (insert command-prefix-string))) - (next-line 1)))) - ;; else -- if not at last line in buffer - (end-of-buffer) - (backward-char) - (next-line 1) - (if (string-equal command-prefix-string - (substring current-line 0 (length command-prefix-string))) - (insert (substring current-line (length command-prefix-string))) - (insert current-line))))) - -(defun command-kill-line() - "Kills the current line. Used in command mode." - (interactive) - (beginning-of-line) - (kill-line)) - -(define-key esc-map "$" 'subprocess-command) - -;;; vmsx.el ends here
--- a/lisp/w3/ChangeLog Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/ChangeLog Mon Aug 13 09:23:06 2007 +0200 @@ -2,8 +2,147 @@ * Makefile (xemacs-w3): Special target for XEmacs Build. +Wed Mar 26 06:23:51 1997 William M. Perry <wmperry@aventail.com> + +* Emacs-W3 3.0.75 released + +* url.el (url-clean-text): Better matchine of bogus process exited + messages. + +* font.el (font-rgb-color-p): No longer match "^#xxyyzz" as an rgb-color, + this screwed up bigtime in font-color-rgb-components. + (font-set-face-foreground): Do the test here instead. + (font-set-face-background): and here. + +* w3-widget.el (widget-image-value-create): For client side imagemaps, + make sure case-fold-search or :ignore-case is specified. + +* url-gw.el (url-gateway-nslookup-program): Default to using 'nslookup' as + url-gateway-nslookup-program + +Tue Mar 25 16:06:28 1997 William M. Perry <wmperry@aventail.com> + +* Emacs-W3 3.0.74 released + +Tue Mar 25 15:31:56 1997 Greg Stark <gsstark@great-white> + +* url-cookie.el (url-cookie-handle-set-cookie): don't deal with #!%@ed + microsoft web site cookies - they break good, clean, wholesome sites + like yahoo's stock pages. + +* ssl.el (ssl-program-arguments): Make sure everything gets turned into a + string, not an integer. + (open-ssl-stream): use a pipe instead of a pty if possible (why?) + +* w3-display.el (w3-display-node): Added back in <keygen> support + +* w3.el (w3-notify-when-ready): protect against bad buffer switching + (minibuffer as active window lossage, etc) + +* w3-toolbar.el (w3-toolbar-make-buttons): Don't warn about toolbar + directory on Emacsen that can't do toolbars! + +Tue Mar 25 15:31:56 1997 William M. Perry <wmperry@aventail.com> + +* Emacs-W3 3.0.73 released + +* w3-display.el (w3-get-face-info): Allow passing in a second argument + that means 'check this attribute of the html tag if you don't find + something in the stylesheet'. This automatically enables <font color> + and <table|td|tr bgcolor>. + +Tue Mar 25 06:45:02 1997 T. V. Raman <raman@Adobe.COM> + +* w3-forms.el (w3-form-keymap): patch to avoid lossage with emacspeak & + using terminal.el + +Tue Mar 25 06:45:02 1997 William M. Perry <wmperry@aventail.com> + +* ssl.el (ssl-program-arguments): Removed -quiet switch, since it requires + patches to s_client + +Mon Mar 24 10:56:11 1997 William M. Perry <wmperry@aventail.com> + +* Emacs-W3 3.0.72 released + +* w3-display.el (w3-display-node): Better handling of body and html style + attributes in XEmacs + +* w3.el (w3-mode): Removed call to kill-all-local-variables, as it + nukes buffer-local faces as well. + +* css.el (css-expand-length): Don't choke and use the wrong damn thing to + base percentages off of on percentage heights (ie: font-size: 80%) + +Mon Mar 24 07:12:52 1997 Gerry S Hayes <sumner@CMU.EDU> + +* url-gw.el (url-open-telnet): Fixed stupid typo into-to-string -> + int-to-string + (url-open-rlogin): Ditto. + +Sun Mar 23 09:43:24 1997 William M. Perry <wmperry@aventail.com> + +* w3-display.el (w3-table-ascii-border-chars): Use a '+' in the ascii art + version of table borders. + +Sat Mar 22 00:45:34 1997 William M. Perry <wmperry@aventail.com> + +* w3-menu.el (w3-use-menus): Customized this variable + +* w3-display.el (w3-display-node): Don't run multiline text area's default + value through w3-normalize-spaces + +Thu Mar 20 23:44:50 1997 Greg Stark <gsstark@mit.edu> + +* w3-cus.el (w3-use-terminal-characters): New variable + (w3-use-terminal-characters-on-tty): New variable + (w3-use-terminal-glyphs): New variable + (w3-horizontal-rule-char): Make setting it to nil allow use of graphic + characters (also means people can avoid using graphic charactes for + horizontal rules if they wish) +* w3-display.el (w3-handle-image): clean up whitespace in alt tags + (w3-table-glyph-border-chars): New variable + (w3-table-graphic-border-chars): New variable + (w3-terminal-properties): New variable + (w3-insert-terminal-char): New inline function + (w3-horizontal-rule-char): New inline function + (w3-setup-terminal-chars): Set up all of these and make using graphic + characters work on XEmacs using text properties (and optionally use text + properties on FSF Emacs too). + (w3-table-hack-borders): Remove, obsoleted by w3-setup-terminal-chars + (w3-table-unhack-borders): don't have to fiddle with + w3-horizontal-rule-char any more. + (w3-display-table): Use w3-insert-terminal-char + (w3-size-of-tree): Use w3-horizontal-rule-char + (w3-display-node): Use w3-horizontal-rule-char, w3-insert-terminal-char, + uhm, i'm not sure if it was correct to remove the handle-content +* w3-forms.el (w3-fixup-eol-faces): try to remove mouse-face from end-of-lines as + well, uhm, this doesn't seem to work though. + (w3-form-determine-size): add keygen + (w3-form-encode-helper): add keygen support for the day when the ssl code + itself is released. +* w3-widget.el (widget-image-value-create): use 'item widgets instead of + 'push-button widgets and specify the format ourselves so we don't get + widget.el's arbitrary formatting. +* w3.el (w3-do-setup): call w3-setup-terminal-chars to make nice tables and + horizontal rules the default at least under X. +* mm.el added x-x509-ca-cert and x-x509-user-cert viewers but the tests + will fail so no one should should see this change until i release the + functions. + +Fri Mar 21 18:52:31 1997 William M. Perry <wmperry@aventail.com> + +* css.el (css-expand-length): Better support for percentage values in + lengths + +Thu Mar 20 06:22:29 1997 Istvan Marko <istvan@cmdmail.amd.com> + +* Added slot for no_proxy settings under the preferences panel + Thu Mar 20 06:22:29 1997 William M. Perry <wmperry@aventail.com> +* Emacs-W3 3.0.71 released + * w3-parse.el:Added more transitions for error handling of raw 'td' or 'th' outside of a 'tr' in tablebody.
--- a/lisp/w3/Makefile Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/Makefile Mon Aug 13 09:23:06 2007 +0200 @@ -36,7 +36,7 @@ url-nfs.el url-file.el url-cookie.el url-parse.el url-irc.el \ url-gopher.el url-http.el url-mail.el url-misc.el url-news.el \ url-vars.el url-auth.el mm.el md5.el url-gw.el ssl.el base64.el \ - url.el socks.el url-cache.el + url.el socks.el url-cache.el url-ns.el CUSTOMSOURCES = # widget.el widget-edit.el CUSTOMOBJECTS = $(CUSTOMSOURCES:.el=.elc) @@ -67,9 +67,6 @@ xemacs-w3: docomp.el $(OBJECTS) @echo Build of w3 complete... -xemacs-w3: docomp.el $(OBJECTS) - @echo Build of w3 complete... - all: w3.info w3 install: all
--- a/lisp/w3/css.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/css.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; css.el -- Cascading Style Sheet parser ;; Author: wmperry -;; Created: 1997/03/14 22:02:39 -;; Version: 1.30 +;; Created: 1997/03/25 03:35:09 +;; Version: 1.33 ;; Keywords: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -44,7 +44,7 @@ [font-style t symbol] [font-variant t symbol] [font-weight t weight] - [font-size t length] + [font-size t height] [font nil font] ;; Color and background properties, Section 5.3 @@ -317,7 +317,7 @@ (setq classes (sort classes 'string-lessp)) (cons tag classes))) ((string-match "^#" tag) ; id selector - (cons '*document tag)) + (cons '*document (list tag))) (t (cons (intern (downcase tag)) t) ) @@ -361,17 +361,27 @@ (if size (push (cons 'font-size (css-expand-length size)) retval)) (if height - (push (cons 'line-height (css-expand-length height)) retval)) + (push (cons 'line-height (css-expand-length height t)) retval)) (if family (push (cons 'font-family (css-expand-value 'string-list family)) retval)) retval)) -(defun css-expand-length (spec) +(if (not (fboundp 'frame-char-height)) + (defun frame-char-height (&optional frame) + "Height in pixels of a line in the font in frame FRAME. +If FRAME is omitted, the selected frame is used. +For a terminal frame, the value is always 1." + (font-height (face-font 'default frame)))) + +(defun css-expand-length (spec &optional height) (cond ((not (stringp spec)) spec) ((string-equal spec "auto") nil) ((string-match "\\([+-]?\\([0-9]+\\|[0-9]*\\.[0-9]+\\)\\)%" spec) ; A percentage - nil) + (setq spec (/ (string-to-int (match-string 1 spec)) 100.0)) + (if height + (round (* (frame-char-height) spec)) + (max 0 (round (* (frame-width) spec))))) ((string-match "\\([+-]?\\([0-9]+\\|[0-9]*\\.[0-9]+\\)\\)e[mx]" spec) ; Character based (max 0 (round (string-to-number (match-string 1 spec))))) (t @@ -463,6 +473,8 @@ (case type (length ; CSS, Section 6.1 (setq value (css-expand-length value))) + (height + (setq value (css-expand-length value t))) (percentage ; CSS, Section 6.2 (setq value (/ (string-to-number value) (if (fboundp 'float) (float 100) 1)))) @@ -577,8 +589,7 @@ ((string-match (css-symbol-list-as-regexp normal bold bolder lighter) value) (setq value (intern (downcase (concat ":" value))))) - (t setq value (intern ":bold")))) - + (t (setq value (intern ":bold"))))) ;; The rest of these deal with how we handle things internally ((symbol integer) ; Read it in (setq value (read (downcase value))))
--- a/lisp/w3/custom-check Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/custom-check Mon Aug 13 09:23:06 2007 +0200 @@ -4,13 +4,12 @@ HOME=`(cd ; pwd)` fi -if [ -n "$WIDGETDIR" ]; then - echo "WIDGETDIR environment variable set, good good" - exit 0 +if [ -f "${HOME}/.emacs" ]; then + DOTEMACS="-l ${HOME}/.emacs" fi -WITH=`${EMACS} -batch -l ${HOME}/.emacs -eval '(princ (locate-library "custom"))' | cut -f3- |xargs dirname` -WITHOUT=`${EMACS} -batch -eval '(princ (locate-library "custom"))' | cut -f3- |xargs dirname` +WITH=` ${EMACS} -batch ${DOTEMACS} -eval '(princ (file-truename (locate-library "custom")))'` +WITHOUT=`${EMACS} -batch -q -no-site-file -eval '(princ (file-truename (locate-library "custom")))'` if [ "${WITH}" = "${WITHOUT}" ]; then exit 0
--- a/lisp/w3/font.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/font.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; font.el --- New font model ;; Author: wmperry -;; Created: 1997/03/19 18:28:10 -;; Version: 1.38 +;; Created: 1997/03/26 20:08:55 +;; Version: 1.40 ;; Keywords: faces ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -979,8 +979,7 @@ (defsubst font-rgb-color-p (obj) (or (and (vectorp obj) (= (length obj) 4) - (eq (aref obj 0) 'rgb)) - (string-match "^#[0-9a-fA-F]+$" obj))) + (eq (aref obj 0) 'rgb)))) (defsubst font-rgb-color-red (obj) (aref obj 1)) (defsubst font-rgb-color-green (obj) (aref obj 2)) @@ -1093,7 +1092,8 @@ (interactive) (condition-case nil (cond - ((font-rgb-color-p color) + ((or (font-rgb-color-p color) + (string-match "^#[0-9a-fA-F]+$" color)) (apply 'set-face-background face (font-normalize-color color) args)) (t @@ -1104,7 +1104,8 @@ (interactive) (condition-case nil (cond - ((font-rgb-color-p color) + ((or (font-rgb-color-p color) + (string-match "^#[0-9a-fA-F]+$" color)) (apply 'set-face-foreground face (font-normalize-color color) args)) (t (apply 'set-face-foreground face color args)))
--- a/lisp/w3/mm.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/mm.el Mon Aug 13 09:23:06 2007 +0200 @@ -123,6 +123,12 @@ ) ) ("application" . ( + ("x-x509-ca-cert" . (("viewer" . ssl-view-site-cert) + ("test" . (fboundp 'ssl-view-site-cert)) + ("type" . "application/x-x509-ca-cert"))) + ("x-x509-user-cert" . (("viewer" . ssl-view-user-cert) + ("test" . (fboundp 'ssl-view-user-cert)) + ("type" . "application/x-x509-user-cert"))) ("octet-stream" . (("viewer" . mm-save-binary-file) ("type" ."application/octet-stream"))) ("dvi" . (("viewer" . "open %s")
--- a/lisp/w3/ssl.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/ssl.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; ssl.el,v --- ssl functions for emacsen without them builtin ;; Author: wmperry -;; Created: 1997/03/15 00:29:34 -;; Version: 1.11 +;; Created: 1997/03/26 00:04:40 +;; Version: 1.13 ;; Keywords: comm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -85,10 +85,10 @@ :type 'string) (defcustom ssl-program-arguments - '("-quiet" + '(;;"-quiet" "-host" host "-port" service - "-verify" ssl-certificate-verification-depth + "-verify" (int-to-string ssl-certificate-verification-depth) "-CApath" ssl-certificate-directory ) "*Arguments that should be passed to the program `ssl-program-name'. @@ -154,7 +154,7 @@ Fourth arg SERVICE is name of the service desired, or an integer specifying a port number to connect to." (if (integerp service) (setq service (int-to-string service))) - (let* ((process-connection-type t) + (let* ((process-connection-type nil) (port service) (proc (eval (`
--- a/lisp/w3/url-cookie.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/url-cookie.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; url-cookie.el --- Netscape Cookie support ;; Author: wmperry -;; Created: 1997/03/19 00:42:23 -;; Version: 1.14 +;; Created: 1997/03/26 00:06:01 +;; Version: 1.15 ;; Keywords: comm, data, processes, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -374,12 +374,6 @@ (let ((cur nil)) (while rest (setq cur (pop rest)) - ;; Oh gross, this is for microsoft & netscape. - ;; Fuck them fuck them fuchk them fuck them. - (if (string-match "^\\([^=]+\\)=\\(.*\\)" (cdr cur)) - (setq rest (cons (cons (match-string 1 (cdr cur)) - (match-string 2 (cdr cur))) rest) - cur (cons (car cur) ""))) (url-cookie-store (car cur) (cdr cur) expires domain path secure)))) (t
--- a/lisp/w3/url-gw.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/url-gw.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; url-gw.el --- Gateway munging for URL loading ;; Author: wmperry -;; Created: 1997/02/10 01:00:01 -;; Version: 1.5 +;; Created: 1997/03/26 14:32:29 +;; Version: 1.7 ;; Keywords: comm, data, processes ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -68,7 +68,7 @@ but your machine can. This usually happens if you are running a statically linked Emacs under SunOS 4.x") -(defvar url-gateway-nslookup-program nil +(defvar url-gateway-nslookup-program "nslookup" "*If non-NIL then a string naming nslookup program." ) ;; Stolen from ange-ftp @@ -106,7 +106,7 @@ (defun url-open-rlogin (name buffer host service) "Open a connection using rsh." (if (not (stringp service)) - (setq service (into-to-string service))) + (setq service (int-to-string service))) (let ((proc (if url-gateway-rlogin-user-name (start-process name buffer "rsh" @@ -129,7 +129,7 @@ ;; Stolen from red gnus nntp.el (defun url-open-telnet (name buffer host service) (if (not (stringp service)) - (setq service (into-to-string service))) + (setq service (int-to-string service))) (save-excursion (set-buffer (get-buffer-create buffer)) (erase-buffer)
--- a/lisp/w3/url-misc.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/url-misc.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; url-misc.el --- Misc Uniform Resource Locator retrieval code ;; Author: wmperry -;; Created: 1997/02/19 00:52:07 -;; Version: 1.12 +;; Created: 1997/03/24 23:59:37 +;; Version: 1.13 ;; Keywords: comm, data, processes ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -30,6 +30,14 @@ (require 'url-parse) (autoload 'Info-goto-node "info" "" t) +(defun url-netrek (url) + ;; Start a netrek client + (if (get-buffer url-working-buffer) + (kill-buffer url-working-buffer)) + (let ((data (url-generic-parse-url url))) + (error + "I should launch netrek on: %s %s" (url-host data) (url-port data)))) + (defun url-info (url) ;; Fetch an info node (if (get-buffer url-working-buffer)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/w3/url-ns.el Mon Aug 13 09:23:06 2007 +0200 @@ -0,0 +1,63 @@ +;;; url-ns.el --- Various netscape-ish functions for proxy definitions +;; Author: wmperry +;; Created: 1997/03/24 20:16:16 +;; Version: 1.1 +;; Keywords: comm, data, processes, hypermedia + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Copyright (c) 1997 Free Software Foundation, Inc. +;;; +;;; This file is not part of GNU Emacs, but the same permissions apply. +;;; +;;; GNU Emacs is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 2, or (at your option) +;;; any later version. +;;; +;;; GNU Emacs is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Emacs; see the file COPYING. If not, write to the +;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;;; Boston, MA 02111-1307, USA. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun isPlainHostName (host) + (string-match "\\." host)) + +(defun dnsDomainIs (host dom) + (setq host (url-gateway-nslookup-host host)) + (string-match (concat (regexp-quote dom) "$") host)) + +(defun dnsResolve (host) + (url-gateway-nslookup-host host)) + +(defun isResolvable (host) + (if (string-match "^[0-9.]+$" host) + t + (not (string= host (url-gateway-nslookup-host host))))) + +(defun isInNet (ip net mask) + (let ((netc (split-string ip "\\.")) + (ipc (split-string net "\\.")) + (maskc (split-string mask "\\."))) + (if (or (/= (length netc) (length ipc)) + (/= (length ipc) (length maskc))) + nil + (setq netc (mapcar 'string-to-int netc) + ipc (mapcar 'string-to-int ipc) + maskc (mapcar 'string-to-int maskc)) + (and + (= (logand (nth 0 netc) (nth 0 maskc)) + (logand (nth 0 ipc) (nth 0 maskc))) + (= (logand (nth 1 netc) (nth 1 maskc)) + (logand (nth 1 ipc) (nth 1 maskc))) + (= (logand (nth 2 netc) (nth 2 maskc)) + (logand (nth 2 ipc) (nth 2 maskc))) + (= (logand (nth 3 netc) (nth 3 maskc)) + (logand (nth 3 ipc) (nth 3 maskc))))))) + +(provide 'url-ns)
--- a/lisp/w3/url-vars.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/url-vars.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; url-vars.el --- Variables for Uniform Resource Locator tool ;; Author: wmperry -;; Created: 1997/03/20 18:03:50 -;; Version: 1.39 +;; Created: 1997/03/26 20:12:27 +;; Version: 1.43 ;; Keywords: comm, data, processes, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -26,7 +26,7 @@ ;;; Boston, MA 02111-1307, USA. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defconst url-version (let ((x "p3.0.71")) +(defconst url-version (let ((x "p3.0.75")) (if (string-match "State: \\([^ \t\n]+\\)" x) (substring x (match-beginning 1) (match-end 1)) x))
--- a/lisp/w3/url.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/url.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,13 +1,13 @@ ;;; url.el --- Uniform Resource Locator retrieval tool ;; Author: wmperry -;; Created: 1997/03/20 15:45:21 -;; Version: 1.66 +;; Created: 1997/03/26 20:11:33 +;; Version: 1.69 ;; Keywords: comm, data, processes, hypermedia ;;; LCD Archive Entry: ;;; url|William M. Perry|wmperry@cs.indiana.edu| ;;; Functions for retrieving/manipulating URLs| -;;; 1997/03/20 15:45:21|1.66|Location Undetermined +;;; 1997/03/26 20:11:33|1.69|Location Undetermined ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -97,6 +97,7 @@ (autoload 'url-telnet "url-misc") (autoload 'url-tn3270 "url-misc") (autoload 'url-proxy "url-misc") +(autoload 'url-netrek "url-misc") (autoload 'url-news "url-news") (autoload 'url-nntp "url-news") @@ -907,6 +908,7 @@ (url-register-protocol 'nntp nil 'url-identity-expander "119") (url-register-protocol 'irc nil 'url-identity-expander "6667") (url-register-protocol 'data nil 'url-identity-expander) + (url-register-protocol 'netrek nil 'url-identity-expander) (url-register-protocol 'rlogin) (url-register-protocol 'telnet) (url-register-protocol 'tn3270) @@ -1279,9 +1281,9 @@ and decoding any MIME content-transfer-encoding used." (set-buffer url-working-buffer) (goto-char (point-min)) - (url-replace-regexp "Connection closed by.*" "") + (url-replace-regexp "Connection closed by.*\n*\\'" "") (goto-char (point-min)) - (url-replace-regexp "Process WWW.*" "")) + (url-replace-regexp "Process .* exited abnormally.*\n*\\'" "")) (defun url-remove-compressed-extensions (filename) (while (assoc (url-file-extension filename) url-uncompressor-alist)
--- a/lisp/w3/w3-cus.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3-cus.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-cus.el --- Customization support for Emacs-W3 ;; Author: wmperry -;; Created: 1997/03/18 20:30:34 -;; Version: 1.5 +;; Created: 1997/03/24 06:35:57 +;; Version: 1.7 ;; Keywords: comm, help, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -102,7 +102,7 @@ :group 'w3-files :type 'file) -(defcustom w3-documentation-root "http://www.cs.indiana.edu/elisp/w3/docs/" +(defcustom w3-documentation-root "http://www.cs.indiana.edu/elisp/w3/" "*Where the w3 documentation lives. This MUST end in a slash." :group 'w3-files :type 'string) @@ -125,10 +125,16 @@ (const :tag "Show hyperlinks, ask whether to retrieve them" :value ask) (const :tag "Automatically retrieve frames" :value t))) -(defcustom w3-do-incremental-display nil - "*Whether to do incremental display of pages or not." +(defcustom w3-bullets + '((disc . ?*) + (circle . ?o) + (square . ?#) + (none . ? ) + ) + "*An assoc list of unordered list types mapping to characters to use +as the bullet character." :group 'w3-display - :type 'boolean) + :type 'list) (defcustom w3-echo-link '(title url text name) "*Whether to display the URL of a link when tabbing through links. @@ -149,12 +155,45 @@ (const :tag "Name of the link as defined in the HTML tag" :value name))) -(defcustom w3-horizontal-rule-char ?- +(defcustom w3-horizontal-rule-char nil "*The character to use to create a horizontal rule. Must be the character's code, not a string. This character is -replicated across the screen to create a division." +replicated across the screen to create a division. +If nil W3 will use a terminal graphic character if possible." + :group 'w3-display + :type '(choice (const :tag "Best possible" :value nil) + (character))) + +;;; these three variables control how w3-setup-terminal-chars works +(defcustom w3-use-terminal-characters t + "*Use terminal graphics characters for drawing tables and rules if available" + :group 'w3-display + :type 'boolean) + +(defcustom w3-use-terminal-characters-on-tty nil + "*Use terminal graphics characters for tables and rules even on a tty. +This triggers display bugs on both FSF Emacs and XEmacs. +(Though it's usually tolerable at least on FSF Emacs.)" :group 'w3-display - :type 'character) + :type 'boolean) + +(defcustom w3-use-terminal-glyphs t + "*Use glyphs if possible rather than properties for terminal graphics characters + +Glyphs are probably more efficient but don't work with the most recent versions +of XEmacs and there are some cute tricks we can play with text-properties that +glyphs won't let us do. It may be possible someday to make XEmacs automagically +translate the characters back to ascii characters when pasted into another +buffer. (On the other hand, right now w3-excise-terminal-characters doesn't +work at all if we're using text-properties)." + :group 'w3-display + :type '(choice (const :tag "Use Glyphs" :value t) + (const :tag "Use Text Properties" :value nil))) + +(defcustom w3-do-incremental-display nil + "*Whether to do incremental display of pages or not." + :group 'w3-display + :type 'boolean) (defcustom w3-defined-link-types ;; This is the HTML3.0 list (downcased) plus "made".
--- a/lisp/w3/w3-display.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3-display.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-display.el --- display engine v99999 ;; Author: wmperry -;; Created: 1997/03/18 23:20:40 -;; Version: 1.150 +;; Created: 1997/03/26 15:24:53 +;; Version: 1.157 ;; Keywords: faces, help, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -75,9 +75,12 @@ (defmacro w3-get-attribute (attr) (` (cdr-safe (assq (, attr) args)))) - (defmacro w3-get-face-info (info) + (defmacro w3-get-face-info (info &optional other) (let ((var (intern (format "w3-face-%s" info)))) - (` (push (w3-get-style-info (quote (, info)) node (car (, var))) + (` (push (w3-get-style-info (quote (, info)) node + (or (cdr-safe (assq (quote (, other)) + (nth 1 node))) + (car (, var)))) (, var))))) (defmacro w3-pop-face-info (info) @@ -94,8 +97,8 @@ (w3-get-face-info font-size) (w3-get-face-info text-decoration) ;;(w3-get-face-info pixmap) - (w3-get-face-info color) - (w3-get-face-info background-color) + (w3-get-face-info color color) + (w3-get-face-info background-color bgcolor) (setq w3-face-font-spec (make-font :weight (car w3-face-font-weight) :family (car w3-face-font-family) @@ -285,15 +288,6 @@ (setq string (substring string 0 (match-beginning 0)))) string) -(defvar w3-bullets - '((disc . ?*) - (circle . ?o) - (square . ?#) - (none . ? ) - ) - "*An assoc list of unordered list types mapping to characters to use -as the bullet character.") - (defsubst w3-display-line-break (n) (if (or @@ -728,6 +722,7 @@ ((stringp w3-auto-image-alt) (format w3-auto-image-alt (url-basepath src t))))) (alt (or (w3-get-attribute 'alt) our-alt)) + (c nil) (ismap (and (assq 'ismap args) 'ismap)) (usemap (w3-get-attribute 'usemap)) (base (w3-get-attribute 'base)) @@ -736,6 +731,8 @@ (widget nil) (align (or (w3-get-attribute 'align) (w3-get-style-info 'vertical-align node)))) + (while (setq c (string-match "[\C-i\C-j\C-l\C-m]" alt)) + (aset alt c ? )) (if (assq '*table-autolayout w3-display-open-element-stack) (insert alt) (setq widget (widget-create 'image @@ -757,11 +754,141 @@ ;; The table handling +(defvar w3-table-ascii-border-chars + [nil nil nil ?/ nil ?- ?\\ ?- nil ?\\ ?| ?| ?/ ?- ?| ?+] + "*Vector of ascii characters to use to draw table borders. +This vector is used when terminal characters are unavailable") + +(defvar w3-table-glyph-border-chars + [nil nil nil 11 nil 2 7 14 nil 3 8 6 1 15 4 5] + "Vector of characters to use to draw table borders. +This vector is used when terminal characters are used via glyphs") + +(defvar w3-table-graphic-border-chars + [nil nil nil ?j nil ?q ?m ?v nil ?k ?x ?u ?l ?w ?t ?n] + "Vector of characters to use to draw table borders. +This vector is used when terminal characters are used directly") + +(defvar w3-table-border-chars w3-table-ascii-border-chars + "Vector of characters to use to draw table borders. +w3-setup-terminal-chars sets this to one of +w3-table-ascii-border-chars, +w3-table-glyph-border-chars, or +w3-table-graphic-border-chars.") + +(defsubst w3-table-lookup-char (l u r b) + (aref w3-table-border-chars (logior (if l 1 0) + (if u 2 0) + (if r 4 0) + (if b 8 0)))) + +(defvar w3-terminal-properties nil) + +(defsubst w3-insert-terminal-char (character &optional count inherit) + (if w3-terminal-properties + (set-text-properties (point) + (progn + (insert-char (or character ? ) + (or count 1) inherit) + (point)) + w3-terminal-properties) + (insert-char (or character ? ) (or count 1) inherit))) + +(defsubst w3-horizontal-rule-char nil + (or w3-horizontal-rule-char (w3-table-lookup-char t nil t nil))) + +(defun w3-setup-terminal-chars nil + "Try to find the best set of characters to draw table borders with. +On a console, this can trigger some Emacs display bugs. + +Initializes a number of variables: +w3-terminal-properties to either nil or a list of properties including 'face +w3-table-border-chars to one of the the three other vectors" + (interactive) + (setq w3-table-border-chars w3-table-ascii-border-chars + w3-terminal-properties nil) + (cond + ((and w3-use-terminal-characters + (eq (device-type) 'x)) + (if (find-face 'w3-table-hack-x-face) nil + (make-face 'w3-table-hack-x-face) + (font-set-face-font 'w3-table-hack-x-face + (make-font :family "terminal"))) + (cond + ((not (face-differs-from-default-p 'w3-table-hack-x-face)) + nil) + ((and w3-use-terminal-glyphs (fboundp 'face-id)) + (let ((id (face-id 'w3-table-hack-x-face)) + (c (length w3-table-border-chars))) + (while (> (decf c) 0) + (if (aref w3-table-glyph-border-chars c) + (aset standard-display-table (aref w3-table-glyph-border-chars c) + (vector (+ (* 256 id) + (aref w3-table-graphic-border-chars c)))))) + (setq w3-table-border-chars w3-table-glyph-border-chars + w3-terminal-properties nil))) + (t + (setq w3-table-border-chars w3-table-graphic-border-chars + w3-terminal-properties (list 'start-open t + 'end-open t + 'rear-nonsticky t + 'w3-table-border t + 'face 'w3-table-hack-x-face))))) + ((and w3-use-terminal-characters-on-tty + (eq (device-type) 'tty)) + (let ((c (length w3-table-border-chars))) + (while (> (decf c) 0) + (and (aref w3-table-glyph-border-chars c) + (aref w3-table-graphic-border-chars c) + (standard-display-g1 (aref w3-table-glyph-border-chars c) + (aref w3-table-graphic-border-chars c))))) + (setq w3-table-border-chars w3-table-glyph-border-chars + w3-terminal-properties (list 'w3-table-border t))) + (t + nil)) + w3-table-border-chars) + +(defun w3-unsetup-terminal-characters nil + (interactive) + (w3-excise-terminal-characters (buffer-list)) + (standard-display-default 1 15) + (setq w3-table-border-chars w3-table-ascii-border-chars)) + +(defun w3-excise-terminal-characters (buffs) + "Replace hacked characters with ascii characters in buffers BUFFS. +Should be run before restoring w3-table-border-chars to ascii characters. +This will only work if we used glyphs rather than text properties" + (interactive (list (list (current-buffer)))) + (let ((inhibit-read-only t) + (tr (make-string 16 ? )) + (i 0)) + (while (< i (length tr)) + (aset tr i i) + (setq i (1+ i))) + (setq i 0) + (while (< i (length w3-table-border-chars)) + (and (aref w3-table-border-chars i) + (< (aref w3-table-border-chars i) 16) + (aset tr + (aref w3-table-glyph-border-chars i) + (aref w3-table-ascii-border-chars i))) + (setq i (1+ i))) + (mapcar (function (lambda (buf) + (save-excursion + (set-buffer buf) + (if (eq major-mode 'w3-mode) + (translate-region (point-min) + (point-max) + tr))))) + buffs))) + + (defvar w3-display-table-cut-words-p nil "*Whether to cut words that are oversized in table cells") (defvar w3-display-table-force-borders nil - "*Whether to always draw table borders") + "*Whether to always draw table borders +Can sometimes make the structure of a document clearer") (defun w3-display-table-cut () (save-excursion @@ -828,7 +955,7 @@ (w3-do-incremental-display nil) (hr-regexp (concat "^" (regexp-quote - (make-string 5 w3-horizontal-rule-char)) + (make-string 5 (w3-horizontal-rule-char))) "*$")) ) ;;(push 'left w3-display-alignment-stack) @@ -1042,107 +1169,6 @@ ))) (list rows cols ret-vector)))) -(defvar w3-table-ascii-border-chars - [? ? ? ?/ ? ?- ?\\ ?- ? ?\\ ?| ?| ?/ ?- ?| ?-] - "Vector of ascii characters to use to draw table borders. -w3-table-unhack-border-chars uses this to restore w3-table-border-chars.") - -(defvar w3-table-border-chars w3-table-ascii-border-chars - "Vector of characters to use to draw table borders. -If you set this you should set w3-table-ascii-border-chars to the same value -so that w3-table-unhack-borders can restore the value if necessary. - -A reasonable value is [? ? ? ?/ ? ?- ?\\\\ ?^ ? ?\\\\ ?| ?< ?/ ?- ?> ?-] -Though i recommend replacing the ^ with - and the < and > with |") - -(defsubst w3-table-lookup-char (l u r b) - (aref w3-table-border-chars (logior (if l 1 0) - (if u 2 0) - (if r 4 0) - (if b 8 0)))) - -(defun w3-table-hack-borders nil - "Try to find the best set of characters to draw table borders with. -I definitely recommend trying this on X. -On a console, this can trigger some Emacs display bugs. - -I haven't tried this on XEmacs or any window-system other than X." - (interactive) - (case (device-type) - (x - (let ((id (or (and (find-face 'w3-table-hack-x-face) - (face-id 'w3-table-hack-x-face)) - (progn - (make-face 'w3-table-hack-x-face) - (font-set-face-font 'w3-table-hack-x-face - (make-font :family "terminal")) - (face-id 'w3-table-hack-x-face))))) - (if (not (face-differs-from-default-p 'w3-table-hack-x-face)) - nil - (aset standard-display-table 1 (vector (+ (* 256 id) ?l))) - (aset standard-display-table 2 (vector (+ (* 256 id) ?q))) - (aset standard-display-table 3 (vector (+ (* 256 id) ?k))) - (aset standard-display-table 4 (vector (+ (* 256 id) ?t))) - (aset standard-display-table 5 (vector (+ (* 256 id) ?n))) - (aset standard-display-table 6 (vector (+ (* 256 id) ?u))) - (aset standard-display-table 7 (vector (+ (* 256 id) ?m))) - (aset standard-display-table 8 (vector (+ (* 256 id) ?x))) - (aset standard-display-table 11 (vector (+ (* 256 id) ?j))) - (aset standard-display-table 14 (vector (+ (* 256 id) ?v))) - (aset standard-display-table 15 (vector (+ (* 256 id) ?w))) - (setq w3-table-border-chars [? ? ? 11 ? 2 7 14 ? 3 8 6 1 15 4 5]) - (setq w3-horizontal-rule-char 2)))) - (tty - (standard-display-g1 1 108) ; ulcorner - (standard-display-g1 2 113) ; hline - (standard-display-g1 3 107) ; urcorner - (standard-display-g1 4 116) ; leftt - (standard-display-g1 5 110) ; intersection - (standard-display-g1 6 117) ; rightt - (standard-display-g1 7 109) ; llcorner - (standard-display-g1 8 120) ; vline - (standard-display-g1 11 106) ; lrcorner - (standard-display-g1 14 118) ; upt - (standard-display-g1 15 119) ; downt - (setq w3-table-border-chars [? ? ? 11 ? 2 7 14 ? 3 8 6 1 15 4 5]) - (setq w3-horizontal-rule-char 2)) - (otherwise - (error "Unknown window-system, can't do any better than ascii borders"))) - ) - -(defun w3-table-unhack-borders nil - (interactive) - (w3-table-excise-hack (buffer-list)) - (standard-display-default 1 15) - (setq w3-table-border-chars w3-table-ascii-border-chars) - (setq w3-horizontal-rule-char ?-)) - -(defun w3-table-excise-hack (buffs) - "Replace hacked characters with ascii characters in buffers BUFFS. -Should be run before restoring w3-table-border-chars to ascii characters." - (interactive (list (list (current-buffer)))) - (let ((inhibit-read-only t) - (tr (make-string 16 ? )) - (i 0)) - (while (< i (length tr)) - (aset tr i i) - (setq i (1+ i))) - (setq i 0) - (while (< i (length w3-table-border-chars)) - (if (< (aref w3-table-border-chars i) 16) - (aset tr - (aref w3-table-border-chars i) - (aref w3-table-ascii-border-chars i))) - (setq i (1+ i))) - (mapcar (function (lambda (buf) - (save-excursion - (set-buffer buf) - (if (eq major-mode 'w3-mode) - (translate-region (point-min) - (point-max) - tr))))) - buffs))) - (defun w3-display-table (node) (let* ((dimensions (w3-display-table-dimensions node)) (num-cols (max (cadr dimensions) 1)) @@ -1349,11 +1375,12 @@ (setq bflag (/= (aref table-colspans i) 0)) (setq tflag (/= (aref prev-colspans i) 0)) - (insert (w3-table-lookup-char lflag tflag rflag bflag)) + (w3-insert-terminal-char (w3-table-lookup-char lflag tflag rflag bflag)) (setq lflag t) (cond ((= (aref prev-rowspans i) 0) - (insert-char (w3-table-lookup-char t nil t nil) - (aref column-dimensions i)) + (w3-insert-terminal-char + (w3-table-lookup-char t nil t nil) + (aref column-dimensions i)) (setq i (1+ i))) ((car (aref formatted-cols i)) (insert (pop (aref formatted-cols i))) @@ -1365,8 +1392,9 @@ (setq lflag nil) (setq i (+ i (max (aref table-colspans i) (aref prev-colspans i) 1)))))) - (insert (w3-table-lookup-char lflag (/= row 1) nil t) "\n")) - + (w3-insert-terminal-char (w3-table-lookup-char lflag (/= row 1) nil t)) + (insert "\n")) + ;; recalculate height (in case we've shortened a rowspanning cell (setq height 0 i 0) @@ -1377,13 +1405,14 @@ ;; Insert a row back in original buffer (while (> height 0) - (insert fill-prefix (w3-table-lookup-char nil t nil t)) + (insert fill-prefix) + (w3-insert-terminal-char (w3-table-lookup-char nil t nil t)) (setq i 0) (while (< i num-cols) (if (car (aref formatted-cols i)) (insert (pop (aref formatted-cols i))) (insert-char ? (aref table-colwidth i))) - (insert (w3-table-lookup-char nil t nil t)) + (w3-insert-terminal-char (w3-table-lookup-char nil t nil t)) (setq i (+ i (max (aref table-colspans i) 1)))) (insert "\n") ;;(and w3-do-incremental-display (w3-pause)) @@ -1418,12 +1447,15 @@ (let (tflag lflag) (while (< i num-cols) (setq tflag (/= (aref prev-colspans i) 0)) - (insert (w3-table-lookup-char lflag tflag t nil)) + (w3-insert-terminal-char (w3-table-lookup-char lflag tflag t nil)) (setq lflag t) - (insert-char (w3-table-lookup-char t nil t nil) - (aref column-dimensions i)) + (w3-insert-terminal-char + (w3-table-lookup-char t nil t nil) + (aref column-dimensions i)) (setq i (1+ i))) - (insert (w3-table-lookup-char t t nil nil) "\n"))) + (w3-insert-terminal-char + (w3-table-lookup-char t t nil nil)) + (insert "\n"))) ) (pop w3-display-open-element-stack))))) @@ -1708,14 +1740,11 @@ (let* ((perc (or (w3-get-attribute 'width) (w3-get-style-info 'width node) "100%")) - (rule nil) (width nil)) (setq perc (/ (min (string-to-int perc) 100) 100.0) - width (* fill-column perc) - rule (make-string (max (truncate width) 0) - w3-horizontal-rule-char) - node (list 'hr nil (list rule))) - (w3-handle-content node))) + width (truncate (* fill-column perc))) + (w3-insert-terminal-char (w3-horizontal-rule-char) width) + (w3-handle-empty-tag))) (map ; Client side imagemaps (let ((name (or (w3-get-attribute 'name) (w3-get-attribute 'id) @@ -1795,6 +1824,15 @@ (w3-handle-content node) (setq w3-current-isindex (cons action prompt))) ) + ((html body) + (let ((fore (car (delq nil (copy-list w3-face-color)))) + (back (car (delq nil (copy-list w3-face-background-color)))) + ) + (if (and fore font-running-xemacs) + (font-set-face-foreground 'default fore (current-buffer))) + (if (and back font-running-xemacs) + (font-set-face-background 'default back (current-buffer))) + (w3-handle-content node))) (*document (let ((info (mapcar (lambda (x) (cons x (symbol-value x))) w3-persistent-variables))) @@ -1808,7 +1846,10 @@ w3-right-margin) (or w3-maximum-line-length (window-width)))) - (switch-to-buffer (current-buffer)) + (condition-case nil + (switch-to-buffer (current-buffer)) + (error (message "W3 buffer %s is being drawn." (buffer-name (current-buffer))))) + (buffer-disable-undo (current-buffer)) (mapcar (function (lambda (x) (set (car x) (cdr x)))) info) ;; ACK! We don't like filladapt mode! @@ -1879,21 +1920,13 @@ w3-current-form-number) args)) (w3-handle-content node))) -; (keygen -; (w3-form-add-element 'keygen -; (or (w3-get-attribute 'name) -; (w3-get-attribute 'id) -; "keygen") -; nil ; value -; nil ; size -; nil ; maxlength -; nil ; default -; w3-display-form-id ; action -; nil ; options -; w3-current-form-number -; (w3-get-attribute 'id) ; id -; nil ; checked -; (car w3-active-faces))) + (keygen + (w3-form-add-element + (w3-display-normalize-form-info + (cons '(type . "keygen") + args)) + w3-active-faces) + (w3-handle-empty-tag)) (input (w3-form-add-element (w3-display-normalize-form-info args) @@ -1957,8 +1990,7 @@ (w3-handle-empty-tag)))) (textarea (let* ((plist (w3-display-normalize-form-info args)) - (value (w3-normalize-spaces - (apply 'concat (nth 2 node))))) + (value (apply 'concat (nth 2 node)))) (setq plist (plist-put plist 'type 'multiline) plist (plist-put plist 'value value)) (w3-form-add-element plist w3-active-faces)) @@ -2040,11 +2072,13 @@ (defun w3-fixup-eol-faces () ;; Remove 'face property at end of lines - underlining screws up stuff + ;; also remove 'mouse-face property at the beginning and end of lines (let ((inhibit-read-only t)) (save-excursion (goto-char (point-min)) - (while (search-forward "\n" nil t) - (put-text-property (match-beginning 0) (match-end 0) 'face nil))))) + (while (search-forward "[ \t]*\n[ \t]*" nil t) + (remove-text-properties (match-beginning 0) (match-end 0) + '(face nil mouse-face nil) nil))))) (defsubst w3-finish-drawing () (let (url glyph widget) @@ -2065,7 +2099,7 @@ (not (eq (device-type) 'tty)) (w3-fixup-eol-faces)) (let ((inhibit-read-only t)) - (put-text-property (point-min) (point-max) 'read-only nil)) + (remove-text-properties (point-min) (point-max) '(read-only) nil)) (message "Drawing... done")) (defun w3-region (st nd)
--- a/lisp/w3/w3-forms.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3-forms.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine ;; Author: wmperry -;; Created: 1997/03/18 23:20:04 -;; Version: 1.79 +;; Created: 1997/03/25 23:33:51 +;; Version: 1.81 ;; Keywords: faces, help, comm, data, languages ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -49,7 +49,7 @@ (defvar w3-form-keymap (let ((map (copy-keymap global-map)) - (eol-loc (where-is-internal 'end-of-line nil t))) + (eol-loc (where-is-internal 'end-of-line global-map t))) (if widget-keymap (cl-map-keymap (function (lambda (key binding) @@ -100,6 +100,17 @@ (defsubst w3-form-element-set-widget (obj val) (aset obj 8 val)) (defsubst w3-form-element-set-plist (obj val) (aset obj 9 val)) +(defvar w3-form-valid-key-sizes + '( + ("1024 (Premium)" . 1024) + ("896 (Regular)" . 896) + ("768 (Unleaded)" . 768) + ("512 (Low Grade)" . 512) + ("508 (Woos)" . 508) + ("256 (Test Grade)" . 256) + ) + "An assoc list of available key sizes and meaningful descriptions.") + (defun w3-form-determine-size (el size) (case (w3-form-element-type el) (checkbox 3) @@ -125,6 +136,12 @@ (lambda (x y) (>= (length (car x)) (length (car y))))))))))) + (keygen + (+ (length "Key Length: ") + (apply 'max + (mapcar (function (lambda (pair) + (length (car pair)))) + w3-form-valid-key-sizes)))) (otherwise (or size 22)))) ;;###autoload @@ -348,32 +365,21 @@ :must-match t :value (w3-form-element-value el))) -(defvar w3-form-valid-key-sizes - '( - ("1024 (Premium)" . 1024) - ("896 (Regular)" . 896) - ("768 (Unleaded)" . 768) - ("512 (Low Grade)" . 512) - ("508 (Woos)" . 508) - ("256 (Test Grade)" . 256) - ) - "An assoc list of available key sizes and meaningful descriptions.") - (defun w3-form-create-keygen-list (el face) - (let ((tmp w3-form-valid-key-sizes) - (longest 0) - (options nil)) - (while tmp - (if (> (length (caar tmp)) longest) - (setq longest (length (caar tmp)))) - (setq options (cons (list 'choice-item :tag (caar tmp) - :value (cdar tmp)) options) - tmp (cdr tmp))) + (let* ((size (apply 'max (mapcar (function (lambda (pair) (length (car pair)))) + w3-form-valid-key-sizes))) + (options (mapcar (function (lambda (pair) + (list 'choice-item + :format "%[%t%]" + :menu-tag-get `(lambda (zed) ,(car pair)) + :tag (mule-truncate-string (car pair) size ? ) + :value (cdr pair)))) + w3-form-valid-key-sizes))) (apply 'widget-create 'menu-choice :value 1024 :ignore-case t :tag "Key Length" - :size (1+ longest) + :size size :button-face face :value-face face options))) @@ -795,9 +801,15 @@ (assoc (widget-value widget) (w3-form-element-options formobj))))) (keygen - (cons (w3-form-element-name formobj) - (format "Should create a %d bit RSA key" - (widget-value widget)))) + (condition-case () + (require 'ssl) + (error (error "Not configured for SSL, please read the info pages."))) + (if (fboundp 'ssl-req-user-cert) nil + (error "This version of SSL isn't capable of requesting certificates.")) + (let ((challenge (plist-get (w3-form-element-plist formobj) 'challenge)) + (size (widget-value widget))) + (cons (w3-form-element-name formobj) + (ssl-req-user-cert size challenge)))) ((multiline hidden) (cons (w3-form-element-name formobj) (w3-form-element-value formobj)))
--- a/lisp/w3/w3-menu.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3-menu.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-menu.el --- Menu functions for emacs-w3 ;; Author: wmperry -;; Created: 1997/03/18 00:45:01 -;; Version: 1.34 +;; Created: 1997/03/22 17:31:47 +;; Version: 1.35 ;; Keywords: menu, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -45,8 +45,8 @@ (defvar w3-links-menu nil "Menu for w3-mode in XEmacs.") (make-variable-buffer-local 'w3-links-menu) -(defvar w3-use-menus '(file edit view go bookmark options buffers style - emacs nil help) +(defcustom w3-use-menus '(file edit view go bookmark options buffers style + emacs nil help) "*Non-nil value causes W3 to provide a menu interface. A value that is a list causes W3 to install its own menubar. A value of 1 causes W3 to install a \"W3\" item in the Emacs menubar. @@ -75,7 +75,20 @@ NOTE! The current port of Emacs to Windows NT/95 does not support buttons in the menubar, so the 'emacs' keyword is currently ignored -on that platform.") +on that platform." + :group 'w3-menus + :type '(set (const :tag "File related commands" :value file) + (const :tag "Standard editing commands" :value edit) + (const :tag "View document information" :value view) + (const :tag "Navigation" :value go) + (const :tag "Bookmarks" :value bookmark) + (const :tag "Options" :value options) + (const :tag "Buffer list" :value buffers) + (const :tag "Stylesheet information" :value style) + (const :tag "Search engines" :value search) + (const :tag "Toggle to default menus" :value emacs) + (const :tag "Separator" :value nil) + (const :tag "Help" :value help))) (defun w3-menu-hotlist-constructor (menu-items) (or (cdr w3-html-bookmarks)
--- a/lisp/w3/w3-mouse.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3-mouse.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ -;;; w3-xemac.el --- XEmacs specific functions for emacs-w3 +;;; w3-menu.el --- Mouse specific functions for emacs-w3 ;; Author: wmperry -;; Created: 1997/02/13 23:05:39 -;; Version: 1.7 +;; Created: 1997/03/23 03:08:58 +;; Version: 1.8 ;; Keywords: mouse, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--- a/lisp/w3/w3-prefs.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3-prefs.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-prefs.el --- Preferences panels for Emacs-W3 ;; Author: wmperry -;; Created: 1997/03/14 23:49:47 -;; Version: 1.20 +;; Created: 1997/03/21 15:52:22 +;; Version: 1.23 ;; Keywords: hypermedia, preferences ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -304,7 +304,9 @@ (setq host proxy-entry port nil)) (set (make-local-variable host-var) (or host "")) - (set (make-local-variable port-var) (or port ""))))) + (set (make-local-variable port-var) (or port "")))) + (set (make-local-variable 'w3-preferences-temp-no-proxy) + (cdr-safe (assoc "no_proxy" url-proxy-services)))) (defun w3-preferences-create-proxy-panel () (let ((proxies '("FTP" "Gopher" "HTTP" "Security" "WAIS" "SHTTP" "News")) @@ -335,6 +337,14 @@ :value (format "%5s" (symbol-value port-var))) 'variable port-var) (widget-insert "\n\n")) + (widget-insert " No proxy: ") + (widget-put + (widget-create 'editable-field + :size 40 + :value-face 'underline + :notify 'w3-preferences-generic-variable-callback + :value (or (symbol-value 'w3-preferences-temp-no-proxy) "")) + 'variable 'w3-preferences-temp-no-proxy) (widget-setup))) (defun w3-preferences-save-proxy-panel () @@ -346,6 +356,12 @@ (host nil) (port nil) (new-proxy-services nil)) + (if (/= 0 (length (symbol-value 'w3-preferences-temp-no-proxy))) + (setq new-proxy-services (cons + (cons + "no_proxy" + (symbol-value 'w3-preferences-temp-no-proxy)) + new-proxy-services))) (while proxies (setq proxy (car proxies) proxies (cdr proxies)
--- a/lisp/w3/w3-toolbar.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3-toolbar.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-toolbar.el --- Toolbar functions for emacs-w3 ;; Author: wmperry -;; Created: 1997/02/03 15:38:24 -;; Version: 1.8 +;; Created: 1997/03/26 00:01:47 +;; Version: 1.9 ;; Keywords: mouse, toolbar ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -163,7 +163,8 @@ (expand-file-name "w3" data-directory)))) (cond ((not (file-exists-p w3-toolbar-icon-directory)) - (w3-warn 'files "Toolbar directory does not exist.")) + (and w3-running-xemacs + (w3-warn 'files "Toolbar directory does not exist."))) ((not (fboundp 'toolbar-make-button-list)) nil) ((eq w3-toolbar-type 'text)
--- a/lisp/w3/w3-vars.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3-vars.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-vars.el,v --- All variable definitions for emacs-w3 ;; Author: wmperry -;; Created: 1997/03/20 18:03:49 -;; Version: 1.112 +;; Created: 1997/03/26 20:12:26 +;; Version: 1.116 ;; Keywords: comm, help, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -33,7 +33,7 @@ (require 'w3-cus) ; Grab everything that is customized (defconst w3-version-number - (let ((x "p3.0.71")) + (let ((x "p3.0.75")) (if (string-match "State:[ \t\n]+.\\([^ \t\n]+\\)" x) (setq x (substring x (match-beginning 1) (match-end 1))) (setq x (substring x 1))) @@ -41,7 +41,7 @@ (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x "")) "Version # of w3-mode.") -(defconst w3-version-date (let ((x "1997/03/20 18:03:49")) +(defconst w3-version-date (let ((x "1997/03/26 20:12:26")) (if (string-match "Date: \\([^ \t\n]+\\)" x) (substring x (match-beginning 1) (match-end 1)) x))
--- a/lisp/w3/w3-widget.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3-widget.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-widget.el --- An image widget ;; Author: wmperry -;; Created: 1997/03/11 15:40:22 -;; Version: 1.23 +;; Created: 1997/03/26 15:31:17 +;; Version: 1.27 ;; Keywords: faces, images ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -147,7 +147,8 @@ (cdr-safe (assoc usemap w3-imagemaps))))) (defun widget-image-callback (widget widget-ignore &optional event) - (and (widget-get widget 'href) (w3-fetch (widget-get widget 'href) (widget-get widget 'target)))) + (if (widget-get widget 'href) + (w3-fetch (widget-get widget 'href) (widget-get widget 'target)))) (defmacro widget-image-create-subwidget (&rest args) (` (widget-create (,@ args) @@ -158,37 +159,6 @@ 'src (widget-get widget 'src) 'ismap server-map))) -(defun widget-image-emacspeak-tty-imagemap (usemap) - (let* ((default nil) - (href nil) - (tag nil) - (options (delete - nil - (mapcar - (function - (lambda (x) - (if (eq (aref x 0) 'default) - (setq default (aref x 2))) - (if (and (not default) (stringp (aref x 2))) - (setq default (aref x 2))) - (setq tag (or (aref x 3) (aref x 2)) - href (aref x 2)) - (and (stringp tag) - (stringp href) - (list 'a - (list - (cons 'href href) - (cons - 'class - (list - (if (url-have-visited-url href) - ":visited" ":link")))) - (list tag))))) - usemap)))) - (w3-display-node (list 'table '((border . "1")) - (w3-display-chop-into-table - (list nil nil options) 3))))) - (defun widget-image-value-create (widget) ;; Insert the printed representation of the value (let ( @@ -218,35 +188,32 @@ (goto-char where) (cond (client-map - (if (featurep 'emacspeak) - (widget-image-emacspeak-tty-imagemap client-map) - (let* ((default nil) - (href nil) - (tag nil) - (options (mapcar - (function - (lambda (x) - (if (eq (aref x 0) 'default) - (setq default (aref x 2))) - (if (and (not default) (stringp (aref x 2))) - (setq default (aref x 2))) - (list 'choice-item - :format "%[%t%]" - :tag (or (aref x 3) (aref x 2)) - :value (aref x 2)))) client-map))) - (setq real-widget - (apply 'widget-create 'menu-choice - :tag (or (widget-get widget :tag) "Imagemap") - :notify (widget-get widget :notify) - :action (widget-get widget :action) - :value default - :parent widget - :help-echo 'widget-image-summarize - options))))) + (let* ((default nil) + (options (mapcar + (function + (lambda (x) + (if (eq (aref x 0) 'default) + (setq default (aref x 2))) + (if (and (not default) (stringp (aref x 2))) + (setq default (aref x 2))) + (list 'choice-item + :format "%[%t%]" + :tag (or (aref x 3) (aref x 2)) + :value (aref x 2)))) client-map))) + (setq real-widget + (apply 'widget-create 'menu-choice + :tag (or (widget-get widget :tag) "Imagemap") + :ignore-case t + :notify (widget-get widget :notify) + :action (widget-get widget :action) + :value default + :parent widget + :help-echo 'widget-image-summarize + options)))) ((and server-map (stringp href)) (setq real-widget (widget-image-create-subwidget - 'push-button + 'item :format "%[%t%]" :tag alt :delete 'widget-default-delete :value href @@ -255,7 +222,8 @@ (href (setq real-widget (widget-image-create-subwidget - 'push-button :tag (or alt "Image") + 'item :format "%[%t%]" + :tag (or alt "Image") :value href :delete 'widget-default-delete :action (widget-get widget :action) @@ -263,7 +231,8 @@ (alt (setq real-widget (widget-image-create-subwidget - 'push-button :tag alt :format "%[%t%]" + 'item :format "%[%t%]" + :tag alt :tab-order -1 :delete 'widget-default-delete :action (widget-get widget :action) @@ -279,6 +248,7 @@ (widget-put widget :children nil) (set-extent-property extent 'keymap widget-image-keymap) (set-extent-property extent 'begin-glyph glyph) + (set-extent-property extent 'detachable t) (set-extent-property extent 'help-echo (cond ((and href (or client-map server-map)) @@ -329,12 +299,10 @@ (usemap (widget-image-usemap widget)) (href (widget-get widget 'href)) (alt (widget-get widget 'alt)) - (value (widget-value widget)) - (i nil)) + (value (widget-value widget))) (cond (usemap - (setq i (length usemap) - usemap (widget-image-usemap-default usemap)) + (setq usemap (widget-image-usemap-default usemap)) ;; Perhaps we should do something here with showing the # of entries ;; in the imagemap as well as the default href? Could get too long. (format "Client side imagemap: %s" value)) @@ -366,7 +334,6 @@ (href (widget-get widget 'href)) (img-src (or (widget-get widget 'src) (and widget-changed (widget-get widget-changed 'src)))) - (value (widget-value widget)) (target (widget-get widget 'target)) ) (cond @@ -383,7 +350,8 @@ (cons (or (aref entry 3) (aref entry 2)) (aref entry 2)))) usemap)) - (choice nil)) + (choice nil) + (case-fold-search t)) (setq choice (completing-read "Imagemap: " choices nil t) choice (cdr-safe (assoc choice choices))) (and (stringp choice) (w3-fetch choice target))))
--- a/lisp/w3/w3.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/w3/w3.el Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions ;; Author: wmperry -;; Created: 1997/03/18 20:31:29 -;; Version: 1.100 +;; Created: 1997/03/26 00:02:30 +;; Version: 1.103 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -183,7 +183,9 @@ (pop-to-buffer buff) (delete-other-windows)) ((eq w3-notify 'semibully) - (switch-to-buffer buff)) + (condition-case nil + (switch-to-buffer buff) + (error (message "W3 buffer %s is ready." (buffer-name buff))))) ((eq w3-notify 'aggressive) (pop-to-buffer buff)) ((eq w3-notify 'friendly) @@ -1998,6 +2000,8 @@ (setq url-package-version w3-version-number url-package-name "Emacs-W3") + (w3-setup-terminal-chars) + (w3-emit-image-warnings-if-necessary) (cond @@ -2203,7 +2207,8 @@ (w3-preview-this-buffer) (let ((tmp (mapcar (function (lambda (x) (cons x (symbol-value x)))) w3-persistent-variables))) - (kill-all-local-variables) + ;; Oh gross, this kills buffer-local faces in XEmacs + ;;(kill-all-local-variables) (use-local-map w3-mode-map) (setq major-mode 'w3-mode) (setq mode-name "WWW")
--- a/lisp/x11/x-menubar.el Mon Aug 13 09:21:56 2007 +0200 +++ b/lisp/x11/x-menubar.el Mon Aug 13 09:23:06 2007 +0200 @@ -1413,7 +1413,8 @@ (items (cdr mode-popup-menu)) filters) ;; Strip keywords from local menu for attaching them at the top - (while (not (vectorp (car items))) + (while (and items + (symbolp (car items))) (setq items (append filters (list (car items)))) (setq items (cdr items))) ;; If filters contains a keyword already present in
--- a/man/ChangeLog Mon Aug 13 09:21:56 2007 +0200 +++ b/man/ChangeLog Mon Aug 13 09:23:06 2007 +0200 @@ -1,3 +1,11 @@ +Sun Mar 23 15:47:05 1997 Steven L Baur <steve@altair.xemacs.org> + + * Makefile (srcs): Add efs.texi. + +Sat Mar 22 16:39:16 1997 Steven L Baur <steve@altair.xemacs.org> + + * Makefile (srcs): Add hm--html-mode.texi. + Sun Mar 16 18:48:14 1997 Steven L Baur <steve@altair.xemacs.org> * gnats/Makefile (gnats_srcs): New manuals for GNATS.
--- a/man/Makefile Mon Aug 13 09:21:56 2007 +0200 +++ b/man/Makefile Mon Aug 13 09:23:06 2007 +0200 @@ -39,10 +39,11 @@ ../info/%.info : %.texi -$(MAKEINFO) -o $@ $< -srcs = cc-mode cl custom ediff external-widget forms gnus \ - hyperbole ilisp info ispell mailcrypt message mh-e oo-browser \ - pcl-cvs psgml psgml-api rmail standards supercite term \ - termcap texinfo vhdl-mode viper vm w3 widget xemacs-faq +srcs = cc-mode cl custom ediff efs external-widget forms gnus \ + hm--html-mode \ + hyperbole ilisp info ispell mailcrypt message mh-e oo-browser \ + pcl-cvs psgml psgml-api rmail standards supercite term \ + termcap texinfo vhdl-mode viper vm w3 widget xemacs-faq info = $(srcs:%=../info/%.info) dvi = $(srcs:%=%.dvi)
--- a/man/custom.texi Mon Aug 13 09:21:56 2007 +0200 +++ b/man/custom.texi Mon Aug 13 09:23:06 2007 +0200 @@ -13,7 +13,7 @@ @comment node-name, next, previous, up @top The Customization Library -Version: 1.65 +Version: 1.68 @menu * Introduction:: @@ -620,8 +620,9 @@ When you save the customizations, call to @code{custom-set-variables}, @code{custom-set-faces} are inserted into the file specified by @code{custom-file}. By default @code{custom-file} is your @file{.emacs} -file. The two functions will initialize variables and faces as you have -specified. +file. If you use another file, you must explicitly load it yourself. +The two functions will initialize variables and faces as you have +specified. @node Wishlist, , The Init File, Top @comment node-name, next, previous, up
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/efs.texi Mon Aug 13 09:23:06 2007 +0200 @@ -0,0 +1,1688 @@ +\input texinfo @c -*-texinfo-*- +@comment %**start of header (This is for running Texinfo on a region.) +@setfilename efs.info +@settitle EFS +@comment %**end of header (This is for running Texinfo on a region.) + +@synindex fn vr + +@node Top, What is EFS?, (dir), (dir) +@comment node-name, next, previous, up +@ifinfo +@unnumbered EFS + +This file documents EFS, a system for transparent file-transfer +between remote hosts using the FTP protocol within Emacs. + +This info is for version 1.15 of EFS. + +Documentation version: 1.0 + +Copyright @copyright{} 1991, 1992 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries a copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +@end ignore +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. +@end ifinfo + +@titlepage +@sp5 +@center @titlefont{EFS} +@center version 1.15 +@sp2 +@center A transparent remote file system, by Sandy Rutherford and Andy Norman +@sp7 +@center This documentation based on ange-ftp documentation by David Smith +@center and on documentation in the EFS source code +@center It was put together by Mike Sperber. + +This documentation is definitely incomplete and parts of it may be +outright incorrect or out-of-date. + +@center info-version 1.0 +@page +@vskip 0pt plus 1filll +Copyright @copyright{} 1991, 1992 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. +@end titlepage + +@menu +* What is EFS?:: +* Installing EFS:: Where to find it, and how to use it. +* Using EFS:: EFS -- a users' guide. +* Getting help:: Mailing lists and newsgroups. +* Bugs:: Known bugs, and a wish list. + +Indices: +* Concept Index:: +* Variable and function index:: +@end menu + + +@node What is EFS?, Installing EFS, Top, Top +@comment node-name, next, previous, up +@chapter Introducing EFS + +EFS is a system for transparent file-transfer between remote UNIX, +Guardian, DOS, Macintosh, KA9Q, Netware, NOS/VE, Plan 9, TI Explorer, +Twenex, TOPS 20, VOS, MPE, MVS, VMS, CMS or MTS hosts using FTP. This +means that you can edit, copy and otherwise manipulate files on any +machine you have access to from within Emacs as if it were a local +file. EFS works by introducing an extended filename syntax, and +overloading functions such as @code{insert-file-contents} so that +accessing a remote file causes appropriate commands to be sent to an FTP +process. EFS includes and enhanced version of Dired to facilitate +directory browsing and multiple file transfer from remote hosts. + +The authors of EFS are Sandy Rutherford (@code{sandy@@math.ubc.ca}) and +Andy (Ange) Norman (@code{ange@@hplb.hpl.hp.com}). EFS is partly based +on an earlier package called ange-ftp. The integration of EFS 1.15 into +XEmacs and numerous bug fixes were done by Mike Sperber +(@code{sperber@@informatik.uni-tuebingen.de}). + +@ifinfo +Many people have sent in enhancements for ange-ftp and EFS. +Members of the ange-ftp and EFS Hall of Fame include: + +@itemize @bullet +@item +Many thanks to Roland McGrath for improving the filename syntax handling, +for suggesting many enhancements and for numerous cleanups to the code. + +@item +Thanks to Jamie Zawinski for bugfixes and for ideas such as gateways. + +@item +Thanks to Ken Laprade for improved @file{.netrc} parsing and password +reading, and Dired/shell autoloading. + +@item +Thanks to Sebastian Kremer for tree dired support and for many ideas and +bugfixes. + +@item +Thanks to Joe Wells for bugfixes, non-UNIX system support, VOS support, +and hostname completion. + +@item +Thanks to Nakagawa Takayuki for many good ideas, filename-completion, help +with file-name expansion, efficiency worries, stylistic concerns and many +bugfixes. + +@item +Also, thanks to Rob Austein, Doug Bagley, Andy Caiger, Jim Franklin, +Noah Friedman, Aksnes Knut-Havard, Elmar Heeb, John Interrante, Roland +McGrath, Jeff Morgenthaler, Mike Northam, Jens Petersen, Jack Repenning, +Joerg-Martin Schwarz, Michael Sperber, Svein Tjemsland, Andy Whitcroft, +Raymond A. Wiker and many others whose names have been forgotten who +have helped to debug and fix problems. +@end itemize +@end ifinfo + +Finally, this info file was put together by Mike Sperber +(@code{sperber@@informatik.uni-tuebingen.de}) from an ange-ftp info file +written by Dave Smith (@code{dsmith@@stats.adelaide.edu.au}) and the EFS +source code. + +@node Installing EFS, Using EFS, What is EFS?, Top +@comment node-name, next, previous, up +@chapter Installing EFS + +At the time of writing of this documentation, the version of EFS +distributed with XEmacs (this means the EFS running on XEmacs +19.15/20.1) is the latest version available. It includes many bugfixes +and some enhancements over the last separately released version of EFS, +1.15. This situation will change once a new version of EFS is +available. + +Generally, EFS is pretty easy to get hold of. FTP is the probably the +simplest method, but other options such as mail are available. + +Once you have the Emacs-Lisp source, there are a few customisations you +might need to make. The ideal configuration is to have the FTP process running +on the same machine as you are running Emacs on, but this is not always +possible since some machines cannot access hosts outside the local +network. In this case, the FTP process needs to be run on a machine +which @emph{does} have access to the local world --- this is called the +@strong{gateway host}. EFS has facilities to make use of a +gateway host when accessing remote hosts. + +@menu +* Obtaining source code:: Where to find the EFS source. +* Installing source:: Where to put it, how to load it. +* Using a gateway:: If your local machine has limited access. +* Setting up a gateway:: +* Gateway types:: +* Gateway problems:: +* Other options:: More user variables to twiddle. +@end menu + +@node Obtaining source code, Installing source, Installing EFS, Installing EFS +@section How to get the EFS source code +@comment node-name, next, previous, up + +The latest separately distributed version of EFS should always be +available from Andy Norman's home page at +@example +http://www-uk.hpl.hp.com/people/ange/efs +@end example + +There are also some ftp locations: + +@table @b +@item Switzerland +@example +/anonymous@@itp.ethz.ch:/sandy/efs/ +@end example + +@item Massachusetts, USA +@example +/anonymous@@alpha.gnu.ai.mit.edu:/efs/ +@end example + +@item California, USA +@example +/anonymous@@ftp.hmc.edu:/pub/emacs/packages/efs/ +@end example +@end table + +Failing these, someone on the EFS mailing list (@xref{Getting help}) may +be able to help you find the latest version. + +@node Installing source, Using a gateway, Obtaining source code, Installing EFS +@comment node-name, next, previous, up +@section Installing the source + +For byte compiling the EFS package, a @file{Makefile} is provided. You +should follow the instructions at the top of the @file{Makefile}. If +you have any problems, please let us know so that we can fix them for +other users. Don't even consider using eFS without byte compiling it. It +will be far too slow. + +If you decide to byte compile efs by hand, it is important that the file +@file{efs-defun.el} be byte compiled first, followed by @file{efs.el}. +The other files may be byte compiled in any order. + +To use EFS, simply put the byte compiled files in your load path +and add + +@example +(require 'efs) +@end example + +in your @file{.emacs} file. Note this takes awhile, and some users have +found this to be unbearably slow. Therefore ... + +If you would like efs to be autoloaded when you attempt to access +a remote file, put + +@example +(require 'efs-auto) +@end example + +in your @file{.emacs} file. Note that there are some limitations associated +with autoloading EFS. A discussion of them is given at the top of +@file{efs-auto.el}. + +Note that, in XEmacs, EFS automatically loads @file{efs-auto} when the +user accesses a remote file. Therefore, no additional @code{require} +statements should be necessary to use EFS. Just fire away ... + +The above instructions should allow you to access all hosts that your +local machine can access. If your local host has limited access, +however, you may wish to have EFS working through a gateway +machine. If so, read on. Otherwise, @xref{Using EFS} to get started +using EFS. + +@node Using a gateway, Setting up a gateway, Installing source, Installing EFS +@comment node-name, next, previous, up +@section Using a gateway + +Sometimes it is necessary for the FTP process to be run on a different +machine than the machine running Emacs. This can happen when the +local machine has restrictions on what hosts it can access. + +Suppose you are running Emacs (and EFS, of course) on a machine X +(let's call it the `local host') and you want to access a file on a +machine Z (which we will call the `remote host'). Unfortunately, X does +not have FTP access to Z: when you try a manual FTP something like +the following happens: +@example +X$ ftp Z.foo.bar.com +ftp: connect: Host is unreachable +@end example +@noindent +However, X @emph{does} have access to a machine Y (the `gateway +machine') which @emph{can} access Z. Fortunately, you have an account on +the gateway machine, and so the solution is to login to Y, ftp to Z, +download the file you want from Z to Y, and then copy it from Y to the +local host, X. This can get a bit tedious, to say the least, but +fortunately EFS can do all the hard work for you. + +@node Setting up a gateway, Gateway types, Using a gateway, Installing EFS +@comment node-name, next, previous, up +@section Setting up a gateway + +@enumerate + +@item +Set the variable @code{efs-gateway-host} to the name of a machine +@vindex efs-gateway-host +that doesn't have the access restrictions. If you need to use a +nonstandard port to access this host for gateway use, then specify +@code{efs-gateway-host} as @code{<hostname>#<port>}. + +@item +Set the variable @code{efs-ftp-local-host-regexp} to a regular +expression +@vindex efs-ftp-local-host-regexp +that matches hosts that can be contacted from running a local ftp +process, but fails to match hosts that can't be accessed locally. + +For example: + +@example + "\\.hp\\.com$\\|^[^.]*$" +@end example + +will match all hosts that are in the @t{.hp.com} domain, or don't have +an explicit domain in their name, but will fail to match hosts with +explicit domains or that are specified by their ip address. + +@item +Set the variable @code{efs-local-host-regexp} to machines that you have +@vindex efs-local-host-regexp +direct TCP/IP access. In other words, you must be able to ping these +hosts. Usually, @code{efs-ftp-local-host-regexp} and +@code{efs-local-host-regexp} will be the same. However, they will +differ for so-called transparent gateways. See below for more +details. + +@item +Set the variable @code{efs-gateway-tmp-name-template} to the name of +@vindex efs-gateway-tmp-name-template +a directory plus an identifying filename prefix for making temporary +files on the gateway. For example: @code{"/tmp/hplose/ange/efs"} + +@item +If the gateway and the local host share cross-mounted directories, +set the value of @code{efs-gateway-mounted-dirs-alist} accordingly. It +@vindex efs-gateway-mounted-dirs-alist +is particularly useful, but not mandatory, that the directory +of @code{efs-gateway-tmp-name-template} be cross-mounted. +@vindex efs-gateway-tmp-name-template + +@item +Set the variable @code{efs-gateway-type} to the type gateway that you have. +This variable is a list, the first element of which is a symbol +denoting the type of gateway. +@end enumerate + +@node Gateway types, Gateway problems, Setting up a gateway, Installing EFS +@comment node-name, next, previous, up +@section Supported gateway types + +@vindex efs-gateway-type + +@table @samp + +@item local +This means that your local host is itself the gateway. However, +it is necessary to use a different FTP client to gain access to +the outside world. If the name of the FTP client were @t{xftp}, you might +set @code{efs-gateway-type} to + +@example +(list 'local "xftp" efs-ftp-program-args) +@end example + +If @t{xftp} required special arguments, then give them in place of +@t{efs-ftp-program-args}. +@vindex efs-ftp-program-args + +@item proxy + +This indicates that your gateway works by first FTP'ing to it, and +then issuing a @code{USER} command of the form + +@example +USER <username>@@<host> +@end example + +In this case, you might set @code{efs-gateway-type} to + +@example +(list 'proxy "ftp" efs-ftp-program-args) +@end example + +If you need to use a nonstandard client, such as @t{iftp}, give this +@pindex iftp +instead of @t{ftp}. If this client needs to take special arguments, +give them instead of @t{efs-ftp-program-args}. + +@item remsh + +For this type of gateway, you need to start a remote shell on +your gateway, using either @t{remsh} or @t{rsh}. You should set +@pindex remsh +@pindex rsh +@sc{efs-gateway-type} to something like + +@example +(list 'remsh "remsh" nil "ftp" efs-ftp-program-args) +@end example + +If you use @t{rsh} instead of @r{remsh}, change the second element from +@code{"remsh"} to @code{"rsh"}. Note that the symbol indicating the gateway +type should still be @code{'remsh}. If you want to pass arguments +to the remsh program, give them as the third element. For example, +if you need to specify a user, make this @code{(list "-l" "sandy")}. +If you need to use a nonstandard FTP client, specify that as the fourth +element. If your FTP client needs to be given special arguments, +give them instead of @code{efs-ftp-program-args}. + +@item interactive + +This indicates that you need to establish a login on the gateway, +using either @t{telnet} or @t{rlogin}. +@pindex telnet +@pindex rlogin +You should set @code{efs-gateway-type} to something like + +@example +(list 'interactive "rlogin" nil "exec ftp" efs-ftp-program-args) +@end example + +If you need to use @t{telnet}, then give @code{"telnet"} in place of the second +element @code{"rlogin"}. If your login program needs to be given arguments, +then they should be given in the third slot. The fourth element +is for the name of the FTP client program. Giving this as @code{"exec ftp"}, +instead of @code{"ftp"}, ensures that you are logged out if the FTP client +dies. If the FTP client takes special arguments, give these instead +of @code{efs-ftp-program-args}. Furthermore, you should see the documentation +at the top of @file{efs-gwp.el}. You may need to set the variables +@code{efs-gwp-setup-term-command}, and @code{efs-gwp-prompt-pattern}. +@vindex efs-gwp-setup-term-command +@vindex efs-gwp-prompt-pattern + +@item raptor +This is a type of gateway where efs is expected to specify a gateway +user, and send a password for this user using the @code{ACCOUNT} command. +For example, to log in to @samp{foobar.edu} as sandy, while using the account +ange on the gateway, the following commands would be sent: + +@example +open raptorgate.com +quote USER sandy@@foobar.edu ange +quote pass <sandy's password on foobar> +quote account <ange's password on raptorgate> +@end example + +For such a gateway, you would set @code{efs-gateway-type} to + +@example +(list 'raptor efs-ftp-program efs-ftp-program-args <GATEWAY USER>) +@end example + +where @code{<GATEWAY USER>} is the name of your account on the gateway. In +the above example, this would be @code{"ange"}. You can set your gateway +password by simply setting an account password for the gateway host. +This can be done with either efs-set-account, or within your .netrc +file. If no password is set, you will be prompted for one. + +@item interlock +This is a type of gateway where you are expected to send a PASS +command after opening the connection to the gateway. +The precise login sequence is + +@example +open interlockgate +quote PASS <sandy's password on interlockgate> +quote USER sandy@@foobar.edu +quote PASS <sandy's password on foobar.edu> +@end example + +For such a gateway, you should set @code{efs-gateway-type} to + +@example +(list 'interlock efs-ftp-program efs-ftp-program-args) +@end example + +If you need to use a nonstandard name for your FTP client, +then replace @code{efs-ftp-program} with this name. If your FTP client +needs to take nonstandard arguments, then replace @code{efs-ftp-program-args} +with these arguments. + +If your gateway returns both a 220 code and a 331 code to the +@code{"open interlockgate"} command, then you should add a regular +expression to @code{efs-skip-msgs} that matches the 220 response. +Returning two response codes to a single FTP command is not permitted +in RFC 959. It is not possible for efs to ignore the 220 by default, +because than it would hang for interlock installations which do not +require a password. + +@item kerberos +With this gateway, you need to authenticate yourself by getting a +kerberos "ticket" first. Usually, this is done with the kinit program. +Once authenticated, you connect to @samp{foobar.com} as user sandy with the +sequence: (Note that the @code{"-n"} argument inhibits automatic login. +Although, in manual use you probably don't use it, EFS always uses it.) + +@example +iftp -n +open foobar.com +user sandy@@foobar.com +@end example +@pindex iftp + +You should set @code{efs-gateway-type} to something like + +@example +(list 'kerberos "iftp" efs-ftp-program-args "kinit" <KINIT-ARGS>) +@end example + +If you use an FTP client other than @t{iftp}, insert its name instead of +@code{"iftp"} above. If your FTP client needs special arguments, give +them as a list of strings in place of @code{efs-ftp-program-args}. If +the program that you use to collect a ticket in not called +@code{"kinit"}, then give its name in place of @code{"kinit"} above. +@code{<KINIT-ARGS>} should be any arguments that you need to pass to +your kinit program, given as a list of strings. Most likely, you will +give this as nil. + +See the file @file{efs-kerberos.el} for more configuration variables. If you +need to adjust any of these variables, please report this to us so that +we can fix them for other users. + +If EFS detects that you are not authenticated to use the gateway, it +will run the kinit program automatically, prompting you for a password. +If you give a password in your @file{.netrc} file for login the value of +@code{efs-gateway-host} and user @t{kerberos}, then EFS will use this to +obtain gateway authentication. + +@item Transparent gateways + +If your gateway is completely transparent (for example it uses socks), +then you should set @code{efs-gateway-type} to @code{nil}. Also, set +@code{efs-ftp-local-host-regexp} to @code{".*"}. However, +@code{efs-local-host-regexp}, must still be set to a regular expression +matching hosts in your local domain. EFS uses this to determine which +machines that it can open-network-stream to. Furthermore, you should +still set @code{efs-gateway-host} to the name of your gateway machine. +That way EFS will know that this is a special machine having direct +TCP/IP access to both hosts in the outside world, and hosts in your +local domain. + +@end table + + + +@node Gateway problems, Other options, Gateway types, Installing EFS +@comment node-name, next, previous, up +@section Common Problems with Gateways + +@subsection Spurious 220 responses + +Some proxy-style gateways (eg gateway type @code{'proxy} or @code{'raptor}), +return two 3-digit FTP reply codes to the @code{USER} command. +For example: + +@example +open gateway.weird +220 Connected to gateway.weird +quote USER sandy@@foobar +220 Connected to foobar +331 Password required for sandy +@end example + +This is wrong, according to the FTP Protocol. Each command must return +exactly one 3-digit reply code. It may be preceded by continuation +lines. What should really be returned is: + +@example +quote USER sandy@@foobar +331-Connected to foobar. +331 Password required for sandy. +@end example + +or even + +@example +quote USER sandy@@foobar +331-220 Connected to foobar. +331 Password required for sandy. +@end example + +Even though the @samp{"331-220"} looks strange, it is correct protocol, +and EFS will parse it properly. + +If your gateway is returning a spurious 220 to @code{USER}, a work-around +is to add a regular expression to @code{efs-skip-msgs} that matches +@vindex efs-skip-msgs +this line. It must not match the 220 line returned to the open +command. This work-around may not work, as some system FTP clients +also get confused by the spurious 220. In this case, the only +solution is to patch the gateway server. In either case, please +send a bug report to the author of your gateway software. + +@subsection Case-sensitive parsing of FTP commands + +Some gateway servers seem to treat FTP commands case-sensitively. +This is incorrect, as RFC 959 clearly states that FTP commands +are always to be case-insensitive. If this is a problem with your +gateway server, you should send a bug report to its author. +If efs is using a case for FTP commands that does not suit your server, +a possible work-around is to edit the efs source so that the required +case is used. However, we will not be making any changes to the +standard EFS distribution to support this type of server behaviour. +If you need help changing the efs source, you should enquire with the +efs-help mailing list. + +@node Other options, , Gateway problems, Installing EFS +@comment node-name, next, previous, up +@section Other user options + +Here are other user options available in EFS: + +@code{efs-netrc-filename}: The name of a file in @code{netrc(5)} +format that EFS will use to match hostnames, users and their +respective passwords. Hostnames specified here are also used for hostname +completion. +The default is @code{"~/.netrc"}. +@vindex efs-netrc-filename + +@code{efs-default-user}: If this is a string, it is the username to +use when none is specified in a filename. If @code{nil}, then the +name under which the user is logged in is used. If non-@code{nil} but +not a string, the user is prompted for the name. The default is @code{nil}. +@vindex efs-default-user + +@code{efs-default-password}: The password to use when the user is the +same as @code{efs-default-user}. The default is @code{nil}. +@vindex efs-default-password + +@code{efs-default-account}: Account password to use when the user +is the same as @code{efs-default-user}. The default is @code{nil}. +@vindex efs-default-account + +@code{efs-dumb-unix-host-regexp}: The FTP servers on some machines have +problems if the @code{ls} command is used. The usual indication that +something is wrong is when EFS erroneously thinks that a directory +is just a plain file. The routine @code{efs-add-host} can +be called to tell EFS to limit itself to the @code{DIR} command and +not @code{ls} for a given host (but this change will take effect for the +current Emacs session only) when called like this: + +@example +(efs-add-host 'dumb-unix "hostname") +@end example + +If a large number of machines with similar hostnames have this problem +then it is easier to change the value of this variable to a regexp which +matches hostnames which have this problem, particularly since EFS cannot +automatically detect such hosts. The default is @code{nil}. +@vindex efs-dumb-unix-host-regexp +@findex efs-add-host + +@code{efs-binary-file-name-regexp}: By default EFS will +transfer files in ASCII mode. If a file being transferred matches the +value of this regexp then the FTP process will be toggled into BINARY +mode before the transfer and back to ASCII mode after the transfer. The +default is: +@example + (concat "\\." ; the dot + ;; extensions + "\\([zZ]\\|t?gz\\|lzh\\|arc\\|zip\\|zoo\\|ta[rz]\\|dvi\\|sit\\|" + "ps\\|elc\\|gif\\|Z-part-..\\|tpz\\|exe\\|[jm]pg\\|TZ[a-z]?\\|lib\\)" + "\\(~\\|~[0-9]+~\\)?$" ; backups + "\\|" + ;; UPPER CASE LAND + "\\." + "\\(ARC\\|ELC\\|TAGS\\|EXE\\|ZIP\\|DVI\|ZOO\\|GIF\\|T?GZ\\|" + "[JM]PG\\)" + "\\([.#;][0-9]+\\)?$" ; versions + ) +@end example +@vindex efs-binary-file-name-regexp + +@code{efs-hash-mark-size}: EFS by default requests that the +FTP process sends hash marks (just @code{#} characters) during transfers +to keep track of how much data has been sent or received. This variable, +if non-@code{nil}, should be the number of kilobytes represented by the +FTP client's hash mark. The default value of 1 doesn't work for me --- I +use 2 instead. +@vindex efs-hash-mark-size + +@code{efs-verbose}: If this is @code{t} then EFS will be chatty about +interaction with the FTP process. The default is @code{t}. +@vindex efs-process-verbose + +@code{efs-ftp-program-name}: This should be the name of the FTP +program to run on the local host. The default value of @code{"ftp"} +should be fine for most systems. +@vindex efs-ftp-program-name + +@code{efs-make-backup-files}: A list of operating systems for which +EFS will make Emacs backup files on the remote host. For example, +@code{'(unix)} makes sense, but @code{'(unix vms)} or @code{'(vms)} +would be silly, since VMS makes its own backups. The host type is +determined by the function @code{efs-host-type}. Possible host +types are: @code{dumb-unix}; @code{vos}; @code{vms}; @code{mts}; and +@code{unix}. The default of @code{nil} means make no backups on remote +hosts. +@vindex efs-make-backup-files +@cindex backup files + +@code{efs-skip-msgs}: A regular expression matching messages from +the ftp process that can be ignored. The default is +@example + (concat + "^110 \\|" ; Restart marker reply. + "^125 \\|" ; Data connection already open; transfer starting. + "^150 ") ; File status OK; about to open connection. +@end example +@noindent +but you might need to tweak it if EFS is giving up when it +shouldn't. +@vindex efs-skip-msgs + +@code{efs-fatal-msgs}: A regular expression matching messages from +the FTP process that indicate something has gone drastically wrong +attempting the action that was initiated and that the FTP process should +(or already has) been killed. The default is +@example +(concat + ;; RFC959 codes + "^221 \\|" ; Service closing control connection. + "^421 \\|" ; Service not available. + "^425 \\|" ; Can't open data connection. + "^426 \\|" ; Connection closed, transfer aborted. + "^451 \\|" ; Requested action aborted, local error in processing. + ;; RFC959 non-compliant codes + "^552 Maximum Idle Time Exceded\\.$\\|" ; Hellsoft server uses this to + ; indicate a timeout. 552 is + ; supposed to be used for exceeded + ; storage allocation. Note that + ; they also misspelled the error + ; message. + ;; client problems + "^ftp: \\|^Not connected\\|^rcmd: \\|^No control connection\\|" + "^unknown host\\|: unknown host$\\|^lost connection\\|" + "^[Ss]egmentation fault\\|" + ;; Make sure that the "local: " isn't just a message about a file. + "^local: [^/]\\|" + ;; Gateways + "^iftp: cannot authenticate to server\\b" + ) +@end example +@vindex efs-fatal-msgs + +@code{efs-gateway-fatal-msgs}: Regular expression matching messages +from the rlogin / telnet process that indicates that logging in to the +gateway machine has gone wrong. The default is +@example +"No route to host\\|Connection closed\\|No such host\\|Login incorrect" +@end example +@vindex efs-gateway-fatal-msgs + +@code{efs-tmp-name-template}: This should be a directory and a +filename prefix indicating where EFS should make temporary files. +The default of @code{"/tmp/efs"} should be fine for most systems. +@vindex efs-tmp-name-template +@cindex temporary files + +@code{efs-retry-time}: Number of seconds to wait before retrying if +a file or listing doesn't arrive. For slow connections, you might get a +``listing unreadable'' error messages +@cindex listing unreadable error +or an empty buffer for a file that you know has something in it. The +solution is to increase the value of @code{efs-retry-time}. Its default +value is 5 which is plenty for reasonable connections. However, for +some transatlantic connections 20 might be a better value. +@vindex efs-retry-time + +@node Using EFS, Getting help, Installing EFS, Top +@comment node-name, next, previous, up +@chapter Using EFS + +Once installed, efs operates largely transparently. All files normally +accessible to you on the internet, become part of a large virtual file +system. These files are accessed using an extended file name syntax. To +access file @code{<path>} on remote host @code{<host>} by logging in as +user @code{<user>}, you simply specify the full path of the file as +@code{/<user>@@<host>:<path>}. Nearly all Emacs file handling functions +work for remote files. It is not possible to access remote files using +shell commands in an emacs *shell* buffer, as such commands are passed +directly to the shell, and not handled by emacs. + +FTP is the underlying utility that efs uses to operate on remote files. + +For example, if @code{find-file} is given a filename of: + +@example +/ange@@anorman:/tmp/notes +@end example + +then EFS will spawn an FTP process, connect to the host 'anorman' as +user 'ange', get the file @file{/tmp/notes} and pop up a buffer containing the +contents of that file as if it were on the local file system. If efs +needed a password to connect then it would prompt the user in the +minibuffer. For further discussion of the EFS path syntax, see the +paragraph on extended file name syntax @ref{Remote filenames}. + +Full file-name completion is supported on every type of remote host. To +do filename completion, EFS needs a listing from the remote host. +Therefore, for very slow connections, it might not save any +time. However, the listing is cached, so subsequent uses of file-name +completion will be just as fast as for local file names. + +@menu +* Ports:: Using nonstandard ports. +* Remote filenames:: The EFS extended filename syntax. +* Passwords:: +* Using Dired:: Browsing directories. +* Using a .netrc:: Preventing password pestering. +* EFS commands:: Interactive commands supplied by EFS. +* FTP processes:: How EFS does its work +* Tips:: Some stuff to help you use EFS +* DL support:: Descriptive directory listings +* Non-Unix Hosts:: Some of what you want to know +* Completion:: Works but has its price +* Accessing the FTP process:: ... manually +@end menu + +@node Ports, Remote filenames, Using EFS, Using EFS +@comment node-name, next, previous, up +@section Using nonstandard ports + +EFS supports the use of nonstandard ports on remote hosts. To specify +that port @code{<port>} should be used, give the host name as +@code{host#<port>}. Host names may be given in this form anywhere that +efs normally expects a host name. This includes in the @file{.netrc} file. +Logically, EFS treats different ports to correspond to different remote +hosts. + +@node Remote filenames, Passwords, Ports, Using EFS +@comment node-name, next, previous, up +@section Extended filename syntax + +The default full EFS path syntax is + +@example +/<user>@@<host>#<port>:<path> +@end example + +Both the @code{#<port>'}and @code{<user>@@} may be omitted. + +If the @code{#<port>} is omitted, then the default port is taken to be 21, +the usual FTP port. For most users, the port syntax will only +very rarely be necessary. + +If the @code{<user>@@} is omitted, then EFS will use a default user. If +a login token is specified in your @file{.netrc} file, then this will be +used as the default user for @code{<host>}. Otherwise, it is determined +based on the value of the variable @code{efs-default-user}. +@vindex efs-default-user + +This EFS path syntax can be customised to a certain extent by changing a +number of variables. To +undertake such a customization requires some knowledge about the +internal workings of EFS. + +@node Passwords, Using Dired, Remote filenames, Using EFS +@comment node-name, next, previous, up +@section Passwords + +A password is required for each host / user pair. This will be prompted +for when needed, unless already set by calling @code{efs-set-passwd}, +@findex efs-set-passwd +or specified in a @emph{valid} @file{~/.netrc} file. + +When EFS prompts for a password, it provides defaults from its cache of +currently known passwords. The defaults are ordered such that passwords +for accounts which have the same user name as the login which is +currently underway have priority. You can cycle through your list of +defaults with @kbd{C-n} to cycle forwards and @kbd{C-p} to cycle +backwards. The list is circular. + +@subsection Passwords for anonymous user + +Passwords for the user @t{anonymous} (or @t{ftp}) are handled specially. +The variable @code{efs-generate-anonymous-password} controls what +\vindex efs-generate-anonymous-password happens. If the value of this +variable is a string, then this is used as the password; if +non-@code{nil}, then a password is created from the name of the user and +the hostname of the machine on which Emacs is running; if @code{nil} +(the default) then the user is prompted for a password as normal. + +@subsection Account passwords + +Some FTP servers require an additional password which is sent by the +@code{ACCOUNT} command. EFS will detect this and prompt the user for an +account password if the server expects one. Also, an account password +can be set by calling @code{efs-set-account}, or by specifying an +@findex efs-set-account +account token in the @file{.netrc} file. + +Some operating systems, such as CMS, require that @code{ACCOUNT} be used +to give a write access password for minidisks. @code{efs-set-account} can be +used to set a write password for a specific minidisk. Also, tokens of +the form + +@example +minidisk <minidisk name> <password> +@end example + +may be added to host lines in your @file{.netrc} file. Minidisk tokens +must be at the end of the host line, however there may be an arbitrary +number of them for any given host. + +@node Using Dired, Using a .netrc, Passwords, Using EFS +@comment node-name, next, previous, up +@section Using Dired + +This feature of EFS is particularly useful when file transfers, as +opposed to file editing, are the order of the day. Simply run +@code{find-file} on a directory to +get a listing of the files in that directory. For example, you might +run @code{find-file} on +@example +/anonymous@@archive.site.com:pub +@end example +@noindent +to see what's in the @file{pub} directory of your favourite archive +@cindex archive sites +site. This brings up a Dired buffer of all the files in that directory. +The @kbd{f} command is useful for looking at @file{README} files --- if +you then decide to save it @kbd{C-x C-w} is useful. You can also use +this method to copy files, but the @kbd{c} command is easier. The +@kbd{f} command can also be used to descend the directory tree by +applying it to directories. + +You can also use Dired to refresh EFS's internal cache. If you +(or anybody else) has changed a remote directory since you first accessed it +with EFS, completion is not provided on any new files that EFS +does not know about. If you have +(or create) a Dired buffer which contains the modified directory, +executing @code{revert-buffer} +@findex revert-buffer +with a prefix argument (@kbd{C-u g} in the Dired buffer) +will force a refresh of both the the buffer @emph{and also EFS's +internal cache}. If you find that filename completion isn't working on a +@cindex filename completion +file that you @emph{know} is there, this is how to fix the problem. + +Dired provides facilities for maintaining an +entire directory tree in a Dired buffer, for marking files which match a +certain regexp (or you can select files interactively) and then copying +all those files to your local host (or even a different remote host). +Another useful feature is Virtual Dired, which allows you to save Dired +@cindex virtual dired +buffers of remote hosts, allowing you to browse them at a later date +without actually needing to connect to the host. + +@node Using a .netrc, EFS commands, Using Dired, Using EFS +@comment node-name, next, previous, up +@section Using a .netrc file + +Being prompted for passwords all the time can get rather annoying, but +there is a way to fix the problem --- a @file{.netrc} (but @xref{Other +options} and @code{efs-netrc-filename} +@vindex efs-netrc-filename +if you want another +filename) file in your home directory. Basically, this is a file (in the +format of Unix @code{netrc(5)}) which +contains the names of all the machines you regularly login to, as well +as the username and password you use for that machine. You can also +supply an account password, if required. + +Your @file{.netrc} file consists of lines of the form +@example +machine <machine-name> login <user-name> password <password> +@end example +@noindent +It doesn't all have to be on the one line, though: any @code{login} or +@code{password} commands in the file refer to the previous +@code{machine} command. You can also have @code{account +<account-passwd>} commands if you need special account passwords. + +For example, you might have the following line in your @file{.netrc}: +@example +machine Y.local.lan.edu login myname password secret +@end example +@noindent +Then if you run @code{find-file} on the file @file{/Y.local.lan.edu:somefile} +you will automatically be logged in as user @code{myname} with password +@code{secret}. You can still login under another name and password, if +you so desire: just include the @code{user@@} part of the filename. + +You may also include a default option, as follows: +@example +default login <user-name> password <password> +@end example +@noindent +which applies to any other machines not mentioned elsewhere in your +@file{.netrc}. A particularly useful application of this is with +anonymous logins: +@cindex anonymous FTP +@example +default login myname password myname@@myhost.edu +@end example +@noindent +so that accessing @file{/anyhost:anyfile} will automatically log you in +anonymously, provided the host is not mentioned in the @file{.netrc}. +Note also that if the value of @code{efs-default-user} is +@vindex efs-default-user +non-@code{nil}, its value will have precedence over the username +supplied in the default option of the @file{.netrc}. + +The @file{.netrc} file is also useful in another regard: machines +included in it are provided with hostname completion. That is, for any +@cindex hostname completion +machine in the @file{.netrc}, you need only type a slash and the first +few characters of its name and then press @key{TAB} to be logged in +automatically with a username and password from the @file{.netrc} file. +So it's a good idea to put hosts you use regularly in your @file{.netrc} +as well: +@example +machine archive.site.com login anonymous password myname@@X.local.lan.edu +@end example + +@node EFS commands, FTP processes, Using a .netrc, Using EFS +@comment node-name, next, previous, up +@section EFS commands + +EFS supplies a few interactive commands to make connecting with +hosts a little easier. + +@noindent +Command @code{efs-set-user}: Prompts for a hostname and a username. +Next time access to the host is attempted, EFS will attempt to log +in again with the new username. +@findex efs-set-user + +@noindent +Command @code{efs-set-passwd}: Prompts for a hostname, user and +password. Future logins to that host as that user will use the given +password. +@findex efs-set-passwd + +@noindent +Command @code{efs-set-account}: Prompts for a hostname, user and +account. Future logins to that host as that user will use the given +account. +@findex efs-set-account + +Note that the effects of the above three commands only last the duration +of the current Emacs session. To make their effects permanent, you may +include them as lisp code in your @file{.emacs}: +@example +(efs-set-user HOST USER) +(efs-set-password HOST USER PASSWORD) +(efs-set-account HOST USER ACCOUNT) +@end example +@noindent +This is an alternative to using a @file{.netrc}; @xref{Using a .netrc}. + +@noindent +Command @code{efs-kill-ftp-process}: kill the FTP process +associated with a given buffer's filename (by default the current +buffer). This is an easy way to achieve a resynch: any future accesses +to the remote host will cause the FTP process to be recreated. +@findex efs-kill-ftp-process + +@node FTP processes, Tips, EFS commands, Using EFS +@comment node-name, next, previous, up +@section FTP processes + +When EFS starts up an FTP process, it leaves it running for speed +purposes. Some FTP servers will close the connection after a period of +time, but EFS should be able to quietly reconnect the next time that +the process is needed. + +The FTP process will be killed should the associated @samp{*ftp user@@host*} +buffer be deleted. This should not cause efs any grief. + +@subsection Showing background FTP activity on the mode-line + +After EFS is loaded, the command @code{efs-display-ftp-activity} will cause +@findex efs-display-ftp-activity +background FTP activity to be displayed on the mode line. The variable +@code{efs-mode-line-format} is used to determine how this data is displayed. +@vindex efs-mode-line-format +efs does not continuously track the number of active sessions, as this +would cause the display to change too rapidly. Rather, it uses a heuristic +algorithm to determine when there is a significant change in FTP activity. + +@subsection File types + +By default EFS will assume that all files are ASCII. If a file +being transferred matches the value of @code{efs-binary-file-name-regexp} +@vindex efs-binary-file-name-regexp +then the file will be assumed to be a binary file, and EFS will +transfer it using "type image". ASCII files will be transferred +using a transfer type which efs computes to be correct according +to its knowledge of the file system of the remote host. The +command @code{efs-prompt-for-transfer-type} toggles the variable +@findex efs-prompt-for-transfer-type +@code{efs-prompt-for-transfer-type}. When this variable is +@vindex efs-prompt-for-transfer-type +non-@code{nil}, EFS will prompt the user for the transfer type to use +for every FTP transfer. Having this set all the time is annoying, but +it is useful to give special treatment to a small set of files. There +is also a variable @code{efs-text-file-name-regexp}. This is tested +@vindex efs-text-file-name-regexp +before @code{efs-binary-file-name-regexp}, so if you set +@code{efs-text-file-name-regexp} to a non-trivial regular expression, +and @code{efs-binary-file-name-regexp} to @samp{".*"}, the result will +to make image the default tranfer type. + +Also, if you set @code{efs-treat-crlf-as-nl}, +@vindex efs-treat-crlf-as-nl +then EFS will use type image +to transfer files between hosts whose file system differ only in that +one specifies end of line as CR-LF, and the other as NL. This is useful +if you are transferring files between UNIX and DOS machines, and have a +package such as @file{dos-mode.el}, that handles the extra @key{^M}'s. + +@subsection Status reports + +Most EFS commands that talk to the FTP process output a status +message on what they are doing. In addition, efs can take advantage +of the FTP client's @code{HASH} command to display the status of transferring +files and listing directories. See the documentation for the variables +@code{efs-hash-mark-size}, +@vindex efs-hash-mark-size +@code{efs-send-hash} +@vindex efs-send-hash +and @code{efs-verbose} +@vindex efs-verbose +for more details. + +@subsection Caching of directory information + +EFS keeps an internal cache of file listings from remote hosts. +If this cache gets out of synch, it can be renewed by reverting a +dired buffer for the appropriate directory (@code{dired-revert} is usually +bound to @kbd{g}). + +Alternatively, you can add the following two lines to your @file{.emacs} file +if you want @kbd{C-r} to refresh EFS's cache whilst doing filename +completion. + +@example +(define-key minibuffer-local-completion-map "\C-r" 'efs-re-read-dir) +(define-key minibuffer-local-must-match-map "\C-r" 'efs-re-read-dir) +@end example + +@node Tips, DL support, FTP processes, Using EFS +@comment node-name, next, previous, up + +@section Tips for using EFS + +@enumerate +@item +Beware of compressing files on non-UNIX hosts. EFS will do it by +copying the file to the local machine, compressing it there, and then +sending it back. Binary file transfers between machines of different +architectures can be a risky business. Test things out first on some +test files. @xref{Bugs} Also, note that EFS sometimes +copies files by moving them through the local machine. Again, +be careful when doing this with binary files on non-Unix +machines. + +@item +Beware that dired over ftp will use your setting of +@code{dired-no-confirm} +@vindex dired-no-confirm +(list of dired commands for which confirmation is not asked). +You might want to reconsider your setting of this variable, +because you might want confirmation for more commands on remote +direds than on local direds. For example, I strongly recommend +that you not include compress in this list. If there is enough +demand it might be a good idea to have an alist +@code{efs-dired-no-confirm} of pairs @code{( TYPE . LIST )}, where @code{TYPE} is an +operating system type and @code{LIST} is a list of commands for which +confirmation would be suppressed. Then remote dired listings +would take their (buffer-local) value of @code{dired-no-confirm} from +this alist. Who votes for this? + +@item +Some combinations of FTP clients and servers break and get out of sync +when asked to list a non-existent directory. Some of the @t{ai.mit.edu} +machines cause this problem for some FTP clients. Using +@code{efs-kill-ftp-process} +@findex efs-kill-ftp-process +can be used to restart the ftp process, which +should get things back in synch. + +@item +Some ftp servers impose a length limit on the password that can +be sent. If this limit is exceeded they may bomb in an +incomprehensible way. This sort of behaviour is common with +MVS servers. Therefore, you should beware of this possibility +if you are generating a long password (like an email address) +with @code{efs-generate-anonymous-password}. +@vindex efs-generate-anonymous-password + +@item +Some antiquated FTP servers hang when asked for an @code{RNFR} command. +EFS sometimes uses this to test whether its local cache is stale. +If your server for @code{HOST} hangs when asked for this command, put + +@example +(efs-set-host-property HOST 'rnfr-failed t) +@end example + +in your @code{efs-ftp-startup-function-alist} +@vindex efs-ftp-startup-function-alist +entry for @code{HOST}. + +@item +The FTP servers on some Unix machines have problems if the @code{ls} +command is used. EFS will try to correct for this automatically, +and send the @code{dir} command instead. If it fails, you can call the +function @code{efs-add-host}, +@findex efs-add-host +and give the host type as @code{dumb-unix}. Note that this change will +take effect for the current Emacs session only. To make this +specification for future emacs sessions, put + +@example +(efs-add-host 'dumb-unix "hostname") +@end example + +in your @file{.emacs} file. Also, please report any failure to +automatically recognize dumb unix to the "bugs" address given below, so +that we can fix the auto recognition code. + +@end enumerate + +@node DL support, Non-Unix Hosts, Tips, Using EFS +@comment node-name, next, previous, up +@section Descriptive directory listings + +Some hosts (such as @code{cs.uwp.edu}) now use descriptive directory +listings +@cindex descriptive directory listings +@cindex extended directory listings +(which in fact contain @emph{less} information than the +standard listing!) when issued the @code{ls} command, and EFS has +been modified to cope with this. EFS can detect such listings, but +if you regularly use a remote host which uses this extended listing +format you should set the variable @code{efs-dl-dir-regexp} to a +@vindex efs-dl-dir-regexp +regular expression which matches directories using the extended listing +format. You shouldn't anchor the regexp with @samp{$} -- that way the +regexp will match subdirectories as well. Alternatively, you can use +the interactive command @code{efs-add-dl-dir} to temporarily add a +@findex efs-add-dl-dir +remote directory for this Emacs session only. + +Dired has been modified to work with such descriptive listings. + +@node Non-Unix Hosts, Completion, DL support, Using EFS +@comment node-name, next, previous, up +@section Using EFS with non-Unix hosts + +EFS also works with some non-Unix hosts, although not necessarily +with all the features available with Unix hosts. VMS, CMS, and MTS +systems will all now work with EFS and Dired. It also works with a whole +bunch of others, but documentation for that has not been written yet. +This section was taken straight from the ange-ftp manual, and is +therefore in all likelihood out-of-date. + +EFS should be able to automatically detect which type of host you +are using (VMS, CMS or MTS), but if it is unable to do so you can fix +the problem by setting the appropriate +@code{efs-TYPE-host-regexp} variable (where @code{TYPE} is one of +@samp{vms}, @samp{cms} or @samp{mts}) -- see below. If EFS is unable +to automatically detect any VMS, CMS or MTS host, please report this as +a bug: @xref{Bugs}. + +In all cases the file-name conventions of the remote host are converted +to a UNIX-ish format, and this is the format you should use to find +files on such hosts. + +@menu +* VMS support:: Using EFS with VMS systems +* CMS support:: Using EFS with CMS systems +* MTS support:: Using EFS with MTS systems +@end menu + +@node VMS support, CMS support, Non-Unix Hosts, Non-Unix Hosts +@comment node-name, next, previous, up +@subsection VMS support +@cindex VMS filenames +VMS filenames are of the form @code{FILE.TYPE;##}, where both +@code{FILE} and @code{TYPE} can be up to 39 characters long, and +@code{##} is an integer version number between 1 and 32,767. Valid +characters in filenames are @samp{A}-@samp{Z}, @samp{0}-@samp{9}, +@samp{_}, @samp{-} and @samp{$}, however @samp{$} cannot begin a +filename and @samp{-} cannot be used as the first or last character. + +Directories in VMS are converted to the standard UNIX @samp{/} notation. +For example, the VMS filename +@example +PUB$:[ANONYMOUS.SDSCPUB.NEXT]README.TXT;1 +@end example +would be entered as +@noindent +@example +/PUB$$:/ANONYMOUS/SDSCPUB/NEXT/README.TXT;1 +@end example +@noindent +(The double @samp{$} is required to prevent Emacs from attempting to +expand an environment variable.) Similarly, to anonymously FTP the file +@file{[.CSV.POLICY]RULES.MEM;1} from @code{ymir.claremont.edu} you would +type @kbd{C-x C-f +/anonymous@@ymir.claremont.edu:CSV/POLICY/RULES.MEM;1}. You can always +drop off the @samp{;##} part at the end of the filename to get the +latest version. + +Sandy Rutherford provides some tips for using VMS hosts: +@itemize @bullet +@item +Although VMS is not case sensitive, EMACS running under UNIX is. +Therefore, to access a VMS file, you must enter the filename with upper +case letters. + +@item +To access the latest version of file under VMS, you use the filename +without the @samp{;} and version number. You should always edit the +latest version of a file. If you want to edit an earlier version, copy +it to a new file first. This has nothing to do with EFS, but is +simply good VMS operating practice. Therefore, to edit @file{FILE.TXT;3} +(say 3 is latest version), do @kbd{C-x C-f +/ymir.claremont.edu:FILE.TXT}. If you inadvertently do +@example +@kbd{C-x C-f /ymir.claremont.edu:FILE.TXT;3} +@end example +@noindent +you will find that VMS will not allow +you to save the file because it will refuse to overwrite +@file{FILE.TXT;3}, but instead will want to create @file{FILE.TXT;4}, +and attach the buffer to this file. To get out of this situation, +@kbd{M-x write-file /ymir.claremont.edu:FILE.TXT} will attach the buffer +to latest version of the file. For this reason, in Dired @kbd{f} +(@code{dired-find-file}), +@findex dired-find-file +always loads the file sans version, whereas @kbd{v}, +(@code{dired-view-file}), +@findex dired-view-file +always loads the explicit version number. The +reasoning being that it reasonable to view old versions of a file, but +not to edit them. + +@item +VMS filenames often contain @samp{$} characters: make sure you always +quote these as @samp{$$} and watch out for the Emacs bug which fails to +quote @samp{$}'s when defaults are presented in the minibuffer: see +@xref{Bugs}. +@end itemize + +EFS should automatically detect that you are using a VMS host. If +it fails to do so (which should be reported as a bug) you can use the +command @code{efs-add-vms-host} +@findex efs-add-vms-host +to inform EFS manually. For a more permanent effect, or +if you use a VMS host regularly, it's a good idea to set +@code{efs-vms-host-regexp} to a regular expression matching that +@vindex efs-vms-host-regexp +host's name. For instance, if use use @code{ymir.claremont.edu} a lot, +place the following in your .emacs: +@example +(setq efs-vms-host-regexp "^ymir.claremont.edu$") +@end example + +@node CMS support, MTS support, VMS support, Non-Unix Hosts +@comment node-name, next, previous, up +@subsection CMS support +EFS has full support, including Dired support, for hosts +running CMS. + +@cindex CMS filenames +CMS filenames are entered in a UNIX-y way. Minidisks are +treated as UNIX directories; for example to access the file @file{READ.ME} in +minidisk @file{*.311} on @file{cuvmb.cc.columbia.edu}, you would enter +@example +/anonymous@@cuvmb.cc.columbia.edu:/*.311/READ.ME +@end example +If @file{*.301} is the default minidisk for this account, you could access +@file{FOO.BAR} on this minidisk as +@example +/anonymous@@cuvmb.cc.columbia.edu:FOO.BAR +@end example +CMS filenames are of the form @file{FILE.TYPE}, where both @file{FILE} +and @file{TYPE} can be up to 8 characters. Again, beware that CMS +filenames are always upper case, and hence must be entered as such. + +Sandy Rutherford provides some tips on using CMS hosts: +@itemize @bullet +@item +CMS machines, with the exception of anonymous accounts, nearly always +need an account password. To have EFS send an account password, +you can either include it in your @file{.netrc} (@xref{Using a .netrc}), or use +@code{efs-set-account}. +@findex efs-set-account + +@item +EFS cannot send ``write passwords'' for a minidisk. Hopefully, we +can fix this. +@end itemize + +EFS should automatically detect that you are using a CMS host. If +it fails to do so (which should be reported as a bug) you can use the +command @code{efs-add-cms-host} +@findex efs-add-cms-host +to inform EFS manually. For a more permanent effect, or +if you use a CMS host regularly, it's a good idea to set +@code{efs-cms-host-regexp} to a regular expression matching that +@vindex efs-cms-host-regexp +host's name. + +@node MTS support, , CMS support, Non-Unix Hosts +@comment node-name, next, previous, up +@subsection MTS support +EFS has full support, including Dired support, for hosts +running the Michigan terminal system, and should be able to +automatically recognise any MTS machine. + +@cindex MTS filenames +MTS filenames are entered in a UNIX-y way. For example, if your account +was @file{YYYY}, the file @file{FILE} in the account @file{XXXX:} on +@file{mtsg.ubc.ca} would be entered as +@example +/YYYY@@mtsg.ubc.ca:/XXXX:/FILE +@end example +In other words, MTS accounts are treated as UNIX directories. Of course, +to access a file in another account, you must have access permission for +it. If @file{FILE} were in your own account, then you could enter it in a +relative path fashion as +@example +/YYYY@@mtsg.ubc.ca:FILE +@end example +MTS filenames can be up to 12 characters. Like UNIX, the structure of the +filename does not contain a type (i.e. it can have as many @samp{.}'s as you +like.) MTS filenames are always in upper case, and hence be sure to enter +them as such! MTS is not case sensitive, but an EMACS running under UNIX +is. + +EFS should automatically detect that you are using an MTS host. If +it fails to do so (which should be reported as a bug) you can use the +command @code{efs-add-mts-host} +@findex efs-add-mts-host +to inform EFS manually. For a more permanent effect, or +if you use an MTS host regularly, it's a good idea to set +@code{efs-mts-host-regexp} to a regular expression matching that +@vindex efs-mts-host-regexp +host's name. + +@node Completion, Accessing the FTP process, Non-Unix Hosts, Using EFS +@comment node-name, next, previous, up +@section File- and host-name completion + +Full filename completion is supported on all remote UNIX hosts and some +non-Unix hosts. Hostnames also have completion if they are mentioned in +the @file{.netrc} and no username is specified. However using the +filename completion feature can be a bit of a two edged sword. + +To understand why, we need to discuss how EFS works. Whenever +EFS is asked to find a remote file (or directory) an @code{ls} +command is sent to the FTP process to list all the files in the +directory. This list is maintained in an internal cache, to provide +filename completion for later requests on that directory. EFS keeps +this cache up-to-date by monitoring Emacs commands which affect files +and directories, but if a process outside Emacs (such as another user) +changes a directory (e.g. a new file is added) +completion won't work on +that file since EFS doesn't know about it yet. The solution if to +force EFS to reread the directory and update it's cache, and the +easiest way to do that is with Dired --- @xref{Using Dired} to see how. + +Another problem is that the @code{ls} command can take a long time, +especially when dealing with distant hosts over slow links. So if you're +after a file in the @file{pub/images} directory but nothing else, it's a +better idea to type @kbd{pub/images/file @key{TAB}} than @kbd{pub/im @key{TAB}} +which will force a read of the @file{pub} directory (since +EFS needs to know how to complete @code{im}). A little extra typing +can often save a lot of waiting. Don't be afraid to use the @key{TAB} +key once the directory is cached, though. + +@node Accessing the FTP process, , Completion, Using EFS +@comment node-name, next, previous, up +@section Accessing the FTP process buffer + +The FTP process used to access the remote files is available for access +if you wish. It will be in a buffer +@cindex process buffers +@cindex buffers +called @samp{"*ftp @var{remote-file-name}*"}, +i.e. if you found the file +@example +/anonymous@@archive.site.com:pub/README +@end example +@noindent +there will be a buffer +@example +*ftp anonymous@@archive.site.com* +@end example +@noindent +where all the transfers are taking place. You can have a look at the +buffer using @kbd{C-x b} as usual, and even type in commands to the FTP +process under an interface very much like @samp{shell-mode}. There are +two instances when doing this can be very useful: one is accessing +non-UNIX hosts, where Dired and filename completion may not work (if EFS +even works at all). If you are going to use @code{mget} or @code{mput}, +make sure you type @code{glob} first: EFS turns globbing off by +default. Don't be afraid of changing directories, either --- EFS always +uses absolute pathnames when communicating with the FTP process. + +You can kill the FTP process at any time simply by killing this buffer. +@cindex FTP processes +@cindex processes +You can also call @code{efs-kill-ftp-process}. +@findex efs-kill-ftp-process +This won't cause EFS any grief whatsoever --- if you later make +another request to that host, EFS will simply fire up another +process and create a new buffer to hold it. + +@node Getting help, Bugs, Using EFS, Top +@comment node-name, next, previous, up +@chapter Getting help + +EFS has its own mailing list called @t{efs-help}. All users of EFS +are welcome to subscribe (see below) and to discuss aspects of +EFS. + +To [un]subscribe to @t{efs-help}, or to report mailer problems with the +list, please mail one of the following addresses: + +@example +efs-help-request@@cuckoo.hpl.hp.com +@end example +or +@example +efs-help-request%cuckoo.hpl.hp.com@@hplb.hpl.hp.com +@end example + +Please don't forget the @t{-request} part. + +For mail to be posted directly to @t{efs-help}, send to one of the +following addresses: + +@example +efs-help@@cuckoo.hpl.hp.com +@end example +or +@example +efs-help%cuckoo.hpl.hp.com@@hplb.hpl.hp.com +@end example + +Alternatively, there is a mailing list that only gets +announcements of new EFS releases. This is called @t{efs-announce}, +and can be subscribed to by e-mailing to the @t{-request} address as +above. Please make it clear in the request which mailing list you +wish to join. + +Mailing list archives are also accessible from this web page: + +@example +http://www-uk.hpl.hp.com/people/ange/efs +@end example + + +@node Bugs, Concept Index, Getting help, Top +@comment node-name, next, previous, up +@chapter Bugs and Wish List + + +If you find any bugs or problems with this package, @strong{please} +e-mail the authors. Ideas and constructive comments are especially +welcome. So are any enhancements to EFS, preferably debugged and +documented. Also welcome are any typo fixes, corrections or additions to +this manual. + +Here is a list of known bugs: + +If you hit a bug in this list, please report it anyway. Most of +the bugs here remain unfixed because they are considered too +esoteric to be a high priority. If one of them gets reported +enough, we will likely change our view on that. + +@enumerate +@item +EFS does not check to make sure that when creating a new file, +you provide a valid filename for the remote operating system. +If you do not, then the remote FTP server will most likely +translate your filename in some way. This may cause EFS to +get confused about what exactly is the name of the file. + +@item +For CMS support, we send too many @code{cd}'s. Since @code{cd}'s are +cheap, I haven't worried about this too much. Eventually, we should have +some caching of the current minidisk. This is complicated by the fact +that some CMS servers lie about the current minidisk, so sending +redundant cd's helps us recover in this case. + +@item +The code to do compression of files over ftp is not as careful as it +should be. It deletes the old remote version of the file, before +actually checking if the local to remote transfer of the compressed file +succeeds. Of course to delete the original version of the file after +transferring the compressed version back is also dangerous, because some +OS's have severe restrictions on the length of filenames, and when the +compressed version is copied back the @code{"-Z"} or @code{".Z"} may be +truncated. Then, EFS would delete the only remaining version of the +file. Maybe EFS should make backups when it compresses files (of +course, the backup @code{"~"} could also be truncated off, sigh...). +Suggestions? + +@item +If a dir listing is attempted for an empty directory on (at least +some) VMS hosts, an ftp error is given. This is really an ftp bug, and +I don't know how to get EFS work to around it. + +@item +EFS gets confused by directories containing file names with embedded +newlines. A temporary solution is to add @code{"q"} to your dired +listing switches. As long as your dired listing switches also contain +@code{"l"} and either @code{"a"} or @code{"A"}, EFS will use these +switches to get listings for its internal cache. The "q" switch should +force listings to be exactly one file per line. You still will not be +able to access a file with embedded newlines, but at least it won't mess +up the parsing of the rest of the files. + +@item +EFS cannot parse symlinks which have an embedded @code{" -> "} in their +name. It's alright to have an embedded @code{" -> "} in the name of any +other type of file. A fix is possible, but probably not worth the +trouble. If you disagree, send us a bug report. + +@item +EFS doesn't handle context-dep. files in H-switch listings on +HP's. It wouldn't be such a big roaring deal to fix this. I'm +waiting until I get an actual bug report though. + +@item +If a hard link is added or deleted, EFS will not update its +internal cache of the link count for other names of the file. +This may cause file-nlinks to return incorrectly. Reverting +any dired buffer containing other names for the file will +cause the file data to be updated, including the link counts. +A fix for this problem is known and will be eventually +implemented. How it is implemented will depend on how we decide +to handle inodes. See below. + +@item +EFS is unable to parse R-switch listings from remote Unix hosts. +This is inefficient, because EFS will insist on doing individual +listings of the subdirectories to get its file information. +This may be fixed if there is enough demand. + +@item +In file-attributes, EFS returns a fake inode number. Of course +this is necessary, but this inode number is not even necessarily +unique. It is simply the sum of the characters (treated as +integers) in the host name, user name, and file name. Possible +ways to get a unique inode number are: + +@enumerate +@item +Simply keep a count of all remote file in the cache, and +return the file's position in this count as a negative number. +@item +For unix systems, we could actually get at the real inode number on the +remote host, by adding an @code{"i"} to the ls switches. The inode +numbers would then be removed from the listing returned by @code{efs-ls}, if +the caller hadn't requested the @code{"i"} switch. We could then make a +unique number out of the host name and the real inode number. +@end enumerate + +@item +EFS tries to determine if a file is readable or writable by comparing +the file modes, file owner, and user name under which it is logged +into the remote host. This does not take into account groups. +We simply assume that the user belongs to all groups. As a result +we may assume that a file is writable, when in fact it is not. +Groups are tough to handle correctly over FTP. Suggestions? +(For new FTP servers, can do a @code{"QUOTE SITE EXEC groups"} to +handle this.) +@end enumerate + + +@node Concept Index, Variable and function index, Bugs, Top +@comment node-name, next, previous, up +@unnumbered Concept Index + +@printindex cp + +@node Variable and function index, , Concept Index, Top +@unnumbered Variable and function index + +@printindex vr + +@contents + +@bye +
--- a/man/gnus.texi Mon Aug 13 09:21:56 2007 +0200 +++ b/man/gnus.texi Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename gnus -@settitle Gnus 5.4.33 Manual +@settitle Gnus 5.4.37 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -287,7 +287,7 @@ @tex @titlepage -@title Gnus 5.4.33 Manual +@title Gnus 5.4.37 Manual @author by Lars Magne Ingebrigtsen @page @@ -323,7 +323,7 @@ spool or your mbox file. All at the same time, if you want to push your luck. -This manual corresponds to Gnus 5.4.33. +This manual corresponds to Gnus 5.4.37. @end ifinfo @@ -8240,12 +8240,12 @@ That might seem quite naughty, but it does make sense most of the time. Let's say you have 10 groups subscribed to the server -@samp{nepholococcygia.com}. This server is located somewhere quite far -away from you, the machine is quite, so it takes 1 minute just to find -out that it refuses connection from you today. If Gnus were to attempt -to do that 10 times, you'd be quite annoyed, so Gnus won't attempt to do -that. Once it has gotten a single ``connection refused'', it will -regard that server as ``down''. +@samp{nephelococcygia.com}. This server is located somewhere quite far +away from you and the machine is quite slow, so it takes 1 minute just +to find out that it refuses connection from you today. If Gnus were to +attempt to do that 10 times, you'd be quite annoyed, so Gnus won't +attempt to do that. Once it has gotten a single ``connection refused'', +it will regard that server as ``down''. So, what happens if the machine was only feeling unwell temporarily? How do you test to see whether the machine has come up again? @@ -8911,7 +8911,7 @@ (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list") (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list") ;; People... - (any "larsi@@ifi\\.uio\\.no" "people.Lars Magne Ingebrigtsen")) + (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen")) ;; Unmatched mail goes to the catch all group. "misc.misc") @end lisp @@ -12186,6 +12186,7 @@ * Moderation:: What to do if you're a moderator. * XEmacs Enhancements:: There are more pictures and stuff under XEmacs. * Fuzzy Matching:: What's the big fuzz? +* Thwarting Email Spam:: A how-to on avoiding unsolited commercial email. * Various Various:: Things that are really various. @end menu @@ -12985,7 +12986,7 @@ Note that adding daemons can be pretty naughty if you overdo it. Adding functions that scan all news and mail from all servers every two seconds is a sure-fire way of getting booted off any respectable system. So -behave. +behave. @node NoCeM @@ -13410,6 +13411,75 @@ manglers masquerading as newsreaders. +@node Thwarting Email Spam +@section Thwarting Email Spam +@cindex email spam +@cindex spam +@cindex UCE +@cindex unsolicited commercial email + +In these last days of the Usenet, commercial vultures are hanging about +and grepping through news like crazy to find email addresses they can +foist off their scams and products to. As a reaction to this, many +people have started putting nonsense addresses into their @code{From} +lines. I think this is counterproductive---it makes it difficult for +people to send you legitimate mail in response to things you write, as +well as making it difficult to see who wrote what. This rewriting may +perhaps be a bigger menace than the unsolicited commercial email itself +in the end. + +The biggest problem I have with email spam is that it comes in under +false pretenses. I press @kbd{g} and Gnus merrily informs me that I +have 10 new emails. I say ``Golly gee! Happy is me!'' and selects the +mail group, only to find two pyramid schemes, seven advertisements +``New! Miracle tonic for growing full, lustrouos hair on your toes!'' +and one mail asking me to repent and find some god. + +This is annoying. + +The way to deal with this is having Gnus split out all spam into a +@samp{spam} mail group (@pxref{Splitting Mail}). + +First, pick one (1) legal mail address that you can be reached at, and +put it in your @code{From} header of all your news articles. (I've +chosen @samp{larsi@@trym.ifi.uio.no}.) + +@lisp +(setq message-default-news-headers + "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n") +@end lisp + +Then put the following split rule in @code{nnmail-split-fancy} +(@pxref{Fancy Mail Splitting}): + +@lisp +( + ... + (to "larsi@@trym.ifi.uio.no" + (| ("subject" "re:.*" "misc") + ("references" ".*@@.*" "misc") + "spam")) + ... +) +@end lisp + +This says that all mail to this address is suspect, but if it has a +@code{Subject} that starts with a @samp{Re:} or has a @code{References} +header, it's probably ok. All the rest goes to the @samp{spam} group. +(This idea probably comes from Tim Pierce.) + +In my experience, this will sort virtually everything into the right +group. You still have to check the @samp{spam} group from time to time to +check for legitimate mail, though. If you feel like being a good net +citizen, you can even send off complaints to the proper authorities on +each unsolicited commercial email---at your leisure. + +This works for me. It allows people an easy way to contact me (they can +just press @kbd{r} in the usual way), and I'm not bothered at all with +spam. It's a win-win situation. Forging @code{From} headers to point +to non-existant domains is yucky, in my opinion. + + @node Various Various @section Various Various @cindex mode lines
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/hm--html-mode.texi Mon Aug 13 09:23:06 2007 +0200 @@ -0,0 +1,2033 @@ +\input texinfo @c -*-texinfo-*- +@comment %**start of header (This is for running Texinfo on a region.) +@setfilename hm--html-mode.info +@settitle HM HTML Mode +@setchapternewpage odd +@comment %**end of header (This is for running Texinfo on a region.) +@comment $Id: hm--html-mode.texi,v 1.2 1997/03/28 02:29:28 steve Exp $ +@ifinfo +This file documents the Elisp package @code{hm--html-menus}. + +Copyright @copyright{} 1997 Heiko Münkel + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries a copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +@end ignore +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +sections entitled ``Distribution'' and ``General Public License'' are +included exactly as in the original, and provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that the sections entitled ``Distribution'' and ``General Public +License'' may be included in a translation approved by the author instead +of in the original English. + +@end ifinfo +@iftex +@input umlaute.texinfo +@end iftex +@titlepage +@sp 10 +@center @titlefont{The Elisp Package hm---html-menus} + +@sp 4 +@center by Heiko Münkel +@sp 4 +@center Version 5.6, March 1997 +@page +@vskip 0pt plus 1filll +Copyright @copyright{} 1997 Heiko Münkel +@sp 4 +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries a copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +@end ignore +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +sections entitled ``Distribution'' and ``General Public License'' are +included exactly as in the original, and provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that the sections entitled ``Distribution'' and ``General Public +License'' may be included in a translation approved by the author instead +of in the original English. + +@end titlepage + +@comment The Top node contains the master menu for the Info file. +@comment This appears only in the Info file, not in the printed manual. + +@node Top, License, (dir), (dir) +@comment node-name, next, previous, up + + + +@menu +* License:: Your rights +* Overview:: Overview +* Distribution:: How to get the latest version +* Installation:: How to install the package +* Customization:: How to customize the package +* Add New Elements:: How to add new HTML elements +* Use With psgml-html:: Use this package as an add-on minor mode +* Internal Drag And Drop:: The HTML independent drag and drop package +* Template Minor Mode:: The HTML independent template package +* Bug Reports:: How and to whom you should send bug reports +* Concept Index:: Concept Index +* Function Index:: Function Index +* Variable Index:: Variable Index +@end menu + + +@node License, Overview, Top, Top +@comment node-name, next, previous, up +@chapter License +@cindex license to copy hm---html-menus +@cindex General Public License +Copyright (C) 1993 - 1997 Heiko Münkel, muenkel@@tnt.uni-hannover.de +@sp 2 +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +@node Overview, Distribution, License, Top +@comment node-name, next, previous, up +@chapter Overview +@cindex overview +@cindex version +@findex hm--html-mode +@findex hm--html-minor-mode + +This document describes the Elisp package @emph{hm---html-menus 5.6}. + +The version of the document is:@* +$Id: hm--html-mode.texi,v 1.2 1997/03/28 02:29:28 steve Exp $ + +The package provides commands and various popup and pulldown menus for +an HTML mode called @dfn{hm---html-mode}, a mode for writing HTML pages +for the World Wide Web (WWW). It also provides a minor mode +(@dfn{hm---html-minor-mode}), which can be used together with another +HTML major mode, like the psgml-html modes in XEmacs 19.14. + +You can easily view the HTML documents by calling the browsers w3 (a +nice elisp package from William M. Perry), Netscape, or Mosaic directly +from the pulldown menu of the mode. + +An integrated (emacs internal) drag and drop interface makes it +very easy to insert links or images, by just clicking on them. + +When appropriate, identical commands work on selected +regions. You'll see the same menu items and can use the same +keystrokes, whether a region is active or not, but if it's +active, then the commands are operating on the region. Therefore, you +don't need to learn different menus or keys for similar functions! + +One major design goal of the package was to make it easier to write a +HTML page, even if you don't know much about HTML. For that I've tried +to put more knowledge about HTML, URL's and so on in it than an SGML based +mode could find out from a DTD file. In most cases the user gets help to +construct a specific link by examples, or by a completion list with +possible input strings. And you can choose between an expert popup menu +and an novice popup menu interactively. The novice menu contains only +the basic HTML elements, so that you're not bothered by the quantity of +different HTML elements. And if you want to use more HTML elements, then +you can easily switch to the expert menus. + +You can configure the html mode with a special configuration file for +your site and with another file specific to a user. Look at the +customization chapter for this, @xref{Customization, Customization}. + + +@node Distribution, Installation, Overview, Top +@comment node-name, next, previous, up +@chapter Distribution +The name of the distribution file is +@file{hm--html-menus-<version>.tar.gz}, where @var{<version>} is the +version number. The package is part of the XEmacs. You should always +find the latest version of the package on the following ftp server: +@display +@emph{ftp.tnt.uni-hannover.de} in @file{/pub/editors/xemacs/contrib} +@end display +You should also find the package in the USA on the ftp server +(which is mirrored on many other servers in the world): +@display +@emph{sunsite.unc.edu} in @file{/pub/Linux/apps/editors/emacs} +@end display +@menu +* Contents:: Contents of the distribution +@end menu + +@node Contents, , Distribution, Distribution +@comment node-name, next, previous, up +@section Contents +@cindex contents +The package consists of the following files: + +@table @file +@item README +Please, read this first. +@itemx README-EMACS-19 +Some special hints only for GNU Emacs 19 users. +@itemx ANNOUNCEMENT +Text of the announcement of this package. +@itemx LSM +Entry for the Linux Software Map. +@itemx NEWS +The NEWS and Change log file. +@itemx adapt.el +Provides (emulates XEmacs) functions for the use of this package with +GNU Emacs 19. +@itemx hm--html.el +Provides functions to write html pages. It defines all commands which +insert html elements and entities. +@itemx hm--html-indentation.el +Provides the lisp code for the indentation. +@itemx hm--html-keys.el +Defines the key bindings. +@itemx hm--html-menu.el +Provides the menus. +@itemx hm--html-mode.el +Provides the functions for the definition of the hm--html-mode and the +hm--html-minor-mode. This is the main file of the package. +@itemx hm--html-not-standard.el +Provides functions to insert some non standard html elements. This file +is not evaluated by default and it may be a bad idea to use it. +@itemx hm--html-configuration.el +Configuration file for the html mode. All the user variables are defined +in this file. +@itemx hm--html-drag-and-drop.el +Defines the HTML-specific functions for the drag and drop interface. +@itemx hm--date.el +Defines the function hm--date, which returns the date in the format +"day-month-year" like "30-Jun-1993". +@itemx html-view.el +Ron Tapia's html-view.el to view html pages in Mosaic. It is +patched for use with XEmacs. +@itemx internal-drag-and-drop.el +Provides the general (html-mode independent) functions of the drag and +drop interface. +@itemx templates.doc +Describes the syntax of the templates provided in the file +@file{tmpl-minor-mode.el} +@itemx tmpl-minor-mode.el +Provides functions for the tmpl-minor-mode. With this mode you can +expand templates, which are described in the file +@file{templates-syntax.doc} (look at the files +@file{command-description.html.tmpl} and @file{frame.html.tmpl} for +examples). Templates can be expanded automatically, if you include a +file with templates via the html pulldown menu item "Templates ..." or +with the item "Templates (fixed dirs)...". +@itemx command-description.html.tmpl +Template file for the use with the tmpl-minor-mode. +@itemx frame.html.tmpl +Template file, provides a simple frame. +@itemx doc/hm--html-mode.texinfo +Package documentation in the Texinfo format. +@itemx doc/umlaute.texinfo +Texinfo include file for German vowel mutation (deutsche Umlaute). +@end table + +@node Installation, Customization, Distribution, Top +@comment node-name, next, previous, up +@chapter Installation +@cindex installation + + +@enumerate +@item Put all the *.el files in one of your XEmacs (or emacs) lisp load +directories (e.g. site-lisp/hm--html-menus). + +@item Put the following in your .emacs (or default.el or site-init.el): +@lisp +(autoload 'hm--html-mode "hm--html-mode" "HTML major mode." t) +(autoload 'hm--html-minor-mode "hm--html-mode" "HTML minor mode." t) +(or (assoc "\\.html$" auto-mode-alist) + (setq auto-mode-alist (cons '("\\.html$" . hm--html-mode) + auto-mode-alist))) + +(autoload 'tmpl-expand-templates-in-buffer "tmpl-minor-mode" + "Expand all templates in the current buffer." t) + +(autoload 'html-view-start-mosaic "html-view" "Start Xmosaic." t) +(autoload 'html-view-view-buffer + "html-view" + "View the current buffer in Xmosaic." + t) +(autoload 'html-view-view-file + "html-view" + "View a file in Xmosaic." + t) +(autoload 'html-view-goto-url + "html-view" + "Goto url in Xmosaic." + t) +(autoload 'html-view-get-display + "html-view" + "Get the display for Xmosaic (i.e. hostxy:0.0)." + t) +@end lisp + +The above lines assume that you have not already installed another +html mode. If this isn't true, then you should use the following: +@lisp +(setq auto-mode-alist (cons '("\\.html$" . hm--html-mode) + auto-mode-alist)) +@end lisp + +instead of: +@lisp +(or (assoc "\\.html$" auto-mode-alist) + (setq auto-mode-alist (cons '("\\.html$" . hm--html-mode) + auto-mode-alist))) +@end lisp +If you want to use the hm--html-minor-mode together +with the psgml-html modes, then you should add the following +line (works only in XEmacs version >= 19.15 and != 20.0): +@lisp +(add-hook 'html-mode-hook 'hm--html-minor-mode) +@end lisp +@end enumerate + +@node Customization, Add New Elements, Installation, Top +@comment node-name, next, previous, up +@chapter Customization +@cindex customization +@cindex configuration + +You should be able to use the package after its installation without +any further customization. But it contains a lot of user variables to +adapt the package better to your special needs. How to do this is +described in this chapter. + +@menu +* Customization (Configuration) Files:: +* Customization Variables:: +@end menu + +@node Customization (Configuration) Files, Customization Variables, Customization, Customization +@comment node-name, next, previous, up +@section Customization (Configuration) Files +@cindex customization files +@cindex configuration files + +This package uses 3 different files to customize the mode, but you need +not use all of them. Only one of them, the file +@file{hm--html-configuration.el} is delivered together with the package. +The reason for three different files is to provide the opportunity to +have different customization for the package, the site and the +user. There's also a pulldown menu item to reload all customization +files. The files are described in the following sections. + +@menu +* Where Are All The Customization Variables Defined:: +* Where To Put Site Specific Customization:: +* Where To Put User Specific Customization:: +@end menu + +@node Where Are All The Customization Variables Defined, Where To Put Site Specific Customization, Customization (Configuration) Files, Customization (Configuration) Files +@comment node-name, next, previous, up +@subsection Where Are All The Customization Variables Defined +@cindex package specific customization +@cindex hm--configuration.el +@vindex HTML_CONFIG_FILE + +All variables which can be used to customize the mode are defined in +the package configuration file @file{hm--configuration.el}. You should +take a look at this file if you don't find how to customize a feature +in this documentation (the documentation of a program is never as +complete as its program code :-). + +This file is searched in one of your lisp load directories. You can +change this by setting the environment variable @code{HTML_CONFIG_FILE} +to another file. But I don't recommend this. + +@emph{Note}: This file is loaded before the other customization files, +so that its definitions could be overwritten. All variables are set by +@code{defvar}, so that its values could also be overwritten with +@code{setq} in any standard emacs customization files (e.g. in +@file{.emacs}). + + +@node Where To Put Site Specific Customization, Where To Put User Specific Customization, Where Are All The Customization Variables Defined, Customization (Configuration) Files +@comment node-name, next, previous, up +@subsection Where To Put Site Specific Customization +@cindex site specific customization +@cindex hm--site-configuration-file.el +@vindex HTML_SITE_CONFIG_FILE +@vindex hm--html-site-config-file + +In general all users at a site are writing their html pages for the same +WWW server. Therefore it is very likely that most of the customizations +are site specific, and only a few are user specific. However, you +don't have to use a site specific customization if you don't want one. + +If you'd like to make a site specific customization of +@code{hm--html-mode}, it's possible to put it in a special file called +@file{hm--site-configuration-file.el}. If you do this, you have to set +either the lisp variable @code{hm--html-site-config-file} or the +environment variable @code{HTML_SITE_CONFIG_FILE} to the file and its +path. If you write the filename without its extension (.el), emacs +tries first to load a compiled version of the file. + +The environment variables overwrite the lisp variables. + +You can also put the site specific customization in any standard emacs +customization file like, @file{default.el}. But an advantage to +using @file{hm--site-configuration-file.el} is that it is very likely +you will be able to use this file with future versions of the +package. I'll try to make it as backward compatible as possible. + +@emph{Note}: This file is loaded after the package customization file +and before the user customization file. + +@node Where To Put User Specific Customization, , Where To Put Site Specific Customization, Customization (Configuration) Files +@comment node-name, next, previous, up +@subsection Where To Put User Specific Customization +@cindex user specific customization +@cindex ~/.hm--configuration-file.el +@vindex HTML_USER_CONFIG_FILE +@vindex hm--html-user-config-file + +User specific customization can be put in the file +@file{.hm--configuration-file.el}, which is searched by default in the +home directory of the user. This can be overwritten by setting either +the environment variable @code{HTML_USER_CONFIG_FILE} or the lisp +variable @code{hm--html-user-config-file} to the name of the file and +its path. If you write the filename without its extension (.el), emacs +tries first to load a compiled version of the file. + +You can also put the user specific customization in your +@file{.emacs}. It's up to you to decide which way is better. + +@emph{Note}: This file is loaded after the package and the site specific +one. Therefore it overwrites all other customization files. + + +@node Customization Variables, , Customization (Configuration) Files, Customization +@comment node-name, next, previous, up +@section Customization Variables + +In the following subsections the main customization variables are +described. + +@menu +* User Name/Signature:: +* Switching Between Expert And Novice Menus :: +* HTML Doctype:: +* Defaults Used For Generating Links:: +* Templates:: +* Deleting Automounter Path Prefix:: +* Automatic Insert Of Information:: +* Latin 1 Characters:: +* Drag And Drop:: +* Font Lock Keywords:: +* Prefix Keys:: +* Pulldown Menu Names:: +* Hook Variables:: +* Previewing HTML Files:: +* Meta Element:: +* Indentation:: +@end menu + + +@node User Name/Signature, Switching Between Expert And Novice Menus , Customization Variables, Customization Variables +@comment node-name, next, previous, up +@subsection User Name/Signature +@cindex user name +@cindex signature +@vindex hm--html-username +@vindex hm--html-signature-file + +@itemize @bullet +@item +@code{hm--html-username}: Your real name. This is used as the name of +the signature links. You need only specify it if your name in the +file @file{/etc/passwd} isn't the one you'd like to see in the html +files. Otherwise this may be set to @code{nil}. +@item +@code{hm--html-signature-file}: The link used in your signature. In +general this should be a link to your home page. +@end itemize + + +@node Switching Between Expert And Novice Menus , HTML Doctype, User Name/Signature, Customization Variables +@comment node-name, next, previous, up +@subsection Switching Between Expert And Novice Menus +@cindex expert menus +@cindex novice menus +@vindex hm--html-expert + +@itemize @bullet +@item +@code{hm--html-expert}: If you're a html novice and don't want to be +bothered with lots of possible html elements, then you should use the +novice popup menus. For that, set this variable to @code{nil}, +which is the default. But if you are more familiar with html and would +like to use more html elements, then you should use the expert menus and +set this variable to @code{t}. +@end itemize + + +@node HTML Doctype, Defaults Used For Generating Links, Switching Between Expert And Novice Menus , Customization Variables +@comment node-name, next, previous, up +@subsection HTML Doctype +@vindex hm--html-html-doctype-version +@cindex HTML doctype + +@itemize @bullet +@item +@code{hm--html-html-doctype-version}: The HTML version. This is used in +the doctype element. Change this if you use non HTML 3.2 elements. This +package (@xref{Overview, version}.) defines by default only HTML 3.2 elements. +@end itemize + + +@node Defaults Used For Generating Links, Templates, HTML Doctype, Customization Variables +@comment node-name, next, previous, up +@subsection Defaults Used For Generating Links +@cindex links + +One of the main features of @code{hm--html-mode} is its easy ways to +insert special links to html pages, ftp servers, news servers and so +on. I think that most people will have their own (this may be site +specific. @xref{Where To Put Site Specific Customization, Where To Put +Site Specific Customization}.) favourite servers, directories and so +on. You may customize the default values and the alists with useful +alternatives, which are used from the mode in the inserting functions +for the links. + +@menu +* Your Favourite HTTP Server:: +* Links to WWW Servers:: +* Links To Files:: +* Links To FTP Servers:: +* Links To Emacs Info Files:: +* Links To Gopher Servers:: +* Links To WAIS Gateways:: +* Links To The Mail Gateway:: +* Links For Sending Mail:: +* Links To The Program Gateway:: +* Links To The Local Program Gateway:: +* URL For Forms And Image Tags:: +* Marking Of Examples:: +@end menu + + +@node Your Favourite HTTP Server, Links to WWW Servers, Defaults Used For Generating Links, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Your Favourite HTTP Server +@cindex favourite HTTP server +@vindex hm--html-favorite-http-server-host-name + +@itemize @bullet +@item +@code{hm--html-favorite-http-server-host-name}: The name of your +favorite http server host. It must be specified! This variable is used +in many other variables. +@end itemize + + +@node Links to WWW Servers, Links To Files, Your Favourite HTTP Server, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links to WWW Server +@cindex WWW server links +@cindex HTTP links +@vindex hm--html-html-hostname:port-default +@vindex hm--html-html-hostname:port-alist +@vindex hm--html-html-path-alist + +@itemize @bullet +@item +@code{hm--html-html-hostname:port-default}: Default hostname with port +for http links to a HTML server. +@item +@code{hm--html-html-hostname:port-alist}: Alist with hostnames and ports +for http links to HTML servers. It contains useful alternatives. +@item +@code{hm--html-html-path-alist}: Alist with directories for the HTML +server. Each alist element must consist of a number and a directory +string. The number is used to select the directory during the query +about the directory for an http link. +@end itemize + + +@node Links To Files, Links To FTP Servers, Links to WWW Servers, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links To Files +@cindex file gateway links +@vindex hm--html-file-path-alist + +@itemize @bullet +@item +@code{hm--html-file-path-alist}: Alist with directories for the file +gateway. Each alist element must consist of a number and a directory +string. The number is used to select the directory during the query +about the directory for a file link. +@end itemize + + +@node Links To FTP Servers, Links To Emacs Info Files, Links To Files, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links To FTP Servers +@cindex FTP links +@vindex hm--html-ftp-hostname:port-default +@vindex hm--html-ftp-hostname:port-alist +@vindex hm--html-ftp-path-alist + +@itemize @bullet +@item +@code{hm--html-ftp-hostname:port-default}: Default hostname with port +for links to an ftp server. This is for the default FTP server. In general +you don't need to specify a port for this. +@item +@code{hm--html-ftp-hostname:port-alist}: Alist with hostnames and ports +for links to ftp servers. It contains useful alternatives. In general +you don't need to specify ports for the ftp servers. +@item +@code{hm--html-ftp-path-alist}: Alist with directories for the ftp +server links. It contains useful alternatives with /pub, /pub/gnu and +so on. Each alist element must consist of a number and a directory +string. The number is used to select the directory during the query +about the directory for an ftp link. +@end itemize + + +@node Links To Emacs Info Files, Links To Gopher Servers, Links To FTP Servers, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links To Emacs Info Files +@cindex emacs info links +@vindex hm--html-info-hostname:port-alist +@vindex hm--html-info-hostname:port-default +@vindex hm--html-info-path-alist + +@itemize @bullet +@item +@code{hm--html-info-hostname:port-default}: Default hostname with port +for the Info gateway. +@item +@code{hm--html-info-hostname:port-alist}: Alist with hostnames and ports +for Info gateways. It contains useful alternatives. +@item +@code{hm--html-info-path-alist}: Alist with directories for the Info +gateway. This may be a list with all of your emacs info directories. +@end itemize + + +@node Links To Gopher Servers, Links To WAIS Gateways, Links To Emacs Info Files, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links To Gopher Servers +@cindex Gopher gateway links +@vindex hm--html-gopher-hostname:port-default +@vindex hm--html-gopher-hostname:port-alist +@vindex hm--html-gopher-doctype-default +@vindex hm--html-gopher-doctype-alist +@vindex hm--html-gopher-anchor-alist + +There are a lot of useful gopher information servers on the Internet. +You can access them with a gopher browser or with a WWW browser. In the +latter case you have to use the gopher gateway. + +@itemize @bullet +@item +@code{hm--html-gopher-hostname:port-default}: Default hostname with port +for links to the default gopher server. +@item +@code{hm--html-gopher-hostname:port-alist}: Alist with hostnames and +ports for links to gopher servers. It contains useful alternatives. +@item +@code{hm--html-gopher-doctype-default}: For gopher links you have to +specify the doctype. In most cases this should be the string \"/1\". +Therefore this is the default doctype, but you can change it to +another. +@item +@code{hm--html-gopher-doctype-alist}: Alist with doctype strings for links +to a gopher server. The strings \"/1\", \"/11\" and \"/00\" are the only +doctype strings that I know. Please let me know if there are other +strings. +@item +@code{hm--html-gopher-anchor-alist}: Alist with directories for links to +a gopher server. It contains useful alternatives for the main gopher +servers. Each alist element must consist of a number and a directory +string. The number is used to select the directory during the query +about the directory for a local program gateway link. +@end itemize + + +@node Links To WAIS Gateways, Links To The Mail Gateway, Links To Gopher Servers, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links To WAIS Gateways +@cindex WAIS gateway links +@vindex hm--html-wais-hostname:port-alist +@vindex hm--html-wais-hostname:port-default +@vindex hm--html-wais-servername:port-alist +@vindex hm--html-wais-servername:port-default +@vindex hm--html-wais-path-alist + +You can either make a link direct to a WAIS server (it may be that not +all WWW browsers support this) or an http link to a server (relay host) +which queries the WAIS server. The variables +@code{hm--html-wais-hostname:port-default} and +@code{hm--html-wais-hostname} refer to these relay hosts and the +variables @code{hm--html-wais-servername:port-default} and +@code{hm--html-wais-servername:port-alist} refer to the WAIS servers. + +@itemize @bullet +@item +@code{hm--html-wais-hostname:port-default}: Default hostname of the +relay host with port for the WAIS gateway. +@item +@code{hm--html-wais-hostname:port-alist}: Alist with hostnames of +possible relay hosts and ports for the WAIS gateway. It contains +useful alternatives. +@item +@code{hm--html-wais-servername:port-default}: Default WAIS servername +with port for the WAIS gateway. +@item +@code{hm--html-wais-servername:port-alist}: Alist with WAIS servernames +and ports for the WAIS gateway. It contains useful alternatives. +@item +@code{hm--html-wais-path-alist}: Alist with directories for the wais gateway. +@end itemize + + +@node Links To The Mail Gateway, Links For Sending Mail, Links To WAIS Gateways, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links To The Mail Gateway +@cindex Mail gateway links +@cindex Mail folder links +@vindex hm--html-mail-hostname:port-default +@vindex hm--html-mail-hostname:port-alist +@vindex hm--html-mail-path-alist + +The following variables are for customizing the insertion of links to a mail +folder. You need a special server for this, which sends the email back +to the browser. + +@itemize @bullet +@item +@code{hm--html-mail-hostname:port-default}: Default hostname with port +for the mail gateway. +@item +@code{hm--html-mail-hostname:port-alist}: Alist with hostnames and ports +for the mail gateway. It contains useful alternatives. +@item +@code{hm--html-mail-path-alist}: Alist with directories for the mail +gateway. In these directories you'll probably find mail folders. Each +alist element must consist of a number and a directory string. The +number is used to select the directory during the query about the +directory for a mail folder link. +@end itemize + + +@node Links For Sending Mail, Links To The Program Gateway, Links To The Mail Gateway, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links For Sending Mail +@cindex mailto links +@vindex hm--html-mailto-alist + +@itemize @bullet +@item +@code{hm--html-mailto-alist}: Alist with mail addresses for the mailto +alist. The value of `user-mail-address' will also be added by the +package to this alist. +@end itemize + + +@node Links To The Program Gateway, Links To The Local Program Gateway, Links For Sending Mail, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links To The Program Gateway +@cindex program gateway links +@vindex hm--html-proggate-hostname:port-default +@vindex hm--html-proggate-hostname:port-alist +@vindex hm--html-proggate-allowed-file + +The program gateway is a special TNT site specific gateway for starting +programs out of a html page. The programs are started by a special +server, which looks in an allowed file to determine if it is allowed to +start the program. This is necessary because the programs are running +under the user id of the server. We're only allowed to start simple +display programs like man, ls and so on. + +@itemize @bullet +@item +@code{hm--html-proggate-hostname:port-default}: Default hostname with +port for the proggate server. +@item +@code{hm--html-proggate-hostname:port-alist}: Alist with hostnames and +ports for the proggate server. It contains useful alternatives. +@item +@code{hm--html-proggate-allowed-file}: The filename (with path) of the +proggate allowed file. +@end itemize + + +@node Links To The Local Program Gateway, URL For Forms And Image Tags, Links To The Program Gateway, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Links To The Local Program Gateway +@cindex local program gateway links +@vindex hm--html-local-proggate-path-alist + +Another TNT site specific way to start programs from a html page. These +programs are started with the id of the user on the host where the +client (browser) is running. Therefore no restriction about the allowed +programs is made. With this you can start only programs and do only +things, which you can do also without the WWW browser. + +@itemize @bullet +@item +@code{hm--html-local-proggate-path-alist}: Alist with directories for +the local program gateway. Contains directories, where you can find +programs. +@end itemize + + +@node URL For Forms And Image Tags, Marking Of Examples, Links To The Local Program Gateway, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection URL For Forms And Image Tags +@cindex forms URL +@cindex image URL +@vindex hm--html-url-alist + +@itemize @bullet +@item +@code{hm--html-url-alist}: Alist with URL's for FORMS and IMAGE tags. +The cdr of each list contains symbols, which specifies the use of the +URL. +@end itemize + + +@node Marking Of Examples, , URL For Forms And Image Tags, Defaults Used For Generating Links +@comment node-name, next, previous, up +@subsubsection Marking Of Examples +@cindex color of help text +@cindex font of help text +@vindex hm--html-help-foreground +@vindex hm--html-help-background +@vindex hm--html-help-font + +The following variables are for marking the examples in the help +buffer. + +@itemize @bullet +@item +@code{hm--html-help-foreground}: The foreground color for highlighting +examples. +@item +@code{hm--html-help-background}: The background color for highlighting +examples. +@item +@code{hm--html-help-font}: The font for highlighting examples. +@end itemize + + +@node Templates, Deleting Automounter Path Prefix, Defaults Used For Generating Links, Customization Variables +@comment node-name, next, previous, up +@subsection Templates +@cindex templates +@vindex hm--html-template-dir +@vindex hm--html-frame-template-file +@vindex hm--html-automatic-expand-templates + +For inserting html template files you can customize where you keep your +templates. + +@itemize @bullet +@item +@code{hm--html-template-dir}: A directory with template files. It is now +also possible to use it as a list of directories. Look at the variable +@code{tmpl-template-dir-list} for further descriptions. If this +variable is set to a non-existent directory, then it defaults to the +directory where the package is in XEmacs. This is done during +loading the file @file{hm--html-configuration.el} (@xref{Where Are All +The Customization Variables Defined, Where Are All The Customization +Variables Defined}.). This may only be useful in XEmacs >= 19.12. +@item +@code{hm--html-frame-template-file}: File which is used as template for +a html frame. An example is in the package +@emph{hm--html-menus}. @xref{Contents, Contents}. +@item +@code{hm--html-automatic-expand-templates}: Automatic expansion of +templates. This feature needs the file @file{tmpl-minor-mode.el} from Heiko +Münkel (@cite{muenkel@@tnt.uni-hannover.de}), which is distributed with the +package hm--html-menus. +@item +@code{hm--html-template-filter-regexp}: Regexp for filtering out non +(html) template files in a directory. +@end itemize + + +@node Deleting Automounter Path Prefix, Automatic Insert Of Information, Templates, Customization Variables +@comment node-name, next, previous, up +@subsection Deleting Automounter Path Prefix +@cindex automounter path +@vindex hm--html-delete-wrong-path-prefix + +@itemize @bullet +@item +@code{hm--html-delete-wrong-path-prefix}: If non-nil, it specifies path-prefixes which should be deleted in paths. +The Sun automounter adds a temporary prefix to the automounted directories + (at our site the prefix is /tmp_mnt). But you can't select such a path +if the automounter has currently not mounted the directory, and so you +can't follow an html link which consists of such a path. To overcome +this behaviour, you can set this variable to the prefix +(e.g. "/tmp_mnt"). After that, the prefix should be stripped from the +paths during the creation of the links. ATTENTION: This variable is +used as a regular expression! It can be set to a string or to a list of +strings. +@end itemize + +@node Automatic Insert Of Information, Latin 1 Characters, Deleting Automounter Path Prefix, Customization Variables +@comment node-name, next, previous, up +@subsection Automatic Insert Of Information +@cindex automatic insert +@cindex date +@cindex changed comment +@cindex created comment +@vindex hm--html-automatic-new-date +@vindex hm--html-automatic-changed-comment +@vindex hm--html-automatic-created-comment + +The @code{hm--html-mode} automatically inserts some useful information in +html pages. This behaviour can be changed by the following variables. + +@itemize @bullet +@item +@code{hm--html-automatic-new-date}: t => The date in the title line will +be updated before file saving. nil => No automatic update of the date. +@item +@code{hm--html-automatic-changed-comment}: t => A "changed comment" +line will be added before file saving. nil => No automatic insert +of a "changed comment" line. +@item +@code{hm--html-automatic-created-comment}: t => A "created comment" +line will be added. nil => No automatic insert of a "created +comment" line. +@end itemize + + +@node Latin 1 Characters, Drag And Drop, Automatic Insert Of Information, Customization Variables +@comment node-name, next, previous, up +@subsection Latin 1 Characters +@cindex latin 1 characters +@vindex hm--html-bind-latin-1-char-entities + +@itemize @bullet +@item +@code{hm--html-bind-latin-1-char-entities}: Set this to nil, if you +don't want to use the ISO Latin 1 character entities. This is only +useful if `hm--html-use-old-keymap' is set to nil. It is only used +when loading the html package the first time. +@end itemize + + +@node Drag And Drop, Font Lock Keywords, Latin 1 Characters, Customization Variables +@comment node-name, next, previous, up +@subsection Drag And Drop +@cindex drag and drop +@vindex hm--html-idd-create-relative-links +@vindex hm--html-idd-actions + +@itemize @bullet +@item +@code{hm--html-idd-create-relative-links}: If t, then the +@code{hm--html-idd-*} functions create relative links. Otherwise +absolute links are used. The idd functions are used for drag and drop. +@item +@code{hm--html-idd-actions}: The action list for the destination mode +@code{hm--html-mode}. Look at the description of the variable +idd-actions. +@end itemize + + +@node Font Lock Keywords, Prefix Keys, Drag And Drop, Customization Variables +@comment node-name, next, previous, up +@subsection Font Lock Keywords +@cindex font lock keywords +@vindex hm--html-font-lock-keywords-1 +@vindex hm--html-font-lock-keywords-2 +@vindex hm--html-font-lock-keywords + +@itemize @bullet +@item +@code{hm--html-font-lock-keywords-1}: Subdued level highlighting for +@code{hm--html-mode}. +@item +@code{hm--html-font-lock-keywords-2}: Gaudy level highlighting for +@code{hm--html-mode}. +@item +@code{hm--html-font-lock-keywords}: Default expressions to highlight in +the @code{hm--html-mode}. +@end itemize + + +@node Prefix Keys, Pulldown Menu Names, Font Lock Keywords, Customization Variables +@comment node-name, next, previous, up +@subsection Prefix Keys +@cindex prefix keys +@kindex prefix keys +@vindex hm--html-minor-mode-prefix-key +@vindex hm--html-mode-prefix-key + +@itemize @bullet +@item +@code{hm--html-minor-mode-prefix-key}: The prefix key for the key tables +in @code{hm--html-minor-mode}. +@item +@code{hm--html-mode-prefix-key}: The prefix key for the hm--html keys in +@code{hm--html-mode}. +@end itemize + + +@node Pulldown Menu Names, Hook Variables, Prefix Keys, Customization Variables +@comment node-name, next, previous, up +@subsection Pulldown Menu Names +@cindex pulldown menu names +@vindex hm--html-minor-mode-pulldown-menu-name +@vindex hm--html-mode-pulldown-menu-name + +Perhaps you'd like to change the names to get the same menu +names in the major and in the minor modes of the @code{hm--html-menus} +package. + +@itemize @bullet +@item +@code{hm--html-mode-pulldown-menu-name}: The name of the pulldown menu +in the major html mode. +@item +@code{hm--html-minor-mode-pulldown-menu-name}: The name of the pulldown +menu in the minor html mode. +@end itemize + + +@node Hook Variables, Previewing HTML Files, Pulldown Menu Names, Customization Variables +@comment node-name, next, previous, up +@subsection Hook Variables +@vindex hm--html-mode-hook + +You may use the following two variables, if you'd like to call special +functions each time the major html mode is entered or the package is +loaded. + +@itemize @bullet +@item +@code{hm--html-mode-hook}: This hook will be called each time +@code{hm--html-mode} is invoked. +@item +@code{hm--html-load-hook}: Hook variable to execute functions after +loading the package. +@end itemize + + +@node Previewing HTML Files, Meta Element, Hook Variables, Customization Variables +@comment node-name, next, previous, up +@subsection Previewing HTML Files +@cindex previewing HTML files +@vindex html-view-mosaic-command +@vindex html-sigusr1-signal-value + +The following two variables are only used, if you preview html +documents with @code{Mosaic}. There are also some other variables in +@file{hmtl-view.el}. @xref{Contents, Contents}. Look at that file if +you have trouble with the functions to preview the html document with +@code{Mosaic}. + +@itemize @bullet +@item +@code{html-view-mosaic-command}: The command that runs @code{Mosaic} on your +system. +@item +@code{html-sigusr1-signal-value}: Value for the SIGUSR1 signal on your +system. See, usually, @file{/usr/include/sys/signal.h}. +@example + SunOS 4.1.x : (setq html-sigusr1-signal-value 30) + SunOS 5.x : (setq html-sigusr1-signal-value 16) + Linux : (setq html-sigusr1-signal-value 10)) +@end example +@end itemize + + +@node Meta Element, Indentation, Previewing HTML Files, Customization Variables +@comment node-name, next, previous, up +@subsection Meta Element +@cindex meta element +@vindex hm--html-meta-name-alist + +@itemize @bullet +@item +@code{hm--html-meta-name-alist}: Alist with possible names for the name +or http-equiv attribute of meta. Currently I know of the names +@code{Expires}, @code{Keys} and @code{Author}. Please send me +(@emph{muenkel@@tnt.uni-hannover.de}) an email, if you know other +standard html names for the meta element. +@end itemize + + +@node Indentation, , Meta Element, Customization Variables +@comment node-name, next, previous, up +@subsection Indentation +@cindex indentation +@vindex hm--html-disable-indentation +@vindex hm--html-inter-tag-indent +@vindex hm--html-comment-indent +@vindex hm--html-intra-tag-indent +@vindex hm--html-tag-name-alist + +@itemize @bullet +@item +@code{hm--html-disable-indentation}: Set this to t if you want to +disable indentation in @code{hm--html-mode}. And maybe send me +(@emph{muenkel@@tnt.uni-hannover.de}) a note why you did this. +@item +@code{hm--html-inter-tag-indent}: The indentation after a start tag. +@item +@code{hm--html-comment-indent}: The indentation of a comment. +@item +@code{hm--html-intra-tag-indent}: The indentation after the start of a +tag. +@item +@code{hm--html-tag-name-alist}: An alist with tag names known by +@code{hm--html-mode}. It is used to determine if a tag is a one element +tag or not. In the future it should also be used to get possible +parameters of the tag. Use lower case characters in this list!!!! If +you have problems with the indentation of +@code{:hm--html-one-or-two-element-tag} elements, then you should set +them to either @code{:hm--html-one-element-tag} or +@code{:hm--html-two-element-tag}, depending on how you use these +elements. In the future I'll try to implement a better indentation for +these elements. +@end itemize + + +@node Add New Elements, Use With psgml-html, Customization, Top +@comment node-name, next, previous, up +@chapter Add New Elements +@cindex add new html elements +@cindex non standard html +@vindex hm--html-tag-name-alist + +If you'd like to add new HTML elements to this package, you should first take +a look at the file @file{hm--html-not-standard.el}, which +already contains some non-standard elements. If you find your tags +there, you should uncomment the line @code{(require +'hm--html-not-standard)} in the file @file{hm--html-mode.el}. There are +also menu entries for these elements in the file +@file{hm--html-menu.el}, which are commented out. Don't forget to +recompile the changed lisp files after that! + +If you don't find your new elements there, you should do the following +steps to add them: + +@enumerate +@item +Locate a tag which is similar to the one you want to add. "Similar" +means that it is inserted in the way you want to insert the new +tags. Now let's assume, that you chose @samp{<strong></strong>}. +@item +Look at the file @file{hm--html.el} and search the function(s) which +inserts the similar tag(s). If the HTML element consists of only one +tag, then there should be only one function for inserting the tag. If +the element consists of a start and an end tag, there are at least two +functions. Only in some special cases, if it is possible to insert +elements with different attribute values, are there more than two +functions. In the case of @samp{<strong></strong>}, there are the two +functions @code{hm--html-add-strong} and +@code{hm--html-add-strong-to-region}. The first one is used if no +region is active, and the second if a region is active. The naming scheme +of these functions is always @var{hm--html-add-<tagname>} and +@var{hm--html-add-<tagname>-to-region}. @var{<tagname>} is not in all +cases the tagname. Sometimes a more human readable name is used (e.g. +bold instead of b). +@item +To get the right indentation for the new tags you should add an entry +for them to the variable @code{hm--html-tag-name-alist}, which is defined +in @file{hm--html-configuration.el}. Let's assume that the new tagname +is @samp{foo}. The entry in @code{hm--html-tag-name-alist} should +be +@lisp + ("foo" (:hm--html-one-element-tag t)) +@end lisp +if the new element consists only of one tag (@samp{img} is such an +element) or +@lisp + ("foo" (:hm--html-two-element-tag t)) +@end lisp +if the new element consists of two tags (@samp{strong} is such an +element) or +@lisp + ("foo" (:hm--html-one-or-two-element-tag t)) +@end lisp +if the new element consists of two tags, but it is permissible to use the +start tag without its end tag (@samp{p} is such an element). +@end enumerate + +Now you are ready and able to insert the new tags with +@example + M-x hm--html-add-foo +@end example +and +@example + M-x hm--html-add-foo-to-region +@end example + +If you want to add the new commands also to the popup menu, +then you have to take a look at @file{hm--html-menu.el}, where all the +menus are defined. Look at @code{hm--html-menu-noregion-expert} and +@code{hm--html-menu-region-expert}. The first one is used if no region is +active, and the second if a region is active (both are only available +if the "expert menus" are used; this is an option in the pulldown +menu). You should now add an entry like +@lisp + ["Foo" hm--html-add-foo t] +@end lisp +to the @code{hm--html-menu-noregion-expert} variable and an entry +@lisp + ["Foo" hm--html-add-foo-to-region t] +@end lisp +to the @code{hm--html-menu-region-expert} variable (only if +@code{hm--html-add-foo-to-region} exists). You can do this by setting the +whole variable to a new value or by using the function +@code{add-menu-button}. I recommend the last method. + +If you'd like to have a key sequence for inserting the new tag as well, +take a look at @file{hm--html-keys.el}. There are +different key tables defined for region and no region cases and for +different sorts of elements, like anchors, frame elements (doesn't mean +the Netscape element frame) and so on. These "groups" are the same as +the submenu groups. + + +@node Use With psgml-html, Internal Drag And Drop, Add New Elements, Top +@comment node-name, next, previous, up +@chapter Use With psgml-html +@cindex use with other HTML modes +@findex hm--html-minor-mode + +The package provides a minor mode called @code{hm--html-minor-mode}, +which could be used to join the features of this package with another +HTML package. Currently this is only tested with the psgml-html mode in +XEmacs. Please let me know if it works or not with other packages +or in Emacs 19. + +If you'd like to use the minor mode in psgml-html mode, +put the following line in your @file{.emacs}: + +@lisp + (add-hook 'html-mode-hook 'hm--html-minor-mode) +@end lisp + +Note: This should work only in XEmacs versions greater than 19.14 and not +in 20.0. It doesn't work in other versions because the hook variable +@code{html-mode-hook} doesn't exist in those versions. Therefore in those +versions you must either call the minor mode by hand or change the +lisp file of the psgml-html mode. + + +@node Internal Drag And Drop, Template Minor Mode, Use With psgml-html, Top +@comment node-name, next, previous, up +@chapter Internal Drag And Drop +@cindex drag and drop +@cindex internal drag and drop +@vindex idd-actions +@vindex hm--html-idd-actions + + +The file @file{internal-drag-and-drop.el}, which is shipped with +@file{hm--html-menus}, provides a general package for internal drag and +drop in emacs. "General" means that it can be used apart from +@code{hm--html-mode} in any other mode. + +You can start such an action by clicking with the mouse in the source +buffer and then in the destination buffer. The action may depend on +the points where you've clicked with the mouse, on the state of the +region, the point, the mark and any other properties of the source and +the destination buffers. The actions are defined by the variable +@code{idd-actions}, which is a buffer local variable. + + +@menu +* Drag And Drop Customization:: +* The Drag And Drop Commands:: +@end menu + +@node Drag And Drop Customization, The Drag And Drop Commands, Internal Drag And Drop, Internal Drag And Drop +@comment node-name, next, previous, up +@section Drag And Drop Customization +@cindex customization +@cindex configuration + +The internal drag and drop functions may be used in all +modes. Therefore their general customization isn't done in +@file{hm--html-configuration.el}. Its variables are defined in the file +@file{internal-drag-and-drop.el} instead. You can set them in your +@file{.emacs} or in one of the other emacs init files (e.g. +@file{default.el}). The following subsections describe the main +customization variables. + + +@menu +* Defining The Drag And Drop Actions:: +* The Mouse Bindings:: +@end menu + +@node Defining The Drag And Drop Actions, The Mouse Bindings, Drag And Drop Customization, Drag And Drop Customization +@comment node-name, next, previous, up +@subsection Defining The Drag And Drop Actions +@cindex actions +@cindex drag and drop actions +@vindex idd-actions + +The drag and drop actions are commands which are called after an +internal drag and drop. They depend on the source and the destination +of the drag and drop. Drag and drop actions are defined by the +variable: + +@itemize @bullet +@item +@code{idd-actions}: A list with actions, depending on the source and the +destination of the drag and drop command. +@end itemize + +The list looks like: +@lisp +'((@var{<destination-specification-1>} (@var{<source-specification-1>} @var{<action-1-1>}) + (@var{<source-specification-2>} @var{<action-1-2>}) + : + ) + (@var{<destination-specification-2>} (@var{<source-specification-1>} @var{<action-2-1>}) + (@var{<source-specification-2>} @var{<action-2-2>}) + : + ) + : + ) +@end lisp +The @var{<source-specification>} looks like the following: +@lisp +'([(@var{<specification-type>} @var{<value>})]) +@end lisp +with +@lisp +@table @var +@item <specification-type> :== +@w{@code{idd-if-minor-mode-p}} | @w{@code{idd-if-buffer-name-p}} | +@w{@code{idd-if-region-active-p}} | @w{@code{idd-if-url-at-point-p}} | +@w{@code{idd-if-major-mode-p}} | @w{@code{idd-if-variable-non-nil-p}} | +@w{@code{idd-if-dired-file-on-line-p}} | +@w{@code{idd-if-dired-no-file-on-line-p}} | +@w{@code{idd-if-local-file-p}} | @w{@code{idd-if-buffer-name-p}} | +@w{@code{idd-if-modifiers-p}} | ... +@end table +@end lisp + +The @var{<specification-type>} - functions must have two arguments. The +first one is the source or destination and the second is the +@var{<value>}. It must return @code{nil}, if the test wasn't successful, +and a number (in general 1), which specifies the weight of the test +function. The weights of all single tests are added to a summary weight +and assigned to the action. The action with the highest weight is called +from the action handler. Look at the definition of +@w{@code{idd-if-major-mode-p}}, @w{@code{idd-if-minor-mode-p}} and so on for +examples. Look at the function +@code{idd-get-source-or-destination-alist}, if you want to know the +structure of the @code{source-or-destination} argument of these +functions. + +The @var{<destination-specification>} looks like +@var{<source-specification>}, but in general it could be set to +@code{nil} in mode specific idd-action lists. + +If @var{<destination-specification-1>} or @var{<source-specification-1>} +is set to @code{nil}, then every source or source +matches. @code{idd-actions} is a buffer local variable, which should be +at least mode depended. So if the @var{<destination-specification-1>} is +set to @code{nil} it says, that the destination buffer must only have a +specific mode. However, it's also possible to define a general +@code{idd-actions} list, where the destination mode is specified by +@code{idd-if-major-mode-p}. + +@var{<action>} is a function which has two arguments. The first +specifies the source and the second the destination. Look at the +function definition of @code{idd-action-copy-region} and +@code{idd-action-copy-replace-region}. They are examples for such +actions. + +The following is an example for @code{hm--html-mode}: + +@lisp +(defvar idd-actions + '((nil (((idd-if-major-mode-p . dired-mode) + (idd-if-dired-file-on-line-p . ".*\\.\\(gif\\)\\|\\(jpq\\)")) + hm--html-idd-add-include-image-from-dired-line) + (((idd-if-major-mode-p . dired-mode) + (idd-if-dired-no-file-on-line-p . nil)) + hm--html-idd-add-file-link-to-file-on-dired-line) + (((idd-if-major-mode-p . dired-mode) + (idd-if-dired-no-file-on-line-p . t)) + hm--html-idd-add-file-link-to-directory-of-buffer) + (((idd-if-major-mode-p . w3-mode) + (idd-if-url-at-point-p . t)) + hm--html-idd-add-html-link-from-w3-buffer-point) + (((idd-if-major-mode-p . w3-mode)) + hm--html-idd-add-html-link-to-w3-buffer) + (((idd-if-local-file-p . t)) + hm--html-idd-add-file-link-to-buffer))) +@end lisp + + +@node The Mouse Bindings, , Defining The Drag And Drop Actions, Drag And Drop Customization +@comment node-name, next, previous, up +@subsection The Mouse Bindings +@cindex mouse bindings +@vindex idd-global-mouse-keys +@vindex idd-global-help-mouse-keys +@vindex idd-drag-and-drop-mouse-binding-type +@findex idd-mouse-drag-and-drop +@findex idd-help-mouse-drag-and-drop + +The following three variables determine the mouse +bindings and the mouse behaviour for the internal drag and drop package: + +@itemize @bullet +@item +@code{idd-global-mouse-keys}: The mouse keys for the command +@code{idd-mouse-drag-and-drop}. The command +@code{idd-mouse-drag-and-drop} is bound during the loading of the +package @file{internal-drag-and-drop} to these keys in the @b{global +keymap}. The drag and drop action @b{must be bound global}, because the +drag and drop action must be started by a click in the source +buffer. Therefore no action will be performed if the mouse keys are not +bound to @code{idd-mouse-drag-and-drop} in the destination buffer. + +Set it to @code{nil}, if you don't want to bind this function during +loading. + +If the command is already bound in the global keymap during loading, +then this key sequence will not be bound. + +By default the mouse binding is @key{meta} @key{control} @key{button1}. + +@item +@code{idd-global-help-mouse-keys}: The mouse keys for the command +@code{idd-help-mouse-drag-and-drop}. The command +@code{idd-help-mouse-drag-and-drop} is bound during the loading of the +package @file{internal-drag-and-drop} to these keys in the @b{global +keymap}. + +Set it to @code{nil} if you don't want to bind this function during +loading. + +If the command is already bound in the global keymap during loading, +then this key sequence will not be bound. + +By default the mouse binding is @key{meta} @key{control} @key{button3}. + +@item +@code{idd-drag-and-drop-mouse-binding-type}: The type of the drag and +drop mouse binding. The value may be @code{click} or +@code{press-button-during-move}. A value of @code{click} means that +you have to click over the source, release the button and click it again +over the destination. A value of @code{press-button-during-move} means +that you have to press the button down over the source and hold it until +the mouse pointer is over the destination. + +The @emph{disadvantage} of the @code{press-button-during-move} type +compared with the @code{click} type is that you can't select a destination +region, and therefore a drag and drop action depending on a selected +region can't be started with that type of mouse binding. +@end itemize + +@node The Drag And Drop Commands, , Drag And Drop Customization, Internal Drag And Drop +@comment node-name, next, previous, up +@section The Drag And Drop Commands +@cindex drag and drop commands + +There are 2 groups of commands. The first contains commands which +perform the drag and drop action and the second displays help +messages about a possible drag and drop action. + + +@menu +* Performing The Drag And Drop Action:: +* Displaying Help On Drag And Drop:: +@end menu + +@node Performing The Drag And Drop Action, Displaying Help On Drag And Drop, The Drag And Drop Commands, The Drag And Drop Commands +@comment node-name, next, previous, up +@subsection Performing The Drag And Drop Action +@cindex drag and drop commands +@cindex performing drag and drop +@findex idd-mouse-drag-and-drop +@findex idd-start-mouse-drag-and-drop +@findex idd-mouse-drag-and-drop-press-button-during-move +@findex idd-mouse-drag-and-drop-click +@findex idd-help-start-action +@vindex idd-drag-and-drop-mouse-binding-type + +The following five commands perform internal +drag and drop actions: + +@itemize @bullet +@item +@code{idd-mouse-drag-and-drop}: Performs a drag and drop action. It +calls the command @code{idd-mouse-drag-and-drop-click} or +@code{idd-mouse-drag-and-drop-press-button-during-move} depending on the +value of @code{idd-drag-and-drop-mouse-binding-type}. However you've set +this, you start a drag and drop action with this command by pressing +down its mouse button over the source. This command is bound by default +to a global mouse key sequence. @xref{The Mouse Bindings}. + +@item +@code{idd-start-mouse-drag-and-drop}: Starts a drag and drop command. +This command could be used to start a drag and drop command without a +button event. Therefore this should not be bound directly to a mouse +button. This command can be used to start a drag and drop action with a +click on a menu item or tool bar icon. After that you have to press a +mouse button over the source. The rest depends on the value of +@code{idd-drag-and-drop-mouse-binding-type}, as with the command +@code{idd-mouse-drag-and-drop}. + +@item +@code{idd-help-start-action}: It is possible to display a help buffer +with a message in it, which describes the action instead of performing +it immediately (@pxref{Displaying Help On Drag And Drop}). In this case +you can perform the action by clicking on a special extent in the help +buffer, which runs this command. + +@item +@code{idd-mouse-drag-and-drop-press-button-during-move}: Performs a drag +and drop action in a more traditional way than +@code{idd-mouse-drag-and-drop-click}. First you press the button +over the source and then move with the depressed button to the +destination, where you release the button. This must be bound to a +mouse button. The @code{SOURCE-EVENT} must be a +@code{button-press-event}. + +The disadvantage of this command compared with the command +@code{idd-mouse-drag-and-drop-click} is, that you can't select a +destination region. + +You should bind the command @code{idd-mouse-drag-and-drop} instead of +this one, because it's then possible to switch between both drag and +drop behaviours by changing only one variable. + +@item +@code{idd-mouse-drag-and-drop-click}: Performs a drag and drop action in +a more useful way than +@code{idd-mouse-drag-and-drop-press-button-during-move}. First you +click on the source and then on the destination. This must +be bound to a mouse button. The @code{SOURCE-EVENT} must be a +@code{button-press-event}. + +You should bind the command @code{idd-mouse-drag-and-drop} instead of +this one, because it's then possible to switch between both drag and +drop behaviours by changing only one variable. +@end itemize + + +@node Displaying Help On Drag And Drop, , Performing The Drag And Drop Action, The Drag And Drop Commands +@comment node-name, next, previous, up +@subsection Displaying Help On Drag And Drop +@cindex help on drag and drop +@cindex displaying help on drag and drop +@findex idd-help-mouse-drag-and-drop +@findex idd-start-help-mouse-drag-and-drop + +It's possible to display a buffer with a help message describing the +action being considered before actually performing it. To perform the +action, you then click on a special extent in the help buffer. To get +the help buffer, you do the same things as you do to perform the action +itself. Only the mouse key differs. There are two commands for this: + +@itemize @bullet +@item +@code{idd-help-mouse-drag-and-drop}: Displays help about the drag and +drop action. It works similarly to @code{idd-mouse-drag-and-drop} +(@pxref{Performing The Drag And Drop Action}). + +By default this command is globally bound to @key{meta} @key{control} +@key{button3}. This may be changed with the variable +@code{idd-global-help-mouse-keys} (@pxref{The Mouse Bindings}). + +@item +@code{idd-start-help-mouse-drag-and-drop}: Starts displaying help about +the drag and drop action. It works similarly to +@code{idd-start-mouse-drag-and-drop} (@pxref{Performing The Drag And +Drop Action}) and can be used to start the help by clicking on a menu +item or a tool bar icon. +@end itemize + + +@node Template Minor Mode, Bug Reports, Internal Drag And Drop, Top +@comment node-name, next, previous, up +@chapter Template Minor Mode +@cindex templates + +There's a file called @file{tmpl-minor-mode.el} in the distribution +of the package @emph{hm---html-menus}. It provides functions to use +templates for the @code{hm--html-mode} and also for other modes. It +needs nothing from the rest of the package and therefore it can be used +independently of @code{hm--html-mode}. + + +@menu +* What Are Templates:: +* Syntax Of Templates:: +* Template Customization:: +* Template Commands:: +@end menu + +@node What Are Templates, Syntax Of Templates, Template Minor Mode, Template Minor Mode +@comment node-name, next, previous, up +@section What Are Templates +@cindex templates +@findex tmpl-insert-template-file +@findex tmpl-expand-templates-in-buffer +@findex tmpl-expand-templates-in-region + +Templates are special pieces of text, which can be expanded by +emacs. Expansion means that the template is replaced by something else, +determined by evaluating lisp forms or emacs commands. The +expansion can be done automatically after the insertion of templates +with the command @code{tmpl-insert-template-file} in a buffer or by hand +with the commands @code{tmpl-expand-templates-in-buffer} or +@code{tmpl-expand-templates-in-region}. + +Templates can be put together with normal text in a so called template +file to provide prototype files. You should name these files with the +following naming scheme: + +@example + @var{<file>}.@var{<type>}.tmpl +@end example + +where @var{<file>} is a string which describes for what the template +could be used and @var{<type>} the normal file extension, e.g. @samp{c} +for C- files or @samp{html} for HTML- files. + + +@node Syntax Of Templates, Template Customization, What Are Templates, Template Minor Mode +@comment node-name, next, previous, up +@section Syntax Of Templates +@cindex template syntax +@vindex tmpl-sign + +The templates are marked with the sign ^@@, which stands for the null +character (\000). It can be inserted in a buffer with the keys @kbd{C-q +C-SPC}. You can also use any other character or string of characters by +changing the variable @code{tmpl-sign}. + +At the moment, there are 3 major types of templates: + +@enumerate +@item +@emph{Emacs Lisp function templates}: The expansion of such a template +evals a lisp form. It is possible to use functions or variables as lisp +forms. The following is a simple example: + +@lisp +^@@LISP^@@ (insert-file "~/.emacs") ^@@END LISP^@@ +@end lisp + +inserts the contents of the file @file{~/.emacs} in the current +buffer during the expansion. + +@item +@emph{Emacs command templates}: The expansion of a command template +evals a template in the same way as an interactive command, which is +invoked with @kbd{M-x command}. For example: + +@lisp +^@@COMMAND^@@ insert-file ^@@END COMMAND^@@ +@end lisp + +runs the interactive command @code{insert-file} during the expansion. + +@item +@emph{Template comments} Nothing will be evaluated during the expansion +of a template comment. It is only a comment. For example: + +@lisp +^@@C^@@ This is a comment +@end lisp + +The end of the comment is the end of the line. Therefore it has the same +syntax as a lisp or C++ comment. +@end enumerate + +By default, a template will be deleted after its expansion, but +without the linefeed. Look at the following examples: + +Before the expansion: + +@example + Line before the template + ^@@C^@@ The Text of a comment template + Line after the template +@end example + +After the expansion: + + Line before the template + + Line after the template + + +Templates can start in any column, and only the template will be deleted +after its expansion. + + +It is also possible to put an attribute list in a template. The +attributes of the list control the deletion of the template. It +may be that this will be extended in the future with other attributes. +The attribute list must be specified as an alist (assoc list) in the start +tag of a template and after its type. Each element of the alist consists +of the name of the attribute following its value. +If no attribute list is specified or if an attribute is missing, then the +default values are used. At the moment there are the following 2 attributes: + +@enumerate +@item @emph{don't delete attribute} (@code{DONT_DELETE}): If the value +is t, then the template will not be deleted after its expansion. If the +value is nil then the template will be deleted. The default is nil. For +example: + +Before the expansion: + +@example + Line before the template + ^@@LISP ((DONT-DELETE t))^@@ (insert-file "~/.cshrc") ^@@END LISP^@@ + Line after the template +@end example + +After the expansion: + +@example + Line before the template + ^@@LISP ((DONT-DELETE t))^@@ (insert-file "~/.cshrc") ^@@END LISP^@@ + Line after the template +@end example + +It was assumed, that the file @file{~/.cshrc} was empty ! + +@item @emph{delete line attribute} (@code{DELETE-LINE}): If the value is +t, then the linefeed before or after the template will be deleted. If +the value is nil then no linefeed will be deleted. The default is +nil. For example: + +Before the expansion: + +@example + Line before the template + ^@@LISP ((DELETE-LINE t))^@@ (insert-file "~/.cshrc") ^@@END LISP^@@ + Line after the template +@end example + +After the expansion: + +@example + Line before the template + Line after the template +@end example + +It was assumed, that the file @file{~/.cshrc} was empty ! +@end enumerate + +These attributes can be combined. For example: + +@example + ^@@COMMAND ((DELETE-LINE t) (DONT-DELETE nil))^@@ + insert-file + ^@@END COMMAND^@@ +@end example + +The last examples show also that whitespace (blanks, tabs, linefeeds) +is allowed at most positions in a template. + +Look at the file @file{tmpl-minor-mode.el} for a description of the +commands to expand templates. + + +@node Template Customization, Template Commands, Syntax Of Templates, Template Minor Mode +@comment node-name, next, previous, up +@section Template Customization +@cindex customization +@cindex configuration +@vindex tmpl-template-dir-list +@vindex tmpl-automatic-expand +@vindex tmpl-filter-regexp +@vindex tmpl-sign +@vindex tmpl-minor-mode-map + +Templates may be used for all editing modes, not only for +@code{hm--html-mode}. Therefore their general customization isn't done in +@file{hm--html-configuration.el}. Template variables are defined in the file +@file{tmpl-minor-mode.el} instead. You can set them in your +@file{.emacs} or in one of the other emacs init files (e.g. +@file{default.el}). The following are the main variables for +customization. + +@itemize @bullet +@item +@code{tmpl-template-dir-list}: A list of directories with template +files. If it is nil, the default-directory will be used. If more than +one directory is specified, then the template filenames should differ +in all directories. + +This variable is used in the commands for inserting templates. Look at +@code{tmpl-insert-template-file-from-fixed-dirs} and at +@code{tmpl-insert-template-file}. The command +@code{tmpl-insert-template-file} uses only the car of the list (if it is +a list.) +@item +@code{tmpl-filter-regexp}: This defines a regular expression used for +filtering out non-template files in template directories. It is used in +the command @code{tmpl-insert-template-file-from-fixed-dirs} to allow +only the selection of files which match the regexp. If it is +nil, then the Filter @code{".*\\.tmpl$"} is used. Set it to +@code{\".*\"} if you want to disable the filter function or use the +command @code{tmpl-insert-template-file}. +@item +@code{tmpl-automatic-expand}: If you insert a template file with +@code{tmpl-insert-template-file-from-fixed-dirs} or with +@code{tmpl-insert-template-file}, this variable is used. The templates +in the buffer will be automatically expanded if the variable is set to +t, which is the default. +@item +@code{tmpl-sign}: Thisdetermines the sign which marks the beginning and +the end of template expressions. By default it is set to the null +character (displayed in emacs as ^@@). You can also set this to a +string. Be careful if you change it, so that the templates will not be +mixed up with other non-template text! Note: The expansion function +looks at the whole template, so that it is very unlikely that the +function will make a mistake. +@item +@code{tmpl-minor-mode-map}: The keymap for the template minor mode. +@end itemize + + +@node Template Commands, , Template Customization, Template Minor Mode +@comment node-name, next, previous, up +@section Template Commands +@cindex commands + +In this section the commands of the template package are described. + + +@menu +* Insert Of Template Files:: +* Expansion Of Templates:: +* Escaping Of Template Signs:: +* The Template Minor Mode:: +@end menu + +@node Insert Of Template Files, Expansion Of Templates, Template Commands, Template Commands +@comment node-name, next, previous, up +@subsection Insert Of Template Files +@cindex template insert +@cindex template files +@findex tmpl-insert-template-file-from-fixed-dirs +@findex tmpl-insert-template-file + +The template package provides the following two commands for inserting +template files in an emacs buffer. + +@itemize @bullet +@item +@code{tmpl-insert-template-file}: This command can be used to insert a +template file in the current buffer. It will expand the templates in the +buffer if @code{tmpl-automatic-expand} is set to @code{t}. You can set +a default directory for this command by setting the variable +@code{tmpl-template-dir-list}. @xref{Template Customization}. +@item +@code{tmpl-insert-template-file-from-fixed-dirs}: The difference from +the simpler command @code{tmpl-insert-template-file} is that this +command will build a list for filename completion from a list of +predefined directories (look at @code{tmpl-template-dir-list}). The +filename completion list will also be filtered with the regular +expression defined by @code{tmpl-filer-regexp}. @xref{Template +Customization}. You can set the directory list and/or the filter +differently in each mode where you use templates, so that you will get +in the completion list only template files which could be used for the +current mode. + +If you want to insert a template file with this command, which is not in +one of the directories from @code{tmpl-template-dir-list}, then you have +to enter the string @emph{"Change the directory"} instead of a template +file. This string is also in the completion list. +@end itemize + +Both commands can also be used as functions. In this case the template +file with is directory path must be given to them as an parameter. + +You can also use commands like @code{insert-file} to insert template +files and expand them by hand (@pxref{Expansion Of Templates}). + + +@node Expansion Of Templates, Escaping Of Template Signs, Insert Of Template Files, Template Commands +@comment node-name, next, previous, up +@subsection Expansion Of Templates +@cindex template expansion +@cindex expansion +@findex tmpl-expand-templates-in-region +@findex tmpl-expand-templates-in-buffer + +You can expand templates by hand or automatically after their +insertion. @xref{Insert Of Template Files}, for automatic +expansion. Expansion by hand can be done with one of the +following two functions: + +@itemize @bullet +@item +@code{tmpl-expand-templates-in-region}: Expands the templates in the +region. The region is established by the optional arguments @code{BEGIN} +and @code{END}. If the arguments are @code{nil}, or if the function is called +interactively, then the current region will be used. +@item +@code{tmpl-expand-templates-in-buffer}: Expands all templates in the +current buffer. +@end itemize + +Both commands are bound to keys in the @code{tmpl-minor-mode}. @xref{The +Template Minor Mode}. + + +@node Escaping Of Template Signs, The Template Minor Mode, Expansion Of Templates, Template Commands +@comment node-name, next, previous, up +@subsection Escaping Of Template Signs +@cindex template escaping +@cindex escaping +@findex tmpl-escape-tmpl-sign-in-region +@findex tmpl-escape-tmpl-sign-in-buffer + +It is possible to escape template signs in a buffer or in a +region. Templates with escaped template signs are not expanded, but they +are un-escaped by the expansion functions. Therefore it is possible to +exclude single templates from the expansion by escaping them. Note: +You can't escape a template twice. The commands which can be used for +this are: + +@itemize @bullet +@item +@code{tmpl-escape-tmpl-sign-in-region}: Escapes all @code{tmpl-sign}s +(@pxref{Template Customization}) with a @code{tmpl-sign} in a +region. The region is established by the optional arguments @code{BEGIN} +and @code{END}. If the arguments are @code{nil}, or if the function is +called interactively, then the current region will be used. +@item +@code{tmpl-escape-tmpl-sign-in-buffer}: Same as +@code{tmpl-escape-tmpl-sign-in-region}, but escapes all templates in the +whole buffer. +@end itemize + +Both commands are bound to keys in @code{tmpl-minor-mode}. @xref{The +Template Minor Mode}. + + +@node The Template Minor Mode, , Escaping Of Template Signs, Template Commands +@comment node-name, next, previous, up +@subsection The Template Minor Mode +@cindex template minor mode +@cindex minor mode +@cindex key bindings +@findex tmpl-minor-mode + +The template minor mode can be toggled with the command +@code{tmpl-minor-mode}. The purpose of this mode is only to provide +key bindings for some of the commands of the package +@file{tmpl-minor-mode}. If you don't want to use the key bindings, you +don't need this minor mode. + +Look at the key table @code{tmpl-minor-mode-map} (@pxref{Template +Customization}) for the definition of the keys. + +It may be that I'll also provide a pulldown or popup menu for the minor +mode in a future release. + + +@node Bug Reports, Concept Index, Template Minor Mode, Top +@comment node-name, next, previous, up +@chapter Bug Reports +@cindex bug report +@findex hm--html-submit-bug-report + +There's no software out there without bugs. This package contains +software, therefore it has bugs. I (Heiko Münkel +<muenkel@@tnt.uni-hannover.de>) have inserted most of the bugs in this +package by myself, but I've forgotten where. So please help me out of +this disaster and send bug reports, if you've found one of these little +animals. I'll try to do my very best to fix them and to insert new ones. + +If it's possible, you should use the command + +@lisp + M-x hm--html-submit-bug-report +@end lisp + +There's also an entry in the pulldown menu for this. + +In some cases a backtrace would also be appropriate. + +If you can't send the report with this function, at +least include the package version and your @code{Emacs}/@code{XEmacs} +version. + +In the best of all worlds you would also include a patch to fix the bug. + +@emph{Note}: It's not true that I've inserted the bugs as a marketing trick, +so that you must buy the next version to get some of them fixed. This is +false, because this software is free. + + +@node Concept Index, Function Index, Bug Reports, Top +@comment node-name, next, previous, up +@unnumbered Concept Index + +@printindex cp + +@node Function Index, Variable Index, Concept Index, Top +@comment node-name, next, previous, up +@unnumbered Function Index + +@printindex fn + +@node Variable Index, , Function Index, Top +@comment node-name, next, previous, up +@unnumbered Variable Index + +@printindex vr + +@summarycontents +@contents +@bye
--- a/man/hypb-mouse.txt Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -============================================================================== - Smart Keys -Context Action Key Assist Key -============================================================================== -Hyperbole - On a menu item Item is activated Item help - On an explicit button Button is activated Button help - Reading argument - 1st press at an arg value Value copied to minibuffer <- same - 2nd press at an arg value Value used as argument <- same - In minibuffer Minibuf arg is applied Completion help - On an implicit button Button is activated Button help - Within an outline cell Collapses and expands Shows tree props - Left of an outline cell Creates a klink Moves a tree - Wrolo Match Buffer Edits entries and mails to e-mail addresses - -Mouse or Keyboard Display Control - Line end, not end of buffer - smart-scroll-proportional - = t (default) Makes curr line top line Bottom line - = nil Scrolls up a windowful Scrolls down - End of Any Help buffer Screen restored to previous state - -Mouse-only Control - Modeline down & wind release Resize window height <- same - Drag from shared window side - or from left of scroll bar Resize window width <- same - Drag between windows Create/modify a link but Swap window buffers - Horizontal drag within window - Left to right Scroll to buffer end Split window across - Right to left Scroll to buffer begin Delete window - Vertical drag within window Split window sideways <- same - Diagonal drag within window Save ring screen-config Restore ring config - Click in modeline - Left window edge Bury buffer Unbury bottom buf - Right window edge Info Smart Key summary - Otherwise Action Key Hook Assist Key Hook - -Special Modes - C,C++,Objective-C,Java Modes Jumps to id/include def Jumps to next def - Java Cross-Reference Tag Jumps to identifier def Jumps to next def - Assembly Language Mode Jumps to id/include def Jumps to next def - Any Lisp or Fortran Mode Jumps to id def Jumps to next def - Emacs Lisp Compiler Error Jumps to def with error <- same - Grep or Occur Match Jumps to match source line <- same - Multi-buffer Occur Match Jumps to match source line <- same - Outline Major/Minor Modes Collapses, expands, and moves outline entries - Man Apropos Displays man page entry <- same - Man Pages Follows cross refs, file refs and C code refs - Buffer Menu Saves, deletes and displays buffers - -Emacs Info Reader - Menu Entry or Cross Ref Jumps to referent <- same - Up, Next or Prev Header Jumps to referent Jumps to prior node - File entry of Header Jumps to top node Jumps to (DIR) node - End of current node Jumps to next node Jumps to prev node - Anywhere else Scrolls up a windowful Scrolls down a wind - -Subsystems - Calendar Scrolls or shows appts Scrolls/marks dates - Dired Mode Views and deletes files from directory listing - GNUS News Reader Toggles group subscriptions, gets new news, - and browses articles - Mail reader and Summaries Browses, deletes and expunges messages - OO-Browser Browses classes and elements - Tar Mode Views and edits files from tar archive files - -Any other context (defaults) Hyperbole top menu Smart Key summary -==============================================================================
--- a/man/internals/internals.texi Mon Aug 13 09:21:56 2007 +0200 +++ b/man/internals/internals.texi Mon Aug 13 09:23:06 2007 +0200 @@ -7,7 +7,7 @@ @ifinfo Copyright @copyright{} 1992 - 1996 Ben Wing. -Copyright @copyright{} 1996 Sun Microsystems. +Copyright @copyright{} 1996, 1997 Sun Microsystems. Copyright @copyright{} 1994, 1995 Free Software Foundation. Copyright @copyright{} 1994, 1995 Board of Trustees, University of Illinois. @@ -59,9 +59,10 @@ @titlepage @title XEmacs Internals Manual -@subtitle Version 1.0, March 1996 +@subtitle Version 1.1, March 1997 @author Ben Wing +@author Martin Buchholz @page @vskip 0pt plus 1fill @@ -72,8 +73,8 @@ Copyright @copyright{} 1994, 1995 Board of Trustees, University of Illinois. @sp 2 -Version 1.0 @* -March, 1996.@* +Version 1.1 @* +March, 1997.@* Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are @@ -870,7 +871,7 @@ operations that make XEmacs useful as an editor as well as just a Lisp environment, and also contains many add-on packages that allow XEmacs to browse directories, act as a mail and Usenet news reader, -compile Lisp code, etc. There is actually a lot more Lisp code than +compile Lisp code, etc. There is actually more Lisp code than C code associated with XEmacs, but much of the Lisp code is peripheral to the actual operation of the editor. The Lisp code all lies in subdirectories underneath the @file{lisp/} directory. @@ -889,15 +890,15 @@ programs that are used in connection with XEmacs. Some of them are used during the build process; others are used to perform certain functions that cannot conveniently be placed in the XEmacs executable (e.g. the -@file{movemail} program for fetching mail out of /var/spool/mail, which -must be setgid to @file{mail} on many systems; and the 'gnuclient' -program, which allows an external script to communicate with a running -XEmacs process). +@file{movemail} program for fetching mail out of @file{/var/spool/mail}, +which must be setgid to @file{mail} on many systems; and the +@file{gnuclient} program, which allows an external script to communicate +with a running XEmacs process). The @file{man/} directory contains the sources for the XEmacs documentation. It is mostly in a form called Texinfo, which can be -converted into either a printed document (by passing it through TeX) or -into on-line documentation called @dfn{info files}. +converted into either a printed document (by passing it through @TeX{}) +or into on-line documentation called @dfn{info files}. The @file{info/} directory contains the results of formatting the XEmacs documentation as @dfn{info files}, for on-line use. These files @@ -940,13 +941,12 @@ cause it to initialize itself, read in a number of basic Lisp files, and then dump itself out into a new executable called @file{xemacs}. This new executable has been pre-initialized and contains pre-digested Lisp -code that is necessary for the editor to function (this includes some -extremely basic Lisp functions, e.g. @code{not}, that can be defined in -terms of other Lisp primitives; some initialization code that is called -when certain objects, such as frames, are created; and all of the -standard keybindings and code for the actions they result in). This -executable, @file{xemacs}, is the executable that you run to use the -XEmacs editor. +code that is necessary for the editor to function (this includes most +basic Lisp functions, e.g. @code{not}, that can be defined in terms of +other Lisp primitives; some initialization code that is called when +certain objects, such as frames, are created; and all of the standard +keybindings and code for the actions they result in). This executable, +@file{xemacs}, is the executable that you run to use the XEmacs editor. @node XEmacs From the Inside, The XEmacs Object System (Abstractly Speaking), XEmacs From the Perspective of Building, Top @chapter XEmacs From the Inside @@ -954,7 +954,7 @@ Internally, XEmacs is quite complex, and can be very confusing. To simplify things, it can be useful to think of XEmacs as containing an event loop that ``drives'' everything, and a number of other subsystems, -such as a Lisp engine and a redisplay mechanism. Each of these others +such as a Lisp engine and a redisplay mechanism. Each of these other subsystems exists simultaneously in XEmacs, and each has a certain state. The flow of control continually passes in and out of these different subsystems in the course of normal operation of the editor. @@ -986,8 +986,8 @@ The buffer mechanism is responsible for keeping track of what buffers exist and what text is in them. It is periodically given commands (usually from the user) to insert or delete text, create a buffer, etc. -When it receives a textual-change command, it tells the redisplay -mechanism about this. +When it receives a text-change command, it notifies the redisplay +mechanism. @item The redisplay mechanism is responsible for making sure that windows and @@ -1183,7 +1183,7 @@ XEmacs Lisp also contains numerous specialized objects used to implement the editor: -@table @asis +@table @code @item buffer Stores text like a string, but is optimized for insertion and deletion and has certain other properties that can be set. @@ -1232,7 +1232,7 @@ There are some other, less-commonly-encountered general objects: -@table @asis +@table @code @item hashtable An object that maps from an arbitrary Lisp object to another arbitrary Lisp object, using hashing for fast lookup. @@ -1256,7 +1256,7 @@ And some strange special-purpose objects: -@table @asis +@table @code @item charset @itemx coding-system Objects used when MULE, or multi-lingual/Asian-language, support is @@ -1370,17 +1370,18 @@ @end example (where @samp{^[} actually is an @samp{ESC} character) converts to a -particular Kanji character. (To decode this gook: @samp{ESC} begins an -escape sequence; @samp{ESC $ (} is a class of escape sequences meaning -``switch to a 94x94 character set''; @samp{ESC $ ( B} means ``switch to -Japanese Kanji''; @samp{#} and @samp{&} collectively index into a -94-by-94 array of characters [subtract 33 from the ASCII value of each -character to get the corresponding index]; @samp{ESC (} is a class of -escape sequences meaning ``switch to a 94 character set''; @samp{ESC (B} -means ``switch to US ASCII''. It is a coincidence that the letter -@samp{B} is used to denote both Japanese Kanji and US ASCII. If the -first @samp{B} were replaced with an @samp{A}, you'd be requesting a -Chinese Hanzi character from the GB2312 character set.) +particular Kanji character when using an ISO2022-based coding system for +input. (To decode this gook: @samp{ESC} begins an escape sequence; +@samp{ESC $ (} is a class of escape sequences meaning ``switch to a +94x94 character set''; @samp{ESC $ ( B} means ``switch to Japanese +Kanji''; @samp{#} and @samp{&} collectively index into a 94-by-94 array +of characters [subtract 33 from the ASCII value of each character to get +the corresponding index]; @samp{ESC (} is a class of escape sequences +meaning ``switch to a 94 character set''; @samp{ESC (B} means ``switch +to US ASCII''. It is a coincidence that the letter @samp{B} is used to +denote both Japanese Kanji and US ASCII. If the first @samp{B} were +replaced with an @samp{A}, you'd be requesting a Chinese Hanzi character +from the GB2312 character set.) @example "foobar" @@ -1513,7 +1514,7 @@ @cindex record type Note that there are only eight types that the tag can represent, but many more actual types than this. This is handled by having -one of the tag types specify a meta-object called a @dfn{record}; +one of the tag types specify a meta-type called a @dfn{record}; for all such objects, the first four bytes of the pointed-to structure indicate what the actual type is. @@ -1537,10 +1538,11 @@ the proper mask. Then, pointers retrieved from Lisp objects are automatically OR'ed with this value prior to being used. - A corollary of the previous paragraph is that @strong{stack-allocated -structures cannot be put into Lisp objects}. The stack is generally -located near the top of memory; if you put such a pointer into a Lisp -object, it will get its top bits chopped off, and you will lose. + A corollary of the previous paragraph is that @strong{(pointers to) +stack-allocated structures cannot be put into Lisp objects}. The stack +is generally located near the top of memory; if you put such a pointer +into a Lisp object, it will get its top bits chopped off, and you will +lose. Various macros are used to construct Lisp objects and extract the components. Macros of the form @code{XINT()}, @code{XCHAR()}, @@ -1565,17 +1567,17 @@ in a pointer being dereferenced as the wrong type of structure, with unpredictable (and sometimes not easily traceable) results. - There are similar @code{XSET()} macros that construct a Lisp object. -These macros are of the form @code{XSET (@var{lvalue}, @var{result})}, + There are similar @code{XSET@var{TYPE}()} macros that construct a Lisp object. +These macros are of the form @code{XSET@var{TYPE} (@var{lvalue}, @var{result})}, i.e. they have to be a statement rather than just used in an expression. The reason for this is that standard C doesn't let you ``construct'' a structure (but GCC does). Granted, this sometimes isn't too convenient; for the case of integers, at least, you can use the function @code{make_number()}, which constructs and @emph{returns} an integer -Lisp object. Note that the @code{XSET()} macros are also affected by -@code{ERROR_CHECK_TYPECHECK} and make sure that the structure is of the right -type in the case of record types, where the type is contained in -the structure. +Lisp object. Note that the @code{XSET@var{TYPE}()} macros are also +affected by @code{ERROR_CHECK_TYPECHECK} and make sure that the +structure is of the right type in the case of record types, where the +type is contained in the structure. @node Rules When Writing New C Code, A Summary of the Various XEmacs Modules, How Lisp Objects Are Represented in C, Top @chapter Rules When Writing New C Code @@ -1603,9 +1605,9 @@ declares any global Lisp variables you have added and initializes global C variables in the module. For each such function, declare it in @file{symsinit.h} and make sure it's called in the appropriate place in -@code{main()}. @strong{Important}: There are stringent requirements on +@file{emacs.c}. @strong{Important}: There are stringent requirements on exactly what can go into these functions. See the comment in -@code{main()}. The reason for this is to avoid obscure unwanted +@file{emacs.c}. The reason for this is to avoid obscure unwanted interactions during initialization. If you don't follow these rules, you'll be sorry! If you want to do anything that isn't allowed, create a @code{complex_vars_of_*()} function for it. Doing this is tricky, @@ -1613,7 +1615,8 @@ so that all the initialization dependencies work out. Every module includes @file{<config.h>} (angle brackets so that -@samp{--srcdir} works correctly) and @file{lisp.h}. @file{config.h} +@samp{--srcdir} works correctly; @file{config.h} may or may not be in +the same directory as the C sources) and @file{lisp.h}. @file{config.h} should always be included before any other header files (including system header files) to ensure that certain tricks played by various @file{s/} and @file{m/} files work out correctly. @@ -1709,7 +1712,7 @@ @code{DEFUN} macro. Here is a template for them: @example -DEFUN (@var{lname}, @var{fname}, @var{min}, @var{max}, @var{interactive} /* +DEFUN (@var{lname}, @var{fname}, @var{min}, @var{max}, @var{interactive}, /* @var{docstring} */ (@var{arglist}) ) @@ -1717,8 +1720,8 @@ @table @var @item lname -This is the name of the Lisp symbol to define as the function name; in -the example above, it is @code{or}. +This string is the name of the Lisp symbol to define as the function +name; in the example above, it is @code{"or"}. @item fname This is the C function name for this function. This is the name that is @@ -1777,7 +1780,7 @@ comment-start characters are on the same line as the interactive specification. @file{make-docfile}, which scans the C files for documentation strings, is very particular about what it looks for, and -will not properly note the doc string if it's not in this exact format. +will not properly extract the doc string if it's not in this exact format. You are free to put the various arguments to @code{DEFUN} on separate lines to avoid overly long lines. However, make sure to put the @@ -1849,14 +1852,14 @@ @xref{GCPROing, ,@code{GCPRO}ing}, for full details on how to do this. What @code{DEFUN} actually does is declare a global structure of -type @code{Lisp_Subr} whose name begins with a capital @samp{S} and +type @code{Lisp_Subr} whose name begins with capital @samp{SF} and which contains information about the primitive (e.g. a pointer to the function, its minimum and maximum allowed arguments, a string describing its Lisp name); @code{DEFUN} then begins a normal C function declaration using the @code{F...} name. The Lisp subr object that is the function definition of a primitive (i.e. the object in the function slot of the symbol that names the primitive) actually points to this -@samp{S} structure; when @code{Feval} encounters a subr, it looks in the +@samp{SF} structure; when @code{Feval} encounters a subr, it looks in the structure to find out how to call the C function. Defining the C function is not enough to make a Lisp primitive @@ -1866,21 +1869,21 @@ be seen by Lisp code.) The code looks like this: @example -defsubr (&@var{subr-structure-name}); +DEFSUBR (@var{fname}); @end example -@noindent -Here @var{subr-structure-name} is the name you used as the third -argument to @code{DEFUN}. - - This call to @code{defsubr} should go in the @code{syms_of_*()} +@noindent +Here @var{fname} is the name you used as the second argument to +@code{DEFUN}. + + This call to @code{DEFSUBR} should go in the @code{syms_of_*()} function at the end of the module. If no such function exists, create it and make sure to also declare it in @file{symsinit.h} and call it from the appropriate spot in @code{main()}. @xref{General Coding Rules}. Note that C code cannot call functions by name unless they are defined -in C. The way to call a function written in Lisp is to use +in C. The way to call a function written in Lisp from C is to use @code{Ffuncall}, which embodies the Lisp function @code{funcall}. Since the Lisp function @code{funcall} accepts an unlimited number of arguments, in C it takes two: the number of Lisp-level arguments, and a @@ -2106,7 +2109,7 @@ after @file{lastfile.c} because they contain various structures that must be statically initialized and into which Xt writes at various times.) @file{pre-crt0.c} and @file{lastfile.c} contain exported symbols -that are used to determine the start and end of XEmacs's initialized +that are used to determine the start and end of XEmacs' initialized data space when dumping. @@ -3090,13 +3093,13 @@ 9918 casetab.c @end example -@file{chartab.c} and @file{chartab.h} implement the char table Lisp -object type, which maps from characters or certain sorts of character -ranges to Lisp objects. The implementation of this object is optimized -for the internal representation of characters. Char tables come in -different types, which affect the allowed object types to which a -character can be mapped and also dictate certain other properties of the -char table. +@file{chartab.c} and @file{chartab.h} implement the @dfn{char table} +Lisp object type, which maps from characters or certain sorts of +character ranges to Lisp objects. The implementation of this object +type is optimized for the internal representation of characters. Char +tables come in different types, which affect the allowed object types to +which a character can be mapped and also dictate certain other +properties of the char table. @cindex case table @file{casetab.c} implements one sort of char table, the @dfn{case @@ -3112,13 +3115,13 @@ @end example @cindex scanner -This module implements syntax tables, another sort of char table that -maps characters into syntax classes that define the syntax of these -characters (e.g. a parenthesis belongs to a class of @samp{open} characters -that have corresponding @samp{close} characters and can be nested). -This module also implements the Lisp @dfn{scanner}, a set of primitives -for scanning over text based on syntax tables. This is used, for -example, to find the matching parenthesis in a command such as +This module implements @dfn{syntax tables}, another sort of char table +that maps characters into syntax classes that define the syntax of these +characters (e.g. a parenthesis belongs to a class of @samp{open} +characters that have corresponding @samp{close} characters and can be +nested). This module also implements the Lisp @dfn{scanner}, a set of +primitives for scanning over text based on syntax tables. This is used, +for example, to find the matching parenthesis in a command such as @code{forward-sexp}, and by @file{font-lock.c} to locate quoted strings, comments, etc. @@ -3680,9 +3683,9 @@ @file{mule-coding.*} implements the @dfn{coding-system} Lisp object type, which encapsulates a method of converting between different -encodings. An encoding is a representation of a stream of characters -from multiple character sets using a stream of bytes or words and -defines (e.g.) which escape sequences are used to specify particular +encodings. An encoding is a representation of a stream of characters, +possibly from multiple character sets, using a stream of bytes or words, +and defines (e.g.) which escape sequences are used to specify particular character sets, how the indices for a character are converted into bytes (sometimes this involves setting the high bit; sometimes complicated rearranging of the values takes place, as in the Shift-JIS encoding), @@ -3694,7 +3697,7 @@ @file{mule-canna.c} and @file{mule-wnnfns.c} implement interfaces to external programs used to implement the Canna and WNN input methods, -respectively. This is currently broken. +respectively. This is currently in beta. @file{mule-mcpath.c} provides some functions to allow for pathnames containing extended characters. This code is fragmentary, obsolete, and @@ -3780,7 +3783,8 @@ (a) Those for whom the value directly represents the contents of the Lisp object. Only two types are in this category: integers and characters. No special allocation or garbage collection is necessary -for such objects. +for such objects. Lisp objects of these types do not need to be +@code{GCPRO}ed. @end itemize In the remaining three categories, the value is a pointer to a @@ -3950,7 +3954,7 @@ @item Any shadowed bindings that are sitting on the specpdl stack. @item -Any objects sitting in currently active stack frames, +Any objects sitting in currently active (Lisp) stack frames, catches, and condition cases. @item A couple of special-case places where active objects are @@ -3999,7 +4003,7 @@ @item @strong{Strings are relocated.} What this means in practice is that the -pointer obtained using @code{string_data()} is liable to change at any +pointer obtained using @code{XSTRING_DATA()} is liable to change at any time, and you should never keep it around past any function call, or pass it as an argument to any function that might cause a garbage collection. This is why a number of functions accept either a @@ -4040,7 +4044,7 @@ @item Beware of @code{GCPRO}ing something that is uninitialized. If you have -any shade of doubt about this, initialize all your variables to Qnil. +any shade of doubt about this, initialize all your variables to @code{Qnil}. @item Be careful of traps, like calling @code{Fcons()} in the argument to @@ -4449,10 +4453,10 @@ As mentioned above, each vector is @code{malloc()}ed individually, and all are threaded through the variable @code{all_vectors}. Vectors are marked strangely during garbage collection, by kludging the size field. -Note that the @code{struct Lisp_Vector} is declared with its contents -being an array of one element. It is actually @code{malloc()}ed with -the right size, however, and access to any element through the contents -array works fine. +Note that the @code{struct Lisp_Vector} is declared with its +@code{contents} field being a @emph{stretchy} array of one element. It +is actually @code{malloc()}ed with the right size, however, and access +to any element through the @code{contents} array works fine. @node Bit Vector @section Bit Vector @@ -4935,20 +4939,22 @@ @code{next-command-event} and @code{read-char} are higher-level interfaces to @code{next-event}. @code{next-command-event} gets the -next @dfn{command} event (i.e. keypress, mouse event, or menu -selection), calling dispatch-event on any others. @code{read-char} -calls @code{next-command-event} and uses @code{event_to_character()} to -return the ASCII equivalent. +next @dfn{command} event (i.e. keypress, mouse event, menu selection, +or scrollbar action), calling @code{dispatch-event} on any others. +@code{read-char} calls @code{next-command-event} and uses +@code{event_to_character()} to return the character equivalent. With +the right kind of input method support, it is possible for (read-char) +to return a Kanji character. @node Converting Events @section Converting Events @code{character_to_event()}, @code{event_to_character()}, @code{event-to-character}, and @code{character-to-event} convert between -ASCII characters and keypresses corresponding to the characters. If the +characters and keypress events corresponding to the characters. If the event was not a keypress, @code{event_to_character()} returns -1 and @code{event-to-character} returns @code{nil}. These functions convert -between ASCII representation and the split-up event representation +between character representation and the split-up event representation (keysym plus mod keys). @node Dispatching Events; The Command Builder @@ -4994,21 +5000,21 @@ At this point, the function to be called is determined by looking at the car of the cons (if this is a symbol, its function definition is retrieved and the process repeated). The function should then consist -of either a Lisp_Subr (built-in function), a Lisp_Compiled object, or a -cons whose car is the symbol @code{autoload}, @code{macro}, -@code{lambda}, or @code{mocklisp}. - - If the function is a Lisp_Subr, the lisp object points to a struct -Lisp_Subr (created by @code{DEFUN()}), which contains a pointer to the C -function, a minimum and maximum number of arguments (possibly the -special constants @code{MANY} or @code{UNEVALLED}), a pointer to the -symbol referring to that subr, and a couple of other things. If the -subr wants its arguments @code{UNEVALLED}, they are passed raw as a -list. Otherwise, an array of evaluated arguments is created and put -into the backtrace structure, and either passed whole (@code{MANY}) or -each argument is passed as a C argument. - - If the function is a Lisp_Compiled object or a lambda, +of either a @code{Lisp_Subr} (built-in function), a +@code{Lisp_Compiled_Function} object, or a cons whose car is the symbol +@code{autoload}, @code{macro}, @code{lambda}, or @code{mocklisp}. + +If the function is a @code{Lisp_Subr}, the lisp object points to a +@code{struct Lisp_Subr} (created by @code{DEFUN()}), which contains a +pointer to the C function, a minimum and maximum number of arguments +(possibly the special constants @code{MANY} or @code{UNEVALLED}), a +pointer to the symbol referring to that subr, and a couple of other +things. If the subr wants its arguments @code{UNEVALLED}, they are +passed raw as a list. Otherwise, an array of evaluated arguments is +created and put into the backtrace structure, and either passed whole +(@code{MANY}) or each argument is passed as a C argument. + + If the function is a @code{Lisp_Compiled_Function} object or a lambda, @code{apply_lambda()} is called. If the function is a macro, [..... fill in] is done. If the function is an autoload, @code{do_autoload()} is called to load the definition and then eval @@ -5028,8 +5034,8 @@ function and binds them to the actual arguments, checking for @code{&rest} and @code{&optional} symbols in the formal arguments and making sure the number of actual arguments is correct. Then either -progn or byte-code is called to actually execute the body and return a -value. +@code{progn} or @code{byte-code} is called to actually execute the body +and return a value. @code{Ffuncall()} implements Lisp @code{funcall}. @code{(funcall fun x1 x2 x3 ...)} is equivalent to @code{(eval (list fun (quote x1) (quote @@ -5077,27 +5083,27 @@ @code{record_unwind_protect()} implements an @dfn{unwind-protect}, which, when placed around a section of code, ensures that some specified cleanup routine will be executed even if the code exits abnormally -(e.g. through a throw or quit). @code{record_unwind_protect()} simply -adds a new specbinding to the specpdl array and stores the appropriate -information in it. The cleanup routine can either be a C function, -which is stored in the @code{func} field, or a progn form, which is stored in -the @code{old_value} field. +(e.g. through a @code{throw} or quit). @code{record_unwind_protect()} +simply adds a new specbinding to the specpdl array and stores the +appropriate information in it. The cleanup routine can either be a C +function, which is stored in the @code{func} field, or a @code{progn} +form, which is stored in the @code{old_value} field. @code{unbind_to()} removes specbindings from the specpdl array until -the specified position is reached. The specbinding can be one of three +the specified position is reached. Each specbinding can be one of three types: @enumerate @item -an unwind-protect with a C cleanup function (@code{func} is not 0 -- +an unwind-protect with a C cleanup function (@code{func} is not 0, and @code{old_value} holds an argument to be passed to the function); @item -an unwind-protect with a Lisp form (@code{func} is 0 and @code{symbol} -is @code{nil} -- @code{old_value} holds the form to be executed with +an unwind-protect with a Lisp form (@code{func} is 0, @code{symbol} +is @code{nil}, and @code{old_value} holds the form to be executed with @code{Fprogn()}); or @item -a local-variable binding (@code{func} is 0 and @code{symbol} is not -@code{nil} -- @code{old_value} holds the old value, which is stored as +a local-variable binding (@code{func} is 0, @code{symbol} is not +@code{nil}, and @code{old_value} holds the old value, which is stored as the symbol's value). @end enumerate @@ -5258,8 +5264,9 @@ you can explicitly create a symbol using @code{make-symbol}, giving it some name. The resulting symbol is not in any obarray (i.e. it is @dfn{uninterned}), and you can't add it to any obarray. Therefore its -primary purpose is as a carrier of information. (Cons cells could -probably be used just as well.) +primary purpose is as a symbol to use in macros to avoid namespace +pollution. It can also be used as a carrier of information, but cons +cells could probably be used just as well. You can also use @code{intern-soft} to look up a symbol but not create a new one, and @code{unintern} to remove a symbol from an obarray. This @@ -5331,7 +5338,7 @@ @enumerate @item -Buffers are @dfn{permanent} objects, i.e. one you create them, they +Buffers are @dfn{permanent} objects, i.e. once you create them, they remain around, and need to be explicitly deleted before they go away. @item Each buffer has a unique name, which is a string. Buffers are @@ -5365,8 +5372,8 @@ gets restored when the code is finished). However, calling @code{set-buffer} will NOT cause a permanent change in the current buffer. The reason for this is that the top-level event loop sets -current buffer to the buffer of the selected window, each time it -finishes executing a user command. +@code{current_buffer} to the buffer of the selected window, each time +it finishes executing a user command. @end enumerate Make sure you understand the distinction between @dfn{current buffer} @@ -5389,10 +5396,10 @@ For now, we can view a character as some non-negative integer that has some shape that defines how it typically appears (e.g. as an -uppercase A). (The exact way in which a character appears depends -on the font of the character.) The internal type of characters in -the C code is an Emchar; this is just an int, but using a symbolic -type makes the code clearer. +uppercase A). (The exact way in which a character appears depends on the +font used to display the character.) The internal type of characters in +the C code is an @code{Emchar}; this is just an @code{int}, but using a +symbolic type makes the code clearer. Between every character in a buffer is a @dfn{buffer position} or @dfn{character position}. We can speak of the character before or after @@ -5448,7 +5455,7 @@ heap, taking up virtual memory, and will not be released back to the operating system. (However, if you have compiled XEmacs with rel-alloc, the situation is different. In this case, the space @emph{will} be -released back to the operating system. However, this tends to effect a +released back to the operating system. However, this tends to result in a noticeable speed penalty.) Astute readers may notice that the text in a buffer is represented as @@ -5501,7 +5508,7 @@ @dfn{memory indices}, typedef @code{Memind} @end enumerate - All three typedefs are just ints, but defining them this way makes + All three typedefs are just @code{int}s, but defining them this way makes things a lot clearer. Most code works with buffer positions. In particular, all Lisp code @@ -5512,7 +5519,7 @@ @code{Bufbyte}, which is an unsigned char. Referring to them as Bufbytes underscores the fact that we are working with a string of bytes in the internal Emacs buffer representation rather than in one of a -number of possible alternative representations (e.g. EUC-coded text, +number of possible alternative representations (e.g. EUC-encoded text, etc.). @node Buffer Lists
--- a/man/lispref/intro.texi Mon Aug 13 09:21:56 2007 +0200 +++ b/man/lispref/intro.texi Mon Aug 13 09:23:06 2007 +0200 @@ -612,9 +612,9 @@ evaluation of the expanded form. @example -(third '(a b c)) - @expansion{} (car (cdr (cdr '(a b c)))) - @result{} c +(news-cadr '(a b c)) + @expansion{} (car (cdr '(a b c))) + @result{} b @end example Sometimes to help describe one form we show another form that @@ -622,7 +622,7 @@ indicated with @samp{@equiv{}}. @example -(make-sparse-keymap) @equiv{} (list 'keymap) +(cons 'a nil) @equiv{} (list 'a) @end example @node Printing Notation
--- a/man/message.texi Mon Aug 13 09:21:56 2007 +0200 +++ b/man/message.texi Mon Aug 13 09:23:06 2007 +0200 @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename message -@settitle Message 5.4.33 Manual +@settitle Message 5.4.37 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -39,7 +39,7 @@ @tex @titlepage -@title Message 5.4.33 Manual +@title Message 5.4.37 Manual @author by Lars Magne Ingebrigtsen @page @@ -79,7 +79,7 @@ * Key Index:: List of Message mode keys. @end menu -This manual corresponds to Message 5.4.33. Message is distributed with +This manual corresponds to Message 5.4.37. Message is distributed with the Gnus distribution bearing the same version number as this manual has.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/umlaute.texi Mon Aug 13 09:23:06 2007 +0200 @@ -0,0 +1,14 @@ +@catcode`@ß=@active +@catcode`@Ä=@active +@catcode`@ä=@active +@catcode`@Ö=@active +@catcode`@ö=@active +@catcode`@Ü=@active +@catcode`@ü=@active +@defß{@ss} +@defÄ{@"A} +@defä{@"a} +@defÖ{@"O} +@defö{@"o} +@defÜ{@"U} +@defü{@"u}
--- a/man/w3.texi Mon Aug 13 09:21:56 2007 +0200 +++ b/man/w3.texi Mon Aug 13 09:23:06 2007 +0200 @@ -12,7 +12,7 @@ @c site: http://www.cs.indiana.edu/elisp/w3/docs.html @c @setfilename w3.info -@settitle Emacs-W3 User's Manual +@settitle Emacs/W3 User's Manual @iftex @finalout @end iftex @@ -27,10 +27,10 @@ @dircategory World Wide Web @dircategory GNU Emacs Lisp @direntry -* W3: (w3). Emacs-W3 World Wide Web browser. +* W3: (w3). Emacs/W3 World Wide Web browser. @end direntry @ifinfo -This file documents the Emacs-W3 World Wide Web browser. +This file documents the Emacs/W3 World Wide Web browser. Copyright (C) 1993, 1994, 1995, 1996 William M. Perry Copyright (C) 1996, 1997 Free Software Foundation @@ -50,10 +50,10 @@ @c @titlepage @sp 6 -@center @titlefont{Emacs-W3} +@center @titlefont{Emacs/W3} @center @titlefont{User's Manual} @sp 4 -@center Third Edition, Emacs-W3 Version 3.0 +@center Third Edition, Emacs/W3 Version 3.0 @sp 1 @center February 1997 @sp 5 @@ -74,25 +74,25 @@ @node Top, Getting Started, (dir), (dir) @top W3 -Users can browse the World Wide Web from within Emacs by using Emacs-W3. +Users can browse the World Wide Web from within Emacs by using Emacs/W3. All of the widely used (and even some not very widely used) @sc{url} schemes are supported, and it is very easy to add new methods as the need arises. -Emacs-W3 provides some core functionality that can be readily re-used +Emacs/W3 provides some core functionality that can be readily re-used from any program in Emacs. Users and other package writers are encouraged to @i{Web-enable} their applications and daily work routines with the library. -Emacs-W3 is completely customizable, both from Emacs-Lisp and from -stylesheets @xref{Stylesheets} If there is any aspect of Emacs-W3 that +Emacs/W3 is completely customizable, both from Emacs-Lisp and from +stylesheets @xref{Stylesheets} If there is any aspect of Emacs/W3 that cannot be modified to your satisfaction, please send mail to the @t{w3-beta@@indiana.edu} mailing list with any suggestions. @xref{Reporting Bugs} @menu -* Getting Started:: Getting up and running with Emacs-W3 -* Basic Usage:: Basic movement and usage of Emacs-W3. +* Getting Started:: Getting up and running with Emacs/W3 +* Basic Usage:: Basic movement and usage of Emacs/W3. * Compatibility:: Explanation of compatibility with other browsers. * Stylesheets:: How to control the look of web pages @@ -109,9 +109,9 @@ * Future Directions:: Plans for future revisions Appendices: -* Reporting Bugs:: How to report a bug in Emacs-W3. +* Reporting Bugs:: How to report a bug in Emacs/W3. * Dealing with Firewalls:: How to get around your firewall. -* Proxy Gateways:: Using a proxy gateway with Emacs-W3. +* Proxy Gateways:: Using a proxy gateway with Emacs/W3. * Installing SSL:: Turning on @sc{ssl} support. * Mailcap Files:: An explanation of Mailcap files. * Down with DoubleClick:: Annoyed by advertisements? Read this! @@ -129,10 +129,10 @@ @kindex M-x w3 @vindex w3-default-homepage @findex w3 -If installed correctly, starting Emacs-W3 is quite painless. Just type +If installed correctly, starting Emacs/W3 is quite painless. Just type @kbd{M-x w3} in a running Emacs session. This will retrieve the default page that has been configured (@pxref{Preferences Panel}) - by default the -documentation for Emacs-W3 at Indiana University. +documentation for Emacs/W3 at Indiana University. If the default page is not retrieved correctly at startup, you will have to do some customization (@pxref{Preferences Panel}). @@ -174,7 +174,7 @@ @end table @menu -* Downloading:: Where to download Emacs-W3. +* Downloading:: Where to download Emacs/W3. * Building and Installing:: Compiling and installing from source. * Startup Files:: What is where, and why. * Preferences Panel:: Quick configuration of common options. @@ -185,7 +185,7 @@ :: WORK :: What you need, and why :: WORK :: Where to download Emacs, XEmacs, various platforms -:: WORK :: Where to download Emacs-W3 +:: WORK :: Where to download Emacs/W3 :: WORK :: Where to download related utilities (netpbm, xv, gimp, etc.) @node Building and Installing, Startup Files, Downloading, Getting Started @@ -200,7 +200,7 @@ @cindex Default stylesheet :: WORK :: startup files -This section should document where emacs-w3 looks for its startup files, +This section should document where Emacs/W3 looks for its startup files, and what each one does. 'profile' 'stylesheet' 'hotlist' 'history' etc. @node Preferences Panel, , Startup Files, Getting Started @@ -219,14 +219,14 @@ @kindex return @kindex tab @kindex M-tab -Emacs-W3 is similar to the Info package all Emacs users hold near and +Emacs/W3 is similar to the Info package all Emacs users hold near and dear to their hearts (@xref{Top,,Info,info, The Info Manual}, for a description of Info). Basically, @kbd{space} and @kbd{backspace} control scrolling, and @kbd{return} or the middle mouse button follows a hypertext link. The @kbd{tab} and @kbd{Meta-tab} keys maneuver around the various links on the page. -@b{NOTE:} Starting with Emacs-W3 3.0, form entry areas in a page can be +@b{NOTE:} Starting with Emacs/W3 3.0, form entry areas in a page can be typed directly into. This is one of the main differences in navigation from version 2.0. If you are used to using the @kbd{f} and @kbd{b} keys to navigate around a buffer, I suggest training yourself to always use @@ -238,8 +238,8 @@ terminal, the links are in shown in different colors. @xref{Stylesheets} for information on how to change this. -There are approximately 50 keys bound to special Emacs-W3 functions. -The basic rule of thumb regarding keybindings in Emacs-W3 is that a +There are approximately 50 keys bound to special Emacs/W3 functions. +The basic rule of thumb regarding keybindings in Emacs/W3 is that a lowercase key takes an action on the @b{current document}, and an uppercase key takes an action on the document pointed to by the hypertext link @b{under the cursor}. @@ -438,7 +438,7 @@ @findex w3-fetch @item C-o Prompts for a @sc{url} in the minibuffer, and attempts to fetch -it. If there are any errors, or Emacs-W3 cannot understand the type of link +it. If there are any errors, or Emacs/W3 cannot understand the type of link requested, the errors are displayed in a hypertext buffer. @kindex o @findex w3-open-local @@ -447,7 +447,7 @@ Opens a local file, interactively. This prompts for a local file name to open. The file must exist, and may be a directory. If the requested file is a directory and @code{url-use-hypertext-dired} is @code{nil}, -then a dired-mode buffer is displayed. If non@code{nil}, then Emacs-W3 +then a dired-mode buffer is displayed. If non@code{nil}, then Emacs/W3 automatically generates a hypertext listing of the directory. The hypertext mode is the default, so that all the keys and functions remain the same. @@ -462,14 +462,14 @@ @findex w3-show-history-list @vindex w3-keep-history @item Hv -If @code{url-keep-history} is non-@code{nil}, then Emacs-W3 keeps track +If @code{url-keep-history} is non-@code{nil}, then Emacs/W3 keeps track of all the @sc{url}s visited in an Emacs session. This function takes all the links that are in that internal list, and formats them as hypertext links in a list. @end table @cindex Buffer movement -And here are the commands to move around between Emacs-W3 buffers: +And here are the commands to move around between Emacs/W3 buffers: @table @kbd @kindex l @@ -610,13 +610,13 @@ @node Compatibility, Stylesheets, Basic Usage, Top @chapter Compatibility with other Browsers -Due to the popularity of several other browsers, Emacs-W3 offers an easy +Due to the popularity of several other browsers, Emacs/W3 offers an easy transition to its much better way of life. This ranges from being able to share the same preferences files and disk cache to actually emulating the keybindings used in other browsers. @menu -* Emulation:: Emacs-W3 can emulate the keybindings and +* Emulation:: Emacs/W3 can emulate the keybindings and other behaviours of other browsers. * Hotlist Handling:: A hotlist is an easy way to keep track of interesting Web pages without having to @@ -773,7 +773,7 @@ :: WORK :: Document that it supports different types of hotlist formats :: WORK :: Make sure everything hotlist related can be accessed via 'h' In order to avoid having to traverse many documents to get to the same -document over and over, Emacs-W3 supports a ``hotlist'' like Mosaic. This is +document over and over, Emacs/W3 supports a ``hotlist'' like Mosaic. This is a file that contains @sc{url}s and aliases. Hotlists allow quick access to any document in the Web, providing it has been visited and added to the hotlist. The variable @code{w3-hotlist-file} determines where this information @@ -844,12 +844,12 @@ of @sc{url}s that can be traversed easily. @vindex url-keep-history -If the variable @code{url-keep-history} is @code{t}, then Emacs-W3 +If the variable @code{url-keep-history} is @code{t}, then Emacs/W3 keeps a list of all the @sc{url}s visited in a session. @findex w3-show-history -To view a listing of the history for this session of Emacs-W3, use -@code{M-x w3-show-history} from any buffer, and Emacs-W3 generates an +To view a listing of the history for this session of Emacs/W3, use +@code{M-x w3-show-history} from any buffer, and Emacs/W3 generates an @sc{html} document showing every @sc{url} visited since Emacs started (or cleared the history list), and then format it. Any of the links can be chosen and followed to the original document. To clear the history @@ -859,7 +859,7 @@ @findex w3-backward-in-history @findex w3-fetch Another twist on the history list mechanism is the fact that all -Emacs-W3 buffers remember what @sc{url}, buffer, and buffer position of the +Emacs/W3 buffers remember what @sc{url}, buffer, and buffer position of the last document, and also keeps track of the next location jumped @b{to} from that buffer. This means that the user can go forwards and backwards very easily along the path taken to reach a particular @@ -876,7 +876,7 @@ @vindex url-keep-history @vindex url-global-history-file -If the variable @code{url-keep-history} is @code{t}, then Emacs-W3 +If the variable @code{url-keep-history} is @code{t}, then Emacs/W3 keeps a list of all the @sc{url}s visited in a session. The file is automatically written to disk when exiting emacs. The list is added to those already in the file specified by @code{url-global-history-file}, @@ -886,12 +886,12 @@ ones are added at the end of the file. The function that saves the global history list is smart enough to -notice what style of history list is being used (Netscape, Emacs-W3, or +notice what style of history list is being used (Netscape, Emacs/W3, or XMosaic), and writes out the new additions appropriately. @cindex Completion of URLs @cindex Usefulness of global history -One of the nice things about keeping a global history files is that Emacs-W3 +One of the nice things about keeping a global history files is that Emacs/W3 can use it as a completion table. When doing @kbd{M-x w3-fetch}, pressing the @kbd{tab} or @kbd{space} key will show all completions for a partial @sc{url}. This is very useful, especially for very long @sc{url}s that @@ -900,12 +900,12 @@ @node Stylesheets, Supported URLs, Compatibility, Top @chapter Stylesheets -The way in which Emacs-W3 formats a document is very customizable. All +The way in which Emacs/W3 formats a document is very customizable. All formatting is now controlled by a default stylesheet set by the user -with the @code{w3-default-stylesheet} variable. Emacs-W3 currently +with the @code{w3-default-stylesheet} variable. Emacs/W3 currently supports the @sc{W3C} recommendation for Cascading Style Sheets, Level 1 (commonly known as @sc{CSS1}) with a few experimental items from other -W3C proposals. Wherever Emacs-W3 diverges from the specification, it +W3C proposals. Wherever Emacs/W3 diverges from the specification, it will be clearly documented, and will be changed once a full standard is available. @@ -913,7 +913,7 @@ low. If anyone would like to help, please contact the author. The following sections closely parallel the @sc{CSS1} specification so -it should be very easy to look up what Emacs-W3 supports when browsing +it should be very easy to look up what Emacs/W3 supports when browsing through the @sc{CSS1} specification. Please note that a lot of the text in the following sections comes directly from the specification as well. @@ -1068,7 +1068,7 @@ pseudo-classes allow style sheets to differentiate between different element types. -The only support pseudo-classes in Emacs-W3 are on the anchor tag +The only support pseudo-classes in Emacs/W3 are on the anchor tag (<a>...</a>). User agents commonly display newly visited anchors differently from @@ -1309,9 +1309,9 @@ @multitable @columnfractions .20 .8 @item Supported Values: @tab If this is present, it lists the parts of -the specification that Emacs-W3 currently supports. +the specification that Emacs/W3 currently supports. @item Unsupported Values: @tab If this is present, it represents the -parts of the specifcation that Emacs-W3 does not support. +parts of the specifcation that Emacs/W3 does not support. @item Initial: @tab The default value for the property, unless explicitly set in a stylesheet. @item Applies to: @tab What type of elements this property can be attached to. @@ -1648,7 +1648,7 @@ default because of the initial 'transparent' value on 'background-color'. -NOTE: Currently, Emacs-W3 can only show background images under XEmacs. +NOTE: Currently, Emacs/W3 can only show background images under XEmacs. Emacs 19 doesn't have the support in its display code yet. @menu @@ -1723,17 +1723,17 @@ @node background-repeat, background-attachment, background-image, Colors and Backgrounds @subsubsection background-repeat -This property is not supported at all under Emacs-W3. +This property is not supported at all under Emacs/W3. @node background-attachment, background-position, background-repeat, Colors and Backgrounds @subsubsection background-attachment -This property is not supported at all under Emacs-W3. +This property is not supported at all under Emacs/W3. @node background-position, background, background-attachment, Colors and Backgrounds @subsubsection background-position -This property is not supported at all under Emacs-W3. +This property is not supported at all under Emacs/W3. @node background, , background-position, Colors and Backgrounds @subsubsection background @@ -1804,7 +1804,7 @@ Here, the word-spacing between each word in 'H1' elements would be increased by '1em'. -NOTE: Emacs-W3 cannot currently support this, due to limitations in +NOTE: Emacs/W3 cannot currently support this, due to limitations in Emacs. It may be implemented in the future. @node letter-spacing, text-decoration, word-spacing, Text Properties @@ -1832,7 +1832,7 @@ Here, the letter-spacing between each character in 'BLOCKQUOTE' elements would be increased by '0.1em'. -NOTE: Emacs-W3 cannot currently support this, due to limitations in +NOTE: Emacs/W3 cannot currently support this, due to limitations in Emacs. It may be implemented in the future. @node text-decoration, vertical-align, letter-spacing, Text Properties @@ -1875,7 +1875,7 @@ @node vertical-align, text-transform, text-decoration, Text Properties @subsubsection vertical-align -This is currently unsupported in Emacs-W3. +This is currently unsupported in Emacs/W3. @node text-transform, text-align, vertical-align, Text Properties @subsubsection text-transform @@ -1908,7 +1908,7 @@ The example above would put 'H1' elements in uppercase text. -NOTE: This capability was in the previous version of Emacs-W3, but has +NOTE: This capability was in the previous version of Emacs/W3, but has not been reimplemented in the new display code yet. Please feel free to send me patches. @@ -1938,12 +1938,12 @@ @node text-indent, line-height, text-align, Text Properties @subsubsection text-indent -Not currently implemented in Emacs-W3. +Not currently implemented in Emacs/W3. @node line-height, , text-indent, Text Properties @subsubsection line-height -Not currently implemented in Emacs-W3. +Not currently implemented in Emacs/W3. @node Box Properties, Classification, Text Properties, Properties @subsection Box Properties @@ -2008,11 +2008,11 @@ The last rule turns off the display of images. -A value of 'line' results in a single line break. Emacs-W3 needs this +A value of 'line' results in a single line break. Emacs/W3 needs this extension to be able to fully specify the behaviour of @sc{br} and @sc{hr} elements within a stylesheet. -NOTE: Emacs-W3 defaults to using 'inline' for this property, which is a +NOTE: Emacs/W3 defaults to using 'inline' for this property, which is a slight deviation from the specification. @node white-space, list-style-type, display, Classification @@ -2073,7 +2073,7 @@ marker. When the image is available it will replace the marker set with the 'list-style-type' marker. -NOTE: This is currently unimplemented in Emacs-W3. +NOTE: This is currently unimplemented in Emacs/W3. @example UL @{ list-style-image: url(http://png.com/ellipse.png) @} @@ -2691,7 +2691,7 @@ types (e.g., @samp{.png -> image/png)}. * Specifying Viewers:: How to specify external and internal viewers - for files that Emacs-W3 cannot handle natively. + for files that Emacs/W3 cannot handle natively. @end menu @node Adding MIME types based on file extensions, Specifying Viewers, MIME Support, MIME Support @@ -2718,14 +2718,14 @@ @cindex mime-types file @findex mm-parse-mimetypes Both Mosaic and the NCSA @sc{http} daemon rely on a separate file for mapping -file extensions to MIME types. Instead of having the users of Emacs-W3 +file extensions to MIME types. Instead of having the users of Emacs/W3 duplicate this in lisp, this file can be parsed using the @code{url-parse-mimetypes} function. This function is called each time w3 is loaded. It tries to locate mimetype files in several places. If the environment variable @code{MIMETYPES} is nonempty, then this is assumed to specify a UNIX-like path of mimetype files (this is a colon separated string of pathnames). If the @code{MIMETYPES} environment -variable is empty, then Emacs-W3 looks for these files: +variable is empty, then Emacs/W3 looks for these files: @enumerate @item @@ -2777,7 +2777,7 @@ @cindex Security @cindex Paranoia There are an increasing number of ways to authenticate a user to a web -service. Emacs-W3 tries to support as many as possible. Emacs-W3 +service. Emacs/W3 tries to support as many as possible. Emacs/W3 currently supports: @table @b @@ -2806,7 +2806,7 @@ @cindex Exportability @cindex Export Restrictions SSL is the @code{Secure Sockets Layer} interface developed by Netscape -Communications @footnote{http://www.netscape.com/}. Emacs-W3 supports +Communications @footnote{http://www.netscape.com/}. Emacs/W3 supports @sc{http} transfers over an SSL encrypted channel, if the appropriate files have been installed.@xref{Installing SSL} @end table @@ -2867,11 +2867,11 @@ @menu * Disk Caching:: Improving performance by using a local disk cache * Interfacing to Mail/News:: How to make VM understand hypertext links -* Debugging HTML:: How to make Emacs-W3 display warnings about invalid +* Debugging HTML:: How to make Emacs/W3 display warnings about invalid @sc{html}/@sc{html}+ constructs. -* Hooks:: Various hooks to use throughout Emacs-W3 +* Hooks:: Various hooks to use throughout Emacs/W3 * Other Variables:: Miscellaneous variables that control the real - guts of Emacs-W3. + guts of Emacs/W3. @end menu @node Disk Caching, Interfacing to Mail/News, Advanced Features, Advanced Features @@ -2881,13 +2881,13 @@ @cindex Disk Cache A cache stores the information on a page on the local machine. When -requesting a page that is in the cache, Emacs-W3 can retrieve the page +requesting a page that is in the cache, Emacs/W3 can retrieve the page from the cache more quickly than retrieving the page again from its location out on the network. With a well-populated cache, browsing the web is dramatically faster. -The first time a page is requested, Emacs-W3 retrieves the page from the -network. When requesting a page that is in the cache, Emacs-W3 checks +The first time a page is requested, Emacs/W3 retrieves the page from the +network. When requesting a page that is in the cache, Emacs/W3 checks to see if the page has changed since it was last retrieved from the remote machine. If it has not changed, the local copy is used, saving the transmission of the file over the network. @@ -2916,7 +2916,7 @@ @vindex url-standalone-mode With a large cache of documents on the local disk, it can be very handy when traveling, or any other time the network connection is not active -(a laptop with a dial-on-demand PPP connection, etc). Emacs-W3 can rely +(a laptop with a dial-on-demand PPP connection, etc). Emacs/W3 can rely solely on its cache, and avoid checking to see if the page has changed on the remote server. In the case of a dial-on-demand PPP connection, this will keep the phone line free as long as possible, only bringing up @@ -2930,11 +2930,11 @@ @section Interfacing to Mail/News @cindex Interfacing to Mail/News @cindex VM -@cindex Using Emacs-W3 with VM +@cindex Using Emacs/W3 with VM @cindex GNUS -@cindex Using Emacs-W3 with Gnus +@cindex Using Emacs/W3 with Gnus @cindex RMAIL -@cindex Using Emacs-W3 with RMAIL +@cindex Using Emacs/W3 with RMAIL More and more people are including @sc{url}s in their signatures, and within the body of mail messages. It can get quite tedious to type these into @@ -2970,7 +2970,7 @@ @code{t} and see what happens. -If a Emacs-W3 thinks it has encountered invalid @sc{html}, then a debugging +If a Emacs/W3 thinks it has encountered invalid @sc{html}, then a debugging message is displayed. :: WORK :: Need to list the different values w3-debug-html can have, and @@ -2981,7 +2981,7 @@ @cindex Hooks These are the various hooks that can be used to customize some of -Emacs-W3's behavior. They are arranged in the order in which they would +Emacs/W3's behavior. They are arranged in the order in which they would happen when retrieving a document. These are all 'normal hooks' in standard Emacs-terminology, meaning they are functions (or lists of functions) that are called consecutively. @@ -2990,7 +2990,7 @@ @vindex w3-load-hook @item w3-load-hook These hooks are run the first time a @sc{url} is fetched. All the -Emacs-W3 variables are initialized before this hook is run. +Emacs/W3 variables are initialized before this hook is run. @item w3-mode-hook These hooks are run after a buffer has been parsed and displayed, but before any inlined images are downloaded and converted. @@ -3001,7 +3001,7 @@ @node Other Variables, , Hooks, Advanced Features @section Miscellaneous variables -There are lots of variables that control the real nitty-gritty of Emacs-W3 +There are lots of variables that control the real nitty-gritty of Emacs/W3 that the beginning user probably shouldn't mess with. Here they are. @table @code @@ -3020,7 +3020,7 @@ @vindex w3-default-action A lisp symbol specifying what action to take for files with extensions that are not in the @code{mm-mime-extensions} assoc list. This is -useful in case Emacs-W3 ever run across files with weird extensions +useful in case Emacs/W3 ever run across files with weird extensions (.foo, .README, .READMEFIRST, etc.). In most circumstances, this should not be required anymore. @@ -3055,7 +3055,7 @@ Determines what happens when @code{w3-fetch} is called on a document that has already been loaded into another buffer. Possible values are: @code{nil}, @code{yes}, and @code{no}. @code{nil} will ask the user if -Emacs-W3 should reuse the buffer (this is the default value). A value of +Emacs/W3 should reuse the buffer (this is the default value). A value of @code{yes} means assume the user wants to always reuse the buffer. A value of @code{no} means assume the user always wants to re-fetch the document. @@ -3105,9 +3105,9 @@ @cindex Relevant Newsgroups @cindex Newsgroups @cindex Support -For more help on Emacs-W3, please send me mail +For more help on Emacs/W3, please send me mail (@i{wmperry@@cs.indiana.edu}). Several discussion lists have also been -created for Emacs-W3. To subscribe, send mail to +created for Emacs/W3. To subscribe, send mail to @i{majordomo@@indiana.edu}, with the body of the message 'subscribe @var{listname} @var{<email addres>}'. All other mail should go to @i{<listname>@@indiana.edu}. @@ -3115,17 +3115,17 @@ @itemize @bullet @item -w3-announce -- this list is for anyone interested in Emacs-W3, and +w3-announce -- this list is for anyone interested in Emacs/W3, and should in general only be used by me. The gnu.emacs.sources newsgroup and a few other mailing lists are included on this. Please only use -this list for major package releases related to Emacs-W3. +this list for major package releases related to Emacs/W3. (@i{www-announce@@w3.org} is included on this list). @item -w3-beta -- this list is for beta testers of Emacs-W3. These brave souls test +w3-beta -- this list is for beta testers of Emacs/W3. These brave souls test out not-quite stable code. @item w3-dev -- a list consisting of myself and a few other people who are -interested in the internals of Emacs-W3, and doing active development work. +interested in the internals of Emacs/W3, and doing active development work. Pretty dead right now, but I hope it will grow. @end itemize @@ -3163,15 +3163,15 @@ @cindex Bugs @cindex Contacting the author -If any bugs are discovered in Emacs-W3, please report them to the +If any bugs are discovered in Emacs/W3, please report them to the mailing list @t{w3-beta@@indiana.edu} - this is where the brave souls -who beta test the latest versions of Emacs-W3 reside, and are generally +who beta test the latest versions of Emacs/W3 reside, and are generally very responsive to bug reports. @kindex w -Please make sure to use the bug submission feature of Emacs-W3, so that +Please make sure to use the bug submission feature of Emacs/W3, so that all relevant information will be sent along with your bug report. By -default this is bound to the `@key{w}' key when in an Emacs-W3 buffer, +default this is bound to the `@key{w}' key when in an Emacs/W3 buffer, or you can use @key{M-x w3-submit-bug} from anywhere within Emacs. For problems that are causing emacs to signal and error, please send a @@ -3215,7 +3215,7 @@ It is becoming more and more common to be behind a firewall or some other system that restricts your outbound network activity, especially if you are like me and away from the wonderful world of academia. -Emacs-W3 has several different methods to get around firewalls (not to +Emacs/W3 has several different methods to get around firewalls (not to worry though - none of them should get you in trouble with the local @sc{mis} department.) @@ -3271,7 +3271,7 @@ @end table @vindex url-gateway-local-host-regexp -Emacs-W3 has support for using the gateway mechanism for certain +Emacs/W3 has support for using the gateway mechanism for certain domains, and directly connecting to others. The variable @code{url-gateway-local-host-regexp} controls this behaviour. This is a regular expression @footnote{Please see the full Emacs distribution for @@ -3280,7 +3280,7 @@ are made through the gateway. @vindex url-gateway-method -Emacs-W3 supports several methods of getting around gateways. The +Emacs/W3 supports several methods of getting around gateways. The variable @code{url-gateway-method} controls which of these methods is used. This variable can have several values (use these as symbol names, not strings), ie: @samp{(setq url-gateway-method 'telnet)}. Possible @@ -3346,12 +3346,12 @@ @c This probably shouldn't be documented @item native -This means that Emacs-W3 should use the builtin networking code of +This means that Emacs/W3 should use the builtin networking code of Emacs. This should be used only if there is no firewall, or the Emacs source has already been hacked to get around the firewall. @end table -Emacs-W3 should now be able to get outside the local network. If none +Emacs/W3 should now be able to get outside the local network. If none of this makes sense, its probably my fault. Please check with the network administrators to see if they have a program that does most of this already, since somebody somewhere at the company has probably been @@ -3389,7 +3389,7 @@ NO_PROXY=*.aventail.com,home.com,*.seanet.com @end example -tells Emacs-W3 to contact all machines in the @b{aventail.com} and +tells Emacs/W3 to contact all machines in the @b{aventail.com} and @b{seanet.com} domains directly, as well as the machine named @b{home.com}. @@ -3417,25 +3417,13 @@ @cindex Gag Puke Retch @cindex Exportability @cindex Export Restrictions -In order to use SSL in Emacs-W3, an implementation of SSL is necessary. -These are the implementations that I am aware of: - -@table @code -@item SSLRef 2.0 -Available from Netscape Communications @footnote{http://www.netscape.com/newsref/std/sslref.html}. This requires the -RSARef library, which is not exportable. The RSARef library is -available from ftp://ftp.rsa.com/rsaref/ -@item SSLeay 0.4 -An implementation by Eric Young (eay@@mincom.oz.au) that is free for -commerial or noncommercial use, and was developed completely outside the -US by a non-US citizen. More information can be found at -ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/ -@end table - -Currently, an external in order to use SSL from within Emacs-W3. This -program should be able to take command line parameters for the hostname -and port number to connect to, and read/write to standard input/output -(similar to telnet, but without the annoying status messages). +In order to use SSL in Emacs/W3, an implementation of SSL is necessary. +Emacs/W3 is configued to work out of the box with SSLeay 0.6.6 or later. +For best results, you should apply a patch that makes the SSLeay client +much quieter about what it reports. + +You can download SSLeay from +@url{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/} The following variables control how the external program is invoked. @@ -3470,13 +3458,13 @@ for mapping MIME types to external viewing programs. This takes some of the burden off of browser developers, so each browser does not have to support all image formats, or postscript, etc. Instead of having the -users of Emacs-W3 duplicate this in lisp, this file can be parsed using +users of Emacs/W3 duplicate this in lisp, this file can be parsed using the @code{mm-parse-mailcaps} function. This function is called each -time Emacs-W3 is loaded. It tries to locate mimetype files in several +time Emacs/W3 is loaded. It tries to locate mimetype files in several places. If the environment variable @code{MAILCAPS} is nonempty, then this is assumed to specify a UNIX-like path of mimetype files (this is a colon separated string of pathnames). If the @code{MAILCAPS} -environment variable is empty, then Emacs-W3 looks for these +environment variable is empty, then Emacs/W3 looks for these files: @enumerate
--- a/man/widget.texi Mon Aug 13 09:21:56 2007 +0200 +++ b/man/widget.texi Mon Aug 13 09:23:06 2007 +0200 @@ -1,6 +1,6 @@ \input texinfo.tex -@c $Id: widget.texi,v 1.9 1997/03/22 06:03:13 steve Exp $ +@c $Id: widget.texi,v 1.10 1997/03/28 02:29:31 steve Exp $ @c %**start of header @setfilename widget @@ -15,7 +15,7 @@ @comment node-name, next, previous, up @top The Emacs Widget Library -Version: 1.65 +Version: 1.68 @menu * Introduction:: @@ -1207,6 +1207,43 @@ Return the name of @var{widget}, a symbol. @end defun +Widgets can be in two states: active, which means they are modifiable by +the user, or inactive, which means they cannot be modified by the user. +You can query or set the state with the following code: + +@lisp +;; Examine if @var{widget} is active or not. +(if (widget-apply @var{widget} :active) + (message "Widget is active.") + (message "Widget is inactive.") + +;; Make @var{widget} inactive. +(widget-apply @var{widget} :deactivate) + +;; Make @var{widget} active. +(widget-apply @var{widget} :activate) +@end lisp + +A widget is inactive if itself, or any of its ancestors (found by +following the @code{:parent} link) have been deactivated. To make sure +a widget is really active, you must therefore activate both itself, and +all its ancestors. + +@lisp +(while widget + (widget-apply widget :activate) + (setq widget (widget-get widget :parent))) +@end lisp + +You can check if a widget has been made inactive by examining the value +of @code{:inactive} keyword. If this is non-nil, the widget itself has +been deactivated. This is different from using the @code{:active} +keyword, in that the later tell you if the widget @strong{or} any of its +ancestors have been deactivated. Do not attempt to set the +@code{:inactive} keyword directly. Use the @code{:activate} +@code{:deactivated} keywords instead. + + @node Defining New Widgets, Widget Wishlist., Widget Properties, Top @comment node-name, next, previous, up @section Defining New Widgets @@ -1338,13 +1375,6 @@ @code{widget-item-convert-widget}, should not have names that are specific to the first widget where I happended to use them. -@item -Unchecked items in a @code{radio-button-choice} or @code{checklist} -should be grayed out, and the subwidgets should somehow become inactive. -This could perhaps be implemented by binding @code{widget-inactive} to t -when inserting the grayed out subwidget, and let the widget-specify -functions check that variable. - @item Flag to make @code{widget-move} skip a specified button.
--- a/man/xemacs-faq.texi Mon Aug 13 09:21:56 2007 +0200 +++ b/man/xemacs-faq.texi Mon Aug 13 09:23:06 2007 +0200 @@ -1,6 +1,6 @@ \input texinfo.tex @c -*-texinfo-*- @c %**start of header -@setfilename ../info/xemacs-faq.info +@setfilename xemacs-faq.info @settitle Frequently asked questions about XEmacs @setchapternewpage off @c %**end of header @@ -64,9 +64,13 @@ but then had to give it up again. Some of the other contributors to this FAQ are listed later in this document. -This version was converted to hypertext format, and edited by Steven -L. Baur <steve@@altair.xemacs.org>. It was converted back to texinfo by -Hrvoje Niksic <hniksic@@srce.hr>. +The previous version was converted to hypertext format, and edited by +Steven L. Baur <steve@@altair.xemacs.org>. It was converted back to +texinfo by Hrvoje Niksic <hniksic@@srce.hr>. + +This version was edited and updated by Andreas Kaempf +<andreas@@sccon.com>. + @menu Introduction: @@ -126,11 +130,11 @@ @node Q1.0.2, Q1.0.3, Q1.0.1, Introduction @section What is the current version of XEmacs? -The current version is 19.15, released in January, 1997. +The current version is 19.15, released in March, 1997. It has been decided that XEmacs 19.15 will be the final release of v19. -XEmacs 19.15 is scheduled for release in mid January. After a brief -period of further testing, XEmacs v20 will be released shortly after +XEmacs 19.15 is scheduled for release in late March. After a brief +period of further testing, XEmacs v20.1 will be released shortly after that. @node Q1.0.3, Q1.0.4, Q1.0.2, Introduction @@ -277,9 +281,20 @@ @section Is there a port of XEmacs to Microsoft ('95 or NT)? The closest is @dfn{Win-Emacs}, which is based on Lucid Emacs 19.6. -Available from <URL:http://www.pearlsoft.com/>. Someone at Microsoft -expressed some interest in working on a port of 19.14 to NT, but never -went any farther. +Available from <URL:http://www.pearlsoft.com/>. + +There are some people actively working on a NT port of v20.1: David +Hobley started the port. Marc Paquette +@example +<marcpa@@cam.org> +@end example +has also became part of this effort. + +Email the beta list +@example +<xemacs-beta@@xemacs.org> +@end example +if you are interested in helping. There's a port of GNU Emacs (not XEmacs) at @example @@ -330,7 +345,7 @@ Brand new questions are tagged. All submissions are welcome. E-mail submissions to -<steve@@altair.xemacs.org>. +<andreas@@sccon.com>. Please make sure that @samp{XEmacs FAQ} appears on the Subject: line. If you think you have a better way of answering a question, or think a @@ -428,23 +443,13 @@ version of the FAQ (listed in alphabetical order): @itemize @bullet -@item Per Abrahamsen <abraham@@dina.kvl.dk> - -@item Vladimir Alexiev <vladimir@@cs.ualberta.ca> - -@item Martin Buchholz <Martin.Buchholz@@sun.com> - -@item Brian Denheyer <briand@@iccom.com> - -@item Markus Gutschke <gutschk@@ESCHER.UNI-MUENSTER.DE> - -@item David Kastrup <dak@@fsnif.neuroinformatik.ruhr-uni-bochum.de> - -@item Natalie Kershaw <nataliek@@rd.scitec.com.au> - -@item John Turner <turner@@lanl.gov> - -@item David Vanderschel <DvdS@@eden.com> +@item Steven L Baur <steve@@miranova.com> + +@item Darrell Kindred <dkindred@@cmu.edu> + +@item David Moore <dmoore@@ucsd.edu> + +@item Justin Sheehy <dworkin@@ccs.neu.edu> @end itemize @node Q1.2.3, Q1.3.1, Q1.2.2, Introduction @@ -629,7 +634,7 @@ There is a cyrillic mode in the file @file{mysetup.zip} in <URL:ftp://ftp.math.ohio-state.edu/pub/users/ilya/emacs/>. This is a modification to Valery Alexeev's <ava@@math.jhu.ed> @file{russian.el} -which can be obtained from +which can be obtained from <URL:ftp://tut.cis.ohio-state.edu/pub/gnu/emacs/elisp-archive/packages/russian.el.Z>. @end quotation @@ -815,6 +820,7 @@ * Q2.1.19:: XEmacs does not follow the local timezone. * Q2.1.20:: @samp{Symbol's function definition is void: hkey-help-show.} * Q2.1.21:: Every so often the XEmacs frame freezes. +* Q2.1.22:: XEmacs seems to take a really long time to do some things. @end menu @node Q2.0.1, Q2.0.2, Installation, Installation @@ -1118,6 +1124,24 @@ a symbolic link. @end quotation +Steve L. Baur <steve@@miranova.com> writes: + +@quotation +If you build against a recent libc-5.4 (late enough to have caused +problems earlier in the beta cycle) and then run with an earlier version +of libc, you get a + +@example +$ xemacs +xemacs: can't resolve symbol '__malloc_hook' +zsh: 7942 segmentation fault (core dumped) xemacs +@end example + +(Example binary compiled against libc-5.4.23 and run with libc-5.4.16). + +The solution is to upgrade to at least libc-5.4.23. Sigh. Drat. +@end quotation + @node Q2.0.9, Q2.0.10, Q2.0.8, Installation @section Where do I find external libraries? @@ -1922,12 +1946,47 @@ where you load hyperbole and the problem should go away. -@node Q2.1.21, , Q2.1.20, Installation +@node Q2.1.21, Q2.1.22, Q2.1.20, Installation @section Every so often the XEmacs frame freezes This problem has been fixed in 19.15, and was due to a not easily reproducible race condition. +@node Q2.1.22, , Q2.1.21, Installation +@section XEmacs seems to take a really long time to do some things + +David Moore <dmoore@@ucsd.edu> writes: + +@quotation +Two things you can do: + +1) C level: + +When you see it going mad like this, you might want to use gdb from an +'xterm' to attach to the running process and get a stack trace. To do +this just run: + +@example +gdb /path/to/xemacs/xemacs #### +@end example + +Where #### is the process id of your xemacs, instead of specifying the +core. When gdb attaches, the xemacs will stop [1] and you can type +`where' in gdb to get a stack trace as usual. To get things moving +again, you can just type `quit' in gdb. It'll tell you the program is +running and ask if you want to quit anyways. Say 'y' and it'll quit and +have your emacs continue from where it was at. + +2) Lisp level: + +Turn on debug-on-quit early on. When you think things are going slow +hit C-g and it may pop you in the debugger so you can see what routine +is running. Press `c' to get going again. + +debug-on-quit doesn't work if something's turned on inhibit-quit or in +some other strange cases. +@end quotation + @node Customization, Subsystems, Installation, Top @chapter Customization and Options
--- a/src/ChangeLog Mon Aug 13 09:21:56 2007 +0200 +++ b/src/ChangeLog Mon Aug 13 09:23:06 2007 +0200 @@ -1,3 +1,56 @@ +Tue Mar 25 11:36:08 1997 David Moore <dmoore@ucsd.edu> + + * fileio.c (barf_or_query_if_file_exists): GC fixes. + (Ffile_readable_p): ditto. + (Ffile_writable_p): ditto. + (Ffile_symlink_p): ditto. + (Ffile_accessible_directory_p): ditto. + + * sound.c (Fplay_sound_file): Fix up gc problems with file + handlers. + + * buffer.c (Fkill_buffer): Fix up buffer killing problems with + file handlers. + + * sysdep.c (sys_subshell): Fix up gc problems with file handlers. + + * callproc.c (Fcall_process_internal): Fix up gc problems with + file handlers. +Tue Mar 25 17:16:14 1997 Steven L Baur <steve@altair.xemacs.org> + + * ralloc.c (MHASH): Make 64bit Alpha happier. + +Tue Mar 25 11:36:08 1997 David Moore <dmoore@ucsd.edu> + + * fileio.c (auto_save_expand_name_error): New function. + (auto_save_expand_name): Ditto. + (Fdo_auto_save): Protect against an error in Fexpand_file_name + from kicking us inappropriately out of auto-save. + +Mon Mar 24 21:50:13 1997 Steven L Baur <steve@altair.xemacs.org> + + * s/linux.h (GETPGRP_NEEDS_ARG): Define if compiling with glibc + 2.1 (suggested by Andreas Jaeger). + +Mon Mar 24 12:40:56 1997 David Moore <dmoore@ucsd.edu> + + * profile.c: Fixed some comments about GC status of functions. + + * profile.c (inside_profiling): New variable to lock the + profiling table. + (sigprof_handler): Check it. + (Fget_profiling_info): Set it. + (mark_profiling_info): Set it. + (Fclear_profiling_info): Set it. + + * eval.c (PUSH_BACKTRACE): New macro. + (POP_BACKTRACE): Ditto. + + * eval.c (Fcommand_execute): Use them and fix problem with + backtrace_list build ordering requirements for profiling code. + (Feval): Ditto. + (funcall_recording_as): Ditto. + Fri Mar 21 20:19:09 1997 Steven L Baur <steve@altair.xemacs.org> * Makefile.in.in: strip inline.o.
--- a/src/buffer.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/buffer.c Mon Aug 13 09:23:06 2007 +0200 @@ -1216,7 +1216,7 @@ */ (bufname)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object buf; REGISTER struct buffer *b; struct gcpro gcpro1, gcpro2; @@ -1384,7 +1384,26 @@ && BUF_SAVE_MODIFF (b) < b->auto_save_modified) { if (!NILP (Vdelete_auto_save_files)) - internal_delete_file (b->auto_save_file_name); + { + /* deleting the auto save file might kill b! */ + /* #### dmoore - fix this crap, we do this same gcpro and + buffer liveness check multiple times. Let's get a + macro or something for it. */ + GCPRO1 (buf); + internal_delete_file (b->auto_save_file_name); + UNGCPRO; + b = XBUFFER (buf); + + if (!BUFFER_LIVE_P (b)) + return Qnil; + + if (b == current_buffer) + { + Fset_buffer (Fother_buffer (buf, Qnil, Qnil)); + if (b == current_buffer) + return Qnil; + } + } } uninit_buffer_markers (b);
--- a/src/callproc.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/callproc.c Mon Aug 13 09:23:06 2007 +0200 @@ -190,6 +190,7 @@ char *bufptr = buf; int bufsize = 16384; int speccount = specpdl_depth (); + struct gcpro gcpro1; char **new_argv = (char **) alloca ((max (2, nargs - 2)) * sizeof (char *)); @@ -229,8 +230,8 @@ GCPRO2 (current_dir, path); /* Caller gcprotects args[] */ current_dir = current_buffer->directory; - current_dir = expand_and_dir_to_file - (Funhandled_file_name_directory (current_dir), Qnil); + current_dir = Funhandled_file_name_directory (current_dir); + current_dir = expand_and_dir_to_file (current_dir, Qnil); #if 0 /* I don't know how RMS intends this crock of shit to work, but it breaks everything in the presence of ange-ftp-visited files, so @@ -244,12 +245,17 @@ if (nargs >= 2 && ! NILP (args[1])) { + struct gcpro gcpro1; + GCPRO1 (current_buffer->directory); infile = Fexpand_file_name (args[1], current_buffer->directory); + UNGCPRO; CHECK_STRING (infile); } else infile = build_string (NULL_DEVICE); + GCPRO1 (infile); /* Fexpand_file_name might trash it */ + if (nargs >= 3) { buffer = args[2]; @@ -287,6 +293,8 @@ else buffer = Qnil; + UNGCPRO; + display = ((nargs >= 4) ? args[3] : Qnil); /* From here we assume we won't GC (unless an error is signaled). */
--- a/src/dired.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/dired.c Mon Aug 13 09:23:06 2007 +0200 @@ -615,7 +615,7 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object values[12]; Lisp_Object dirname = Qnil; struct stat s;
--- a/src/emacsfns.h Mon Aug 13 09:21:56 2007 +0200 +++ b/src/emacsfns.h Mon Aug 13 09:23:06 2007 +0200 @@ -1303,6 +1303,7 @@ extern Lisp_Object Qformatted_string; extern Lisp_Object Qicon; extern Lisp_Object Qconst_glyph_variable; +extern Lisp_Object Qdisplay_table; Error_behavior decode_error_behavior_flag (Lisp_Object no_error); Lisp_Object encode_error_behavior_flag (Error_behavior errb);
--- a/src/eval.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/eval.c Mon Aug 13 09:23:06 2007 +0200 @@ -41,6 +41,16 @@ struct backtrace *backtrace_list; +/* Note you must always fill all of the fields in a backtrace structure + before pushing them on the backtrace_list. The profiling code depends + on this. */ + +#define PUSH_BACKTRACE(bt) \ + do { (bt).next = backtrace_list; backtrace_list = &(bt); } while (0) + +#define POP_BACKTRACE(bt) \ + do { backtrace_list = (bt).next; } while (0) + /* This is the list of current catches (and also condition-cases). This is a stack: the most recent catch is at the head of the list. Catches are created by declaring a 'struct catchtag' @@ -2582,18 +2592,17 @@ #ifdef EMACS_BTL backtrace.id_number = 0; #endif - backtrace.next = backtrace_list; - backtrace_list = &backtrace; backtrace.function = &Qcall_interactively; backtrace.args = &cmd; backtrace.nargs = 1; backtrace.evalargs = 0; backtrace.pdlcount = specpdl_depth (); backtrace.debug_on_exit = 0; + PUSH_BACKTRACE (backtrace); final = Fcall_interactively (cmd, record, keys); - backtrace_list = backtrace.next; + POP_BACKTRACE (backtrace); return (final); } else if (STRINGP (final) || VECTORP (final)) @@ -2917,13 +2926,12 @@ backtrace.id_number = 0; #endif backtrace.pdlcount = specpdl_depth_counter; - backtrace.next = backtrace_list; - backtrace_list = &backtrace; backtrace.function = &original_fun; /* This also protects them from gc */ backtrace.args = &original_args; backtrace.nargs = UNEVALLED; backtrace.evalargs = 1; backtrace.debug_on_exit = 0; + PUSH_BACKTRACE (backtrace); if (debug_on_next_call) do_debug_on_call (Qt); @@ -2999,7 +3007,7 @@ #endif if (backtrace.debug_on_exit) val = do_debug_on_exit (val); - backtrace_list = backtrace.next; + POP_BACKTRACE (backtrace); UNGCPRO; return (val); } @@ -3072,7 +3080,7 @@ #endif if (backtrace.debug_on_exit) val = do_debug_on_exit (val); - backtrace_list = backtrace.next; + POP_BACKTRACE (backtrace); return (val); } @@ -3107,15 +3115,12 @@ backtrace.id_number = 0; #endif backtrace.pdlcount = specpdl_depth_counter; - backtrace.next = backtrace_list; backtrace.function = &args[0]; backtrace.args = &args[1]; backtrace.nargs = nargs; backtrace.evalargs = 0; backtrace.debug_on_exit = 0; - /* XEmacs: make sure this is done last so we don't get race - conditions in the profiling code. */ - backtrace_list = &backtrace; + PUSH_BACKTRACE (backtrace); if (debug_on_next_call) do_debug_on_call (Qlambda); @@ -3204,7 +3209,7 @@ lisp_eval_depth--; if (backtrace.debug_on_exit) val = do_debug_on_exit (val); - backtrace_list = backtrace.next; + POP_BACKTRACE (backtrace); return val; }
--- a/src/event-stream.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/event-stream.c Mon Aug 13 09:23:06 2007 +0200 @@ -773,7 +773,7 @@ static void maybe_do_auto_save (void) { - /* This function can GC */ + /* This function can call lisp */ keystrokes_since_auto_save++; if (auto_save_interval > 0 && keystrokes_since_auto_save > max (auto_save_interval, 20) && @@ -1979,7 +1979,7 @@ */ (event, prompt)) { - /* This function can GC */ + /* This function can call lisp */ /* #### We start out using the selected console before an event is received, for echoing the partially completed command. This is most definitely wrong -- there needs to be a separate
--- a/src/faces.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/faces.c Mon Aug 13 09:23:06 2007 +0200 @@ -825,8 +825,7 @@ set_font_attached_to (f->font, face, Qfont); f->background_pixmap = Fmake_specifier (Qimage); set_image_attached_to (f->background_pixmap, face, Qbackground_pixmap); - /* #### need a special display-table specifier */ - f->display_table = Fmake_specifier (Qgeneric); + f->display_table = Fmake_specifier (Qdisplay_table); f->underline = Fmake_specifier (Qface_boolean); set_face_boolean_attached_to (f->underline, face, Qunderline); f->strikethru = Fmake_specifier (Qface_boolean);
--- a/src/fileio.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/fileio.c Mon Aug 13 09:23:06 2007 +0200 @@ -342,6 +342,7 @@ */ (filename, operation)) { + /* This function does not GC */ /* This function must not munge the match data. */ Lisp_Object chain, inhibited_handlers; @@ -376,7 +377,7 @@ static Lisp_Object call2_check_string (Lisp_Object fn, Lisp_Object arg0, Lisp_Object arg1) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object result = call2 (fn, arg0, arg1); CHECK_STRING (result); return (result); @@ -385,7 +386,7 @@ static Lisp_Object call2_check_string_or_nil (Lisp_Object fn, Lisp_Object arg0, Lisp_Object arg1) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object result = call2 (fn, arg0, arg1); if (!NILP (result)) CHECK_STRING (result); @@ -396,7 +397,7 @@ call3_check_string (Lisp_Object fn, Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object result = call3 (fn, arg0, arg1, arg2); CHECK_STRING (result); return (result); @@ -412,7 +413,7 @@ */ (file)) { - /* This function can GC */ + /* This function can call lisp */ Bufbyte *beg; Bufbyte *p; Lisp_Object handler; @@ -480,7 +481,7 @@ */ (file)) { - /* This function can GC */ + /* This function can call lisp */ Bufbyte *beg, *p, *end; Lisp_Object handler; @@ -516,7 +517,7 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object handler; /* If the file name has special constructs in it, @@ -616,7 +617,7 @@ */ (file)) { - /* This function can GC */ + /* This function can call lisp */ char *buf; Lisp_Object handler; @@ -802,7 +803,7 @@ */ (directory)) { - /* This function can GC */ + /* This function can call lisp */ char *buf; Lisp_Object handler; @@ -870,7 +871,7 @@ */ (name, defalt)) { - /* This function can GC */ + /* This function can call lisp */ Bufbyte *nm; Bufbyte *newdir, *p, *o; @@ -940,11 +941,11 @@ Putting this call here avoids all that crud. The EQ test avoids infinite recursion. */ - if (! NILP (defalt) && !EQ (defalt, name) + if (! NILP(defalt) && !EQ (defalt, name) /* This saves time in a common case. */ && ! (XSTRING_LENGTH (defalt) >= 3 - && IS_DIRECTORY_SEP (XSTRING_BYTE (defalt, 0)) - && IS_DEVICE_SEP (XSTRING_BYTE (defalt, 1)))) + && (IS_DIRECTORY_SEP (XSTRING_BYTE (defalt, 0)) + || IS_DEVICE_SEP (XSTRING_BYTE (defalt, 1))))) { struct gcpro gcpro1; @@ -1400,7 +1401,7 @@ */ (filename, defalt)) { - /* This function can GC */ + /* This function can call lisp */ struct gcpro gcpro1; Lisp_Object expanded_name; Lisp_Object handler; @@ -1527,6 +1528,7 @@ */ (string)) { + /* This function can call lisp */ Bufbyte *nm; Bufbyte *s, *p, *o, *x, *endp; @@ -1737,12 +1739,12 @@ Lisp_Object expand_and_dir_to_file (Lisp_Object filename, Lisp_Object defdir) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object abspath; struct gcpro gcpro1; - GCPRO1 (filename); abspath = Fexpand_file_name (filename, defdir); + GCPRO1 (abspath); #ifdef VMS { Bufbyte c = @@ -1775,6 +1777,7 @@ barf_or_query_if_file_exists (Lisp_Object absname, CONST char *querystring, int interactive, struct stat *statptr) { + /* This function can call lisp */ struct stat statbuf; /* stat is a good way to tell whether the file exists, @@ -1782,19 +1785,24 @@ if (stat ((char *) XSTRING_DATA (absname), &statbuf) >= 0) { Lisp_Object tem; - struct gcpro gcpro1; - - GCPRO1 (absname); + if (interactive) - tem = call1 - (Qyes_or_no_p, - (emacs_doprnt_string_c + { + Lisp_Object prompt; + struct gcpro gcpro1; + + prompt = emacs_doprnt_string_c ((CONST Bufbyte *) GETTEXT ("File %s already exists; %s anyway? "), Qnil, -1, XSTRING_DATA (absname), - GETTEXT (querystring)))); + GETTEXT (querystring)); + + GCPRO1 (prompt); + tem = call1 (Qyes_or_no_p, prompt); + UNGCPRO; + } else tem = Qnil; - UNGCPRO; + if (NILP (tem)) Fsignal (Qfile_already_exists, list2 (build_translated_string ("File already exists"), @@ -1823,7 +1831,7 @@ */ (filename, newname, ok_if_already_exists, keep_time)) { - /* This function can GC */ + /* This function can call lisp */ int ifd, ofd, n; char buf[16 * 1024]; struct stat st, out_st; @@ -1989,7 +1997,7 @@ */ (dirname)) { - /* This function can GC */ + /* This function can call lisp */ char dir [MAXPATHLEN]; Lisp_Object handler; struct gcpro gcpro1; @@ -2033,7 +2041,7 @@ */ (dirname)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object handler; struct gcpro gcpro1; @@ -2060,7 +2068,7 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object handler; struct gcpro gcpro1; @@ -2089,6 +2097,7 @@ int internal_delete_file (Lisp_Object filename) { + /* This function can call lisp */ return NILP (condition_case_1 (Qt, Fdelete_file, filename, internal_delete_file_1, Qnil)); } @@ -2104,7 +2113,7 @@ */ (filename, newname, ok_if_already_exists)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object handler; struct gcpro gcpro1, gcpro2; @@ -2197,7 +2206,7 @@ */ (filename, newname, ok_if_already_exists)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object handler; struct gcpro gcpro1, gcpro2; @@ -2254,7 +2263,7 @@ */ (filename, linkname, ok_if_already_exists)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object handler; struct gcpro gcpro1, gcpro2; @@ -2362,6 +2371,7 @@ */ (filename)) { + /* This function does not GC */ Bufbyte *ptr; CHECK_STRING (filename); @@ -2441,16 +2451,14 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object abspath; Lisp_Object handler; struct stat statbuf; struct gcpro gcpro1; - GCPRO1 (filename); CHECK_STRING (filename); abspath = Fexpand_file_name (filename, Qnil); - UNGCPRO; /* If the file name has special constructs in it, call the corresponding file handler. */ @@ -2473,15 +2481,13 @@ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object abspath; Lisp_Object handler; struct gcpro gcpro1; - GCPRO1 (filename); CHECK_STRING (filename); abspath = Fexpand_file_name (filename, Qnil); - UNGCPRO; /* If the file name has special constructs in it, call the corresponding file handler. */ @@ -2501,7 +2507,7 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object abspath; Lisp_Object handler; int desc; @@ -2534,16 +2540,14 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object abspath, dir; Lisp_Object handler; struct stat statbuf; struct gcpro gcpro1; - GCPRO1 (filename); CHECK_STRING (filename); abspath = Fexpand_file_name (filename, Qnil); - UNGCPRO; /* If the file name has special constructs in it, call the corresponding file handler. */ @@ -2581,7 +2585,7 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ #ifdef S_IFLNK char *buf; int bufsize; @@ -2590,14 +2594,14 @@ Lisp_Object handler; struct gcpro gcpro1; - GCPRO1 (filename); CHECK_STRING (filename); filename = Fexpand_file_name (filename, Qnil); - UNGCPRO; /* If the file name has special constructs in it, call the corresponding file handler. */ + GCPRO1 (filename); handler = Ffind_file_name_handler (filename, Qfile_symlink_p); + UNGCPRO; if (!NILP (handler)) return call2 (handler, Qfile_symlink_p, filename); @@ -2633,7 +2637,7 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object abspath; struct stat st; Lisp_Object handler; @@ -2667,9 +2671,8 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object handler; - struct gcpro gcpro1; /* If the file name has special constructs in it, call the corresponding file handler. */ @@ -2678,17 +2681,10 @@ return call2 (handler, Qfile_accessible_directory_p, filename); - /* #### dmoore - this gcpro on filename should be unneccesary since - the caller should ahve already protected it. */ - GCPRO1 (filename); if (NILP (Ffile_directory_p (filename))) - { - UNGCPRO; return (Qnil); - } - handler = Ffile_executable_p (filename); - UNGCPRO; - return (handler); + else + return Ffile_executable_p (filename); } DEFUN ("file-regular-p", Ffile_regular_p, 1, 1, 0, /* @@ -2697,6 +2693,7 @@ */ (filename)) { + /* This function can call lisp */ Lisp_Object abspath; struct stat st; Lisp_Object handler; @@ -2724,7 +2721,7 @@ */ (filename)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object abspath; struct stat st; Lisp_Object handler; @@ -2759,15 +2756,16 @@ */ (filename, mode)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object abspath; Lisp_Object handler; struct gcpro gcpro1; GCPRO1 (current_buffer->directory); abspath = Fexpand_file_name (filename, current_buffer->directory); + UNGCPRO; + CHECK_INT (mode); - UNGCPRO; /* If the file name has special constructs in it, call the corresponding file handler. */ @@ -2836,7 +2834,7 @@ */ (file1, file2)) { - /* This function can GC */ + /* This function can call lisp */ Lisp_Object abspath1, abspath2; struct stat st; int mtime1; @@ -2902,7 +2900,8 @@ */ (filename, visit, beg, end, replace, codesys, used_codesys)) { - /* This function can GC */ + /* This function can call lisp */ + /* #### dmoore - this function hasn't been checked for gc recently */ struct stat st; int fd; int saverrno = 0; @@ -3364,7 +3363,7 @@ */ (start, end, filename, append, visit, lockname, codesys)) { - /* This function can GC */ + /* This function can call lisp */ int desc; int failure; int save_errno = 0; @@ -4017,7 +4016,7 @@ */ (buf)) { - /* This function can GC */ + /* This function can call lisp */ struct buffer *b; struct stat st; Lisp_Object handler; @@ -4083,7 +4082,7 @@ */ (time_list)) { - /* This function can GC */ + /* This function can call lisp */ if (!NILP (time_list)) { time_t the_time; @@ -4122,7 +4121,7 @@ */ (buf, in_time)) { - /* This function can GC */ + /* This function can call lisp */ unsigned long time_to_use = 0; int set_time_to_use = 0; struct stat st; @@ -4196,7 +4195,7 @@ static Lisp_Object auto_save_error (Lisp_Object condition_object, Lisp_Object ignored) { - /* This function can GC */ + /* This function can call lisp */ if (gc_in_progress) return Qnil; /* Don't try printing an error message after everything is gone! */ @@ -4216,7 +4215,8 @@ static Lisp_Object auto_save_1 (Lisp_Object ignored) { - /* This function can GC */ + /* This function can call lisp */ + /* #### I think caller is protecting current_buffer? */ struct stat st; Lisp_Object fn = current_buffer->filename; Lisp_Object a = current_buffer->auto_save_file_name; @@ -4246,6 +4246,26 @@ ); } +static Lisp_Object +auto_save_expand_name_error (Lisp_Object condition_object, Lisp_Object ignored) +{ + /* #### this function should spew an error message about not being + able to open the .saves file. */ + return Qnil; +} + +static Lisp_Object +auto_save_expand_name (Lisp_Object name) +{ + struct gcpro gcpro1; + + /* note that caller did NOT gc protect name, so we do it. */ + /* #### dmoore - this might not be neccessary, if condition_case_1 + protects it. but I don't think it does. */ + GCPRO1 (name); + RETURN_UNGCPRO (Fexpand_file_name (name, Qnil)); +} + static Lisp_Object do_auto_save_unwind (Lisp_Object fd) @@ -4283,7 +4303,7 @@ */ (no_message, current_only)) { - /* This function can GC */ + /* This function can call lisp */ struct buffer *b; Lisp_Object tail, buf; int auto_saved = 0; @@ -4312,7 +4332,10 @@ run_hook (Qauto_save_hook); if (GC_STRINGP (Vauto_save_list_file_name)) - listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil); + listfile = condition_case_1 (Qt, + auto_save_expand_name, + Vauto_save_list_file_name, + auto_save_expand_name_error, Qnil); /* Make sure auto_saving is reset. */ record_unwind_protect (do_auto_save_unwind_2, make_int (auto_saving));
--- a/src/glyphs-x.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/glyphs-x.c Mon Aug 13 09:23:06 2007 +0200 @@ -387,6 +387,7 @@ simple_image_type_normalize (Lisp_Object inst, Lisp_Object console_type, Lisp_Object image_type_tag) { + /* This function can call lisp */ Lisp_Object file = Qnil; struct gcpro gcpro1, gcpro2; Lisp_Object alist = Qnil; @@ -2976,6 +2977,7 @@ static Lisp_Object xface_normalize (Lisp_Object inst, Lisp_Object console_type) { + /* This funcation can call lisp */ Lisp_Object file = Qnil, mask_file = Qnil; struct gcpro gcpro1, gcpro2, gcpro3; Lisp_Object alist = Qnil;
--- a/src/glyphs.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/glyphs.c Mon Aug 13 09:23:06 2007 +0200 @@ -54,6 +54,7 @@ Lisp_Object Qmono_pixmap, Qcolor_pixmap, Qsubwindow; Lisp_Object Vcurrent_display_table; +Lisp_Object Qdisplay_table; Lisp_Object Vtruncation_glyph, Vcontinuation_glyph, Voctal_escape_glyph; Lisp_Object Vcontrol_arrow_glyph, Vinvisible_text_glyph, Vhscroll_glyph; @@ -386,6 +387,7 @@ Lisp_Object make_string_from_file (Lisp_Object file) { + /* This function can call lisp */ int count = specpdl_depth (); Lisp_Object temp_buffer; struct gcpro gcpro1; @@ -2939,7 +2941,7 @@ nil means display the character in the default fashion. Faces can have their own, overriding display table. */ ); - Vcurrent_display_table = Fmake_specifier (Qgeneric); + Vcurrent_display_table = Fmake_specifier (Qdisplay_table); set_specifier_fallback (Vcurrent_display_table, list1 (Fcons (Qnil, Qnil))); set_specifier_caching (Vcurrent_display_table,
--- a/src/minibuf.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/minibuf.c Mon Aug 13 09:23:06 2007 +0200 @@ -22,6 +22,9 @@ /* Synched up with: Mule 2.0, FSF 19.28. Mule-ized except as noted. Substantially different from FSF. */ +/* #### dmoore - All sorts of things in here can call lisp, like message. + Track all this stuff. */ + #include <config.h> #include "lisp.h" @@ -647,6 +650,7 @@ clear_echo_area_internal (struct frame *f, Lisp_Object label, int from_print, int no_restore) { + /* This function can call lisp */ if (!NILP (Ffboundp (Qclear_message))) { Lisp_Object frame; @@ -666,12 +670,14 @@ Lisp_Object clear_echo_area (struct frame *f, Lisp_Object label, int no_restore) { + /* This function can call lisp */ return clear_echo_area_internal (f, label, 0, no_restore); } Lisp_Object clear_echo_area_from_print (struct frame *f, Lisp_Object label, int no_restore) { + /* This function can call lisp */ return clear_echo_area_internal (f, label, 1, no_restore); } @@ -680,6 +686,7 @@ Bytecount offset, Bytecount length, Lisp_Object label) { + /* This function can call lisp */ Lisp_Object obj; struct gcpro gcpro1; Lisp_Object frame; @@ -727,6 +734,7 @@ Lisp_Object reloc, Bytecount offset, Bytecount length, Lisp_Object label) { + /* This function can call lisp */ clear_echo_area (f, label, 1); echo_area_append (f, nonreloc, reloc, offset, length, label); } @@ -744,6 +752,7 @@ Lisp_Object echo_area_status (struct frame *f) { + /* This function can call lisp */ if (!NILP (Ffboundp (Qcurrent_message_label))) { Lisp_Object frame; @@ -769,7 +778,7 @@ message_internal (CONST Bufbyte *nonreloc, Lisp_Object reloc, Bytecount offset, Bytecount length) { - /* This can GC! */ + /* This function can call lisp */ if (NILP (Vexecuting_macro)) echo_area_message (selected_frame (), nonreloc, reloc, offset, length, Qmessage); @@ -779,7 +788,7 @@ message_append_internal (CONST Bufbyte *nonreloc, Lisp_Object reloc, Bytecount offset, Bytecount length) { - /* This can GC! */ + /* This function can call lisp */ if (NILP (Vexecuting_macro)) echo_area_append (selected_frame (), nonreloc, reloc, offset, length, Qmessage); @@ -792,6 +801,7 @@ static void message_1 (CONST char *fmt, va_list args) { + /* This function can call lisp */ if (fmt) { struct gcpro gcpro1; @@ -810,6 +820,7 @@ static void message_append_1 (CONST char *fmt, va_list args) { + /* This function can call lisp */ if (fmt) { struct gcpro gcpro1; @@ -828,12 +839,14 @@ void clear_message (void) { + /* This function can call lisp */ message_internal (0, Qnil, 0, 0); } void message (CONST char *fmt, ...) { + /* This function can call lisp */ /* I think it's OK to pass the data of Lisp strings as arguments to this function. No GC'ing will occur until the data has already been copied. */ @@ -849,6 +862,7 @@ void message_append (CONST char *fmt, ...) { + /* This function can call lisp */ va_list args; va_start (args, fmt); @@ -861,6 +875,7 @@ void message_no_translate (CONST char *fmt, ...) { + /* This function can call lisp */ /* I think it's OK to pass the data of Lisp strings as arguments to this function. No GC'ing will occur until the data has already been copied. */
--- a/src/mule-canna.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/mule-canna.c Mon Aug 13 09:23:06 2007 +0200 @@ -1589,6 +1589,7 @@ } /* return the MULE internal string length of EUC string */ +/* Modified by sb to return a character count not byte count. */ static int mule_strlen (unsigned char *p, int l) { @@ -1599,17 +1600,17 @@ { if ((unsigned char) ch == ISO_CODE_SS2) { - len += 2; + len++; cp += 2; } else if ((unsigned char) ch == ISO_CODE_SS3) { - len += 3; + len++; cp += 3; } else if (ch & 0x80) { - len += 3; + len++; cp += 2; } else
--- a/src/process.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/process.c Mon Aug 13 09:23:06 2007 +0200 @@ -1195,6 +1195,8 @@ } else { + /* #### dmoore - file-directory-p can call lisp, make sure everything + here protects itself. */ if (!NILP (Ffile_directory_p (program))) error ("Specified program for new process is a directory"); }
--- a/src/profile.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/profile.c Mon Aug 13 09:23:06 2007 +0200 @@ -63,38 +63,63 @@ Lisp_Object QSprocessing_events_at_top_level; Lisp_Object QSunknown; +/* We use inside_profiling to prevent the handler from writing to + the table while another routine is operating on it. We also set + inside_profiling in case the timeout between signal calls is short + enough to catch us while we're already in there. */ +volatile static int inside_profiling; + static SIGTYPE sigprof_handler (int signo) { - Lisp_Object fun; + /* Don't do anything if we are shutting down, or are doing a maphash + or clrhash on the table. */ + if (!inside_profiling && !preparing_for_armageddon) + { + Lisp_Object fun; + + /* If something below causes an error to be signaled, we'll + not correctly reset this flag. But we'll be in worse shape + than that anyways, since we'll longjmp back to the last + condition case. */ + inside_profiling = 1; + + if (profiling_redisplay_flag) + fun = QSin_redisplay; + else if (gc_in_progress) + fun = QSin_garbage_collection; + else if (backtrace_list) + { + fun = *backtrace_list->function; - if (profiling_redisplay_flag) - fun = QSin_redisplay; - else if (gc_in_progress) - fun = QSin_garbage_collection; - else if (backtrace_list) - { - fun = *backtrace_list->function; + /* #### dmoore - why do we need to unmark it, we aren't in GC. */ + XUNMARK (fun); + if (!GC_SYMBOLP (fun) && !GC_COMPILED_FUNCTIONP (fun)) + fun = QSunknown; + } + else + fun = QSprocessing_events_at_top_level; - XUNMARK (fun); - if (!GC_SYMBOLP (fun) && !GC_COMPILED_FUNCTIONP (fun)) - fun = QSunknown; + { + /* #### see comment about memory allocation in start-profiling. + Allocating memory in a signal handler is BAD BAD BAD. + If you are using the non-mmap rel-alloc code, you might + lose because of this. Even worse, if the memory allocation + fails, the `error' generated whacks everything hard. */ + long count; + CONST void *vval; + + if (gethash (LISP_TO_VOID (fun), big_profile_table, &vval)) + count = (long) vval; + else + count = 0; + count++; + vval = (CONST void *) count; + puthash (LISP_TO_VOID (fun), (void *) vval, big_profile_table); + } + + inside_profiling = 0; } - else - fun = QSprocessing_events_at_top_level; - - { - long count; - CONST void *vval; - - if (gethash (LISP_TO_VOID (fun), big_profile_table, &vval)) - count = (long) vval; - else - count = 0; - count++; - vval = (CONST void *) count; - puthash (LISP_TO_VOID (fun), (void *) vval, big_profile_table); - } } DEFUN ("start-profiling", Fstart_profiling, 0, 1, 0, /* @@ -110,6 +135,7 @@ */ (microsecs)) { + /* This function can GC */ int msecs; struct itimerval foo; @@ -136,6 +162,7 @@ EMACS_NORMALIZE_TIME (foo.it_value); foo.it_interval = foo.it_value; profiling_active = 1; + inside_profiling = 0; setitimer (ITIMER_PROF, &foo, 0); return Qnil; } @@ -145,6 +172,7 @@ */ ()) { + /* This function does not GC */ struct itimerval foo; foo.it_value.tv_sec = 0; @@ -156,6 +184,13 @@ return Qnil; } +static Lisp_Object +profile_lock_unwind (Lisp_Object ignore) +{ + inside_profiling = 0; + return Qnil; +} + struct get_profiling_info_closure { Lisp_Object accum; @@ -166,7 +201,7 @@ void *void_val, void *void_closure) { - /* This function can GC */ + /* This function does not GC */ Lisp_Object key; struct get_profiling_info_closure *closure = void_closure; EMACS_INT val; @@ -183,11 +218,18 @@ */ ()) { + /* This function does not GC */ struct get_profiling_info_closure closure; closure.accum = Qnil; if (big_profile_table) - maphash (get_profiling_info_maphash, big_profile_table, &closure); + { + int count = specpdl_depth (); + record_unwind_protect (profile_lock_unwind, Qnil); + inside_profiling = 1; + maphash (get_profiling_info_maphash, big_profile_table, &closure); + unbind_to (count, Qnil); + } return closure.accum; } @@ -201,7 +243,6 @@ void *void_val, void *void_closure) { - /* This function can GC */ Lisp_Object key; struct mark_profiling_info_closure *closure = void_closure; @@ -212,11 +253,16 @@ void mark_profiling_info (void (*markfun) (Lisp_Object)) { + /* This function does not GC (if markfun doesn't) */ struct mark_profiling_info_closure closure; closure.markfun = markfun; if (big_profile_table) - maphash (mark_profiling_info_maphash, big_profile_table, &closure); + { + inside_profiling = 1; + maphash (mark_profiling_info_maphash, big_profile_table, &closure); + inside_profiling = 0; + } } DEFUN ("clear-profiling-info", Fclear_profiling_info, 0, 0, 0, /* @@ -224,8 +270,13 @@ */ ()) { + /* This function does not GC */ if (big_profile_table) - clrhash (big_profile_table); + { + inside_profiling = 1; + clrhash (big_profile_table); + inside_profiling = 0; + } return Qnil; } @@ -258,6 +309,8 @@ */ ); default_profiling_interval = 1000; + inside_profiling = 0; + QSin_redisplay = build_string ("(in redisplay)"); staticpro (&QSin_redisplay); QSin_garbage_collection = build_string ("(in garbage collection)");
--- a/src/ralloc.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/ralloc.c Mon Aug 13 09:23:06 2007 +0200 @@ -757,7 +757,11 @@ static int MHASH (VM_ADDR addr) { +#if (LONGBITS == 64) + unsigned long int addr_shift = (unsigned long int)(addr) >> USELESS_LOWER_ADDRESS_BITS; +#else unsigned int addr_shift = (unsigned int)(addr) >> USELESS_LOWER_ADDRESS_BITS; +#endif int hval = addr_shift % MHASH_PRIME; /* We could have addresses which are -ve when converted to signed ints */ return ((hval >= 0) ? hval : MHASH_PRIME + hval);
--- a/src/redisplay-output.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/redisplay-output.c Mon Aug 13 09:23:06 2007 +0200 @@ -333,13 +333,23 @@ full redraw of the block in order to make sure that the cursor is updated properly. */ if (ddb->type != TEXT +#if 0 + /* I'm not sure exactly what this code wants to do, but it's + * not right--it doesn't update when cursor_elt changes from, e.g., + * 0 to 8, and the new or old cursor loc overlaps this block. + * I've replaced it with the more conservative test below. + * -dkindred@cs.cmu.edu 23-Mar-1997 */ && ((cdl->cursor_elt == -1 && ddl->cursor_elt != -1) || (cdl->cursor_elt != -1 && ddl->cursor_elt == -1)) && (ddl->cursor_elt == -1 || (cursor_start && cursor_width && (cursor_start + cursor_width) >= start_pixpos - && cursor_start <= block_end))) + && cursor_start <= block_end)) +#else + && (cdl->cursor_elt != ddl->cursor_elt) +#endif + ) force = 1; if (f->windows_structure_changed ||
--- a/src/redisplay-x.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/redisplay-x.c Mon Aug 13 09:23:06 2007 +0200 @@ -1079,7 +1079,8 @@ { int tmp_height, tmp_y; int bar_width = EQ (bar_cursor_value, Qt) ? 1 : 2; - int cursor_x; + int need_clipping = (cursor_start < clip_start + || clip_end < cursor_start + cursor_width); /* #### This value is correct (as far as I know) because all of the times we need to draw this cursor, we will @@ -1109,11 +1110,6 @@ Qnil, Qnil, Qnil); } - if (cursor) - cursor_x = clip_start; - else - cursor_x = cursor_start; - tmp_y = dl->ypos - bogusly_obtained_ascent_value; tmp_height = cursor_height; if (tmp_y + tmp_height > (int) (dl->ypos - dl->ascent + height)) @@ -1124,15 +1120,33 @@ tmp_height = dl->ypos - dl->ascent + height - tmp_y; } + if (need_clipping) + { + XRectangle clip_box[1]; + clip_box[0].x = 0; + clip_box[0].y = 0; + clip_box[0].width = clip_end - clip_start; + clip_box[0].height = tmp_height; + XSetClipRectangles (dpy, gc, clip_start, tmp_y, + clip_box, 1, Unsorted); + } + if (!focus && NILP (bar_cursor_value)) { - XDrawRectangle (dpy, x_win, gc, cursor_x, tmp_y, + XDrawRectangle (dpy, x_win, gc, cursor_start, tmp_y, cursor_width - 1, tmp_height - 1); } else if (focus && !NILP (bar_cursor_value)) { - XDrawLine (dpy, x_win, gc, cursor_x + bar_width - 1, tmp_y, - cursor_x + bar_width - 1, tmp_y + tmp_height - 1); + XDrawLine (dpy, x_win, gc, cursor_start + bar_width - 1, tmp_y, + cursor_start + bar_width - 1, tmp_y + tmp_height - 1); + } + + /* Restore the GC */ + if (need_clipping) + { + XSetClipMask (dpy, gc, None); + XSetClipOrigin (dpy, gc, 0, 0); } } } @@ -1826,8 +1840,8 @@ } /* If the window doesn't intersect the exposed region, we're done here. */ - if (x > WINDOW_RIGHT (w) || (x + width) < WINDOW_LEFT (w) - || y > WINDOW_BOTTOM (w) || (y + height) < WINDOW_TOP (w)) + if (x >= WINDOW_RIGHT (w) || (x + width) <= WINDOW_LEFT (w) + || y >= WINDOW_BOTTOM (w) || (y + height) <= WINDOW_TOP (w)) { return; } @@ -2093,12 +2107,10 @@ default_face_font_info (window, &defascent, 0, &defheight, 0, 0); } - cursor_y = dl->ypos - defascent; - if (cursor_y < y) - cursor_y = y; - cursor_height = defheight; - if (cursor_y + cursor_height > y + height) - cursor_height = y + height - cursor_y; + /* make sure the cursor is entirely contained between y and y+height */ + cursor_height = min (defheight, height); + cursor_y = max (y, min (y + height - cursor_height, + dl->ypos - defascent)); if (focus) {
--- a/src/redisplay.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/redisplay.c Mon Aug 13 09:23:06 2007 +0200 @@ -6660,7 +6660,8 @@ { struct buffer *b = XBUFFER (w->buffer); int cur_elt; - Bufpos cur_pos; + Bufpos cur_pos, prev_pos = point; + int point_line_height; int pixheight = pixpos - WINDOW_TEXT_TOP (w); validate_line_start_cache (w); @@ -6670,6 +6671,9 @@ /* #### See comment in update_line_start_cache about big minibuffers. */ if (cur_elt < 0) return point; + + point_line_height = Dynarr_atp (w->line_start_cache, cur_elt)->height; + while (1) { cur_pos = Dynarr_atp (w->line_start_cache, cur_elt)->start; @@ -6681,7 +6685,12 @@ if (pixheight < 0) { w->line_cache_validation_override--; - return cur_pos; + if (-pixheight > point_line_height) + /* We can't make the target line cover pixpos, so put it + above pixpos. That way it will at least be visible. */ + return prev_pos; + else + return cur_pos; } cur_elt--; @@ -6707,6 +6716,7 @@ cur_elt = point_in_line_start_cache (w, cur_pos, 2) - 1; assert (cur_elt >= 0); } + prev_pos = cur_pos; } }
--- a/src/s/linux.h Mon Aug 13 09:21:56 2007 +0200 +++ b/src/s/linux.h Mon Aug 13 09:23:06 2007 +0200 @@ -289,3 +289,8 @@ #endif /* XEmacs: removed setpgrp() definition because we use setpgid() when it's available, and autodetect it. */ + +/* glibc fuckage */ +#if defined __GLIBC__ && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || __GLIBC__ > 2) +# define GETPGRP_NEEDS_ARG +#endif
--- a/src/s/sco5.h Mon Aug 13 09:21:56 2007 +0200 +++ b/src/s/sco5.h Mon Aug 13 09:23:06 2007 +0200 @@ -52,7 +52,7 @@ #ifndef __GNUC__ #define LINKER cc -Xc #else -#define LINKER gcc -Xc +#define LINKER gcc #endif #undef LIBX11_SYSTEM @@ -85,8 +85,8 @@ #define C_OPTIMIZE_SWITCH -O3 -Xc #define C_DEBUG_SWITCH -g -Xc #else -#define C_OPTIMIZE_SWITCH -O99 -m486 -fomit-frame-pointer -Xc -#define C_DEBUG_SWITCH -g -Xc +#define C_OPTIMIZE_SWITCH -O99 -m486 -fomit-frame-pointer +#define C_DEBUG_SWITCH -g #endif /* configure can't get this right linking fails unless -lsocket is used. */ @@ -100,7 +100,11 @@ #undef BROKEN_TIOCGWINSZ #define NEED_PTEM_H +#ifndef __GNUC__ #define START_FILES pre-crt0.o /usr/ccs/lib/crt1.o /usr/ccs/lib/values-Xc.o +#else +#define START_FILES pre-crt0.o /usr/ccs/lib/crt1.o +#endif #define LIB_STANDARD -lc /* Send signals to subprocesses by "typing" signal chars at them. */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/s/ultrix4-3.h Mon Aug 13 09:23:06 2007 +0200 @@ -0,0 +1,21 @@ +/* Ultrix 4.3 system description header file. + Copyright (C) 1997 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "ultrix.h"
--- a/src/signal.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/signal.c Mon Aug 13 09:23:06 2007 +0200 @@ -376,7 +376,9 @@ static SIGTYPE interrupt_signal (int sig) { - /* This function can GC (?!) */ + /* This function can call lisp */ + /* #### we should NOT be calling lisp from a signal handler, boys + and girls */ /* Must preserve main program's value of errno. */ int old_errno = errno;
--- a/src/sound.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/sound.c Mon Aug 13 09:23:06 2007 +0200 @@ -75,11 +75,13 @@ */ (file, volume, device)) { - /* This function can GC */ + /* This function can call lisp */ int vol; #if defined (HAVE_NATIVE_SOUND) || defined (HAVE_NAS_SOUND) struct device *d = decode_device (device); #endif + struct gcpro gcpro1; + CHECK_STRING (file); if (NILP (volume)) vol = bell_volume; @@ -89,12 +91,14 @@ vol = XINT (volume); } + GCPRO1 (file); file = Fexpand_file_name (file, Qnil); if (NILP (Ffile_readable_p (file))) if (NILP (Ffile_exists_p (file))) error ("file does not exist."); else error ("file is unreadable."); + UNGCPRO; #ifdef HAVE_NAS_SOUND if (DEVICE_CONNECTED_TO_NAS_P (d))
--- a/src/specifier.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/specifier.c Mon Aug 13 09:23:06 2007 +0200 @@ -35,6 +35,7 @@ #include "opaque.h" #include "specifier.h" #include "window.h" +#include "glyphs.h" /* for DISP_TABLE_SIZE definition */ Lisp_Object Qspecifierp; Lisp_Object Qprepend, Qappend, Qremove_tag_set_prepend, Qremove_tag_set_append; @@ -2877,6 +2878,30 @@ return (BOOLEAN_SPECIFIERP (object) ? Qt : Qnil); } +/************************************************************************/ +/* Display table specifier type */ +/************************************************************************/ + +DEFINE_SPECIFIER_TYPE (display_table); + +void +display_table_validate(instantiator) +Lisp_Object instantiator; +{ + if (!NILP(instantiator) && + (!VECTORP (instantiator) || + XVECTOR (instantiator)->size != DISP_TABLE_SIZE)) + dead_wrong_type_argument(display_table_specifier_methods->predicate_symbol, instantiator); + return; +} +DEFUN ("display-table-specifier-p", Fdisplay_table_specifier_p, 1, 1, 0, /* +Return non-nil if OBJECT is an display-table specifier. +*/ + (object)) +{ + return (DISPLAYTABLE_SPECIFIERP (object) ? Qt : Qnil); +} + /************************************************************************/ /* Initialization */ @@ -2977,6 +3002,11 @@ INITIALIZE_SPECIFIER_TYPE (boolean, "boolean", "boolean-specifier-p"); SPECIFIER_HAS_METHOD (boolean, validate); + + INITIALIZE_SPECIFIER_TYPE (display_table, "display-table", + "display-table-p"); + + SPECIFIER_HAS_METHOD (display_table, validate); } void
--- a/src/specifier.h Mon Aug 13 09:21:56 2007 +0200 +++ b/src/specifier.h Mon Aug 13 09:23:06 2007 +0200 @@ -311,4 +311,11 @@ #define CHECK_BOOLEAN_SPECIFIER(x) CHECK_SPECIFIER_TYPE (x, boolean) #define CONCHECK_BOOLEAN_SPECIFIER(x) CONCHECK_SPECIFIER_TYPE (x, boolean) +DECLARE_SPECIFIER_TYPE (display_table); +#define XDISPLAYTABLE_SPECIFIER(x) XSPECIFIER_TYPE (x, display_table) +#define XSETDISPLAYTABLE_SPECIFIER(x, p) XSETSPECIFIER_TYPE (x, p, display_table) +#define DISPLAYTABLE_SPECIFIERP(x) SPECIFIER_TYPEP (x, display_table) +#define CHECK_DISPLAYTABLE_SPECIFIER(x) CHECK_SPECIFIER_TYPE (x, display_table) +#define CONCHECK_DISPLAYTABLE_SPECIFIER(x) CONCHECK_SPECIFIER_TYPE (x, display_table) + #endif /* _XEMACS_SPECIFIER_H_ */
--- a/src/sysdep.c Mon Aug 13 09:21:56 2007 +0200 +++ b/src/sysdep.c Mon Aug 13 09:23:06 2007 +0200 @@ -588,6 +588,7 @@ Lisp_Object dir; unsigned char *str = 0; int len; + struct gcpro gcpro1; saved_handlers[0].code = SIGINT; saved_handlers[1].code = SIGQUIT; @@ -607,8 +608,11 @@ dir = Fsymbol_value (Qdefault_directory); if (!STRINGP (dir)) goto xyzzy; - - dir = expand_and_dir_to_file (Funhandled_file_name_directory (dir), Qnil); + + GCPRO1 (dir); + dir = Funhandled_file_name_directory (dir); + dir = expand_and_dir_to_file (dir, Qnil); + UNGCPRO; str = (unsigned char *) alloca (XSTRING_LENGTH (dir) + 2); len = XSTRING_LENGTH (dir); memcpy (str, XSTRING_DATA (dir), len);
--- a/vms/README Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -The file 'emacs.com' in this directory is for VMS. It defines logical -names and commands such as `emacs', so you must edit it to specify the -file and directory names used on your machine. This file must be -executed in each session to enable you to run the installed Emacs. It -should be executed by your `login.com' file, or else perhaps it can be -executed once at system boot time. - -The file `kepteditor.com' in this directory is also for VMS. - When a user says to run Emacs, it really runs this command file. - -See the files VMSINSTALL and VMSNOTES for more information on VMS use.
--- a/vms/VMSINSTALL Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -* Installing GNU Emacs from a VMS install kit - -If you receive a VMS distribution tape containing an install kit, you -can restore Emacs and run it immediately on any VMS system 4.2 or newer. -The installation command file will automatically rename certain files -whose names must vary according to the version of VMS in use. - -However, it is not certain we will have the install kit developed -soon, so until that is done, you may receive an ordinary BACKUP -saveset instead. - -* Installing GNU Emacs from an ordinary VMS BACKUP saveset - -If you receive a VMS distribution tape in VMS BACKUP interchange -format you can restore Emacs and run it on VMS versions 4.2 or newer -after executing a few commands. What you must do depends on the -VMS version (one procedure for VMS 4.2 or 4.3; another procedure -for newer VMS versions). - -For VMS versions 4.4 and up, make sure the file -SYS$SYSTEM:RIGHTSLIST.DAT has WORLD:R access. Emacs reads this file -to check file access. - -In order to compile Emacs with the VMS C compiler, you will need a -pagefile quota of around 22000 pages, plus enough swap space to handle -that. (This was in VMS 5.1-1, with 5 meg of physical memory.) See -HELP SYSGEN CREATE and HELP SYSGEN INSTALL for more information. - -Choose a directory to restore to, say DEV:[LIB]. Do: - - $ mount/foreign mta0: - $ backup/log mta0: dev:[lib...] - -Now, if you are using VMS version 4.4 or later, set your default to -the directory DEV:[LIB.EMACS] and run the command file -DEV:[LIB.EMACS]ALLRENAME.COM: - - $ set default dev:[lib.emacs] - $ @allrename [...] "_" "-" - -This renames all files in the Emacs distribution from their old-VMS -names (containing `_' characters) to their new-VMS names (containing -`-' instead). - -Now, edit DEV:[LIB.EMACS]EMACS.COM. Replace the definition of -EMACS_LIBRARY with the appropriate device and directory. The -definition initially reads as follows: - - $ define /translation=concealed emacs_library sys$device:[emacs.] - -You would replace this with: - - $ define /translation=concealed emacs_library dev:[lib.emacs.] - -Now execute the command file DEV:[LIB.EMACS]EMACS.COM. This defines -a command EMACS that runs a suspendable permanent Emacs. To -fully install Emacs, you must arrange for users to run this file -on login, or arrange for this file to be run when the system boots. - -The distribution contains an Emacs executable in -DEV:[LIB.EMACS]EMACS.EXE. It uses DEV:[LIB.EMACS]EMACS.DUMP every time -it runs. The EMACS.EXE has been linked with the non-sharable C -library, so it should run on any VMS V4.4+ system, whether or not the -C compiler exists. The .OBJ files are all there, so you can relink -with /debug if you want to have fun. - -A few C source files contain compilation conditionals that depend -on the version of VMS. We have compiled these files specially for -VMS version 4.2 (or 4.3) in object files with extension .JBO. -So to run on VMS 4.2, rename all the .JBO files to .OBJ, then -link and build Emacs as described in DEV:[LIB.EMACS.SRC]VMSBUILD. - - $ set def [.src] - $ rename *.jbo *.obj - $ @precomp - $ @link - $ @build - $ rename temacs.exe [-]emacs.exe - $ rename temacs.dump [-]emacs.dump - -To be clean, you should also edit the file [.SRC]CONFIG.H -to #include the file S_VMS4_2.H instead of S-VMS-4-4.H. Then the -proper conditionals will be activated if you ever recompile. - -* Moving a Unix distribution to VMS. - -Moving a Unix distribution to VMS is mostly a matter of transferring -the files to the VMS system, but with old versions of VMS (prior to -4.4) it is a little more complicated because some of the file names -used on Unix are not supported by VMS. Every `-' in a Unix file name -must be changed to a `_' on VMS. (In VMS versions 4.4 and up, this is -not necessary, since `-' is allowed in file names.) - -A few other changes must be made regardless of the version of VMS: - -1) Copy the file [.SRC]VMSPATHS.H to [.SRC]PATHS.H, replacing any existing -file PATHS.H in that directory. - -2) Delete any file [.SRC]CONFIG.H and replace it with a copy of -CONFIG.H-DIST. Then edit this file so it specifies `m-vax.h' as the -second include file and for the first include file one of -`s-vms4-0.h', `s-vms4-2.h' or `s-vms4-4.h'. (Use the highest version -not greater than the VMS version you are running. For VMS versions -prior to 4.4, the `-' characters must be replaced with `_'.) - -You can now compile, link, build and install Emacs as described in -[.SRC]VMSBUILD.. - -* Moving a VMS distribution to Unix. - -Delete all .OBJ files, and PATHS.H and CONFIG.H. Then copy the -remaining files, changing each `_' in a file name to `-`. Unix will -allow filenames with `_' but Emacs will not work with them! - -Names which on VMS end in a period (have a null extension) should -have no period on Unix. Thus, "YMAKEFILE." becomes "ymakefile". - -VMS file names are case-insensitive. On Unix, case is significant. -Most of the file names must be in lower case or they will not work. -There are only a few exceptions: - -1) CHANGELOG. becomes ChangeLog -2) MAKEFILE. becomes Makefile -3) TAGS. becomes TAGS -4) Files of English text with null extensions keep their names - in upper case. For example, README. becomes README and - [.ETC]GNU. becomes GNU -
--- a/vms/VMSNOTES Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -See the file VMSINSTALL for VMS installation information. - -* Deficiencies of VMS GNU Emacs - -All GNU Emacs features which on Unix work by running a Unix utility -in a subprocess currently do not work on VMS. - -These include Dired, listing a file directory, reading and sending -mail, reading and posting netnews, spelling correction, displaying the -time and load in the mode line, queueing output for printing, and the -`sort-columns' command. Naturally, the commands to view Unix manual -pages and execute Unix shell commands also do not work. - -It is not possible to fix these problems in a general way on VMS -because they involve interfaces to parts of the operating system which -work very differently on VMS. Each feature must be reimplemented -individually. - -I hope that someone will send me an implementation for directory listing -on VMS. This should not be very hard to do. Most of the code you need -is already provided in [.src]dired.c. - -The normal commands for running an inferior shell or lisp with I/O -through an Emacs buffer do not work on VMS, but you can instead create -a DCL subprocess which does I/O through an Emacs buffer and get a -similar effect. See the file [.lisp]vms-patch.el. - -* Specifying terminal type. - -To specify a terminal type for Emacs that is not known to VMS, -define the logical name EMACS_TERM with the terminal type as value. -Terminal types are looked up in the termcap data base, which is -found as the file `[etc]termcap.dat' in the Emacs distribution. - -* Specifying file names. - -GNU Emacs accepts both Unix and VMS file name syntax. Most Lisp -code that runs in Emacs uses Unix syntax so it can run everywhere. -Users on VMS will generally type file names with VMS syntax. - -The EMACSLOADPATH logical name, if you use it, should contain -directory names in Unix syntax, separated by commas. - -find-file prompts with the current directory. You can then type a -relative directory spec to get somewhere else in the hirearchy. For -instance: - -Find File: emacs_library:[src][-.lisp]startup.el - -is converted to emacs_library:[lisp]startup.el by -expand-file-name. The basic rule is: -][- is treated like /.. (dir:[file.sub][-.other] ==> dir:[file.other], - dir:[file.sub][-] ==> dir:[file]) -][. elides the ][ (dir:[file][.sub] ==> dir:[file.sub]) -][alpha backs up to the previous [ (dir:[file][other] ==> dir:[other]) -a colon appearing after a ] forces a new "root" disk. - (dev:[file]dev2:[other] ==> dev2:[other]) -expand-file-name also tries to be smart about decnet node names, -but this is not yet known to work. - -* A possible problem. - -For VMS versions 4.4 and up, make sure the file -SYS$SYSTEM:RIGHTSLIST.DAT has WORLD:R access. Emacs reads this file -to check file access. If this file does not have appropriate access, -Emacs may think that you cannot write any files. - -
--- a/vms/allrename.com Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -$! Command file to rename many files at once -$! performing a global string substitution on each name. -$!Example: -$! @allrename [...] "-" "_" -$!changes each `-' in a name into a `_'. -$! -$!The device and directory names are not altered. -$! -$ p2_length = f$length (p2) -$ p3_length = f$length (p3) -$ -$file_loop: -$ full_name = f$search("''p1'*.*;*") -$ if ("''full_name'" .eqs. "") then goto done -$ original_device = f$parse("''full_name'",,,"DEVICE") -$ original_dir = f$parse("''full_name'",,,"DIRECTORY") -$ original_file_name = f$parse("''full_name'",,,"NAME") -$ original_file_type = f$parse("''full_name'",,,"TYPE") -$ original_file_version = f$parse("''full_name'",,,"VERSION") -$ original_file = original_file_name - - + original_file_type + original_file_version -$ new_file = original_file -$ something_done = "false" -$name_loop: -$ max_length = f$length(new_file) -$ index = f$locate("''p2'", new_file) -$ if (index .ge. max_length) then goto end_of_name -$ something_done = "true" -$ new_file = f$extract (0,index,new_file) + p3 - - + f$extract(index+p2_length,max_length-index,new_file) -$ goto name_loop -$end_of_name: -$ original_file = original_device + original_dir + original_file -$ new_file = original_device + original_dir + new_file -$ if (something_done) then - - rename 'original_file' 'new_file' -$ goto file_loop -$done: -$ exit
--- a/vms/complink.com Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -$ ! Compile and link those programs in [etc] that are usable on VMS. -$ -$ old = f$environment("default") -$ set default emacs_library:[etc] -$ if f$search("test-distrib.c") .nes. "" then goto version44 -$ -$ cc test_distrib.c -$ link test_distrib.obj,vmslink.opt/opt -$ run test_distrib.exe -$ cc /debug make_docfile.c -$ link make_docfile.obj,vmslink.opt/opt -$ cc /debug digest_doc.c -$ link digest_doc.obj,vmslink.opt/opt -$ cc /debug sorted_doc.c -$ cc /debug qsort.c -$ link sorted_doc.obj,qsort.obj,vmslink.opt/opt -$ cc /debug etags_vmslib.c -$ cc /debug etags.c -$ link etags.obj,etags_vmslib.obj,vmslink.opt/opt -$ goto finish -$ -$version44: -$ cc test-distrib.c -$ link test-distrib.obj,vmslink.opt/opt -$ run test-distrib.exe -$ cc /debug make-docfile.c -$ link make-docfile.obj,vmslink.opt/opt -$ cc /debug digest-doc.c -$ link digest-doc.obj,vmslink.opt/opt -$ cc /debug sorted-doc.c -$ cc /debug qsort.c -$ link sorted-doc.obj,qsort.obj,vmslink.opt/opt -$ cc /debug etags-vmslib.c -$ cc /debug etags.c -$ link etags.obj,etags-vmslib.obj,vmslink.opt/opt -$ -$finish: -$ cc /debug yow.c -$ link yow.obj,vmslink.opt/opt -$ -$ set default 'old'
--- a/vms/emacs.com Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -$ ! VMS command file to make the definitions needed to run the installed Emacs. -$ ! You must execute this in each session in order to run Emacs -$ ! or else it must be executed by the system at each boot. -$ -$ ! If you execute at boot time, specify "/SYSTEM" as the first parameter. -$ -$ ! This file must reside in the top directory of the Emacs subtree -$ ! when it is executed, because it uses its own directory -$ ! to initialize a logical name. -$ -$ fdev=f$parse(f$environment("procedure"),,,"DEVICE")-":" -$ fdir=f$parse(f$environment("procedure"),,,"DIRECTORY")-"[" -$ ftrn=f$trnlnm(fdev) -$ if ftrn .eqs. "" then ftrn = fdev + ":[]" -$ ndef= ftrn-"]"+fdir-".000000" -$ base=ndef-"]"+".]" -$ -$ define 'p1' /translation=concealed emacs_library 'base' -$ -$ ! -$ ! The following logical name is needed for M-x shell to work. -$ ! process.c\create_process keys on the string *dcl*. -$ ! -$ define 'p1' eshell "*dcl*" -$ -$ runemacs :== $emacs_library:[000000]emacs -map emacs_library:[000000]emacs.dump -$ emacs :== @emacs_library:[000000]kepteditor emacs
--- a/vms/etags.vms Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -VMS-ed version of etags ------------------------ - -1. The changes made allow the program to compile correctly, - to give error messages more meaningful to VMS, to allow '$' - in identifier tokens in C programs, and to expand wild-cards in the - input filespecs. - -2. To minimize the differences from the original version, - the VMS filename expansion converts filenames to lower - case, and strips version numbers. This does indeed mean - that some input specs (containing version wildcards) will - cause curious effects, it is reasonably consistent with - Emacs, which ignores file versions. -
--- a/vms/kepteditor.com Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -$ verify = f$verify (0) -$ ! -$ ! Kept_Editor.COM -$ ! Command file for use on VMS to spawn an Emacs process -$ ! that can be suspended with C-z and will not go away -$ ! when other programs are run. This is the normal way -$ ! for users to invoke Emacs on VMS; the command "emacs" -$ ! is normally defined to execute this file. -$ ! That definition, and other definitions used by it, are done by `emacs.com'. -$ ! Users who want to use Emacs should have their `login.com' files -$ ! execute `emacs.com', which is to be found in this directory. -$ ! -$ ! Joe Kelsey -$ ! FlexComm Corp. -$ ! -$ ! September, 1985 -$ ! -$ ! Run or attach to an editor in a kept fork. -$ ! -$ ! Modified by Marty Sasaki to define the job logical name -$ ! "EMACS_FILE_NAME" with the value of the filename on the command -$ ! line. Lisp code can then use the value of the logical to resume or -$ ! to start editing in that file. -$ ! -$ ! -$ edit = "" -$ name = p1 + " " + f$trnlnm ( "TT" ) - ":" -$ priv_list = f$setprv ("NOWORLD, NOGROUP") -$ pid = 0 -$ 10$: -$ proc = f$getjpi ( f$pid ( pid ), "PRCNAM") -$ if proc .eqs. name then - -$ goto attach -$ if pid .ne. 0 then - -$ goto 10$ -$ spawn: -$ args = p2 + " " + p3 + " " + p4 + " " + p5 + " " + - - p6 + " " + p7 + " " + p8 -$ priv_list = f$setprv ( priv_list ) -$ write sys$error - -"[Spawning a new Kept ''P1']" -$ if p1 .nes. "TPU" then - -$ goto check_emacs -$ define/user sys$input sys$command -$ spawn /process="''NAME'" - - /nolog - - edit/'p1' 'args' -$ goto quit1 -$ check_emacs: -$ if p1 .nes. "EMACS" then - -$ goto un_kempt -$ define/user sys$input sys$command -$ spawn /process="''NAME'" - - /nolog - - runemacs 'args' -$ goto quit1 -$ un_kempt: -$ ! The editor is unruly - spawn a process and let the user deal with the -$ ! editor himself. -$ spawn /process="''NAME'" - - /nolog -$ goto quit1 -$ attach: -$ priv_list = f$setprv ( priv_list ) -$ message_status = f$environment("message") -$ set noon -$ on control_y then goto quit -$ set message /nofacility/noidentification/noseverity/notext -$ if p2 .eqs. "" then goto no_logical -$ temp = f$trnlnm("SYS$DISK") + f$directory() + p2 -$ temp = f$edit(temp,"lowercase") -$ define/nolog/job emacs_file_name "''temp'" -$ no_logical: -$ write sys$error - -"[Attaching to process ''NAME']" -$ define/user sys$input sys$command -$ attach "''NAME'" -$ quit: -$ set noon -$ if p2 .eqs. "" then goto quit1 -$ deassign/job emacs_file_name -$ quit1: -$ set message 'message_status -$ write sys$error - -"[Attached to DCL in directory ''F$TRNLNM("SYS$DISK")'''F$DIRECTORY()']" -$ if verify then - -$ set verify -$ exit
--- a/vms/makedoc.com Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -$ ! VMS command file to create or update the file `DOC.' which contains -$ ! documentation strings for the functions and variables preloaded in Emacs. -$ ! This command file should be run when you build Emacs for the first time and -$ ! again if any documentation strings change in the source files listed here. -$ -$ old = f$environment("default") -$ set default emacs_library:[etc] -$ on error then goto done -$ if f$search("emacs_library:[etc]make-docfile.exe") .nes. "" then goto version44 -$ doit := $emacs_library:[etc]make_docfile -$ rest = "[lisp]lisp_mode.elc [lisp]text_mode.elc [lisp]c_mode.elc [lisp]buff_menu.elc [lisp]vms_patch.elc" -$ goto doit -$version44: -$ doit := $emacs_library:[etc]make-docfile -$ rest = "[lisp]lisp-mode.elc [lisp]text-mode.elc [lisp]c-mode.elc [lisp]buff-menu.elc [lisp]vms-patch.elc" -$ -$doit: -$ set default emacs_library:[000000] -$ doit -o [etc]DOC -$ doit := 'doit' -a [etc]DOC -$ doit [src]dispnew.c [src]scroll.c -$ doit [src]xdisp.c [src]window.c [src]term.c [src]cm.c -$ doit [src]emacs.c [src]keyboard.c [src]macros.c -$ doit [src]keymap.c [src]sysdep.c [src]buffer.c -$ doit [src]filelock.c [src]insdel.c [src]marker.c -$ doit [src]minibuf.c [src]fileio.c [src]dired.c -$ doit [src]filemode.c [src]cmds.c [src]casefiddle.c -$ doit [src]indent.c [src]search.c [src]regex.c -$ doit [src]undo.c [src]alloc.c [src]data.c [src]doc.c -$ doit [src]editfns.c [src]callint.c [src]eval.c -$ doit [src]fns.c [src]print.c [src]lread.c [src]abbrev.c -$ doit [src]syntax.c [src]mocklisp.c -$ doit [src]bytecode.c [src]process.c [src]callproc.c [src]doprnt.c -$ doit [src]vmsfns.c [src]vmsproc.c -$ -$ doit [lisp]simple.elc [lisp]help.elc -$ doit [lisp]files.elc [lisp]window.elc -$ doit [lisp]indent.elc [lisp]loaddefs.el -$ doit [lisp]paths.el [lisp]startup.elc -$ doit [lisp]lisp.elc [lisp]page.elc -$ doit [lisp]register.elc [lisp]paragraphs.elc -$ doit [lisp]fill.elc [lisp]isearch.elc -$ doit [lisp]replace.elc [lisp]abbrev.elc -$ doit [lisp]subr.elc [lisp]vmsproc.elc -$ doit 'rest' -$ -$done: -$ set default 'old'
--- a/vms/vmsdist.com Mon Aug 13 09:21:56 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -$ ! Command file to build Emacs on VMS and create a backup saveset. -$ ! rms, 16 May 1988 -$ -$ ! We assume that the files have been read in to a directory -$ ! $disk1:[rms.dist.emacs]; you should replace `$disk1:[rms.dist' -$ ! with the actual name of the superior directory of [.emacs]. -$ ! This replacement needs to be done in a few places. -$ -$ ! You should be in that directory when you run this command file. -$ -$ ! We also assume that the tar-tape reader has changed all `-' to `_' -$ ! in filenames. If this is not so, delete the first `@allrename' command. -$ -$ ! You must also edit the mag tape device name -$ ! And the Emacs version that appears in the saveset name. -$ -$ ! Change to vms 4.4 filenames. -$ @allrename [...] "_" "-" -$ -$ ! Set up logical devices so we can compile and run Emacs. -$ -$ edit/edt/nocommand emacs.com -s/sys$sysdevice:[emacs.]/$disk1:[rms.dist_18.emacs.]/w -exit -$ @emacs -$ ! Delete the modified emacs.com so we leave the source files clean. -$ ! emacs.com must be edited for real when Emacs is installed -$ ! on another machine. This version wouldn't be right anyway. -$ delete emacs.com;0 -$ -$ ! Edit the configuration files. -$ -$ set def [.src] -$ copy vmspaths.h paths.h -$ copy config.h-dist config.h -$ edit/edt/nocommand config.h -s/s-bsd4-2.h/s-vms4-4.h/w -exit -$ -$ ! Compile, link and dump Emacs. -$ -$ @compile -$ @link -$ @[-.etc]complink -$ @[-.etc]makedoc -$ @build -$ -$ ! Move the executable and image to the appropriate place. -$ -$ rename temacs.exe [-]emacs.exe -$ rename temacs.dump [-]emacs.dump -$ copy sys$library:vaxcrtl.olb vaxcrtl.olb -$ -$ ! Recompile a few files for vms version 4.2. -$ ! Call these object files for 4.2 `.jbo'. -$ -$ edit/edt/nocommand config.h -s/vms4-4/vms4-2/w -exit -$ rename doc.obj doc.obx -$ rename fileio.obj fileio.obx -$ rename sysdep.obj sysdep.obx -$ rename vmsfns.obj vmsfns.obx -$ @recomp doc -$ @recomp fileio -$ @recomp sysdep -$ @recomp vmsfns -$ rename doc.obj doc.jbo -$ rename fileio.obj fileio.jbo -$ rename sysdep.obj sysdep.jbo -$ rename vmsfns.obj vmsfns.jbo -$ rename *.obx *.obj -$ delete config.h;0 -$ -$ ! Change all files back to the names that VMS 4.2 can read in. -$ -$ set def [-] -$ @allrename [...] "-" "_" -$ -$ ! Dump onto tape -$ -$ mount /foreign mua0: -$ define /translation=concealed dumping $disk1:[rms.dist_18.] -$ set def dumping:[emacs] -$ backup /interchange /verify /list [...] mua0:emacs18.51 -$ dismount mua0: