T-gnus 6.15.6 revision 00.
authoryamaoka <yamaoka>
Tue, 7 May 2002 02:55:24 +0000 (02:55 +0000)
committeryamaoka <yamaoka>
Tue, 7 May 2002 02:55:24 +0000 (02:55 +0000)
108 files changed:
ChangeLog
GNUS-NEWS
README.T-gnus
README.semi
README.semi.ja
aclocal.m4
configure
configure.in
contrib/ChangeLog
contrib/gpg.el
contrib/ucs-tables.el [new file with mode: 0644]
contrib/xml.el
etc/gnus/gnus.xpm
lisp/ChangeLog
lisp/ChangeLog.1
lisp/binhex.el
lisp/canlock.el
lisp/deuglify.el [new file with mode: 0644]
lisp/dgnushack.el
lisp/dns.el [new file with mode: 0644]
lisp/gnus-agent.el
lisp/gnus-art.el
lisp/gnus-bbdb.el
lisp/gnus-cache.el
lisp/gnus-cite.el
lisp/gnus-dired.el [new file with mode: 0644]
lisp/gnus-draft.el
lisp/gnus-ems.el
lisp/gnus-fun.el
lisp/gnus-group.el
lisp/gnus-int.el
lisp/gnus-kill.el
lisp/gnus-mailcap.el
lisp/gnus-msg.el
lisp/gnus-namazu.el
lisp/gnus-range.el
lisp/gnus-score.el
lisp/gnus-soup.el
lisp/gnus-srvr.el
lisp/gnus-start.el
lisp/gnus-sum.el
lisp/gnus-util.el
lisp/gnus-uu.el
lisp/gnus-vers.el
lisp/gnus-win.el
lisp/gnus-xmas.el
lisp/gnus.el
lisp/html2text.el [new file with mode: 0644]
lisp/ietf-drums.el
lisp/imap.el
lisp/lpath.el
lisp/mail-source.el
lisp/message-utils.el [new file with mode: 0644]
lisp/message.el
lisp/mm-decode.el
lisp/mm-partial.el
lisp/mm-url.el
lisp/mm-util.el
lisp/mm-uu.el
lisp/mm-view.el
lisp/mml-sec.el
lisp/mml-smime.el
lisp/mml.el
lisp/mml2015.el
lisp/netrc.el [new file with mode: 0644]
lisp/nnagent.el
lisp/nndoc.el
lisp/nndraft.el
lisp/nneething.el
lisp/nnfolder.el
lisp/nnheader.el
lisp/nnimap.el
lisp/nnir.el
lisp/nnkiboze.el
lisp/nnmail.el
lisp/nnmaildir.el
lisp/nnmbox.el
lisp/nnml.el
lisp/nnnil.el [new file with mode: 0644]
lisp/nnrss.el
lisp/nnslashdot.el
lisp/nnsoup.el
lisp/nntp.el
lisp/nnultimate.el
lisp/nnwarchive.el
lisp/nnweb.el
lisp/pop3.el
lisp/qp.el
lisp/rfc2047.el
lisp/rfc2231.el
lisp/smiley.el
lisp/smime.el
lisp/spam.el [new file with mode: 0644]
lisp/time-date.el
texi/ChangeLog
texi/Makefile.in
texi/bk-a4.tex [new file with mode: 0644]
texi/bk-lt.tex [new file with mode: 0644]
texi/booklet.tex [new file with mode: 0644]
texi/emacs-mime.texi
texi/gnus-ja.texi
texi/gnus.texi
texi/gnuslogo-booklet.eps [new file with mode: 0644]
texi/gnusref.tex
texi/message-ja.texi
texi/message.texi
texi/refcard.tex
todo

index a9d9cc5..8aecba8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+2002-04-30  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/message.el (message-expand-name-function): New user option.
+       (message-expand-name): Use it.
+       * lisp/lpath.el: Don't bind lsdb-complete-name and bbdb-complete-name.
+
+2002-04-30  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/message.el (message-expand-name): Use lsdb-complete-name if
+       available.
+       * lisp/lpath.el: Bind lsdb-complete-name.
+
+2002-04-30  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/dgnushack.el (dgnushack-bind-colon-keywords): Also examine
+       backquote'd forms.
+
+       * lisp/nnheader.el (nnheader-with-unibyte): New macro.
+       (mm-with-unibyte): Alias to `nnheader-with-unibyte'.
+
+2002-04-26  Steve Youngs  <youngs@xemacs.org>
+
+       * aclocal.m4 (AC_PATH_INFODIR): New.  Defaults to '$prefix/info'
+       for Emacs and 'site-packages/info' for XEmacs.
+       (AC_PATH_ETCDIR): Drop 'gnus' off the end of the default directory
+       for XEmacs.
+
+       * configure.in: Use 'AC_PATH_INFO_DIR'.
+
+2002-04-23  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Disregard the
+       message cache when bbdb/news-auto-create-p is nil.
+
+2002-04-23  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Work around the
+       incompatibility with BBDB 2.3x.
+
+2002-04-22  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/message.el (message-make-user-agent): Remove product tokens
+       for gnus-vers.  [cf. <semi-gnus-ja:6798>]
+
+2002-04-22  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/gnus-vers.el (gnus-revision-number): Increment to 03.
+
+       * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Tweak BBDB message
+       caching.
+       (gnus-bbdb/extract-message-sender-function): New user option.
+       (gnus-bbdb/extract-message-sender): New function.
+
+2002-04-20  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/gnus-vers.el (gnus-revision-number): Increment to 02.
+
+       * lisp/gnus-sum.el: Don't autoload gnus-set-summary-default-charset.
+       (gnus-summary-inherit-default-charset): New function.
+       (gnus-parse-headers-hook): Use it.
+       (gnus-summary-setup-default-charset): Set default-mime-charset here.
+       
+       * lisp/gnus-delay.el (gnus-delay-article): Undo the last change.
+
+       * lisp/gnus-draft.el: Revert to the original implementation.
+       (gnus-draft-edit-message): Pass restore as the 3rd argument of
+       gnus-draft-setup; call save-buffer instead of message-save-drafts.
+       (gnus-draft-setup): Rename from gnus-draft-setup-for-editing.
+       (gnus-draft-setup-for-sending): Abolish.
+
+       * lisp/nnheader.el (nnheader-auto-save-coding-system): New variable.
+
+       * lisp/message.el (message-draft-coding-system): Delegate the
+       value to nnheader-auto-save-coding-system.
+       (message-mode-map): Don't bind message-save-drafts.
+       (message-dont-send): Use save-buffer instead of message-save-buffer.
+       (message-save-drafts): Abolish.
+
+       * lisp/nndraft.el (nndraft-request-article): Revert to the
+       original implementation.
+
+2002-04-18   Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/gnus-draft.el (gnus-group-send-queue): Pass group and
+       interactive as the arguments of gnus-draft-send.
+       (gnus-draft-send): Don't give "nndraft:queue" special treatment.
+
+2002-04-17   Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/gnus-delay.el (gnus-delay-article): Use `message-save-drafts'
+        instead of `save-buffer'.
+
+2002-04-08  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/gnus-draft.el (gnus-draft-send): Always enter the Message
+       mode.
+
+2002-03-28  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-group.el (gnus-group-completing-read-group-name): Use
+       `mapatoms' to extract all groups from `gnus-active-hashtb'.
+
+2002-03-26  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-group.el (gnus-group-completing-read-group-name):
+       Improve to speed up.
+       (gnus-group-name-charset-group-alist): Change the default value.
+
+2002-03-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-vers.el (gnus-revision-number): Increment to 01.
+
+       * lisp/message.el (message-save-drafts, message-check-8bit,
+       message-send-news, message-send-mail, message-send): Replace
+       `insert-buffer' with `insert-buffer-substring'.
+       * lisp/gnus-art.el (gnus-article-mime-edit-article-setup,
+       gnus-article-edit-exit, article-verify-x-pgp-sig): Ditto.
+
+2002-03-20  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-sum.el (gnus-summary-make-menu-bar): Don't provide
+       "View as different encoding" submenu if the function
+       `coding-system-list' is not available.
+
 2002-03-19  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * lisp/pop3.el (pop3-md5): Treat a given string as binary.
 
-2002-03-13  Simon Josefsson  <jas@extundo.com>
+2002-03-06  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-msg.el (gnus-summary-resend-message-edit): Use
+       `mime-edit-again' instead of `mime-to-mml' to recompose a message.
+
+2002-03-05  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/message.el (mm-make-temp-file): Copied from mm-util.el.
+
+2002-03-04  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/message.el (message-fix-before-sending): Bind
+       `mm-7bit-chars' to the value that concat the original value and
+       escape.
+
+       * lisp/nnheader.el (mm-7bit-chars): Remove.
+
+2002-03-04  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-art.el (gnus-article-edit-mode): Don't call `mml-mode'.
+
+       * lisp/nnheader.el (mm-7bit-chars): Copied from mm-bodies.el.
+       (mm-multibyte-p): New alias.
+       (mm-char-int): Alias to `char-int'.
 
-       * lisp/pop3.el (pop3-open-server): Revert multibyte change.  From
-       Pavel@Janik.cz (Pavel Jan\e,Bm\e(Bk).
+2002-02-26  TSUCHIYA Masatoshi  <tsuchiya@namazu.org>
 
-2002-03-12  Katsumi Yamaoka  <yamaoka@jpl.org>
+       * lisp/gnus-art.el (gnus-request-article-this-buffer): Sync up
+       with Oort-gnus.
 
-       * lisp/pop3.el (pop3-open-server): Set process buffer unibyte.
+       * lisp/nntp.el (nntp-open-via-rlogin-and-telnet): Wrap
+       `call-process' with `as-binary-process'.
+
+2002-02-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/smiley.el (smiley-regexp-alist): Fix the order of faces.
+
+2002-02-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/smiley.el (smiley-regexp-alist): Use faces which originate
+       in etc-0.27.tar.gz if exist.
+       (gnus-smiley-file-types): Add xbm if available.
+       (smiley-region): Don't put two or more faces in one place.
 
 2002-02-22  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * lisp/gnus-art.el (gnus-request-article-this-buffer): Temporally
        fix: erase the buffer before inserting (and saving) an article.
 
+2002-02-22  Steve Youngs  <youngs@xemacs.org>
+
+       * aclocal.m4 (AC_PATH_LISPDIR): Default to
+       .../site-packages/lisp/gnus for XEmacs.
+       (AC_PATH_ETCDIR): Default to .../site-packages/etc/gnus for
+       XEmacs.
+
+2002-02-21   Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/gnus-group.el (gnus-group-name-encode): New function.
+       (gnus-group-encoded-name): New function.
+       (gnus-group-completing-read-group-name): New function.
+       (gnus-fetch-group): Use it.
+       (gnus-group-jump-to-group): Use it.
+       (gnus-group-unsubscribe-current-group): Use it.
+
+2002-02-21   Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/nnheader.el (mm-string-as-unibyte): Undo the last change.
+       * lisp/gnus-srvr.el (gnus-browse-foreign-server): Ditto.
+
+2002-02-21   Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/nnheader.el (mm-string-as-unibyte): Alias to
+       `string-as-unibyte'.
+
+       * lisp/gnus-srvr.el (gnus-browse-foreign-server): Return unibyte
+       group names.
+
+2002-02-19  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/lpath.el: Bind `navi2ch-mona-font'.
+
+2002-02-18  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/gnus-art.el (gnus-treat-monafy): New user option.
+       (article-monafy): New function.
+
 2002-02-18  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * lisp/nnheader.el (std11-field-value): Fix regexp.
 
+2002-02-15  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-art.el (gnus-treat-display-grey-xface): Default to nil
+       under NTEmacs 21.
+
+2002-02-14  TSUCHIYA Masatoshi  <tsuchiya@namazu.org>
+
+       * lisp/gnus-namazu.el (gnus-namazu-kill-summary-buffers): New
+       advice.
+
+2002-02-12  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/mm-view.el: Require `gnus-mailcap' rather than `mailcap'.
+
+       * lisp/nnheader.el (mm-with-unibyte-buffer): Bind `default-mc-flag'
+       instead of `mc-flag'.
+       (nnheader-with-unibyte-current-buffer): New macro.
+       (mm-with-unibyte-current-buffer): Alias to
+       `nnheader-with-unibyte-current-buffer'.
+       (nnheader-guess-mime-charset): New macro.
+       (mm-guess-mime-charset): Alias to `nnheader-guess-mime-charset'.
+       (shell-command-to-string): New function for old Emacsen.
+
+       * lisp/lpath.el: Don't fbind `shell-command-to-string'.
+
+2002-02-09  TSUCHIYA Masatoshi  <tsuchiya@namazu.org>
+
+       * lisp/gnus-namazu.el (gnus-namazu/group-alist): Abolished.
+       (gnus-namazu/setup): Not set it.
+       (gnus-namazu/shutdown): Removed.
+       (gnus-namazu/group-prefixed-name): Handle case-insensitive file
+       names by itself.
+
+2002-02-09  NISHIDA Masakazu  <m_nisida@ca2.so-net.ne.jp>
+
+       * lisp/gnus-namazu.el (gnus-namazu/complete-query): Relaxed the
+       regexp which matches field search keywords.
+
+2002-02-01  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * etc/gnus/gnus.xpm: Remove some garbages at the end of the file.
+
+2002-02-03  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/nnir.el (nnir-run-namazu): According to SUSv3, LC_ALL is
+       prior to the other environment variables whose names are starting
+       with "LC_".  So there is no need to setting them.
+
+2002-02-03  Daiki Ueno  <ueno@unixuser.org>
+
+       * lisp/nnir.el (nnir-imap-default-charset): New user option.
+       (nnir-run-imap): Supply the charset of a search criteria.
+
 2002-02-01  Katsumi Yamaoka  <yamaoka@jpl.org>
        Suggested by Kenichi OKADA <okada@opaopa.org>
 
        * lisp/message.el (message-save-drafts): Override
        `mime-header-encode-method-alist'.
 
+2002-02-01  Taiji Can  <Taiji.Can@grd.advantest.co.jp>
+
+       * texi/gnus-ja.texi (Posting Styles): Fix typo.
+
+2002-01-31  ARISAWA Akihiro  <ari@atesoft.advantest.co.jp>
+
+       * lisp/gnus-art.el (gnus-article-display-traditional-message):
+       Reverted.
+
+2002-01-31  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-art.el (gnus-article-setup-buffer): Enable multibyte
+       in `gnus-original-article-buffer'.
+
 2002-01-29  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * lisp/message.el (message-cite-prefix-regexp): Fix the regexp.
        * lisp/dgnushack.el: Load base64.el before canlock-om.el to avoid
        damage to define `base64-encode-string' by MEL.
 
+2002-01-23  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-sum.el (gnus-article-commands-menu): Bind "Html" to
+       the command `gnus-article-wash-html'.
+       (gnus-summary-article-menu): Ditto.
+       (gnus-summary-wash-map): Bind "h" to the command
+       `gnus-article-wash-html'.
+
+       * lisp/gnus-art.el (gnus-article-treatment-menu): Bind
+       "Treat html" to the command `gnus-article-wash-html'.
+
+       * lisp/nnheader.el: Place mm- stuff and mail-parse stuff in front
+       of the codes which use (or may use) them.
+
 2002-01-21  ARISAWA Akihiro  <ari@mbf.sphere.ne.jp>
 
        * lisp/gnus-art.el (gnus-article-display-traditional-message): Use
        `set-buffer-multibyte'.
 
+2002-01-21  TSUCHIYA Masatoshi  <tsuchiya@namazu.org>
+
+       * lisp/gnus-sum.el (gnus-summary-preview-mime-message): Protect
+       against dead windows.
+
+       * lisp/nnheader.el (mm-encode-coding-string): Alias to
+       `encode-coding-string'.
+       (mm-decode-coding-string): Alias to 'decode-coding-string'.
+
+2002-01-21  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-vers.el: T-gnus 6.15.6 revision 00.
+
+       * lisp/nnheader.el (std11-unfold-region): New function copied from
+       `rfc2047-unfold-region'.
+       (std11-unfold-field): New function.
+       (mail-header-unfold-field): Alias to `std11-unfold-field'.
+
 2002-01-21  Katsumi Yamaoka  <yamaoka@jpl.org>
 
-       * lisp/gnus-vers.el: T-gnus 6.15.5 revision 02 (merged
-       t-gnus-6_15-quimby branch).
+       * lisp/gnus-vers.el (gnus-revision-number): Increment to 02 (synch
+       with the released version of Oort Gnus v0.05).
 
 2002-01-16  Katsumi Yamaoka  <yamaoka@jpl.org>
 
 
 2002-01-10  Katsumi Yamaoka  <yamaoka@jpl.org>
 
-       * lisp/gnus-vers.el (gnus-revision-number): Increment to 11 in
+       * lisp/gnus-vers.el (gnus-revision-number): Increment to 01 in
        order to force update cached format specs.
 
        * lisp/gnus-spec.el (gnus-use-correct-string-widths): Default to t.
index 4026b65..83e5448 100644 (file)
--- a/GNUS-NEWS
+++ b/GNUS-NEWS
@@ -1,5 +1,5 @@
 GNUS NEWS -- history of user-visible changes.
-Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 See the end for copying conditions.
 
 Please send Gnus bug reports to bugs@gnus.org.
@@ -8,6 +8,73 @@ For older news, see Gnus info node "New Features".
 \f
 * Changes in Oort Gnus
 
+** gnus-summary-line-format
+
+The default value changed to "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n".
+Moreover gnus-extra-headers, nnmail-extra-headers and
+gnus-ignored-from-addresses changed their default so that the users
+name will be replaced by the recipient's name or the group name
+posting to for NNTP groups.
+
+** deuglify.el (gnus-article-outlook-deuglify-article)
+
+A new file from Raymond Scholz <rscholz@zonix.de> for deuglifying
+broken Outlook (Express) articles.
+
+** (require 'gnus-load)
+
+If you use a stand-alone Gnus distribution, you'd better add (require
+'gnus-load) into your ~/.emacs after adding the Gnus lisp directory
+into load-path.
+
+File gnus-load.el contains autoload commands, functions and variables,
+some of which may not be included in distributions of Emacsen.
+
+** gnus-slave-unplugged
+
+A new command which starts gnus offline in slave mode.
+
+** message-insinuate-rmail
+
+Adding (message-insinuate-rmail) and (setq mail-user-agent
+'gnus-user-agent) in .emacs convinces RMAIL to compose, reply and
+forward messages in message-mode, where you can enjoy the power of
+MML.
+
+** message-minibuffer-local-map
+
+The line below enables BBDB in resending a message:
+
+(define-key message-minibuffer-local-map [(tab)] 'bbdb-complete-name)
+
+** Externalize attachments.
+
+If gnus-gcc-externalize-attachments (or
+message-fcc-externalize-attachments) is non-nil, attach local files as
+external parts.
+
+Command gnus-mime-save-part-and-strip (bound to \C-o on MIME buttons)
+saves a part and replaces the part with an external one. It works only
+on back ends that support editing.
+
+** gnus-default-charset
+
+The default value is determined from the current-language-environment
+variable, instead of 'iso-8859-1. Also the ".*" item in
+gnus-group-charset-alist is removed.
+
+** gnus-posting-styles
+
+Add a new format of match like
+
+        ((header "to" "larsi.*org")
+         (Organization "Somewhere, Inc."))
+
+The old format like the lines below is obsolete.
+
+        (header "to" "larsi.*org"
+         (Organization "Somewhere, Inc."))
+
 ** message-ignored-news-headers and message-ignored-mail-headers
 
 X-Draft-From and X-Gnus-Agent-Meta-Information have been added into
@@ -172,7 +239,7 @@ ever-changing layouts.
 ----------------------------------------------------------------------
 Copyright information:
 
-Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 
    Permission is granted to anyone to make or distribute verbatim copies
    of this document as received, in any medium, provided that the
index 30637ea..b205012 100644 (file)
@@ -1,6 +1,6 @@
 ========================================================================
 Codename:      T-gnus
-Branch Tag:    t-gnus-6_15
+Branch Tag:    t-gnus-6_15-quimby
 Branch Status: Develop, Synchronize with Oort Gnus
 Branch Goal:   Implement latest features of gnus and offline features
                Use Gnus in Offline status.
@@ -33,6 +33,6 @@ NEWS:
 
 * T-gnus 6.15 - this is based on Oort Gnus.
 
-  The latest T-gnus is T-gnus 6.15.5 (based on Oort Gnus 0.05).  It
+  The latest T-gnus is T-gnus 6.15.6 (based on Oort Gnus 0.06).  It
   requires SEMI/WEMI (1.13.5 or later), FLIM (1.13.1 or later), and
   APEL (10.0 or later).
index 3f29d09..dfa5660 100644 (file)
@@ -38,7 +38,7 @@ How to get? (via CVS)
 (1) checkout
 
     % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root \
-       checkout -r t-gnus-6_15 gnus
+       checkout -r t-gnus-6_15-quimby gnus
 
 (2) compile
 
@@ -48,7 +48,7 @@ How to get? (via CVS)
 
 (3) update
 
-    % cvs update -r t-gnus-6_15 gnus
+    % cvs update -r t-gnus-6_15-quimby gnus
 
 Major tags are following:
 
index acd2218..a266e80 100644 (file)
@@ -39,7 +39,7 @@ http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/
 (1) checkout
 
     % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root \
-       checkout -r t-gnus-6_15 gnus
+       checkout -r t-gnus-6_15-quimby gnus
 
 (2) compile
 
@@ -49,7 +49,7 @@ http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/
 
 (3) update
 
-    % cvs update -r t-gnus-6_15 gnus
+    % cvs update -r t-gnus-6_15-quimby gnus
 
 \e$B<g$J%?%0$O0J2<$N$h$&$K$J$C$F$$$^$9\e(B:
 
index 720c918..fd52950 100644 (file)
@@ -95,11 +95,19 @@ AC_DEFUN(AC_PATH_LISPDIR, [
     if test "$theprefix" = NONE; then
        theprefix=$ac_default_prefix
     fi
-    lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}"
+    if test "$EMACS_FLAVOR" = "xemacs"; then
+       lispdir="\$(datadir)/${EMACS_FLAVOR}/site-packages/lisp/${GNUS_PRODUCT_NAME}"
+    else
+       lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}"
+    fi
     for thedir in share lib; do
        potential=
        if test -d ${theprefix}/${thedir}/${EMACS_FLAVOR}/site-lisp; then
-          lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}"
+          if test "$EMACS_FLAVOR" = "xemacs"; then
+              lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-packages/lisp/${GNUS_PRODUCT_NAME}"
+          else
+              lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}"
+          fi
           break
        fi
     done
@@ -117,13 +125,38 @@ AC_DEFUN(AC_PATH_ETCDIR, [
   AC_ARG_WITH(etcdir,[  --with-etcdir=DIR       Where to install etc files], etcdir=${withval})
   AC_MSG_CHECKING([where etc files should go])
   if test -z "$etcdir"; then
-    dnl Set default value
+    dnl Set default value.
+    if test "$EMACS_FLAVOR" = "xemacs"; then
+      etcdir="\$(lispdir)/../../etc"
+    else
     etcdir="\$(lispdir)/../etc"
+    fi
   fi
   AC_MSG_RESULT($etcdir)
   AC_SUBST(etcdir)
 ])
 
+dnl 
+dnl This is a bit on the "evil hack" side of things.  It is so we can
+dnl have a different default infodir for XEmacs.  A user can still specify
+dnl someplace else with '--infodir=DIR'.
+dnl
+AC_DEFUN(AC_PATH_INFO_DIR, [
+  AC_MSG_CHECKING([where the TeXinfo docs should go])
+  dnl Set default value.  This must be an absolute path.
+  if test "$infodir" = "\${prefix}/info"; then
+    if test "$EMACS_FLAVOR" = "xemacs"; then
+      info_dir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-packages/info"
+    else
+      info_dir="\$(prefix)/info"
+    fi
+  else
+    info_dir=$infodir
+  fi
+  AC_MSG_RESULT($info_dir)
+  AC_SUBST(info_dir)
+])
+
 dnl
 dnl Check whether a function exists in a library
 dnl All '_' characters in the first argument are converted to '-'
@@ -251,13 +284,13 @@ if test -z "${USE_FONTS}"; then
       if echo "$retval" | grep 'Some font shapes were not available' >& AC_FD_CC 2>&1  ; then  
        :
       else
-        if test -z "${USE_FONTS}"; then
+        if test -z "${USE_FONTS}"; then
          USE_FONTS="Adobe Futura"
-        else
+        else
          USE_FONTS="${USE_FONTS}, Adobe Futura"
-        fi
-        WITH_FONTS_pfu=
-        WITHOUT_FONTS_pfu='%'
+        fi
+        WITH_FONTS_pfu=
+        WITHOUT_FONTS_pfu='%'
       fi
     fi
     echo '\nonstopmode\documentclass{article}\begin{document}{\fontfamily{bcr}\fontsize{10pt}{10}\selectfont test}\end{document}' > ${OUTPUT}
@@ -265,13 +298,13 @@ if test -z "${USE_FONTS}"; then
       if echo "$retval" | grep 'Some font shapes were not available' >& AC_FD_CC 2>&1  ; then  
        :
       else
-        if test -z "${USE_FONTS}"; then
+        if test -z "${USE_FONTS}"; then
          USE_FONTS="Bitstream Courier"
-        else
+        else
          USE_FONTS="${USE_FONTS}, Bitstream Courier"
-        fi
-        WITH_FONTS_bcr=
-        WITHOUT_FONTS_bcr='%'
+        fi
+        WITH_FONTS_bcr=
+        WITHOUT_FONTS_bcr='%'
       fi
     fi
     rm -f ${OUTPUT} ${OUTPUT}.aux ${OUTPUT}.log ${OUTPUT}.dvi
index d92eda2..92de619 100755 (executable)
--- a/configure
+++ b/configure
@@ -967,11 +967,19 @@ echo "configure:965: checking where lisp files should go" >&5
     if test "$theprefix" = NONE; then
        theprefix=$ac_default_prefix
     fi
-    lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}"
+    if test "$EMACS_FLAVOR" = "xemacs"; then
+       lispdir="\$(datadir)/${EMACS_FLAVOR}/site-packages/lisp/${GNUS_PRODUCT_NAME}"
+    else
+       lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}"
+    fi
     for thedir in share lib; do
        potential=
        if test -d ${theprefix}/${thedir}/${EMACS_FLAVOR}/site-lisp; then
-          lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}"
+          if test "$EMACS_FLAVOR" = "xemacs"; then
+              lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-packages/lisp/${GNUS_PRODUCT_NAME}"
+          else
+              lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}"
+          fi
           break
        fi
     done
@@ -992,16 +1000,35 @@ if test "${with_etcdir+set}" = set; then
 fi
 
   echo $ac_n "checking where etc files should go""... $ac_c" 1>&6
-echo "configure:996: checking where etc files should go" >&5
+echo "configure:1004: checking where etc files should go" >&5
   if test -z "$etcdir"; then
-        etcdir="\$(lispdir)/../etc"
+        if test "$EMACS_FLAVOR" = "xemacs"; then
+      etcdir="\$(lispdir)/../../etc"
+    else
+    etcdir="\$(lispdir)/../etc"
+    fi
   fi
   echo "$ac_t""$etcdir" 1>&6
   
 
 
+  echo $ac_n "checking where the TeXinfo docs should go""... $ac_c" 1>&6
+echo "configure:1017: checking where the TeXinfo docs should go" >&5
+    if test "$infodir" = "\${prefix}/info"; then
+    if test "$EMACS_FLAVOR" = "xemacs"; then
+      info_dir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-packages/info"
+    else
+      info_dir="\$(prefix)/info"
+    fi
+  else
+    info_dir=$infodir
+  fi
+  echo "$ac_t""$info_dir" 1>&6
+  
+
+
 echo $ac_n "checking for acceptable URL version""... $ac_c" 1>&6
-echo "configure:1005: checking for acceptable URL version" >&5
+echo "configure:1032: checking for acceptable URL version" >&5
 
 unset EMACS_cv_ACCEPTABLE_URL;
 unset EMACS_cv_SYS_url_dir;
@@ -1014,14 +1041,14 @@ else
 
 if test -z ""noecho""; then
        echo $ac_n "checking for url-retrieve in url""... $ac_c" 1>&6
-echo "configure:1018: checking for url-retrieve in url" >&5
+echo "configure:1045: checking for url-retrieve in url" >&5
 fi
 library=`echo url | tr _ -`
 
 elisp="(progn (fmakunbound (quote url-retrieve)) (condition-case nil (progn (require (quote $library)) (fboundp (quote url-retrieve))) (error (prog1 nil (message \"$library not found\")))))"
 if test -z ""noecho""; then
        echo $ac_n "checking for url""... $ac_c" 1>&6
-echo "configure:1025: checking for url" >&5
+echo "configure:1052: checking for url" >&5
 fi
 if eval "test \"\${EMACS_cv_SYS_url+set}\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1065,7 +1092,7 @@ if test "${EMACS_cv_ACCEPTABLE_URL}" = yes; then
 elisp="(file-name-directory (locate-library \"url\"))"
 if test -z ""noecho""; then
        echo $ac_n "checking for url_dir""... $ac_c" 1>&6
-echo "configure:1069: checking for url_dir" >&5
+echo "configure:1096: checking for url_dir" >&5
 fi
 if eval "test \"\${EMACS_cv_SYS_url_dir+set}\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1107,7 +1134,7 @@ fi
 
 
 echo $ac_n "checking for acceptable W3 version""... $ac_c" 1>&6
-echo "configure:1111: checking for acceptable W3 version" >&5
+echo "configure:1138: checking for acceptable W3 version" >&5
 
 unset EMACS_cv_ACCEPTABLE_W3;
 unset EMACS_cv_SYS_w3_dir;
@@ -1120,14 +1147,14 @@ else
 
 if test -z ""noecho""; then
        echo $ac_n "checking for w3-form-encode-xwfu in w3_forms""... $ac_c" 1>&6
-echo "configure:1124: checking for w3-form-encode-xwfu in w3_forms" >&5
+echo "configure:1151: checking for w3-form-encode-xwfu in w3_forms" >&5
 fi
 library=`echo w3_forms | tr _ -`
 
 elisp="(progn (fmakunbound (quote w3-form-encode-xwfu)) (condition-case nil (progn (require (quote $library)) (fboundp (quote w3-form-encode-xwfu))) (error (prog1 nil (message \"$library not found\")))))"
 if test -z ""noecho""; then
        echo $ac_n "checking for w3_forms""... $ac_c" 1>&6
-echo "configure:1131: checking for w3_forms" >&5
+echo "configure:1158: checking for w3_forms" >&5
 fi
 if eval "test \"\${EMACS_cv_SYS_w3_forms+set}\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1171,7 +1198,7 @@ if test "${EMACS_cv_ACCEPTABLE_W3}" = yes; then
 elisp="(file-name-directory (locate-library \"w3-forms\"))"
 if test -z ""noecho""; then
        echo $ac_n "checking for w3_dir""... $ac_c" 1>&6
-echo "configure:1175: checking for w3_dir" >&5
+echo "configure:1202: checking for w3_dir" >&5
 fi
 if eval "test \"\${EMACS_cv_SYS_w3_dir+set}\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1218,7 +1245,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1222: checking for $ac_word" >&5
+echo "configure:1249: checking for $ac_word" >&5
 if eval "test \"\${ac_cv_path_LATEX+set}\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1255,7 +1282,7 @@ done
 test -n "$LATEX" || LATEX="no"
 
 echo $ac_n "checking for available fonts""... $ac_c" 1>&6
-echo "configure:1259: checking for available fonts" >&5
+echo "configure:1286: checking for available fonts" >&5
 # Check whether --with-fonts or --without-fonts was given.
 if test "${with_fonts+set}" = set; then
   withval="$with_fonts"
@@ -1288,13 +1315,13 @@ if test -z "${USE_FONTS}"; then
       if echo "$retval" | grep 'Some font shapes were not available' >& 5 2>&1  ; then  
        :
       else
-        if test -z "${USE_FONTS}"; then
+        if test -z "${USE_FONTS}"; then
          USE_FONTS="Adobe Futura"
-        else
+        else
          USE_FONTS="${USE_FONTS}, Adobe Futura"
-        fi
-        WITH_FONTS_pfu=
-        WITHOUT_FONTS_pfu='%'
+        fi
+        WITH_FONTS_pfu=
+        WITHOUT_FONTS_pfu='%'
       fi
     fi
     echo '\nonstopmode\documentclass{article}\begin{document}{\fontfamily{bcr}\fontsize{10pt}{10}\selectfont test}\end{document}' > ${OUTPUT}
@@ -1302,13 +1329,13 @@ if test -z "${USE_FONTS}"; then
       if echo "$retval" | grep 'Some font shapes were not available' >& 5 2>&1  ; then  
        :
       else
-        if test -z "${USE_FONTS}"; then
+        if test -z "${USE_FONTS}"; then
          USE_FONTS="Bitstream Courier"
-        else
+        else
          USE_FONTS="${USE_FONTS}, Bitstream Courier"
-        fi
-        WITH_FONTS_bcr=
-        WITHOUT_FONTS_bcr='%'
+        fi
+        WITH_FONTS_bcr=
+        WITHOUT_FONTS_bcr='%'
       fi
     fi
     rm -f ${OUTPUT} ${OUTPUT}.aux ${OUTPUT}.log ${OUTPUT}.dvi
@@ -1343,7 +1370,7 @@ fi
 
   if test ${EMACS_FLAVOR} = xemacs; then
     echo $ac_n "checking where the XEmacs package is""... $ac_c" 1>&6
-echo "configure:1347: checking where the XEmacs package is" >&5
+echo "configure:1374: checking where the XEmacs package is" >&5
     # Check whether --with-packagedir or --without-packagedir was given.
 if test "${with_packagedir+set}" = set; then
   withval="$with_packagedir"
@@ -1366,7 +1393,7 @@ elisp="(let (package-dir)\
       (or package-dir \"\"))"
 if test -z ""noecho""; then
        echo $ac_n "checking for PACKAGEDIR""... $ac_c" 1>&6
-echo "configure:1370: checking for PACKAGEDIR" >&5
+echo "configure:1397: checking for PACKAGEDIR" >&5
 fi
 if eval "test \"\${EMACS_cv_SYS_PACKAGEDIR+set}\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1405,7 +1432,7 @@ elisp="(let (package-dir)\
       (or package-dir \"\"))"
 if test -z ""noecho""; then
        echo $ac_n "checking for PACKAGEDIR""... $ac_c" 1>&6
-echo "configure:1409: checking for PACKAGEDIR" >&5
+echo "configure:1436: checking for PACKAGEDIR" >&5
 fi
 if eval "test \"\${EMACS_cv_SYS_PACKAGEDIR+set}\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1442,7 +1469,7 @@ if test "${with_addpath+set}" = set; then
   withval="$with_addpath"
   if test "$withval" != yes -a -n "$withval"; then
       echo $ac_n "checking where to find the additional elisp libraries""... $ac_c" 1>&6
-echo "configure:1446: checking where to find the additional elisp libraries" >&5
+echo "configure:1473: checking where to find the additional elisp libraries" >&5
       ADDITIONAL_LOAD_PATH=$withval
       echo "$ac_t""$ADDITIONAL_LOAD_PATH" 1>&6
     fi
@@ -1607,6 +1634,7 @@ s%@EMACS@%$EMACS%g
 s%@XEMACS@%$XEMACS%g
 s%@lispdir@%$lispdir%g
 s%@etcdir@%$etcdir%g
+s%@info_dir@%$info_dir%g
 s%@HAVE_url@%$HAVE_url%g
 s%@URL@%$URL%g
 s%@HAVE_w3_forms@%$HAVE_w3_forms%g
index a2afd77..18dfdb1 100644 (file)
@@ -6,6 +6,7 @@ AC_CHECK_PROG(MAKEINFO, makeinfo, makeinfo, no)
 AC_CHECK_EMACS
 AC_PATH_LISPDIR
 AC_PATH_ETCDIR
+AC_PATH_INFO_DIR
 AC_CHECK_URL
 AC_CHECK_W3
 GNUS_CHECK_FONTS
index 9f58afd..f894e17 100644 (file)
@@ -1,3 +1,21 @@
+2002-04-24  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+       * ucs-tables.el (featurep): Barf on XEmacs.
+
+2002-03-06  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * ucs-tables.el: Copy from Emacs 21.
+       
+2002-03-05  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * xml.el: Sync with Emacs 21.
+
+2002-01-25  Josh Huber  <huber@alum.wpi.edu>
+
+       * gpg.el (gpg-command-decrypt): Enable the status-fd command line
+       option to gpg when decrypting so `mml2015-mailcrypt-decrypt' can
+       parse and display the output.
+
 2002-01-01  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * gnus-mdrtn.el (gnus-moderation-cancel-article): Insert an extra
index c87dc64..a747594 100644 (file)
@@ -340,7 +340,7 @@ endings; the input data shall be treated as binary."
   :group 'gpg-commands)
 
 (defcustom gpg-command-decrypt
-  '(gpg . ("--decrypt" "--batch" "--passphrase-fd=0"))
+  '(gpg . ("--status-fd" "2" "--decrypt" "--batch" "--passphrase-fd=0"))
   "Command to decrypt a message.
 The invoked program has to read the passphrase from standard
 input, followed by the encrypted message.  It writes the decrypted
diff --git a/contrib/ucs-tables.el b/contrib/ucs-tables.el
new file mode 100644 (file)
index 0000000..0255053
--- /dev/null
@@ -0,0 +1,2479 @@
+;;; ucs-tables.el --- translation to, from and via Unicode  -*- coding: iso-2022-7bit -*-
+
+;; Copyright (C) 2001  Free Software Foundation, Inc.
+
+;; Author: Dave Love <fx@gnu.org>
+;; Keywords: i18n
+
+;; This file is part of GNU Emacs.
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This file 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.
+
+;;; Commentary:
+
+;; This file provides tables mapping between Unicode numbers and
+;; emacs-mule characters from the iso-8859 charsets (and others).  It
+;; also provides some auxiliary functions.
+
+;; These tables are used to construct other mappings between the Mule
+;; iso8859 charsets and the emacs-unicode charsets and a table that
+;; unifies iso8859 characters using a single charset as far as
+;; possible.  These tables are used by latin1-disp.el to display some
+;; Unicode characters without a Unicode font and by utf-8.el to unify
+;; Latin-N as far as possible on encoding.
+
+;; More drastically, they can be used to unify 8859 into Latin-1 plus
+;; mule-unicode-0100-24ff on decoding, with the corresponding
+;; adjustments on encoding; see `ucs-unify-8859'.  Be wary of using
+;; unification when, for instance, editing Lisp files such as this one
+;; which are supposed to contain distinct 8859 charsets.  Also, it can
+;; make reading and writing of emacs-mule and iso-2022-based encodings
+;; not idempotent.
+
+;; Global minor modes are provided to unify on encoding and decoding.
+
+;; The translation table `ucs-mule-to-mule-unicode' is populated.
+;; This is used by the `mule-utf-8' coding system to encode extra
+;; characters.
+
+;; Command `ucs-insert' is convenient for inserting a given Unicode.
+;; (See also the `ucs' input method.)
+
+;;; Code:
+
+(when (featurep 'xemacs)
+  (error "This file cannot be used with XEmacs.  For XEmacs, use latin-unity instead"))
+
+;;; Define tables, to be populated later.
+
+(defvar ucs-mule-8859-to-ucs-table (make-translation-table)
+  "Translation table from Emacs ISO-8859 characters to Unicode.
+This maps Emacs characters from the non-Latin-1
+...-iso8859-... charsets to their Unicode code points.  This is a
+many-to-one mapping.")
+
+(defvar ucs-mule-8859-to-mule-unicode (make-translation-table)
+  "Translation table from Emacs ISO-8859 characters to Mule Unicode.
+This maps Emacs characters from the non-Latin-1
+...-iso8859-... charsets to characters from the
+mule-unicode-... charsets.  This is a many-to-one mapping.  The
+characters translated to are suitable for encoding using the
+`mule-utf-8' coding system.")
+
+;; (defvar ucs-ucs-to-mule-8859-table (make-translation-table)
+;;   "Translation table from Unicode to Emacs ISO-8859 characters.
+;; This maps Unicode code points to corresponding Emacs characters from
+;; the ...-iso8859-... charsets.  This is made a one-to-one mapping where
+;; the same character occurs in more than one set by preferring the Emacs
+;; iso-8859-N character with lowest N.")
+
+;; (defvar ucs-mule-unicode-to-mule-8859 (make-translation-table)
+;;   "Translation table from Mule Unicode to Emacs ISO-8859 characters.
+;; This maps non-Latin-1 Emacs characters from the
+;; mule-unicode-... charsets used by the `mule-utf-8' coding system to
+;; characters from the ...-iso8859-... charsets.  This is made a
+;; one-to-one mapping where the same character occurs in more than one
+;; set by preferring the Emacs iso-8859-N character with lowest N.")
+
+(defvar ucs-8859-1-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-2.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+(defvar ucs-8859-2-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-2.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+(defvar ucs-8859-3-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-3.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+(defvar ucs-8859-4-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-4.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+(defvar ucs-8859-5-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-5.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+(defvar ucs-8859-7-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-7.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+(defvar ucs-8859-8-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-8.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+(defvar ucs-8859-9-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-9.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+(defvar ucs-8859-14-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-14.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+(defvar ucs-8859-15-encode-table nil
+  "Used as `translation-table-for-encode' for iso-8859-15.
+Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.")
+
+;; Probably defined by utf-8.el.
+(defvar ucs-mule-to-mule-unicode (make-translation-table))
+(unless (get 'ucs-mule-to-mule-unicode 'translation-table)
+  (define-translation-table 'ucs-mule-to-mule-unicode ucs-mule-to-mule-unicode))
+;;; Set up the tables.
+
+;; Most of these tables were derived from ones in Mule-UCS.
+
+;; There doesn't seem to be a need to make these let bindings into
+;; defvars, so we'll let the data get GC'ed.
+(let ((ucs-8859-2-alist
+       '((?\\e,B \e(B . ?\x00A0) ;; NO-BREAK SPACE
+        (?\\e,B!\e(B . ?\x0104) ;; LATIN CAPITAL LETTER A WITH OGONEK
+        (?\\e,B"\e(B . ?\x02D8) ;; BREVE
+        (?\\e,B#\e(B . ?\x0141) ;; LATIN CAPITAL LETTER L WITH STROKE
+        (?\\e,B$\e(B . ?\x00A4) ;; CURRENCY SIGN
+        (?\\e,B%\e(B . ?\x013D) ;; LATIN CAPITAL LETTER L WITH CARON
+        (?\\e,B&\e(B . ?\x015A) ;; LATIN CAPITAL LETTER S WITH ACUTE
+        (?\\e,B'\e(B . ?\x00A7) ;; SECTION SIGN
+        (?\\e,B(\e(B . ?\x00A8) ;; DIAERESIS
+        (?\\e,B)\e(B . ?\x0160) ;; LATIN CAPITAL LETTER S WITH CARON
+        (?\\e,B*\e(B . ?\x015E) ;; LATIN CAPITAL LETTER S WITH CEDILLA
+        (?\\e,B+\e(B . ?\x0164) ;; LATIN CAPITAL LETTER T WITH CARON
+        (?\\e,B,\e(B . ?\x0179) ;; LATIN CAPITAL LETTER Z WITH ACUTE
+        (?\\e,B-\e(B . ?\x00AD) ;; SOFT HYPHEN
+        (?\\e,B.\e(B . ?\x017D) ;; LATIN CAPITAL LETTER Z WITH CARON
+        (?\\e,B/\e(B . ?\x017B) ;; LATIN CAPITAL LETTER Z WITH DOT ABOVE
+        (?\\e,B0\e(B . ?\x00B0) ;; DEGREE SIGN
+        (?\\e,B1\e(B . ?\x0105) ;; LATIN SMALL LETTER A WITH OGONEK
+        (?\\e,B2\e(B . ?\x02DB) ;; OGONEK
+        (?\\e,B3\e(B . ?\x0142) ;; LATIN SMALL LETTER L WITH STROKE
+        (?\\e,B4\e(B . ?\x00B4) ;; ACUTE ACCENT
+        (?\\e,B5\e(B . ?\x013E) ;; LATIN SMALL LETTER L WITH CARON
+        (?\\e,B6\e(B . ?\x015B) ;; LATIN SMALL LETTER S WITH ACUTE
+        (?\\e,B7\e(B . ?\x02C7) ;; CARON
+        (?\\e,B8\e(B . ?\x00B8) ;; CEDILLA
+        (?\\e,B9\e(B . ?\x0161) ;; LATIN SMALL LETTER S WITH CARON
+        (?\\e,B:\e(B . ?\x015F) ;; LATIN SMALL LETTER S WITH CEDILLA
+        (?\\e,B;\e(B . ?\x0165) ;; LATIN SMALL LETTER T WITH CARON
+        (?\\e,B<\e(B . ?\x017A) ;; LATIN SMALL LETTER Z WITH ACUTE
+        (?\\e,B=\e(B . ?\x02DD) ;; DOUBLE ACUTE ACCENT
+        (?\\e,B>\e(B . ?\x017E) ;; LATIN SMALL LETTER Z WITH CARON
+        (?\\e,B?\e(B . ?\x017C) ;; LATIN SMALL LETTER Z WITH DOT ABOVE
+        (?\\e,B@\e(B . ?\x0154) ;; LATIN CAPITAL LETTER R WITH ACUTE
+        (?\\e,BA\e(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE
+        (?\\e,BB\e(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+        (?\\e,BC\e(B . ?\x0102) ;; LATIN CAPITAL LETTER A WITH BREVE
+        (?\\e,BD\e(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS
+        (?\\e,BE\e(B . ?\x0139) ;; LATIN CAPITAL LETTER L WITH ACUTE
+        (?\\e,BF\e(B . ?\x0106) ;; LATIN CAPITAL LETTER C WITH ACUTE
+        (?\\e,BG\e(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA
+        (?\\e,BH\e(B . ?\x010C) ;; LATIN CAPITAL LETTER C WITH CARON
+        (?\\e,BI\e(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE
+        (?\\e,BJ\e(B . ?\x0118) ;; LATIN CAPITAL LETTER E WITH OGONEK
+        (?\\e,BK\e(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS
+        (?\\e,BL\e(B . ?\x011A) ;; LATIN CAPITAL LETTER E WITH CARON
+        (?\\e,BM\e(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE
+        (?\\e,BN\e(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+        (?\\e,BO\e(B . ?\x010E) ;; LATIN CAPITAL LETTER D WITH CARON
+        (?\\e,BP\e(B . ?\x0110) ;; LATIN CAPITAL LETTER D WITH STROKE
+        (?\\e,BQ\e(B . ?\x0143) ;; LATIN CAPITAL LETTER N WITH ACUTE
+        (?\\e,BR\e(B . ?\x0147) ;; LATIN CAPITAL LETTER N WITH CARON
+        (?\\e,BS\e(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE
+        (?\\e,BT\e(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+        (?\\e,BU\e(B . ?\x0150) ;; LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+        (?\\e,BV\e(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS
+        (?\\e,BW\e(B . ?\x00D7) ;; MULTIPLICATION SIGN
+        (?\\e,BX\e(B . ?\x0158) ;; LATIN CAPITAL LETTER R WITH CARON
+        (?\\e,BY\e(B . ?\x016E) ;; LATIN CAPITAL LETTER U WITH RING ABOVE
+        (?\\e,BZ\e(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE
+        (?\\e,B[\e(B . ?\x0170) ;; LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+        (?\\e,B\\e(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS
+        (?\\e,B]\e(B . ?\x00DD) ;; LATIN CAPITAL LETTER Y WITH ACUTE
+        (?\\e,B^\e(B . ?\x0162) ;; LATIN CAPITAL LETTER T WITH CEDILLA
+        (?\\e,B_\e(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S
+        (?\\e,B`\e(B . ?\x0155) ;; LATIN SMALL LETTER R WITH ACUTE
+        (?\\e,Ba\e(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE
+        (?\\e,Bb\e(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX
+        (?\\e,Bc\e(B . ?\x0103) ;; LATIN SMALL LETTER A WITH BREVE
+        (?\\e,Bd\e(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS
+        (?\\e,Be\e(B . ?\x013A) ;; LATIN SMALL LETTER L WITH ACUTE
+        (?\\e,Bf\e(B . ?\x0107) ;; LATIN SMALL LETTER C WITH ACUTE
+        (?\\e,Bg\e(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA
+        (?\\e,Bh\e(B . ?\x010D) ;; LATIN SMALL LETTER C WITH CARON
+        (?\\e,Bi\e(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE
+        (?\\e,Bj\e(B . ?\x0119) ;; LATIN SMALL LETTER E WITH OGONEK
+        (?\\e,Bk\e(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS
+        (?\\e,Bl\e(B . ?\x011B) ;; LATIN SMALL LETTER E WITH CARON
+        (?\\e,Bm\e(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE
+        (?\\e,Bn\e(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX
+        (?\\e,Bo\e(B . ?\x010F) ;; LATIN SMALL LETTER D WITH CARON
+        (?\\e,Bp\e(B . ?\x0111) ;; LATIN SMALL LETTER D WITH STROKE
+        (?\\e,Bq\e(B . ?\x0144) ;; LATIN SMALL LETTER N WITH ACUTE
+        (?\\e,Br\e(B . ?\x0148) ;; LATIN SMALL LETTER N WITH CARON
+        (?\\e,Bs\e(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE
+        (?\\e,Bt\e(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX
+        (?\\e,Bu\e(B . ?\x0151) ;; LATIN SMALL LETTER O WITH DOUBLE ACUTE
+        (?\\e,Bv\e(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS
+        (?\\e,Bw\e(B . ?\x00F7) ;; DIVISION SIGN
+        (?\\e,Bx\e(B . ?\x0159) ;; LATIN SMALL LETTER R WITH CARON
+        (?\\e,By\e(B . ?\x016F) ;; LATIN SMALL LETTER U WITH RING ABOVE
+        (?\\e,Bz\e(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE
+        (?\\e,B{\e(B . ?\x0171) ;; LATIN SMALL LETTER U WITH DOUBLE ACUTE
+        (?\\e,B|\e(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS
+        (?\\e,B}\e(B . ?\x00FD) ;; LATIN SMALL LETTER Y WITH ACUTE
+        (?\\e,B~\e(B . ?\x0163) ;; LATIN SMALL LETTER T WITH CEDILLA
+        (?\\e,B\7f\e(B . ?\x02D9) ;; DOT ABOVE
+        ))
+
+      (ucs-8859-3-alist
+       '((?\\e,C \e(B . ?\x00A0) ;; NO-BREAK SPACE
+        (?\\e,C!\e(B . ?\x0126) ;; LATIN CAPITAL LETTER H WITH STROKE
+        (?\\e,C"\e(B . ?\x02D8) ;; BREVE
+        (?\\e,C#\e(B . ?\x00A3) ;; POUND SIGN
+        (?\\e,C$\e(B . ?\x00A4) ;; CURRENCY SIGN
+        (?\\e,C&\e(B . ?\x0124) ;; LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+        (?\\e,C'\e(B . ?\x00A7) ;; SECTION SIGN
+        (?\\e,C(\e(B . ?\x00A8) ;; DIAERESIS
+        (?\\e,C)\e(B . ?\x0130) ;; LATIN CAPITAL LETTER I WITH DOT ABOVE
+        (?\\e,C*\e(B . ?\x015E) ;; LATIN CAPITAL LETTER S WITH CEDILLA
+        (?\\e,C+\e(B . ?\x011E) ;; LATIN CAPITAL LETTER G WITH BREVE
+        (?\\e,C,\e(B . ?\x0134) ;; LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+        (?\\e,C-\e(B . ?\x00AD) ;; SOFT HYPHEN
+        (?\\e,C/\e(B . ?\x017B) ;; LATIN CAPITAL LETTER Z WITH DOT ABOVE
+        (?\\e,C0\e(B . ?\x00B0) ;; DEGREE SIGN
+        (?\\e,C1\e(B . ?\x0127) ;; LATIN SMALL LETTER H WITH STROKE
+        (?\\e,C2\e(B . ?\x00B2) ;; SUPERSCRIPT TWO
+        (?\\e,C3\e(B . ?\x00B3) ;; SUPERSCRIPT THREE
+        (?\\e,C4\e(B . ?\x00B4) ;; ACUTE ACCENT
+        (?\\e,C5\e(B . ?\x00B5) ;; MICRO SIGN
+        (?\\e,C6\e(B . ?\x0125) ;; LATIN SMALL LETTER H WITH CIRCUMFLEX
+        (?\\e,C7\e(B . ?\x00B7) ;; MIDDLE DOT
+        (?\\e,C8\e(B . ?\x00B8) ;; CEDILLA
+        (?\\e,C9\e(B . ?\x0131) ;; LATIN SMALL LETTER DOTLESS I
+        (?\\e,C:\e(B . ?\x015F) ;; LATIN SMALL LETTER S WITH CEDILLA
+        (?\\e,C;\e(B . ?\x011F) ;; LATIN SMALL LETTER G WITH BREVE
+        (?\\e,C<\e(B . ?\x0135) ;; LATIN SMALL LETTER J WITH CIRCUMFLEX
+        (?\\e,C=\e(B . ?\x00BD) ;; VULGAR FRACTION ONE HALF
+        (?\\e,C?\e(B . ?\x017C) ;; LATIN SMALL LETTER Z WITH DOT ABOVE
+        (?\\e,C@\e(B . ?\x00C0) ;; LATIN CAPITAL LETTER A WITH GRAVE
+        (?\\e,CA\e(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE
+        (?\\e,CB\e(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+        (?\\e,CD\e(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS
+        (?\\e,CE\e(B . ?\x010A) ;; LATIN CAPITAL LETTER C WITH DOT ABOVE
+        (?\\e,CF\e(B . ?\x0108) ;; LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+        (?\\e,CG\e(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA
+        (?\\e,CH\e(B . ?\x00C8) ;; LATIN CAPITAL LETTER E WITH GRAVE
+        (?\\e,CI\e(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE
+        (?\\e,CJ\e(B . ?\x00CA) ;; LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+        (?\\e,CK\e(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS
+        (?\\e,CL\e(B . ?\x00CC) ;; LATIN CAPITAL LETTER I WITH GRAVE
+        (?\\e,CM\e(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE
+        (?\\e,CN\e(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+        (?\\e,CO\e(B . ?\x00CF) ;; LATIN CAPITAL LETTER I WITH DIAERESIS
+        (?\\e,CQ\e(B . ?\x00D1) ;; LATIN CAPITAL LETTER N WITH TILDE
+        (?\\e,CR\e(B . ?\x00D2) ;; LATIN CAPITAL LETTER O WITH GRAVE
+        (?\\e,CS\e(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE
+        (?\\e,CT\e(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+        (?\\e,CU\e(B . ?\x0120) ;; LATIN CAPITAL LETTER G WITH DOT ABOVE
+        (?\\e,CV\e(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS
+        (?\\e,CW\e(B . ?\x00D7) ;; MULTIPLICATION SIGN
+        (?\\e,CX\e(B . ?\x011C) ;; LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+        (?\\e,CY\e(B . ?\x00D9) ;; LATIN CAPITAL LETTER U WITH GRAVE
+        (?\\e,CZ\e(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE
+        (?\\e,C[\e(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+        (?\\e,C\\e(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS
+        (?\\e,C]\e(B . ?\x016C) ;; LATIN CAPITAL LETTER U WITH BREVE
+        (?\\e,C^\e(B . ?\x015C) ;; LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+        (?\\e,C_\e(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S
+        (?\\e,C`\e(B . ?\x00E0) ;; LATIN SMALL LETTER A WITH GRAVE
+        (?\\e,Ca\e(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE
+        (?\\e,Cb\e(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX
+        (?\\e,Cd\e(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS
+        (?\\e,Ce\e(B . ?\x010B) ;; LATIN SMALL LETTER C WITH DOT ABOVE
+        (?\\e,Cf\e(B . ?\x0109) ;; LATIN SMALL LETTER C WITH CIRCUMFLEX
+        (?\\e,Cg\e(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA
+        (?\\e,Ch\e(B . ?\x00E8) ;; LATIN SMALL LETTER E WITH GRAVE
+        (?\\e,Ci\e(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE
+        (?\\e,Cj\e(B . ?\x00EA) ;; LATIN SMALL LETTER E WITH CIRCUMFLEX
+        (?\\e,Ck\e(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS
+        (?\\e,Cl\e(B . ?\x00EC) ;; LATIN SMALL LETTER I WITH GRAVE
+        (?\\e,Cm\e(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE
+        (?\\e,Cn\e(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX
+        (?\\e,Co\e(B . ?\x00EF) ;; LATIN SMALL LETTER I WITH DIAERESIS
+        (?\\e,Cq\e(B . ?\x00F1) ;; LATIN SMALL LETTER N WITH TILDE
+        (?\\e,Cr\e(B . ?\x00F2) ;; LATIN SMALL LETTER O WITH GRAVE
+        (?\\e,Cs\e(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE
+        (?\\e,Ct\e(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX
+        (?\\e,Cu\e(B . ?\x0121) ;; LATIN SMALL LETTER G WITH DOT ABOVE
+        (?\\e,Cv\e(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS
+        (?\\e,Cw\e(B . ?\x00F7) ;; DIVISION SIGN
+        (?\\e,Cx\e(B . ?\x011D) ;; LATIN SMALL LETTER G WITH CIRCUMFLEX
+        (?\\e,Cy\e(B . ?\x00F9) ;; LATIN SMALL LETTER U WITH GRAVE
+        (?\\e,Cz\e(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE
+        (?\\e,C{\e(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX
+        (?\\e,C|\e(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS
+        (?\\e,C}\e(B . ?\x016D) ;; LATIN SMALL LETTER U WITH BREVE
+        (?\\e,C~\e(B . ?\x015D) ;; LATIN SMALL LETTER S WITH CIRCUMFLEX
+        (?\\e,C\7f\e(B . ?\x02D9) ;; DOT ABOVE
+        ))
+
+      (ucs-8859-4-alist
+       '((?\\e,D \e(B . ?\x00A0) ;; NO-BREAK SPACE
+        (?\\e,D!\e(B . ?\x0104) ;; LATIN CAPITAL LETTER A WITH OGONEK
+        (?\\e,D"\e(B . ?\x0138) ;; LATIN SMALL LETTER KRA
+        (?\\e,D#\e(B . ?\x0156) ;; LATIN CAPITAL LETTER R WITH CEDILLA
+        (?\\e,D$\e(B . ?\x00A4) ;; CURRENCY SIGN
+        (?\\e,D%\e(B . ?\x0128) ;; LATIN CAPITAL LETTER I WITH TILDE
+        (?\\e,D&\e(B . ?\x013B) ;; LATIN CAPITAL LETTER L WITH CEDILLA
+        (?\\e,D'\e(B . ?\x00A7) ;; SECTION SIGN
+        (?\\e,D(\e(B . ?\x00A8) ;; DIAERESIS
+        (?\\e,D)\e(B . ?\x0160) ;; LATIN CAPITAL LETTER S WITH CARON
+        (?\\e,D*\e(B . ?\x0112) ;; LATIN CAPITAL LETTER E WITH MACRON
+        (?\\e,D+\e(B . ?\x0122) ;; LATIN CAPITAL LETTER G WITH CEDILLA
+        (?\\e,D,\e(B . ?\x0166) ;; LATIN CAPITAL LETTER T WITH STROKE
+        (?\\e,D-\e(B . ?\x00AD) ;; SOFT HYPHEN
+        (?\\e,D.\e(B . ?\x017D) ;; LATIN CAPITAL LETTER Z WITH CARON
+        (?\\e,D/\e(B . ?\x00AF) ;; MACRON
+        (?\\e,D0\e(B . ?\x00B0) ;; DEGREE SIGN
+        (?\\e,D1\e(B . ?\x0105) ;; LATIN SMALL LETTER A WITH OGONEK
+        (?\\e,D2\e(B . ?\x02DB) ;; OGONEK
+        (?\\e,D3\e(B . ?\x0157) ;; LATIN SMALL LETTER R WITH CEDILLA
+        (?\\e,D4\e(B . ?\x00B4) ;; ACUTE ACCENT
+        (?\\e,D5\e(B . ?\x0129) ;; LATIN SMALL LETTER I WITH TILDE
+        (?\\e,D6\e(B . ?\x013C) ;; LATIN SMALL LETTER L WITH CEDILLA
+        (?\\e,D7\e(B . ?\x02C7) ;; CARON
+        (?\\e,D8\e(B . ?\x00B8) ;; CEDILLA
+        (?\\e,D9\e(B . ?\x0161) ;; LATIN SMALL LETTER S WITH CARON
+        (?\\e,D:\e(B . ?\x0113) ;; LATIN SMALL LETTER E WITH MACRON
+        (?\\e,D;\e(B . ?\x0123) ;; LATIN SMALL LETTER G WITH CEDILLA
+        (?\\e,D<\e(B . ?\x0167) ;; LATIN SMALL LETTER T WITH STROKE
+        (?\\e,D=\e(B . ?\x014A) ;; LATIN CAPITAL LETTER ENG
+        (?\\e,D>\e(B . ?\x017E) ;; LATIN SMALL LETTER Z WITH CARON
+        (?\\e,D?\e(B . ?\x014B) ;; LATIN SMALL LETTER ENG
+        (?\\e,D@\e(B . ?\x0100) ;; LATIN CAPITAL LETTER A WITH MACRON
+        (?\\e,DA\e(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE
+        (?\\e,DB\e(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+        (?\\e,DC\e(B . ?\x00C3) ;; LATIN CAPITAL LETTER A WITH TILDE
+        (?\\e,DD\e(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS
+        (?\\e,DE\e(B . ?\x00C5) ;; LATIN CAPITAL LETTER A WITH RING ABOVE
+        (?\\e,DF\e(B . ?\x00C6) ;; LATIN CAPITAL LETTER AE
+        (?\\e,DG\e(B . ?\x012E) ;; LATIN CAPITAL LETTER I WITH OGONEK
+        (?\\e,DH\e(B . ?\x010C) ;; LATIN CAPITAL LETTER C WITH CARON
+        (?\\e,DI\e(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE
+        (?\\e,DJ\e(B . ?\x0118) ;; LATIN CAPITAL LETTER E WITH OGONEK
+        (?\\e,DK\e(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS
+        (?\\e,DL\e(B . ?\x0116) ;; LATIN CAPITAL LETTER E WITH DOT ABOVE
+        (?\\e,DM\e(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE
+        (?\\e,DN\e(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+        (?\\e,DO\e(B . ?\x012A) ;; LATIN CAPITAL LETTER I WITH MACRON
+        (?\\e,DP\e(B . ?\x0110) ;; LATIN CAPITAL LETTER D WITH STROKE
+        (?\\e,DQ\e(B . ?\x0145) ;; LATIN CAPITAL LETTER N WITH CEDILLA
+        (?\\e,DR\e(B . ?\x014C) ;; LATIN CAPITAL LETTER O WITH MACRON
+        (?\\e,DS\e(B . ?\x0136) ;; LATIN CAPITAL LETTER K WITH CEDILLA
+        (?\\e,DT\e(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+        (?\\e,DU\e(B . ?\x00D5) ;; LATIN CAPITAL LETTER O WITH TILDE
+        (?\\e,DV\e(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS
+        (?\\e,DW\e(B . ?\x00D7) ;; MULTIPLICATION SIGN
+        (?\\e,DX\e(B . ?\x00D8) ;; LATIN CAPITAL LETTER O WITH STROKE
+        (?\\e,DY\e(B . ?\x0172) ;; LATIN CAPITAL LETTER U WITH OGONEK
+        (?\\e,DZ\e(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE
+        (?\\e,D[\e(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+        (?\\e,D\\e(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS
+        (?\\e,D]\e(B . ?\x0168) ;; LATIN CAPITAL LETTER U WITH TILDE
+        (?\\e,D^\e(B . ?\x016A) ;; LATIN CAPITAL LETTER U WITH MACRON
+        (?\\e,D_\e(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S
+        (?\\e,D`\e(B . ?\x0101) ;; LATIN SMALL LETTER A WITH MACRON
+        (?\\e,Da\e(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE
+        (?\\e,Db\e(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX
+        (?\\e,Dc\e(B . ?\x00E3) ;; LATIN SMALL LETTER A WITH TILDE
+        (?\\e,Dd\e(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS
+        (?\\e,De\e(B . ?\x00E5) ;; LATIN SMALL LETTER A WITH RING ABOVE
+        (?\\e,Df\e(B . ?\x00E6) ;; LATIN SMALL LETTER AE
+        (?\\e,Dg\e(B . ?\x012F) ;; LATIN SMALL LETTER I WITH OGONEK
+        (?\\e,Dh\e(B . ?\x010D) ;; LATIN SMALL LETTER C WITH CARON
+        (?\\e,Di\e(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE
+        (?\\e,Dj\e(B . ?\x0119) ;; LATIN SMALL LETTER E WITH OGONEK
+        (?\\e,Dk\e(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS
+        (?\\e,Dl\e(B . ?\x0117) ;; LATIN SMALL LETTER E WITH DOT ABOVE
+        (?\\e,Dm\e(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE
+        (?\\e,Dn\e(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX
+        (?\\e,Do\e(B . ?\x012B) ;; LATIN SMALL LETTER I WITH MACRON
+        (?\\e,Dp\e(B . ?\x0111) ;; LATIN SMALL LETTER D WITH STROKE
+        (?\\e,Dq\e(B . ?\x0146) ;; LATIN SMALL LETTER N WITH CEDILLA
+        (?\\e,Dr\e(B . ?\x014D) ;; LATIN SMALL LETTER O WITH MACRON
+        (?\\e,Ds\e(B . ?\x0137) ;; LATIN SMALL LETTER K WITH CEDILLA
+        (?\\e,Dt\e(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX
+        (?\\e,Du\e(B . ?\x00F5) ;; LATIN SMALL LETTER O WITH TILDE
+        (?\\e,Dv\e(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS
+        (?\\e,Dw\e(B . ?\x00F7) ;; DIVISION SIGN
+        (?\\e,Dx\e(B . ?\x00F8) ;; LATIN SMALL LETTER O WITH STROKE
+        (?\\e,Dy\e(B . ?\x0173) ;; LATIN SMALL LETTER U WITH OGONEK
+        (?\\e,Dz\e(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE
+        (?\\e,D{\e(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX
+        (?\\e,D|\e(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS
+        (?\\e,D}\e(B . ?\x0169) ;; LATIN SMALL LETTER U WITH TILDE
+        (?\\e,D~\e(B . ?\x016B) ;; LATIN SMALL LETTER U WITH MACRON
+        (?\\e,D\7f\e(B . ?\x02D9) ;; DOT ABOVE
+        ))
+
+      (ucs-8859-5-alist
+       '((?\\e,L \e(B . ?\x00A0) ;; NO-BREAK SPACE
+        (?\\e,L!\e(B . ?\x0401) ;; CYRILLIC CAPITAL LETTER IO
+        (?\\e,L"\e(B . ?\x0402) ;; CYRILLIC CAPITAL LETTER DJE
+        (?\\e,L#\e(B . ?\x0403) ;; CYRILLIC CAPITAL LETTER GJE
+        (?\\e,L$\e(B . ?\x0404) ;; CYRILLIC CAPITAL LETTER UKRAINIAN IE
+        (?\\e,L%\e(B . ?\x0405) ;; CYRILLIC CAPITAL LETTER DZE
+        (?\\e,L&\e(B . ?\x0406) ;; CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+        (?\\e,L'\e(B . ?\x0407) ;; CYRILLIC CAPITAL LETTER YI
+        (?\\e,L(\e(B . ?\x0408) ;; CYRILLIC CAPITAL LETTER JE
+        (?\\e,L)\e(B . ?\x0409) ;; CYRILLIC CAPITAL LETTER LJE
+        (?\\e,L*\e(B . ?\x040A) ;; CYRILLIC CAPITAL LETTER NJE
+        (?\\e,L+\e(B . ?\x040B) ;; CYRILLIC CAPITAL LETTER TSHE
+        (?\\e,L,\e(B . ?\x040C) ;; CYRILLIC CAPITAL LETTER KJE
+        (?\\e,L-\e(B . ?\x00AD) ;; SOFT HYPHEN
+        (?\\e,L.\e(B . ?\x040E) ;; CYRILLIC CAPITAL LETTER SHORT U
+        (?\\e,L/\e(B . ?\x040F) ;; CYRILLIC CAPITAL LETTER DZHE
+        (?\\e,L0\e(B . ?\x0410) ;; CYRILLIC CAPITAL LETTER A
+        (?\\e,L1\e(B . ?\x0411) ;; CYRILLIC CAPITAL LETTER BE
+        (?\\e,L2\e(B . ?\x0412) ;; CYRILLIC CAPITAL LETTER VE
+        (?\\e,L3\e(B . ?\x0413) ;; CYRILLIC CAPITAL LETTER GHE
+        (?\\e,L4\e(B . ?\x0414) ;; CYRILLIC CAPITAL LETTER DE
+        (?\\e,L5\e(B . ?\x0415) ;; CYRILLIC CAPITAL LETTER IE
+        (?\\e,L6\e(B . ?\x0416) ;; CYRILLIC CAPITAL LETTER ZHE
+        (?\\e,L7\e(B . ?\x0417) ;; CYRILLIC CAPITAL LETTER ZE
+        (?\\e,L8\e(B . ?\x0418) ;; CYRILLIC CAPITAL LETTER I
+        (?\\e,L9\e(B . ?\x0419) ;; CYRILLIC CAPITAL LETTER SHORT I
+        (?\\e,L:\e(B . ?\x041A) ;; CYRILLIC CAPITAL LETTER KA
+        (?\\e,L;\e(B . ?\x041B) ;; CYRILLIC CAPITAL LETTER EL
+        (?\\e,L<\e(B . ?\x041C) ;; CYRILLIC CAPITAL LETTER EM
+        (?\\e,L=\e(B . ?\x041D) ;; CYRILLIC CAPITAL LETTER EN
+        (?\\e,L>\e(B . ?\x041E) ;; CYRILLIC CAPITAL LETTER O
+        (?\\e,L?\e(B . ?\x041F) ;; CYRILLIC CAPITAL LETTER PE
+        (?\\e,L@\e(B . ?\x0420) ;; CYRILLIC CAPITAL LETTER ER
+        (?\\e,LA\e(B . ?\x0421) ;; CYRILLIC CAPITAL LETTER ES
+        (?\\e,LB\e(B . ?\x0422) ;; CYRILLIC CAPITAL LETTER TE
+        (?\\e,LC\e(B . ?\x0423) ;; CYRILLIC CAPITAL LETTER U
+        (?\\e,LD\e(B . ?\x0424) ;; CYRILLIC CAPITAL LETTER EF
+        (?\\e,LE\e(B . ?\x0425) ;; CYRILLIC CAPITAL LETTER HA
+        (?\\e,LF\e(B . ?\x0426) ;; CYRILLIC CAPITAL LETTER TSE
+        (?\\e,LG\e(B . ?\x0427) ;; CYRILLIC CAPITAL LETTER CHE
+        (?\\e,LH\e(B . ?\x0428) ;; CYRILLIC CAPITAL LETTER SHA
+        (?\\e,LI\e(B . ?\x0429) ;; CYRILLIC CAPITAL LETTER SHCHA
+        (?\\e,LJ\e(B . ?\x042A) ;; CYRILLIC CAPITAL LETTER HARD SIGN
+        (?\\e,LK\e(B . ?\x042B) ;; CYRILLIC CAPITAL LETTER YERU
+        (?\\e,LL\e(B . ?\x042C) ;; CYRILLIC CAPITAL LETTER SOFT SIGN
+        (?\\e,LM\e(B . ?\x042D) ;; CYRILLIC CAPITAL LETTER E
+        (?\\e,LN\e(B . ?\x042E) ;; CYRILLIC CAPITAL LETTER YU
+        (?\\e,LO\e(B . ?\x042F) ;; CYRILLIC CAPITAL LETTER YA
+        (?\\e,LP\e(B . ?\x0430) ;; CYRILLIC SMALL LETTER A
+        (?\\e,LQ\e(B . ?\x0431) ;; CYRILLIC SMALL LETTER BE
+        (?\\e,LR\e(B . ?\x0432) ;; CYRILLIC SMALL LETTER VE
+        (?\\e,LS\e(B . ?\x0433) ;; CYRILLIC SMALL LETTER GHE
+        (?\\e,LT\e(B . ?\x0434) ;; CYRILLIC SMALL LETTER DE
+        (?\\e,LU\e(B . ?\x0435) ;; CYRILLIC SMALL LETTER IE
+        (?\\e,LV\e(B . ?\x0436) ;; CYRILLIC SMALL LETTER ZHE
+        (?\\e,LW\e(B . ?\x0437) ;; CYRILLIC SMALL LETTER ZE
+        (?\\e,LX\e(B . ?\x0438) ;; CYRILLIC SMALL LETTER I
+        (?\\e,LY\e(B . ?\x0439) ;; CYRILLIC SMALL LETTER SHORT I
+        (?\\e,LZ\e(B . ?\x043A) ;; CYRILLIC SMALL LETTER KA
+        (?\\e,L[\e(B . ?\x043B) ;; CYRILLIC SMALL LETTER EL
+        (?\\e,L\\e(B . ?\x043C) ;; CYRILLIC SMALL LETTER EM
+        (?\\e,L]\e(B . ?\x043D) ;; CYRILLIC SMALL LETTER EN
+        (?\\e,L^\e(B . ?\x043E) ;; CYRILLIC SMALL LETTER O
+        (?\\e,L_\e(B . ?\x043F) ;; CYRILLIC SMALL LETTER PE
+        (?\\e,L`\e(B . ?\x0440) ;; CYRILLIC SMALL LETTER ER
+        (?\\e,La\e(B . ?\x0441) ;; CYRILLIC SMALL LETTER ES
+        (?\\e,Lb\e(B . ?\x0442) ;; CYRILLIC SMALL LETTER TE
+        (?\\e,Lc\e(B . ?\x0443) ;; CYRILLIC SMALL LETTER U
+        (?\\e,Ld\e(B . ?\x0444) ;; CYRILLIC SMALL LETTER EF
+        (?\\e,Le\e(B . ?\x0445) ;; CYRILLIC SMALL LETTER HA
+        (?\\e,Lf\e(B . ?\x0446) ;; CYRILLIC SMALL LETTER TSE
+        (?\\e,Lg\e(B . ?\x0447) ;; CYRILLIC SMALL LETTER CHE
+        (?\\e,Lh\e(B . ?\x0448) ;; CYRILLIC SMALL LETTER SHA
+        (?\\e,Li\e(B . ?\x0449) ;; CYRILLIC SMALL LETTER SHCHA
+        (?\\e,Lj\e(B . ?\x044A) ;; CYRILLIC SMALL LETTER HARD SIGN
+        (?\\e,Lk\e(B . ?\x044B) ;; CYRILLIC SMALL LETTER YERU
+        (?\\e,Ll\e(B . ?\x044C) ;; CYRILLIC SMALL LETTER SOFT SIGN
+        (?\\e,Lm\e(B . ?\x044D) ;; CYRILLIC SMALL LETTER E
+        (?\\e,Ln\e(B . ?\x044E) ;; CYRILLIC SMALL LETTER YU
+        (?\\e,Lo\e(B . ?\x044F) ;; CYRILLIC SMALL LETTER YA
+        (?\\e,Lp\e(B . ?\x2116) ;; NUMERO SIGN
+        (?\\e,Lq\e(B . ?\x0451) ;; CYRILLIC SMALL LETTER IO
+        (?\\e,Lr\e(B . ?\x0452) ;; CYRILLIC SMALL LETTER DJE
+        (?\\e,Ls\e(B . ?\x0453) ;; CYRILLIC SMALL LETTER GJE
+        (?\\e,Lt\e(B . ?\x0454) ;; CYRILLIC SMALL LETTER UKRAINIAN IE
+        (?\\e,Lu\e(B . ?\x0455) ;; CYRILLIC SMALL LETTER DZE
+        (?\\e,Lv\e(B . ?\x0456) ;; CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        (?\\e,Lw\e(B . ?\x0457) ;; CYRILLIC SMALL LETTER YI
+        (?\\e,Lx\e(B . ?\x0458) ;; CYRILLIC SMALL LETTER JE
+        (?\\e,Ly\e(B . ?\x0459) ;; CYRILLIC SMALL LETTER LJE
+        (?\\e,Lz\e(B . ?\x045A) ;; CYRILLIC SMALL LETTER NJE
+        (?\\e,L{\e(B . ?\x045B) ;; CYRILLIC SMALL LETTER TSHE
+        (?\\e,L|\e(B . ?\x045C) ;; CYRILLIC SMALL LETTER KJE
+        (?\\e,L}\e(B . ?\x00A7) ;; SECTION SIGN
+        (?\\e,L~\e(B . ?\x045E) ;; CYRILLIC SMALL LETTER SHORT U
+        (?\\e,L\7f\e(B . ?\x045F) ;; CYRILLIC SMALL LETTER DZHE
+        ))
+
+      ;; Arabic probably isn't so useful in the absence of Arabic
+      ;; language support.
+      (ucs-8859-6-alist
+       '((?\e,G \e(B . ?\x00A0)  ;; NO-BREAK SPACE
+        (?\e,G$\e(B . ?\x00A4)   ;; CURRENCY SIGN
+        (?\e,G,\e(B . ?\x060C)   ;; ARABIC COMMA
+        (?\e,G-\e(B . ?\x00AD)   ;; SOFT HYPHEN
+        (?\e,G;\e(B . ?\x061B)   ;; ARABIC SEMICOLON
+        (?\e,G?\e(B . ?\x061F)   ;; ARABIC QUESTION MARK
+        (?\e,GA\e(B . ?\x0621)   ;; ARABIC LETTER HAMZA
+        (?\e,GB\e(B . ?\x0622)   ;; ARABIC LETTER ALEF WITH MADDA ABOVE
+        (?\e,GC\e(B . ?\x0623)   ;; ARABIC LETTER ALEF WITH HAMZA ABOVE
+        (?\e,GD\e(B . ?\x0624)   ;; ARABIC LETTER WAW WITH HAMZA ABOVE
+        (?\e,GE\e(B . ?\x0625)   ;; ARABIC LETTER ALEF WITH HAMZA BELOW
+        (?\e,GF\e(B . ?\x0626)   ;; ARABIC LETTER YEH WITH HAMZA ABOVE
+        (?\e,GG\e(B . ?\x0627)   ;; ARABIC LETTER ALEF
+        (?\e,GH\e(B . ?\x0628)   ;; ARABIC LETTER BEH
+        (?\e,GI\e(B . ?\x0629)   ;; ARABIC LETTER TEH MARBUTA
+        (?\e,GJ\e(B . ?\x062A)   ;; ARABIC LETTER TEH
+        (?\e,GK\e(B . ?\x062B)   ;; ARABIC LETTER THEH
+        (?\e,GL\e(B . ?\x062C)   ;; ARABIC LETTER JEEM
+        (?\e,GM\e(B . ?\x062D)   ;; ARABIC LETTER HAH
+        (?\e,GN\e(B . ?\x062E)   ;; ARABIC LETTER KHAH
+        (?\e,GO\e(B . ?\x062F)   ;; ARABIC LETTER DAL
+        (?\e,GP\e(B . ?\x0630)   ;; ARABIC LETTER THAL
+        (?\e,GQ\e(B . ?\x0631)   ;; ARABIC LETTER REH
+        (?\e,GR\e(B . ?\x0632)   ;; ARABIC LETTER ZAIN
+        (?\e,GS\e(B . ?\x0633)   ;; ARABIC LETTER SEEN
+        (?\e,GT\e(B . ?\x0634)   ;; ARABIC LETTER SHEEN
+        (?\e,GU\e(B . ?\x0635)   ;; ARABIC LETTER SAD
+        (?\e,GV\e(B . ?\x0636)   ;; ARABIC LETTER DAD
+        (?\e,GW\e(B . ?\x0637)   ;; ARABIC LETTER TAH
+        (?\e,GX\e(B . ?\x0638)   ;; ARABIC LETTER ZAH
+        (?\e,GY\e(B . ?\x0639)   ;; ARABIC LETTER AIN
+        (?\e,GZ\e(B . ?\x063A)   ;; ARABIC LETTER GHAIN
+        (?\e,G`\e(B . ?\x0640)   ;; ARABIC TATWEEL
+        (?\e,Ga\e(B . ?\x0641)   ;; ARABIC LETTER FEH
+        (?\e,Gb\e(B . ?\x0642)   ;; ARABIC LETTER QAF
+        (?\e,Gc\e(B . ?\x0643)   ;; ARABIC LETTER KAF
+        (?\e,Gd\e(B . ?\x0644)   ;; ARABIC LETTER LAM
+        (?\e,Ge\e(B . ?\x0645)   ;; ARABIC LETTER MEEM
+        (?\e,Gf\e(B . ?\x0646)   ;; ARABIC LETTER NOON
+        (?\e,Gg\e(B . ?\x0647)   ;; ARABIC LETTER HEH
+        (?\e,Gh\e(B . ?\x0648)   ;; ARABIC LETTER WAW
+        (?\e,Gi\e(B . ?\x0649)   ;; ARABIC LETTER ALEF MAKSURA
+        (?\e,Gj\e(B . ?\x064A)   ;; ARABIC LETTER YEH
+        (?\e,Gk\e(B . ?\x064B)   ;; ARABIC FATHATAN
+        (?\e,Gl\e(B . ?\x064C)   ;; ARABIC DAMMATAN
+        (?\e,Gm\e(B . ?\x064D)   ;; ARABIC KASRATAN
+        (?\e,Gn\e(B . ?\x064E)   ;; ARABIC FATHA
+        (?\e,Go\e(B . ?\x064F)   ;; ARABIC DAMMA
+        (?\e,Gp\e(B . ?\x0650)   ;; ARABIC KASRA
+        (?\e,Gq\e(B . ?\x0651)   ;; ARABIC SHADDA
+        (?\e,Gr\e(B . ?\x0652)   ;; ARABIC SUKUN
+        ))
+
+      (ucs-8859-7-alist
+       '((?\\e,F \e(B . ?\x00A0) ;; NO-BREAK SPACE
+        (?\\e,F!\e(B . ?\x2018) ;; LEFT SINGLE QUOTATION MARK
+        (?\\e,F"\e(B . ?\x2019) ;; RIGHT SINGLE QUOTATION MARK
+        (?\\e,F#\e(B . ?\x00A3) ;; POUND SIGN
+        (?\\e,F&\e(B . ?\x00A6) ;; BROKEN BAR
+        (?\\e,F'\e(B . ?\x00A7) ;; SECTION SIGN
+        (?\\e,F(\e(B . ?\x00A8) ;; DIAERESIS
+        (?\\e,F)\e(B . ?\x00A9) ;; COPYRIGHT SIGN
+        (?\\e,F+\e(B . ?\x00AB) ;; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        (?\\e,F,\e(B . ?\x00AC) ;; NOT SIGN
+        (?\\e,F-\e(B . ?\x00AD) ;; SOFT HYPHEN
+        (?\\e,F/\e(B . ?\x2015) ;; HORIZONTAL BAR
+        (?\\e,F0\e(B . ?\x00B0) ;; DEGREE SIGN
+        (?\\e,F1\e(B . ?\x00B1) ;; PLUS-MINUS SIGN
+        (?\\e,F2\e(B . ?\x00B2) ;; SUPERSCRIPT TWO
+        (?\\e,F3\e(B . ?\x00B3) ;; SUPERSCRIPT THREE
+        (?\\e,F4\e(B . ?\x0384) ;; GREEK TONOS
+        (?\\e,F5\e(B . ?\x0385) ;; GREEK DIALYTIKA TONOS
+        (?\\e,F6\e(B . ?\x0386) ;; GREEK CAPITAL LETTER ALPHA WITH TONOS
+        (?\\e,F7\e(B . ?\x00B7) ;; MIDDLE DOT
+        (?\\e,F8\e(B . ?\x0388) ;; GREEK CAPITAL LETTER EPSILON WITH TONOS
+        (?\\e,F9\e(B . ?\x0389) ;; GREEK CAPITAL LETTER ETA WITH TONOS
+        (?\\e,F:\e(B . ?\x038A) ;; GREEK CAPITAL LETTER IOTA WITH TONOS
+        (?\\e,F;\e(B . ?\x00BB) ;; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        (?\\e,F<\e(B . ?\x038C) ;; GREEK CAPITAL LETTER OMICRON WITH TONOS
+        (?\\e,F=\e(B . ?\x00BD) ;; VULGAR FRACTION ONE HALF
+        (?\\e,F>\e(B . ?\x038E) ;; GREEK CAPITAL LETTER UPSILON WITH TONOS
+        (?\\e,F?\e(B . ?\x038F) ;; GREEK CAPITAL LETTER OMEGA WITH TONOS
+        (?\\e,F@\e(B . ?\x0390) ;; GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+        (?\\e,FA\e(B . ?\x0391) ;; GREEK CAPITAL LETTER ALPHA
+        (?\\e,FB\e(B . ?\x0392) ;; GREEK CAPITAL LETTER BETA
+        (?\\e,FC\e(B . ?\x0393) ;; GREEK CAPITAL LETTER GAMMA
+        (?\\e,FD\e(B . ?\x0394) ;; GREEK CAPITAL LETTER DELTA
+        (?\\e,FE\e(B . ?\x0395) ;; GREEK CAPITAL LETTER EPSILON
+        (?\\e,FF\e(B . ?\x0396) ;; GREEK CAPITAL LETTER ZETA
+        (?\\e,FG\e(B . ?\x0397) ;; GREEK CAPITAL LETTER ETA
+        (?\\e,FH\e(B . ?\x0398) ;; GREEK CAPITAL LETTER THETA
+        (?\\e,FI\e(B . ?\x0399) ;; GREEK CAPITAL LETTER IOTA
+        (?\\e,FJ\e(B . ?\x039A) ;; GREEK CAPITAL LETTER KAPPA
+        (?\\e,FK\e(B . ?\x039B) ;; GREEK CAPITAL LETTER LAMDA
+        (?\\e,FL\e(B . ?\x039C) ;; GREEK CAPITAL LETTER MU
+        (?\\e,FM\e(B . ?\x039D) ;; GREEK CAPITAL LETTER NU
+        (?\\e,FN\e(B . ?\x039E) ;; GREEK CAPITAL LETTER XI
+        (?\\e,FO\e(B . ?\x039F) ;; GREEK CAPITAL LETTER OMICRON
+        (?\\e,FP\e(B . ?\x03A0) ;; GREEK CAPITAL LETTER PI
+        (?\\e,FQ\e(B . ?\x03A1) ;; GREEK CAPITAL LETTER RHO
+        (?\\e,FS\e(B . ?\x03A3) ;; GREEK CAPITAL LETTER SIGMA
+        (?\\e,FT\e(B . ?\x03A4) ;; GREEK CAPITAL LETTER TAU
+        (?\\e,FU\e(B . ?\x03A5) ;; GREEK CAPITAL LETTER UPSILON
+        (?\\e,FV\e(B . ?\x03A6) ;; GREEK CAPITAL LETTER PHI
+        (?\\e,FW\e(B . ?\x03A7) ;; GREEK CAPITAL LETTER CHI
+        (?\\e,FX\e(B . ?\x03A8) ;; GREEK CAPITAL LETTER PSI
+        (?\\e,FY\e(B . ?\x03A9) ;; GREEK CAPITAL LETTER OMEGA
+        (?\\e,FZ\e(B . ?\x03AA) ;; GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+        (?\\e,F[\e(B . ?\x03AB) ;; GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+        (?\\e,F\\e(B . ?\x03AC) ;; GREEK SMALL LETTER ALPHA WITH TONOS
+        (?\\e,F]\e(B . ?\x03AD) ;; GREEK SMALL LETTER EPSILON WITH TONOS
+        (?\\e,F^\e(B . ?\x03AE) ;; GREEK SMALL LETTER ETA WITH TONOS
+        (?\\e,F_\e(B . ?\x03AF) ;; GREEK SMALL LETTER IOTA WITH TONOS
+        (?\\e,F`\e(B . ?\x03B0) ;; GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+        (?\\e,Fa\e(B . ?\x03B1) ;; GREEK SMALL LETTER ALPHA
+        (?\\e,Fb\e(B . ?\x03B2) ;; GREEK SMALL LETTER BETA
+        (?\\e,Fc\e(B . ?\x03B3) ;; GREEK SMALL LETTER GAMMA
+        (?\\e,Fd\e(B . ?\x03B4) ;; GREEK SMALL LETTER DELTA
+        (?\\e,Fe\e(B . ?\x03B5) ;; GREEK SMALL LETTER EPSILON
+        (?\\e,Ff\e(B . ?\x03B6) ;; GREEK SMALL LETTER ZETA
+        (?\\e,Fg\e(B . ?\x03B7) ;; GREEK SMALL LETTER ETA
+        (?\\e,Fh\e(B . ?\x03B8) ;; GREEK SMALL LETTER THETA
+        (?\\e,Fi\e(B . ?\x03B9) ;; GREEK SMALL LETTER IOTA
+        (?\\e,Fj\e(B . ?\x03BA) ;; GREEK SMALL LETTER KAPPA
+        (?\\e,Fk\e(B . ?\x03BB) ;; GREEK SMALL LETTER LAMDA
+        (?\\e,Fl\e(B . ?\x03BC) ;; GREEK SMALL LETTER MU
+        (?\\e,Fm\e(B . ?\x03BD) ;; GREEK SMALL LETTER NU
+        (?\\e,Fn\e(B . ?\x03BE) ;; GREEK SMALL LETTER XI
+        (?\\e,Fo\e(B . ?\x03BF) ;; GREEK SMALL LETTER OMICRON
+        (?\\e,Fp\e(B . ?\x03C0) ;; GREEK SMALL LETTER PI
+        (?\\e,Fq\e(B . ?\x03C1) ;; GREEK SMALL LETTER RHO
+        (?\\e,Fr\e(B . ?\x03C2) ;; GREEK SMALL LETTER FINAL SIGMA
+        (?\\e,Fs\e(B . ?\x03C3) ;; GREEK SMALL LETTER SIGMA
+        (?\\e,Ft\e(B . ?\x03C4) ;; GREEK SMALL LETTER TAU
+        (?\\e,Fu\e(B . ?\x03C5) ;; GREEK SMALL LETTER UPSILON
+        (?\\e,Fv\e(B . ?\x03C6) ;; GREEK SMALL LETTER PHI
+        (?\\e,Fw\e(B . ?\x03C7) ;; GREEK SMALL LETTER CHI
+        (?\\e,Fx\e(B . ?\x03C8) ;; GREEK SMALL LETTER PSI
+        (?\\e,Fy\e(B . ?\x03C9) ;; GREEK SMALL LETTER OMEGA
+        (?\\e,Fz\e(B . ?\x03CA) ;; GREEK SMALL LETTER IOTA WITH DIALYTIKA
+        (?\\e,F{\e(B . ?\x03CB) ;; GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+        (?\\e,F|\e(B . ?\x03CC) ;; GREEK SMALL LETTER OMICRON WITH TONOS
+        (?\\e,F}\e(B . ?\x03CD) ;; GREEK SMALL LETTER UPSILON WITH TONOS
+        (?\\e,F~\e(B . ?\x03CE) ;; GREEK SMALL LETTER OMEGA WITH TONOS
+        ))
+
+      (ucs-8859-8-alist
+       '((?\\e,H \e(B . ?\x00A0) ;; NO-BREAK SPACE
+        (?\\e,H"\e(B . ?\x00A2) ;; CENT SIGN
+        (?\\e,H#\e(B . ?\x00A3) ;; POUND SIGN
+        (?\\e,H$\e(B . ?\x00A4) ;; CURRENCY SIGN
+        (?\\e,H%\e(B . ?\x00A5) ;; YEN SIGN
+        (?\\e,H&\e(B . ?\x00A6) ;; BROKEN BAR
+        (?\\e,H'\e(B . ?\x00A7) ;; SECTION SIGN
+        (?\\e,H(\e(B . ?\x00A8) ;; DIAERESIS
+        (?\\e,H)\e(B . ?\x00A9) ;; COPYRIGHT SIGN
+        (?\\e,H*\e(B . ?\x00D7) ;; MULTIPLICATION SIGN
+        (?\\e,H+\e(B . ?\x00AB) ;; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        (?\\e,H,\e(B . ?\x00AC) ;; NOT SIGN
+        (?\\e,H-\e(B . ?\x00AD) ;; SOFT HYPHEN
+        (?\\e,H.\e(B . ?\x00AE) ;; REGISTERED SIGN
+        (?\\e,H/\e(B . ?\x00AF) ;; MACRON
+        (?\\e,H0\e(B . ?\x00B0) ;; DEGREE SIGN
+        (?\\e,H1\e(B . ?\x00B1) ;; PLUS-MINUS SIGN
+        (?\\e,H2\e(B . ?\x00B2) ;; SUPERSCRIPT TWO
+        (?\\e,H3\e(B . ?\x00B3) ;; SUPERSCRIPT THREE
+        (?\\e,H4\e(B . ?\x00B4) ;; ACUTE ACCENT
+        (?\\e,H5\e(B . ?\x00B5) ;; MICRO SIGN
+        (?\\e,H6\e(B . ?\x00B6) ;; PILCROW SIGN
+        (?\\e,H7\e(B . ?\x00B7) ;; MIDDLE DOT
+        (?\\e,H8\e(B . ?\x00B8) ;; CEDILLA
+        (?\\e,H9\e(B . ?\x00B9) ;; SUPERSCRIPT ONE
+        (?\\e,H:\e(B . ?\x00F7) ;; DIVISION SIGN
+        (?\\e,H;\e(B . ?\x00BB) ;; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        (?\\e,H<\e(B . ?\x00BC) ;; VULGAR FRACTION ONE QUARTER
+        (?\\e,H=\e(B . ?\x00BD) ;; VULGAR FRACTION ONE HALF
+        (?\\e,H>\e(B . ?\x00BE) ;; VULGAR FRACTION THREE QUARTERS
+        ;; These are commented out since the current 8859-8 standard
+        ;; does not yet define these codepoints, although there are
+        ;; drafts which do).
+;       (?\\e,H@\e(B . ?\x05B0) ;; HEBREW POINT SHEVA
+;       (?\\e,HA\e(B . ?\x05B1) ;; HEBREW POINT HATAF SEGOL
+;       (?\\e,HB\e(B . ?\x05B2) ;; HEBREW POINT HATAF PATAH
+;       (?\\e,HC\e(B . ?\x05B3) ;; HEBREW POINT HATAF QAMATS
+;       (?\\e,HD\e(B . ?\x05B4) ;; HEBREW POINT HIRIQ
+;       (?\\e,HE\e(B . ?\x05B5) ;; HEBREW POINT TSERE
+;       (?\\e,HF\e(B . ?\x05B6) ;; HEBREW POINT SEGOL
+;       (?\\e,HG\e(B . ?\x05B7) ;; HEBREW POINT PATAH
+;       (?\\e,HH\e(B . ?\x05B8) ;; HEBREW POINT QAMATS
+;       (?\\e,HI\e(B . ?\x05B9) ;; HEBREW POINT HOLAM
+;       (?\\e,HK\e(B . ?\x05BB) ;; HEBREW POINT QUBUTS
+;       (?\\e,HL\e(B . ?\x05BC) ;; HEBREW POINT DAGESH
+;       (?\\e,HM\e(B . ?\x05BD) ;; HEBREW POINT METEG
+;       (?\\e,HN\e(B . ?\x05BE) ;; HEBREW POINT MAQAF
+;       (?\\e,HO\e(B . ?\x05BF) ;; HEBREW POINT RAFE
+;       (?\\e,HP\e(B . ?\x05C0) ;; HEBREW PUNCTUATION PASEQ
+;       (?\\e,HQ\e(B . ?\x05C1) ;; HEBREW POINT SHIN DOT
+;       (?\\e,HR\e(B . ?\x05C2) ;; HEBREW POINT SIN DOT
+;       (?\\e,HS\e(B . ?\x05C3) ;; HEBREW PUNCTUATION SOF PASUQ
+        (?\\e,H[\e(B . ?\x202D) ;; LEFT-TO-RIGHT OVERRIDE
+        (?\\e,H\\e(B . ?\x202E) ;; RIGHT-TO-LEFT OVERRIDE
+        (?\\e,H]\e(B . ?\x202C) ;; POP DIRECTIONAL FORMATTING
+        (?\\e,H_\e(B . ?\x2017) ;; DOUBLE LOW LINE
+        (?\\e,H`\e(B . ?\x05D0) ;; HEBREW LETTER ALEF
+        (?\\e,Ha\e(B . ?\x05D1) ;; HEBREW LETTER BET
+        (?\\e,Hb\e(B . ?\x05D2) ;; HEBREW LETTER GIMEL
+        (?\\e,Hc\e(B . ?\x05D3) ;; HEBREW LETTER DALET
+        (?\\e,Hd\e(B . ?\x05D4) ;; HEBREW LETTER HE
+        (?\\e,He\e(B . ?\x05D5) ;; HEBREW LETTER VAV
+        (?\\e,Hf\e(B . ?\x05D6) ;; HEBREW LETTER ZAYIN
+        (?\\e,Hg\e(B . ?\x05D7) ;; HEBREW LETTER HET
+        (?\\e,Hh\e(B . ?\x05D8) ;; HEBREW LETTER TET
+        (?\\e,Hi\e(B . ?\x05D9) ;; HEBREW LETTER YOD
+        (?\\e,Hj\e(B . ?\x05DA) ;; HEBREW LETTER FINAL KAF
+        (?\\e,Hk\e(B . ?\x05DB) ;; HEBREW LETTER KAF
+        (?\\e,Hl\e(B . ?\x05DC) ;; HEBREW LETTER LAMED
+        (?\\e,Hm\e(B . ?\x05DD) ;; HEBREW LETTER FINAL MEM
+        (?\\e,Hn\e(B . ?\x05DE) ;; HEBREW LETTER MEM
+        (?\\e,Ho\e(B . ?\x05DF) ;; HEBREW LETTER FINAL NUN
+        (?\\e,Hp\e(B . ?\x05E0) ;; HEBREW LETTER NUN
+        (?\\e,Hq\e(B . ?\x05E1) ;; HEBREW LETTER SAMEKH
+        (?\\e,Hr\e(B . ?\x05E2) ;; HEBREW LETTER AYIN
+        (?\\e,Hs\e(B . ?\x05E3) ;; HEBREW LETTER FINAL PE
+        (?\\e,Ht\e(B . ?\x05E4) ;; HEBREW LETTER PE
+        (?\\e,Hu\e(B . ?\x05E5) ;; HEBREW LETTER FINAL TSADI
+        (?\\e,Hv\e(B . ?\x05E6) ;; HEBREW LETTER TSADI
+        (?\\e,Hw\e(B . ?\x05E7) ;; HEBREW LETTER QOF
+        (?\\e,Hx\e(B . ?\x05E8) ;; HEBREW LETTER RESH
+        (?\\e,Hy\e(B . ?\x05E9) ;; HEBREW LETTER SHIN
+        (?\\e,Hz\e(B . ?\x05EA) ;; HEBREW LETTER TAV
+        (?\\e,H{\e(B . ?\x202A) ;; LEFT-TO-RIGHT EMBEDDING
+        (?\\e,H|\e(B . ?\x202B) ;; RIGHT-TO-LEFT EMBEDDING
+        (?\\e,H}\e(B . ?\x200E) ;; LEFT-TO-RIGHT MARK
+        (?\\e,H~\e(B . ?\x200F) ;; RIGHT-TO-LEFT MARK
+        ))
+
+      (ucs-8859-9-alist
+       '((?\\e,M \e(B . ?\x00A0) ;; NO-BREAK SPACE
+        (?\\e,M!\e(B . ?\x00A1) ;; INVERTED EXCLAMATION MARK
+        (?\\e,M"\e(B . ?\x00A2) ;; CENT SIGN
+        (?\\e,M#\e(B . ?\x00A3) ;; POUND SIGN
+        (?\\e,M$\e(B . ?\x00A4) ;; CURRENCY SIGN
+        (?\\e,M%\e(B . ?\x00A5) ;; YEN SIGN
+        (?\\e,M&\e(B . ?\x00A6) ;; BROKEN BAR
+        (?\\e,M'\e(B . ?\x00A7) ;; SECTION SIGN
+        (?\\e,M(\e(B . ?\x00A8) ;; DIAERESIS
+        (?\\e,M)\e(B . ?\x00A9) ;; COPYRIGHT SIGN
+        (?\\e,M*\e(B . ?\x00AA) ;; FEMININE ORDINAL INDICATOR
+        (?\\e,M+\e(B . ?\x00AB) ;; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        (?\\e,M,\e(B . ?\x00AC) ;; NOT SIGN
+        (?\\e,M-\e(B . ?\x00AD) ;; SOFT HYPHEN
+        (?\\e,M.\e(B . ?\x00AE) ;; REGISTERED SIGN
+        (?\\e,M/\e(B . ?\x00AF) ;; MACRON
+        (?\\e,M0\e(B . ?\x00B0) ;; DEGREE SIGN
+        (?\\e,M1\e(B . ?\x00B1) ;; PLUS-MINUS SIGN
+        (?\\e,M2\e(B . ?\x00B2) ;; SUPERSCRIPT TWO
+        (?\\e,M3\e(B . ?\x00B3) ;; SUPERSCRIPT THREE
+        (?\\e,M4\e(B . ?\x00B4) ;; ACUTE ACCENT
+        (?\\e,M5\e(B . ?\x00B5) ;; MICRO SIGN
+        (?\\e,M6\e(B . ?\x00B6) ;; PILCROW SIGN
+        (?\\e,M7\e(B . ?\x00B7) ;; MIDDLE DOT
+        (?\\e,M8\e(B . ?\x00B8) ;; CEDILLA
+        (?\\e,M9\e(B . ?\x00B9) ;; SUPERSCRIPT ONE
+        (?\\e,M:\e(B . ?\x00BA) ;; MASCULINE ORDINAL INDICATOR
+        (?\\e,M;\e(B . ?\x00BB) ;; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        (?\\e,M<\e(B . ?\x00BC) ;; VULGAR FRACTION ONE QUARTER
+        (?\\e,M=\e(B . ?\x00BD) ;; VULGAR FRACTION ONE HALF
+        (?\\e,M>\e(B . ?\x00BE) ;; VULGAR FRACTION THREE QUARTERS
+        (?\\e,M?\e(B . ?\x00BF) ;; INVERTED QUESTION MARK
+        (?\\e,M@\e(B . ?\x00C0) ;; LATIN CAPITAL LETTER A WITH GRAVE
+        (?\\e,MA\e(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE
+        (?\\e,MB\e(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+        (?\\e,MC\e(B . ?\x00C3) ;; LATIN CAPITAL LETTER A WITH TILDE
+        (?\\e,MD\e(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS
+        (?\\e,ME\e(B . ?\x00C5) ;; LATIN CAPITAL LETTER A WITH RING ABOVE
+        (?\\e,MF\e(B . ?\x00C6) ;; LATIN CAPITAL LETTER AE
+        (?\\e,MG\e(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA
+        (?\\e,MH\e(B . ?\x00C8) ;; LATIN CAPITAL LETTER E WITH GRAVE
+        (?\\e,MI\e(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE
+        (?\\e,MJ\e(B . ?\x00CA) ;; LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+        (?\\e,MK\e(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS
+        (?\\e,ML\e(B . ?\x00CC) ;; LATIN CAPITAL LETTER I WITH GRAVE
+        (?\\e,MM\e(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE
+        (?\\e,MN\e(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+        (?\\e,MO\e(B . ?\x00CF) ;; LATIN CAPITAL LETTER I WITH DIAERESIS
+        (?\\e,MP\e(B . ?\x011E) ;; LATIN CAPITAL LETTER G WITH BREVE
+        (?\\e,MQ\e(B . ?\x00D1) ;; LATIN CAPITAL LETTER N WITH TILDE
+        (?\\e,MR\e(B . ?\x00D2) ;; LATIN CAPITAL LETTER O WITH GRAVE
+        (?\\e,MS\e(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE
+        (?\\e,MT\e(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+        (?\\e,MU\e(B . ?\x00D5) ;; LATIN CAPITAL LETTER O WITH TILDE
+        (?\\e,MV\e(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS
+        (?\\e,MW\e(B . ?\x00D7) ;; MULTIPLICATION SIGN
+        (?\\e,MX\e(B . ?\x00D8) ;; LATIN CAPITAL LETTER O WITH STROKE
+        (?\\e,MY\e(B . ?\x00D9) ;; LATIN CAPITAL LETTER U WITH GRAVE
+        (?\\e,MZ\e(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE
+        (?\\e,M[\e(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+        (?\\e,M\\e(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS
+        (?\\e,M]\e(B . ?\x0130) ;; LATIN CAPITAL LETTER I WITH DOT ABOVE
+        (?\\e,M^\e(B . ?\x015E) ;; LATIN CAPITAL LETTER S WITH CEDILLA
+        (?\\e,M_\e(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S
+        (?\\e,M`\e(B . ?\x00E0) ;; LATIN SMALL LETTER A WITH GRAVE
+        (?\\e,Ma\e(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE
+        (?\\e,Mb\e(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX
+        (?\\e,Mc\e(B . ?\x00E3) ;; LATIN SMALL LETTER A WITH TILDE
+        (?\\e,Md\e(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS
+        (?\\e,Me\e(B . ?\x00E5) ;; LATIN SMALL LETTER A WITH RING ABOVE
+        (?\\e,Mf\e(B . ?\x00E6) ;; LATIN SMALL LETTER AE
+        (?\\e,Mg\e(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA
+        (?\\e,Mh\e(B . ?\x00E8) ;; LATIN SMALL LETTER E WITH GRAVE
+        (?\\e,Mi\e(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE
+        (?\\e,Mj\e(B . ?\x00EA) ;; LATIN SMALL LETTER E WITH CIRCUMFLEX
+        (?\\e,Mk\e(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS
+        (?\\e,Ml\e(B . ?\x00EC) ;; LATIN SMALL LETTER I WITH GRAVE
+        (?\\e,Mm\e(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE
+        (?\\e,Mn\e(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX
+        (?\\e,Mo\e(B . ?\x00EF) ;; LATIN SMALL LETTER I WITH DIAERESIS
+        (?\\e,Mp\e(B . ?\x011F) ;; LATIN SMALL LETTER G WITH BREVE
+        (?\\e,Mq\e(B . ?\x00F1) ;; LATIN SMALL LETTER N WITH TILDE
+        (?\\e,Mr\e(B . ?\x00F2) ;; LATIN SMALL LETTER O WITH GRAVE
+        (?\\e,Ms\e(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE
+        (?\\e,Mt\e(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX
+        (?\\e,Mu\e(B . ?\x00F5) ;; LATIN SMALL LETTER O WITH TILDE
+        (?\\e,Mv\e(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS
+        (?\\e,Mw\e(B . ?\x00F7) ;; DIVISION SIGN
+        (?\\e,Mx\e(B . ?\x00F8) ;; LATIN SMALL LETTER O WITH STROKE
+        (?\\e,My\e(B . ?\x00F9) ;; LATIN SMALL LETTER U WITH GRAVE
+        (?\\e,Mz\e(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE
+        (?\\e,M{\e(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX
+        (?\\e,M|\e(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS
+        (?\\e,M}\e(B . ?\x0131) ;; LATIN SMALL LETTER DOTLESS I
+        (?\\e,M~\e(B . ?\x015F) ;; LATIN SMALL LETTER S WITH CEDILLA
+        (?\\e,M\7f\e(B . ?\x00FF) ;; LATIN SMALL LETTER Y WITH DIAERESIS
+        ))
+
+      (ucs-8859-14-alist
+       '((?\\e,_ \e(B . ?\x00A0) ;; NO-BREAK SPACE
+        (?\\e,_!\e(B . ?\x1E02) ;; LATIN CAPITAL LETTER B WITH DOT ABOVE
+        (?\\e,_"\e(B . ?\x1E03) ;; LATIN SMALL LETTER B WITH DOT ABOVE
+        (?\\e,_#\e(B . ?\x00A3) ;; POUND SIGN
+        (?\\e,_$\e(B . ?\x010A) ;; LATIN CAPITAL LETTER C WITH DOT ABOVE
+        (?\\e,_%\e(B . ?\x010B) ;; LATIN SMALL LETTER C WITH DOT ABOVE
+        (?\\e,_&\e(B . ?\x1E0A) ;; LATIN CAPITAL LETTER D WITH DOT ABOVE
+        (?\\e,_'\e(B . ?\x00A7) ;; SECTION SIGN
+        (?\\e,_(\e(B . ?\x1E80) ;; LATIN CAPITAL LETTER W WITH GRAVE
+        (?\\e,_)\e(B . ?\x00A9) ;; COPYRIGHT SIGN
+        (?\\e,_*\e(B . ?\x1E82) ;; LATIN CAPITAL LETTER W WITH ACUTE
+        (?\\e,_+\e(B . ?\x1E0B) ;; LATIN SMALL LETTER D WITH DOT ABOVE
+        (?\\e,_,\e(B . ?\x1EF2) ;; LATIN CAPITAL LETTER Y WITH GRAVE
+        (?\\e,_-\e(B . ?\x00AD) ;; SOFT HYPHEN
+        (?\\e,_.\e(B . ?\x00AE) ;; REGISTERED SIGN
+        (?\\e,_/\e(B . ?\x0178) ;; LATIN CAPITAL LETTER Y WITH DIAERESIS
+        (?\\e,_0\e(B . ?\x1E1E) ;; LATIN CAPITAL LETTER F WITH DOT ABOVE
+        (?\\e,_1\e(B . ?\x1E1F) ;; LATIN SMALL LETTER F WITH DOT ABOVE
+        (?\\e,_2\e(B . ?\x0120) ;; LATIN CAPITAL LETTER G WITH DOT ABOVE
+        (?\\e,_3\e(B . ?\x0121) ;; LATIN SMALL LETTER G WITH DOT ABOVE
+        (?\\e,_4\e(B . ?\x1E40) ;; LATIN CAPITAL LETTER M WITH DOT ABOVE
+        (?\\e,_5\e(B . ?\x1E41) ;; LATIN SMALL LETTER M WITH DOT ABOVE
+        (?\\e,_6\e(B . ?\x00B6) ;; PILCROW SIGN
+        (?\\e,_7\e(B . ?\x1E56) ;; LATIN CAPITAL LETTER P WITH DOT ABOVE
+        (?\\e,_8\e(B . ?\x1E81) ;; LATIN SMALL LETTER W WITH GRAVE
+        (?\\e,_9\e(B . ?\x1E57) ;; LATIN SMALL LETTER P WITH DOT ABOVE
+        (?\\e,_:\e(B . ?\x1E83) ;; LATIN SMALL LETTER W WITH ACUTE
+        (?\\e,_;\e(B . ?\x1E60) ;; LATIN CAPITAL LETTER S WITH DOT ABOVE
+        (?\\e,_<\e(B . ?\x1EF3) ;; LATIN SMALL LETTER Y WITH GRAVE
+        (?\\e,_=\e(B . ?\x1E84) ;; LATIN CAPITAL LETTER W WITH DIAERESIS
+        (?\\e,_>\e(B . ?\x1E85) ;; LATIN SMALL LETTER W WITH DIAERESIS
+        (?\\e,_?\e(B . ?\x1E61) ;; LATIN SMALL LETTER S WITH DOT ABOVE
+        (?\\e,_@\e(B . ?\x00C0) ;; LATIN CAPITAL LETTER A WITH GRAVE
+        (?\\e,_A\e(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE
+        (?\\e,_B\e(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+        (?\\e,_C\e(B . ?\x00C3) ;; LATIN CAPITAL LETTER A WITH TILDE
+        (?\\e,_D\e(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS
+        (?\\e,_E\e(B . ?\x00C5) ;; LATIN CAPITAL LETTER A WITH RING ABOVE
+        (?\\e,_F\e(B . ?\x00C6) ;; LATIN CAPITAL LETTER AE
+        (?\\e,_G\e(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA
+        (?\\e,_H\e(B . ?\x00C8) ;; LATIN CAPITAL LETTER E WITH GRAVE
+        (?\\e,_I\e(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE
+        (?\\e,_J\e(B . ?\x00CA) ;; LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+        (?\\e,_K\e(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS
+        (?\\e,_L\e(B . ?\x00CC) ;; LATIN CAPITAL LETTER I WITH GRAVE
+        (?\\e,_M\e(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE
+        (?\\e,_N\e(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+        (?\\e,_O\e(B . ?\x00CF) ;; LATIN CAPITAL LETTER I WITH DIAERESIS
+        (?\\e,_P\e(B . ?\x0174) ;; LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+        (?\\e,_Q\e(B . ?\x00D1) ;; LATIN CAPITAL LETTER N WITH TILDE
+        (?\\e,_R\e(B . ?\x00D2) ;; LATIN CAPITAL LETTER O WITH GRAVE
+        (?\\e,_S\e(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE
+        (?\\e,_T\e(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+        (?\\e,_U\e(B . ?\x00D5) ;; LATIN CAPITAL LETTER O WITH TILDE
+        (?\\e,_V\e(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS
+        (?\\e,_W\e(B . ?\x1E6A) ;; LATIN CAPITAL LETTER T WITH DOT ABOVE
+        (?\\e,_X\e(B . ?\x00D8) ;; LATIN CAPITAL LETTER O WITH STROKE
+        (?\\e,_Y\e(B . ?\x00D9) ;; LATIN CAPITAL LETTER U WITH GRAVE
+        (?\\e,_Z\e(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE
+        (?\\e,_[\e(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+        (?\\e,_\\e(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS
+        (?\\e,_]\e(B . ?\x00DD) ;; LATIN CAPITAL LETTER Y WITH ACUTE
+        (?\\e,_^\e(B . ?\x0176) ;; LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+        (?\\e,__\e(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S
+        (?\\e,_`\e(B . ?\x00E0) ;; LATIN SMALL LETTER A WITH GRAVE
+        (?\\e,_a\e(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE
+        (?\\e,_b\e(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX
+        (?\\e,_c\e(B . ?\x00E3) ;; LATIN SMALL LETTER A WITH TILDE
+        (?\\e,_d\e(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS
+        (?\\e,_e\e(B . ?\x00E5) ;; LATIN SMALL LETTER A WITH RING ABOVE
+        (?\\e,_f\e(B . ?\x00E6) ;; LATIN SMALL LETTER AE
+        (?\\e,_g\e(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA
+        (?\\e,_h\e(B . ?\x00E8) ;; LATIN SMALL LETTER E WITH GRAVE
+        (?\\e,_i\e(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE
+        (?\\e,_j\e(B . ?\x00EA) ;; LATIN SMALL LETTER E WITH CIRCUMFLEX
+        (?\\e,_k\e(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS
+        (?\\e,_l\e(B . ?\x00EC) ;; LATIN SMALL LETTER I WITH GRAVE
+        (?\\e,_m\e(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE
+        (?\\e,_n\e(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX
+        (?\\e,_o\e(B . ?\x00EF) ;; LATIN SMALL LETTER I WITH DIAERESIS
+        (?\\e,_p\e(B . ?\x0175) ;; LATIN SMALL LETTER W WITH CIRCUMFLEX
+        (?\\e,_q\e(B . ?\x00F1) ;; LATIN SMALL LETTER N WITH TILDE
+        (?\\e,_r\e(B . ?\x00F2) ;; LATIN SMALL LETTER O WITH GRAVE
+        (?\\e,_s\e(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE
+        (?\\e,_t\e(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX
+        (?\\e,_u\e(B . ?\x00F5) ;; LATIN SMALL LETTER O WITH TILDE
+        (?\\e,_v\e(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS
+        (?\\e,_w\e(B . ?\x1E6B) ;; LATIN SMALL LETTER T WITH DOT ABOVE
+        (?\\e,_x\e(B . ?\x00F8) ;; LATIN SMALL LETTER O WITH STROKE
+        (?\\e,_y\e(B . ?\x00F9) ;; LATIN SMALL LETTER U WITH GRAVE
+        (?\\e,_z\e(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE
+        (?\\e,_{\e(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX
+        (?\\e,_|\e(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS
+        (?\\e,_}\e(B . ?\x00FD) ;; LATIN SMALL LETTER Y WITH ACUTE
+        (?\\e,_~\e(B . ?\x0177) ;; LATIN SMALL LETTER Y WITH CIRCUMFLEX
+        (?\\e,_\7f\e(B . ?\x00FF) ;; LATIN SMALL LETTER Y WITH DIAERESIS
+        ))
+
+      (ucs-8859-15-alist
+       '((?\\e,b \e(B . ?\x00A0) ;; NO-BREAK SPACE
+        (?\\e,b!\e(B . ?\x00A1) ;; INVERTED EXCLAMATION MARK
+        (?\\e,b"\e(B . ?\x00A2) ;; CENT SIGN
+        (?\\e,b#\e(B . ?\x00A3) ;; POUND SIGN
+        (?\\e,b$\e(B . ?\x20AC) ;; EURO SIGN
+        (?\\e,b%\e(B . ?\x00A5) ;; YEN SIGN
+        (?\\e,b&\e(B . ?\x0160) ;; LATIN CAPITAL LETTER S WITH CARON
+        (?\\e,b'\e(B . ?\x00A7) ;; SECTION SIGN
+        (?\\e,b(\e(B . ?\x0161) ;; LATIN SMALL LETTER S WITH CARON
+        (?\\e,b)\e(B . ?\x00A9) ;; COPYRIGHT SIGN
+        (?\\e,b*\e(B . ?\x00AA) ;; FEMININE ORDINAL INDICATOR
+        (?\\e,b+\e(B . ?\x00AB) ;; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        (?\\e,b,\e(B . ?\x00AC) ;; NOT SIGN
+        (?\\e,b-\e(B . ?\x00AD) ;; SOFT HYPHEN
+        (?\\e,b.\e(B . ?\x00AE) ;; REGISTERED SIGN
+        (?\\e,b/\e(B . ?\x00AF) ;; MACRON
+        (?\\e,b0\e(B . ?\x00B0) ;; DEGREE SIGN
+        (?\\e,b1\e(B . ?\x00B1) ;; PLUS-MINUS SIGN
+        (?\\e,b2\e(B . ?\x00B2) ;; SUPERSCRIPT TWO
+        (?\\e,b3\e(B . ?\x00B3) ;; SUPERSCRIPT THREE
+        (?\\e,b4\e(B . ?\x017D) ;; LATIN CAPITAL LETTER Z WITH CARON
+        (?\\e,b5\e(B . ?\x00B5) ;; MICRO SIGN
+        (?\\e,b6\e(B . ?\x00B6) ;; PILCROW SIGN
+        (?\\e,b7\e(B . ?\x00B7) ;; MIDDLE DOT
+        (?\\e,b8\e(B . ?\x017E) ;; LATIN SMALL LETTER Z WITH CARON
+        (?\\e,b9\e(B . ?\x00B9) ;; SUPERSCRIPT ONE
+        (?\\e,b:\e(B . ?\x00BA) ;; MASCULINE ORDINAL INDICATOR
+        (?\\e,b;\e(B . ?\x00BB) ;; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        (?\\e,b<\e(B . ?\x0152) ;; LATIN CAPITAL LIGATURE OE
+        (?\\e,b=\e(B . ?\x0153) ;; LATIN SMALL LIGATURE OE
+        (?\\e,b>\e(B . ?\x0178) ;; LATIN CAPITAL LETTER Y WITH DIAERESIS
+        (?\\e,b?\e(B . ?\x00BF) ;; INVERTED QUESTION MARK
+        (?\\e,b@\e(B . ?\x00C0) ;; LATIN CAPITAL LETTER A WITH GRAVE
+        (?\\e,bA\e(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE
+        (?\\e,bB\e(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+        (?\\e,bC\e(B . ?\x00C3) ;; LATIN CAPITAL LETTER A WITH TILDE
+        (?\\e,bD\e(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS
+        (?\\e,bE\e(B . ?\x00C5) ;; LATIN CAPITAL LETTER A WITH RING ABOVE
+        (?\\e,bF\e(B . ?\x00C6) ;; LATIN CAPITAL LETTER AE
+        (?\\e,bG\e(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA
+        (?\\e,bH\e(B . ?\x00C8) ;; LATIN CAPITAL LETTER E WITH GRAVE
+        (?\\e,bI\e(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE
+        (?\\e,bJ\e(B . ?\x00CA) ;; LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+        (?\\e,bK\e(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS
+        (?\\e,bL\e(B . ?\x00CC) ;; LATIN CAPITAL LETTER I WITH GRAVE
+        (?\\e,bM\e(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE
+        (?\\e,bN\e(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+        (?\\e,bO\e(B . ?\x00CF) ;; LATIN CAPITAL LETTER I WITH DIAERESIS
+        (?\\e,bP\e(B . ?\x00D0) ;; LATIN CAPITAL LETTER ETH
+        (?\\e,bQ\e(B . ?\x00D1) ;; LATIN CAPITAL LETTER N WITH TILDE
+        (?\\e,bR\e(B . ?\x00D2) ;; LATIN CAPITAL LETTER O WITH GRAVE
+        (?\\e,bS\e(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE
+        (?\\e,bT\e(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+        (?\\e,bU\e(B . ?\x00D5) ;; LATIN CAPITAL LETTER O WITH TILDE
+        (?\\e,bV\e(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS
+        (?\\e,bW\e(B . ?\x00D7) ;; MULTIPLICATION SIGN
+        (?\\e,bX\e(B . ?\x00D8) ;; LATIN CAPITAL LETTER O WITH STROKE
+        (?\\e,bY\e(B . ?\x00D9) ;; LATIN CAPITAL LETTER U WITH GRAVE
+        (?\\e,bZ\e(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE
+        (?\\e,b[\e(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+        (?\\e,b\\e(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS
+        (?\\e,b]\e(B . ?\x00DD) ;; LATIN CAPITAL LETTER Y WITH ACUTE
+        (?\\e,b^\e(B . ?\x00DE) ;; LATIN CAPITAL LETTER THORN
+        (?\\e,b_\e(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S
+        (?\\e,b`\e(B . ?\x00E0) ;; LATIN SMALL LETTER A WITH GRAVE
+        (?\\e,ba\e(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE
+        (?\\e,bb\e(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX
+        (?\\e,bc\e(B . ?\x00E3) ;; LATIN SMALL LETTER A WITH TILDE
+        (?\\e,bd\e(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS
+        (?\\e,be\e(B . ?\x00E5) ;; LATIN SMALL LETTER A WITH RING ABOVE
+        (?\\e,bf\e(B . ?\x00E6) ;; LATIN SMALL LETTER AE
+        (?\\e,bg\e(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA
+        (?\\e,bh\e(B . ?\x00E8) ;; LATIN SMALL LETTER E WITH GRAVE
+        (?\\e,bi\e(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE
+        (?\\e,bj\e(B . ?\x00EA) ;; LATIN SMALL LETTER E WITH CIRCUMFLEX
+        (?\\e,bk\e(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS
+        (?\\e,bl\e(B . ?\x00EC) ;; LATIN SMALL LETTER I WITH GRAVE
+        (?\\e,bm\e(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE
+        (?\\e,bn\e(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX
+        (?\\e,bo\e(B . ?\x00EF) ;; LATIN SMALL LETTER I WITH DIAERESIS
+        (?\\e,bp\e(B . ?\x00F0) ;; LATIN SMALL LETTER ETH
+        (?\\e,bq\e(B . ?\x00F1) ;; LATIN SMALL LETTER N WITH TILDE
+        (?\\e,br\e(B . ?\x00F2) ;; LATIN SMALL LETTER O WITH GRAVE
+        (?\\e,bs\e(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE
+        (?\\e,bt\e(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX
+        (?\\e,bu\e(B . ?\x00F5) ;; LATIN SMALL LETTER O WITH TILDE
+        (?\\e,bv\e(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS
+        (?\\e,bw\e(B . ?\x00F7) ;; DIVISION SIGN
+        (?\\e,bx\e(B . ?\x00F8) ;; LATIN SMALL LETTER O WITH STROKE
+        (?\\e,by\e(B . ?\x00F9) ;; LATIN SMALL LETTER U WITH GRAVE
+        (?\\e,bz\e(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE
+        (?\\e,b{\e(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX
+        (?\\e,b|\e(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS
+        (?\\e,b}\e(B . ?\x00FD) ;; LATIN SMALL LETTER Y WITH ACUTE
+        (?\\e,b~\e(B . ?\x00FE) ;; LATIN SMALL LETTER THORN
+        (?\\e,b\7f\e(B . ?\x00FF) ;; LATIN SMALL LETTER Y WITH DIAERESIS
+        ))
+
+      (ucs-8859-1-alist
+       (let ((i 160)
+            l)
+        (while (< i 256)
+          (push (cons (make-char 'latin-iso8859-1 (- i 128)) i)
+                l)
+          (setq i (1+ i)))
+        (nreverse l)))
+      
+;;       (case-table (standard-case-table))
+;;       (syntax-table (standard-syntax-table))
+      )
+
+  ;; Convert the lists to the basic char tables.
+  (dolist (n (list 15 14 9 8 7 5 4 3 2 1))
+    (let ((alist (symbol-value (intern (format "ucs-8859-%d-alist" n)))))
+      (dolist (pair alist)
+       (let ((mule (car pair))
+             (uc (cdr pair))
+             (mu (decode-char 'ucs (cdr pair))))
+         (aset ucs-mule-8859-to-ucs-table mule uc)
+         ;;      (aset ucs-ucs-to-mule-8859-table uc mule)
+         ;;      (aset ucs-mule-unicode-to-mule-8859 mu mule)
+         (aset ucs-mule-8859-to-mule-unicode mule mu)
+         (aset ucs-mule-to-mule-unicode mule mu)))
+;; I think this is actually done OK in characters.el.
+;; Probably things like accents shouldn't have word syntax, but the
+;; Latin-N syntax tables currently aren't consistent for such
+;; characters anyhow.
+;;      ;; Make the mule-unicode characters inherit syntax and case info
+;;      ;; if they don't already have it.
+;;      (dolist (pair alist)
+;;     (let ((mule (car pair))
+;;           (uc (cdr pair))
+;;           (mu (decode-char 'ucs (cdr pair))))
+;;       (let ((syntax (aref syntax-table mule)))
+;;         (if (eq mule (downcase mule))
+;;             (if (eq mule (upcase mule)) ; non-letter or uncased letter
+;;                 (progn
+;;                   (if (= 4 (car syntax)) ; left delim
+;;                       (progn
+;;                         (aset syntax-table
+;;                               mu
+;;                               (cons 4 (aref ucs-mule-8859-to-mule-unicode
+;;                                             (cdr syntax))))
+;;                         (aset syntax-table
+;;                               (aref ucs-mule-8859-to-mule-unicode
+;;                                     (cdr syntax))
+;;                               (cons 5 mu)))
+;;                     (aset syntax-table mu syntax))
+;;                   (aset case-table mu mu)))
+;;           ;; Upper case letter
+;;           (let ((lower (aref ucs-mule-8859-to-mule-unicode
+;;                              (aref case-table mule))))
+;;             (aset case-table mu lower)
+;;             (aset case-table lower lower)
+;;             (modify-syntax-entry lower "w   " syntax-table)
+;;             (modify-syntax-entry mu "w   " syntax-table))))))
+      ))
+  ;; Derive tables that can be used as per-coding-system
+  ;; `translation-table-for-encode's.
+  (dolist (n (list 15 14 9 8 7 5 4 3 2 1))
+    (let* ((alist (symbol-value (intern (format "ucs-8859-%d-alist" n))))
+          (encode-translator (set (intern (format "ucs-8859-%d-encode-table"
+                                                  n))
+                                  (make-translation-table)))
+          elt)
+      ;; Start with the mule-unicode component.
+      (dolist (pair alist)
+       (let ((mule (car pair))
+             (mu (decode-char 'ucs (cdr pair))))
+         (aset encode-translator mu mule)))
+      ;; Find characters from other 8859 sets which map to the same
+      ;; unicode as some character in this set.
+      (map-char-table (lambda (k v)
+                       (if (and (setq elt (rassq v alist))
+                                (not (assq k alist)))
+                           (aset encode-translator k (car elt))))
+                     ucs-mule-8859-to-ucs-table))))
+
+;; Register for use in CCL.
+(define-translation-table 'ucs-mule-8859-to-mule-unicode
+  ucs-mule-8859-to-mule-unicode)
+
+;; Fixme: Make this reversible, which means frobbing
+;; `char-coding-system-table' directly to remove what we added -- see
+;; codepages.el.  Also make it a user option.
+(defun ucs-unify-8859 (&optional encode-only)
+  "Set up translation tables for unifying characters from ISO 8859.
+
+On decoding, non-ASCII characters are mapped into the `iso-latin-1'
+and `mule-unicode-0100-24ff' charsets.  On encoding, these are mapped
+back appropriate for the coding system.
+
+With prefix arg, do unification on encoding only, i.e. don't unify
+everything on input operations."
+  (interactive "P")
+  (unless encode-only
+    ;; Unify 8859 on decoding.  (Non-CCL coding systems only.)
+    (set-char-table-parent standard-translation-table-for-decode
+                          ucs-mule-8859-to-mule-unicode))
+  ;; Adjust the 8859 coding systems to fragment the unified characters
+  ;; on encoding.
+  (dolist (n '(1 2 3 4 5 7 8 9 14 15))
+    (let* ((coding-system
+           (coding-system-base (intern (format "iso-8859-%d" n))))
+          (table (symbol-value
+                  (intern (format "ucs-8859-%d-encode-table" n))))
+          (safe (coding-system-get coding-system 'safe-chars)))
+      ;; Actually, the coding system's safe-chars are not normally
+      ;; used after they've been registered, but we might as well
+      ;; record them.  Setting the parent here is a convenience.
+      (set-char-table-parent safe table)
+      ;; Update the table of what encodes to what.
+      (register-char-codings coding-system table)
+      (coding-system-put coding-system 'translation-table-for-encode table)))
+
+;;; The following works for the bundled coding systems, but it's
+;;; better to use the Unicode-based ones and make it irrelevant.
+
+;;;   ;; Update the Cyrillic special cases.
+;;;   ;; `translation-table-for-encode' doesn't work for CCL coding
+;;;   ;; systems, and `standard-translation-table-for-decode' isn't
+;;;   ;; applied.
+;;;   (let ((table (get 'cyrillic-koi8-r-encode-table 'translation-table)))
+;;;     (map-char-table
+;;;      (lambda (k v)
+;;;        (aset table
+;;;         (or (aref ucs-8859-5-encode-table k)
+;;;             k)
+;;;         v))
+;;;      table)
+;;;     (register-char-codings 'cyrillic-koi8 table))
+;;;   (let ((table (get 'cyrillic-koi8-r-nonascii-translation-table
+;;;                'translation-table)))
+;;;     (map-char-table
+;;;      (lambda (k v)
+;;;        (if v (aset table k (or (aref ucs-mule-8859-to-mule-unicode v)
+;;;                           v))))
+;;;      table))
+;;;   ;; Redefine this, since the orginal only translated 8859-5.
+;;;   (define-ccl-program ccl-encode-koi8
+;;;     `(1
+;;;       ((loop
+;;;    (read-multibyte-character r0 r1)
+;;;    (translate-character cyrillic-koi8-r-encode-table r0 r1)
+;;;    (write-repeat r1))))
+;;;     "CCL program to encode KOI8.")
+;;;   (let ((table (get 'cyrillic-alternativnyj-encode-table 'translation-table)))
+;;;     (map-char-table
+;;;      (lambda (k v)
+;;;        (aset table
+;;;         (or (aref ucs-8859-5-encode-table k)
+;;;             k)
+;;;         v))
+;;;      table)
+;;;     (register-char-codings 'cyrillic-alternativnyj table))
+;;;   (let ((table (get 'cyrillic-alternativnyj-nonascii-translation-table
+;;;                'translation-table)))
+;;;     (map-char-table
+;;;      (lambda (k v)
+;;;        (if v (aset table
+;;;               k
+;;;               (or (aref ucs-mule-8859-to-mule-unicode v)
+;;;                   v))))
+;;;      table))
+  )
+
+(defun ucs-fragment-8859 (&optional encode-only)
+  "Undo the unification done by `ucs-unify-8859'.
+With prefix arg, undo unification on encoding only, i.e. don't undo
+unification on input operations."
+  (interactive "P")
+  ;; Maybe fix decoding.
+  (unless encode-only
+    ;; Unify 8859 on decoding.  (Non-CCL coding systems only.)
+    (set-char-table-parent standard-translation-table-for-decode nil))
+  ;; Fix encoding.  For each charset, remove the entries in
+  ;; `char-coding-system-table' added to its safe-chars table (as its
+  ;; parent).
+  (dolist (n '(1 2 3 4 5 7 8 9 14 15))
+    (let* ((coding-system
+           (coding-system-base (intern (format "iso-8859-%d" n))))
+          (table (symbol-value
+                  (intern (format "ucs-8859-%d-encode-table" n))))
+          (safe (coding-system-get coding-system 'safe-chars)))
+      (map-char-table
+       (lambda (key val)
+        (if (and (>= key 128) val)
+            (let ((codings (aref char-coding-system-table key)))
+              (aset char-coding-system-table key
+                    (delq coding-system codings)))))
+       (char-table-parent safe))
+      (set-char-table-parent safe nil)
+      (coding-system-put coding-system 'translation-table-for-encode nil))))
+
+;;;###autoload
+(define-minor-mode unify-8859-on-encoding-mode
+  "Set up translation tables for unifying ISO 8859 characters on encoding.
+
+The ISO 8859 characters sets overlap, e.g. 8859-1 (Latin-1) and
+8859-15 (Latin-9) differ only in a few characters.  Emacs normally
+distinguishes equivalent characters from those ISO-8859 character sets
+which are built in to Emacs.  This behaviour is essentially inherited
+from the European-originated international standards.  Treating them
+equivalently, by translating to and from a single representation is
+called `unification'.  (The `utf-8' coding system treats the
+characters of European scripts in a unified manner.)
+
+In this mode, on encoding -- i.e. output operations -- non-ASCII
+characters from the built-in ISO 8859 and `mule-unicode-0100-24ff'
+charsets are handled automatically by the coding system used if it can
+represent them.  Thus, say, an e-acute from the Latin-1 charset (the
+unified representation) in a buffer saved as Latin-9 will be encoded
+directly to a byte value 233.  By default, in contrast, you would be
+prompted for a general coding system to use for saving the file, which
+can cope with separate Latin-1 and Latin-9 representations of e-acute.
+
+See also command `unify-8859-on-decoding-mode'."
+  :group 'mule
+  :global t
+  :version 21.3                                ; who knows...?
+  :init-value nil
+  (if unify-8859-on-encoding-mode
+      (ucs-unify-8859 t)
+    (ucs-fragment-8859 t)))
+
+;;;###autoload
+(define-minor-mode unify-8859-on-decoding-mode
+  "Set up translation table for unifying ISO 8859 characters on decoding.
+On decoding -- i.e. input operations -- non-ASCII characters from the
+built-in ISO 8859 charsets are unified by mapping them into the
+`iso-latin-1' and `mule-unicode-0100-24ff' charsets.
+
+This sets the parent of `standard-translation-table-for-decode'.
+
+See also command `unify-8859-on-encoding-mode'."
+  :group 'mule
+  :global t
+  :version 21.3                                ; who knows...?
+  :init-value nil
+  (if unify-8859-on-decoding-mode
+      (set-char-table-parent standard-translation-table-for-decode
+                            ucs-mule-8859-to-mule-unicode)
+    (set-char-table-parent standard-translation-table-for-decode nil)))
+
+(defun ucs-insert (arg)
+  "Insert the Emacs character representation of the given Unicode.
+Interactively, prompts for a hex string giving the code."
+  (interactive "sUnicode (hex): ")
+  (insert (decode-char 'ucs (if (integerp arg)
+                               arg
+                             (string-to-number arg 16)))))
+
+;;; Dealing with non-8859 character sets.
+
+;; We only set up translation on encoding to utf-8.  Also translation
+;; tables ucs-CS-encode-table are constructed for some coding systems
+;; CS which could be used as `translation-table-for-encode', currently
+;; for indian-is13194, lao, thai, tibetan-iso-8bit and
+;; vietnamese-viscii.
+
+;; The alists here cover both coding systems (external charsets), like
+;; VISCII, and individual Emacs charsets, like `ipa'.
+(let ((vietnamese-viscii
+       '((?\e,1!\e(B . ?\e$,1o/\e(B)
+        (?\e,1"\e(B . ?\e$,1o1\e(B)
+        (?\e,1#\e(B . ?\e$,1o7\e(B)
+        (?\e,1$\e(B . ?\e$,1o%\e(B)
+        (?\e,1%\e(B . ?\e$,1o'\e(B)
+        (?\e,1&\e(B . ?\e$,1o)\e(B)
+        (?\e,1'\e(B . ?\e$,1o-\e(B)
+        (?\e,1(\e(B . ?\e$,1o=\e(B)
+        (?\e,1)\e(B . ?\e$,1o9\e(B)
+        (?\e,1*\e(B . ?\e$,1o?\e(B)
+        (?\e,1+\e(B . ?\e$,1oA\e(B)
+        (?\e,1,\e(B . ?\e$,1oC\e(B)
+        (?\e,1-\e(B . ?\e$,1oE\e(B)
+        (?\e,1.\e(B . ?\e$,1oG\e(B)
+        (?\e,1/\e(B . ?\e$,1oQ\e(B)
+        (?\e,10\e(B . ?\e$,1oS\e(B)
+        (?\e,11\e(B . ?\e$,1oU\e(B)
+        (?\e,12\e(B . ?\e$,1oW\e(B)
+        (?\e,15\e(B . ?\e$,1oY\e(B)
+        (?\e,16\e(B . ?\e$,1o]\e(B)
+        (?\e,17\e(B . ?\e$,1o_\e(B)
+        (?\e,18\e(B . ?\e$,1oK\e(B)
+        (?\e,1=\e(B . ?\e$,1!a\e(B)
+        (?\e,1>\e(B . ?\e$,1o[\e(B)
+        (?\e,1F\e(B . ?\e$,1o3\e(B)
+        (?\e,1G\e(B . ?\e$,1o5\e(B)
+        (?\e,1O\e(B . ?\e$,1os\e(B)
+        (?\e,1Q\e(B . ?\e$,1oi\e(B)
+        (?\e,1U\e(B . ?\e$,1o!\e(B)
+        (?\e,1V\e(B . ?\e$,1ow\e(B)
+        (?\e,1W\e(B . ?\e$,1ok\e(B)
+        (?\e,1X\e(B . ?\e$,1om\e(B)
+        (?\e,1[\e(B . ?\e$,1oy\e(B)
+        (?\e,1\\e(B . ?\e$,1ou\e(B)
+        (?\e,1^\e(B . ?\e$,1oa\e(B)
+        (?\e,1_\e(B . ?\e$,1!p\e(B)
+        (?\e,1`\e(B . ?\e,A`\e(B)
+        (?\e,1a\e(B . ?\e,Aa\e(B)
+        (?\e,1b\e(B . ?\e,Ab\e(B)
+        (?\e,1c\e(B . ?\e,Ac\e(B)
+        (?\e,1d\e(B . ?\e$,1o#\e(B)
+        (?\e,1e\e(B . ?\e$,1 #\e(B)
+        (?\e,1f\e(B . ?\e$,1oo\e(B)
+        (?\e,1g\e(B . ?\e$,1o+\e(B)
+        (?\e,1h\e(B . ?\e,Ah\e(B)
+        (?\e,1i\e(B . ?\e,Ai\e(B)
+        (?\e,1j\e(B . ?\e,Aj\e(B)
+        (?\e,1k\e(B . ?\e$,1o;\e(B)
+        (?\e,1l\e(B . ?\e,Al\e(B)
+        (?\e,1m\e(B . ?\e,Am\e(B)
+        (?\e,1n\e(B . ?\e$,1 I\e(B)
+        (?\e,1o\e(B . ?\e$,1oI\e(B)
+        (?\e,1p\e(B . ?\e$,1 1\e(B)
+        (?\e,1q\e(B . ?\e$,1oq\e(B)
+        (?\e,1r\e(B . ?\e,Ar\e(B)
+        (?\e,1s\e(B . ?\e,As\e(B)
+        (?\e,1t\e(B . ?\e,At\e(B)
+        (?\e,1u\e(B . ?\e,Au\e(B)
+        (?\e,1v\e(B . ?\e$,1oO\e(B)
+        (?\e,1w\e(B . ?\e$,1oM\e(B)
+        (?\e,1x\e(B . ?\e$,1oe\e(B)
+        (?\e,1y\e(B . ?\e,Ay\e(B)
+        (?\e,1z\e(B . ?\e,Az\e(B)
+        (?\e,1{\e(B . ?\e$,1!)\e(B)
+        (?\e,1|\e(B . ?\e$,1og\e(B)
+        (?\e,1}\e(B . ?\e,A}\e(B)
+        (?\e,1~\e(B . ?\e$,1oc\e(B)
+
+        (?\e,2!\e(B . ?\e$,1o.\e(B)
+        (?\e,2"\e(B . ?\e$,1o0\e(B)
+        (?\e,2#\e(B . ?\e$,1o6\e(B)
+        (?\e,2$\e(B . ?\e$,1o$\e(B)
+        (?\e,2%\e(B . ?\e$,1o&\e(B)
+        (?\e,2&\e(B . ?\e$,1o(\e(B)
+        (?\e,2'\e(B . ?\e$,1o,\e(B)
+        (?\e,2(\e(B . ?\e$,1o<\e(B)
+        (?\e,2)\e(B . ?\e$,1o8\e(B)
+        (?\e,2*\e(B . ?\e$,1o>\e(B)
+        (?\e,2+\e(B . ?\e$,1o@\e(B)
+        (?\e,2,\e(B . ?\e$,1oB\e(B)
+        (?\e,2-\e(B . ?\e$,1oD\e(B)
+        (?\e,2.\e(B . ?\e$,1oF\e(B)
+        (?\e,2/\e(B . ?\e$,1oP\e(B)
+        (?\e,20\e(B . ?\e$,1oR\e(B)
+        (?\e,21\e(B . ?\e$,1oT\e(B)
+        (?\e,22\e(B . ?\e$,1oV\e(B)
+        (?\e,25\e(B . ?\e$,1oX\e(B)
+        (?\e,26\e(B . ?\e$,1o\\e(B)
+        (?\e,27\e(B . ?\e$,1o^\e(B)
+        (?\e,28\e(B . ?\e$,1oJ\e(B)
+        (?\e,2=\e(B . ?\e$,1!`\e(B)
+        (?\e,2>\e(B . ?\e$,1oZ\e(B)
+        (?\e,2F\e(B . ?\e$,1o2\e(B)
+        (?\e,2G\e(B . ?\e$,1o4\e(B)
+        (?\e,2O\e(B . ?\e$,1or\e(B)
+        (?\e,2Q\e(B . ?\e$,1oh\e(B)
+        (?\e,2U\e(B . ?\e$,1o \e(B)
+        (?\e,2V\e(B . ?\e$,1ov\e(B)
+        (?\e,2W\e(B . ?\e$,1oj\e(B)
+        (?\e,2X\e(B . ?\e$,1ol\e(B)
+        (?\e,2[\e(B . ?\e$,1ox\e(B)
+        (?\e,2\\e(B . ?\e$,1ot\e(B)
+        (?\e,2^\e(B . ?\e$,1o`\e(B)
+        (?\e,2_\e(B . ?\e$,1!o\e(B)
+        (?\e,2`\e(B . ?\e,A@\e(B)
+        (?\e,2a\e(B . ?\e,AA\e(B)
+        (?\e,2b\e(B . ?\e,AB\e(B)
+        (?\e,2c\e(B . ?\e,AC\e(B)
+        (?\e,2d\e(B . ?\e$,1o"\e(B)
+        (?\e,2e\e(B . ?\e$,1 "\e(B)
+        (?\e,2f\e(B . ?\e$,1on\e(B)
+        (?\e,2g\e(B . ?\e$,1o*\e(B)
+        (?\e,2h\e(B . ?\e,AH\e(B)
+        (?\e,2i\e(B . ?\e,AI\e(B)
+        (?\e,2j\e(B . ?\e,AJ\e(B)
+        (?\e,2k\e(B . ?\e$,1o:\e(B)
+        (?\e,2l\e(B . ?\e,AL\e(B)
+        (?\e,2m\e(B . ?\e,AM\e(B)
+        (?\e,2n\e(B . ?\e$,1 H\e(B)
+        (?\e,2o\e(B . ?\e$,1oH\e(B)
+        (?\e,2p\e(B . ?\e$,1 0\e(B)
+        (?\e,2q\e(B . ?\e$,1op\e(B)
+        (?\e,2r\e(B . ?\e,AR\e(B)
+        (?\e,2s\e(B . ?\e,AS\e(B)
+        (?\e,2t\e(B . ?\e,AT\e(B)
+        (?\e,2u\e(B . ?\e,AU\e(B)
+        (?\e,2v\e(B . ?\e$,1oN\e(B)
+        (?\e,2w\e(B . ?\e$,1oL\e(B)
+        (?\e,2x\e(B . ?\e$,1od\e(B)
+        (?\e,2y\e(B . ?\e,AY\e(B)
+        (?\e,2z\e(B . ?\e,AZ\e(B)
+        (?\e,2{\e(B . ?\e$,1!(\e(B)
+        (?\e,2|\e(B . ?\e$,1of\e(B)
+        (?\e,2}\e(B . ?\e,A]\e(B)
+        (?\e,2~\e(B . ?\e$,1ob\e(B)))
+
+      (thai-tis620
+       '((?\e,T!\e(B . ?\e$,1Ba\e(B)
+        (?\e,T"\e(B . ?\e$,1Bb\e(B)
+        (?\e,T#\e(B . ?\e$,1Bc\e(B)
+        (?\e,T$\e(B . ?\e$,1Bd\e(B)
+        (?\e,T%\e(B . ?\e$,1Be\e(B)
+        (?\e,T&\e(B . ?\e$,1Bf\e(B)
+        (?\e,T'\e(B . ?\e$,1Bg\e(B)
+        (?\e,T(\e(B . ?\e$,1Bh\e(B)
+        (?\e,T)\e(B . ?\e$,1Bi\e(B)
+        (?\e,T*\e(B . ?\e$,1Bj\e(B)
+        (?\e,T+\e(B . ?\e$,1Bk\e(B)
+        (?\e,T,\e(B . ?\e$,1Bl\e(B)
+        (?\e,T-\e(B . ?\e$,1Bm\e(B)
+        (?\e,T.\e(B . ?\e$,1Bn\e(B)
+        (?\e,T/\e(B . ?\e$,1Bo\e(B)
+        (?\e,T0\e(B . ?\e$,1Bp\e(B)
+        (?\e,T1\e(B . ?\e$,1Bq\e(B)
+        (?\e,T2\e(B . ?\e$,1Br\e(B)
+        (?\e,T3\e(B . ?\e$,1Bs\e(B)
+        (?\e,T4\e(B . ?\e$,1Bt\e(B)
+        (?\e,T5\e(B . ?\e$,1Bu\e(B)
+        (?\e,T6\e(B . ?\e$,1Bv\e(B)
+        (?\e,T7\e(B . ?\e$,1Bw\e(B)
+        (?\e,T8\e(B . ?\e$,1Bx\e(B)
+        (?\e,T9\e(B . ?\e$,1By\e(B)
+        (?\e,T:\e(B . ?\e$,1Bz\e(B)
+        (?\e,T;\e(B . ?\e$,1B{\e(B)
+        (?\e,T<\e(B . ?\e$,1B|\e(B)
+        (?\e,T=\e(B . ?\e$,1B}\e(B)
+        (?\e,T>\e(B . ?\e$,1B~\e(B)
+        (?\e,T?\e(B . ?\e$,1B\7f\e(B)
+        (?\e,T@\e(B . ?\e$,1C \e(B)
+        (?\e,TA\e(B . ?\e$,1C!\e(B)
+        (?\e,TB\e(B . ?\e$,1C"\e(B)
+        (?\e,TC\e(B . ?\e$,1C#\e(B)
+        (?\e,TD\e(B . ?\e$,1C$\e(B)
+        (?\e,TE\e(B . ?\e$,1C%\e(B)
+        (?\e,TF\e(B . ?\e$,1C&\e(B)
+        (?\e,TG\e(B . ?\e$,1C'\e(B)
+        (?\e,TH\e(B . ?\e$,1C(\e(B)
+        (?\e,TI\e(B . ?\e$,1C)\e(B)
+        (?\e,TJ\e(B . ?\e$,1C*\e(B)
+        (?\e,TK\e(B . ?\e$,1C+\e(B)
+        (?\e,TL\e(B . ?\e$,1C,\e(B)
+        (?\e,TM\e(B . ?\e$,1C-\e(B)
+        (?\e,TN\e(B . ?\e$,1C.\e(B)
+        (?\e,TO\e(B . ?\e$,1C/\e(B)
+        (?\e,TP\e(B . ?\e$,1C0\e(B)
+        (?\e,TQ\e(B . ?\e$,1C1\e(B)
+        (?\e,TR\e(B . ?\e$,1C2\e(B)
+        (?\e,TS\e(B . ?\e$,1C3\e(B)
+        (?\e,TT\e(B . ?\e$,1C4\e(B)
+        (?\e,TU\e(B . ?\e$,1C5\e(B)
+        (?\e,TV\e(B . ?\e$,1C6\e(B)
+        (?\e,TW\e(B . ?\e$,1C7\e(B)
+        (?\e,TX\e(B . ?\e$,1C8\e(B)
+        (?\e,TY\e(B . ?\e$,1C9\e(B)
+        (?\e,TZ\e(B . ?\e$,1C:\e(B)
+        (?\e,T_\e(B . ?\e$,1C?\e(B)
+        (?\e,T`\e(B . ?\e$,1C@\e(B)
+        (?\e,Ta\e(B . ?\e$,1CA\e(B)
+        (?\e,Tb\e(B . ?\e$,1CB\e(B)
+        (?\e,Tc\e(B . ?\e$,1CC\e(B)
+        (?\e,Td\e(B . ?\e$,1CD\e(B)
+        (?\e,Te\e(B . ?\e$,1CE\e(B)
+        (?\e,Tf\e(B . ?\e$,1CF\e(B)
+        (?\e,Tg\e(B . ?\e$,1CG\e(B)
+        (?\e,Th\e(B . ?\e$,1CH\e(B)
+        (?\e,Ti\e(B . ?\e$,1CI\e(B)
+        (?\e,Tj\e(B . ?\e$,1CJ\e(B)
+        (?\e,Tk\e(B . ?\e$,1CK\e(B)
+        (?\e,Tl\e(B . ?\e$,1CL\e(B)
+        (?\e,Tm\e(B . ?\e$,1CM\e(B)
+        (?\e,Tn\e(B . ?\e$,1CN\e(B)
+        (?\e,To\e(B . ?\e$,1CO\e(B)
+        (?\e,Tp\e(B . ?\e$,1CP\e(B)
+        (?\e,Tq\e(B . ?\e$,1CQ\e(B)
+        (?\e,Tr\e(B . ?\e$,1CR\e(B)
+        (?\e,Ts\e(B . ?\e$,1CS\e(B)
+        (?\e,Tt\e(B . ?\e$,1CT\e(B)
+        (?\e,Tu\e(B . ?\e$,1CU\e(B)
+        (?\e,Tv\e(B . ?\e$,1CV\e(B)
+        (?\e,Tw\e(B . ?\e$,1CW\e(B)
+        (?\e,Tx\e(B . ?\e$,1CX\e(B)
+        (?\e,Ty\e(B . ?\e$,1CY\e(B)
+        (?\e,Tz\e(B . ?\e$,1CZ\e(B)
+        (?\e,T{\e(B . ?\e$,1C[\e(B)))
+
+      (tibetan-iso-8bit
+       '((?\e$(7!0\e(B . ?\e$,1E@\e(B)
+        (?\e$(7!1\e(B . ?\e$,1EA\e(B)
+        (?\e$(7!2\e(B . ?\e$,1EB\e(B)
+        (?\e$(7!3\e(B . ?\e$,1EC\e(B)
+        (?\e$(7!4\e(B . ?\e$,1ED\e(B)
+        (?\e$(7!5\e(B . ?\e$,1EE\e(B)
+        (?\e$(7!6\e(B . ?\e$,1EF\e(B)
+        (?\e$(7!7\e(B . ?\e$,1EG\e(B)
+        (?\e$(7!8\e(B . ?\e$,1EH\e(B)
+        (?\e$(7!9\e(B . ?\e$,1EI\e(B)
+        (?\e$(7!:\e(B . ?\e$,1EJ\e(B)
+        (?\e$(7!;\e(B . ?\e$,1EK\e(B)
+        (?\e$(7!<\e(B . ?\e$,1EL\e(B)
+        (?\e$(7!=\e(B . ?\e$,1EM\e(B)
+        (?\e$(7!>\e(B . ?\e$,1EN\e(B)
+        (?\e$(7!?\e(B . ?\e$,1EO\e(B)
+        (?\e$(7!@\e(B . ?\e$,1EP\e(B)
+        (?\e$(7!A\e(B . ?\e$,1EQ\e(B)
+        (?\e$(7!B\e(B . ?\e$,1ER\e(B)
+        (?\e$(7!C\e(B . ?\e$,1ES\e(B)
+        (?\e$(7!D\e(B . ?\e$,1ET\e(B)
+        (?\e$(7!E\e(B . ?\e$,1EU\e(B)
+        (?\e$(7!F\e(B . ?\e$,1EV\e(B)
+        (?\e$(7!G\e(B . ?\e$,1EW\e(B)
+        (?\e$(7!H\e(B . ?\e$,1EX\e(B)
+        (?\e$(7!I\e(B . ?\e$,1EY\e(B)
+        (?\e$(7!J\e(B . ?\e$,1EZ\e(B)
+        (?\e$(7!K\e(B . ?\e$,1E[\e(B)
+        (?\e$(7!L\e(B . ?\e$,1E\\e(B)
+        (?\e$(7!M\e(B . ?\e$,1E]\e(B)
+        (?\e$(7!N\e(B . ?\e$,1E^\e(B)
+        (?\e$(7!O\e(B . ?\e$,1E_\e(B)
+        (?\e$(7!P\e(B . ?\e$,1E`\e(B)
+        (?\e$(7!Q\e(B . ?\e$,1Ea\e(B)
+        (?\e$(7!R\e(B . ?\e$,1Eb\e(B)
+        (?\e$(7!S\e(B . ?\e$,1Ec\e(B)
+        (?\e$(7!T\e(B . ?\e$,1Ed\e(B)
+        (?\e$(7!U\e(B . ?\e$,1Ee\e(B)
+        (?\e$(7!V\e(B . ?\e$,1Ef\e(B)
+        (?\e$(7!W\e(B . ?\e$,1Eg\e(B)
+        (?\e$(7!X\e(B . ?\e$,1Eh\e(B)
+        (?\e$(7!Y\e(B . ?\e$,1Ei\e(B)
+        (?\e$(7!Z\e(B . ?\e$,1Ej\e(B)
+        (?\e$(7![\e(B . ?\e$,1Ek\e(B)
+        (?\e$(7!\\e(B . ?\e$,1El\e(B)
+        (?\e$(7!]\e(B . ?\e$,1Em\e(B)
+        (?\e$(7!^\e(B . ?\e$,1En\e(B)
+        (?\e$(7!_\e(B . ?\e$,1Eo\e(B)
+        (?\e$(7!`\e(B . ?\e$,1Ep\e(B)
+        (?\e$(7!a\e(B . ?\e$,1Eq\e(B)
+        (?\e$(7!b\e(B . ?\e$,1Er\e(B)
+        (?\e$(7!c\e(B . ?\e$,1Es\e(B)
+        (?\e$(7!d\e(B . ?\e$,1Et\e(B)
+        (?\e$(7!e\e(B . ?\e$,1Eu\e(B)
+        (?\e$(7!f\e(B . ?\e$,1Ev\e(B)
+        (?\e$(7!g\e(B . ?\e$,1Ew\e(B)
+        (?\e$(7!h\e(B . ?\e$,1Ex\e(B)
+        (?\e$(7!i\e(B . ?\e$,1Ey\e(B)
+        (?\e$(7!j\e(B . ?\e$,1Ez\e(B)
+        (?\e$(7!k\e(B . ?\e$,1E{\e(B)
+        (?\e$(7!l\e(B . ?\e$,1E|\e(B)
+        (?\e$(7!m\e(B . ?\e$,1E}\e(B)
+        (?\e$(7!n\e(B . ?\e$,1E~\e(B)
+        (?\e$(7!o\e(B . ?\e$,1E\7f\e(B)
+        (?\e$(7"!\e(B . ?\e$,1F \e(B)
+        (?\e$(7""\e(B . ?\e$,1F!\e(B)
+        (?\e$(7"#\e(B . ?\e$,1F"\e(B)
+        (?\e$(7"$\e(B . ?\e$,1F#\e(B)
+        (?\e$(7"%\e(B . ?\e$,1F$\e(B)
+        (?\e$(7"&\e(B . ?\e$,1F%\e(B)
+        (?\e$(7"'\e(B . ?\e$,1F&\e(B)
+        (?\e$(7"(\e(B . ?\e$,1F'\e(B)
+        (?\e$(7"*\e(B . ?\e$,1F)\e(B)
+        (?\e$(7"+\e(B . ?\e$,1F*\e(B)
+        (?\e$(7",\e(B . ?\e$,1F+\e(B)
+        (?\e$(7"-\e(B . ?\e$,1F,\e(B)
+        (?\e$(7".\e(B . ?\e$,1F-\e(B)
+        (?\e$(7"/\e(B . ?\e$,1F.\e(B)
+        (?\e$(7"0\e(B . ?\e$,1F/\e(B)
+        (?\e$(7"1\e(B . ?\e$,1F0\e(B)
+        (?\e$(7"2\e(B . ?\e$,1F1\e(B)
+        (?\e$(7"3\e(B . ?\e$,1F2\e(B)
+        (?\e$(7"4\e(B . ?\e$,1F3\e(B)
+        (?\e$(7"5\e(B . ?\e$,1F4\e(B)
+        (?\e$(7"6\e(B . ?\e$,1F5\e(B)
+        (?\e$(7"7\e(B . ?\e$,1F6\e(B)
+        (?\e$(7"8\e(B . ?\e$,1F7\e(B)
+        (?\e$(7"9\e(B . ?\e$,1F8\e(B)
+        (?\e$(7":\e(B . ?\e$,1F9\e(B)
+        (?\e$(7";\e(B . ?\e$,1F:\e(B)
+        (?\e$(7"<\e(B . ?\e$,1F;\e(B)
+        (?\e$(7"=\e(B . ?\e$,1F<\e(B)
+        (?\e$(7">\e(B . ?\e$,1F=\e(B)
+        (?\e$(7"?\e(B . ?\e$,1F>\e(B)
+        (?\e$(7"@\e(B . ?\e$,1F?\e(B)
+        (?\e$(7"A\e(B . ?\e$,1F@\e(B)
+        (?\e$(7"B\e(B . ?\e$,1FA\e(B)
+        (?\e$(7"C\e(B . ?\e$,1FB\e(B)
+        (?\e$(7"D\e(B . ?\e$,1FC\e(B)
+        (?\e$(7"E\e(B . ?\e$,1FD\e(B)
+        (?\e$(7"F\e(B . ?\e$,1FE\e(B)
+        (?\e$(7"G\e(B . ?\e$,1FF\e(B)
+        (?\e$(7"H\e(B . ?\e$,1FG\e(B)
+        (?\e$(7"I\e(B . ?\e$,1FH\e(B)
+        (?\e$(7"J\e(B . ?\e$,1FI\e(B)
+        (?\e$(7"K\e(B . ?\e$,1FJ\e(B)
+        (?\e$(7"R\e(B . ?\e$,1FQ\e(B)
+        (?\e$(7"S\e(B . ?\e$,1FR\e(B)
+        (?\e$(7"T\e(B . ?\e$,1FS\e(B)
+        (?\e$(7"U\e(B . ?\e$,1FT\e(B)
+        (?\e$(7"V\e(B . ?\e$,1FU\e(B)
+        (?\e$(7"W\e(B . ?\e$,1FV\e(B)
+        (?\e$(7"X\e(B . ?\e$,1FW\e(B)
+        (?\e$(7"Y\e(B . ?\e$,1FX\e(B)
+        (?\e$(7"Z\e(B . ?\e$,1FY\e(B)
+        (?\e$(7"[\e(B . ?\e$,1FZ\e(B)
+        (?\e$(7"\\e(B . ?\e$,1F[\e(B)
+        (?\e$(7"]\e(B . ?\e$,1F\\e(B)
+        (?\e$(7"^\e(B . ?\e$,1F]\e(B)
+        (?\e$(7"_\e(B . ?\e$,1F^\e(B)
+        (?\e$(7"`\e(B . ?\e$,1F_\e(B)
+        (?\e$(7"a\e(B . ?\e$,1F`\e(B)
+        (?\e$(7"b\e(B . ?\e$,1Fa\e(B)
+        (?\e$(7"c\e(B . ?\e$,1Fb\e(B)
+        (?\e$(7"d\e(B . ?\e$,1Fc\e(B)
+        (?\e$(7"e\e(B . ?\e$,1Fd\e(B)
+        (?\e$(7"f\e(B . ?\e$,1Fe\e(B)
+        (?\e$(7"g\e(B . ?\e$,1Ff\e(B)
+        (?\e$(7"h\e(B . ?\e$,1Fg\e(B)
+        (?\e$(7"i\e(B . ?\e$,1Fh\e(B)
+        (?\e$(7"j\e(B . ?\e$,1Fi\e(B)
+        (?\e$(7"k\e(B . ?\e$,1Fj\e(B)
+        (?\e$(7"l\e(B . ?\e$,1Fk\e(B)
+        (?\e$(7#!\e(B . ?\e$,1Fp\e(B)
+        (?\e$(7#"\e(B . ?\e$,1Fq\e(B)
+        (?\e$(7##\e(B . ?\e$,1Fr\e(B)
+        (?\e$(7#$\e(B . ?\e$,1Fs\e(B)
+        (?\e$(7#%\e(B . ?\e$,1Ft\e(B)
+        (?\e$(7#&\e(B . ?\e$,1Fu\e(B)
+        (?\e$(7#'\e(B . ?\e$,1Fv\e(B)
+        (?\e$(7#(\e(B . ?\e$,1Fw\e(B)
+        (?\e$(7#*\e(B . ?\e$,1Fy\e(B)
+        (?\e$(7#+\e(B . ?\e$,1Fz\e(B)
+        (?\e$(7#,\e(B . ?\e$,1F{\e(B)
+        (?\e$(7#-\e(B . ?\e$,1F|\e(B)
+        (?\e$(7#.\e(B . ?\e$,1F}\e(B)
+        (?\e$(7#/\e(B . ?\e$,1F~\e(B)
+        (?\e$(7#0\e(B . ?\e$,1F\7f\e(B)
+        (?\e$(7#1\e(B . ?\e$,1G \e(B)
+        (?\e$(7#2\e(B . ?\e$,1G!\e(B)
+        (?\e$(7#3\e(B . ?\e$,1G"\e(B)
+        (?\e$(7#4\e(B . ?\e$,1G#\e(B)
+        (?\e$(7#5\e(B . ?\e$,1G$\e(B)
+        (?\e$(7#6\e(B . ?\e$,1G%\e(B)
+        (?\e$(7#7\e(B . ?\e$,1G&\e(B)
+        (?\e$(7#8\e(B . ?\e$,1G'\e(B)
+        (?\e$(7#9\e(B . ?\e$,1G(\e(B)
+        (?\e$(7#:\e(B . ?\e$,1G)\e(B)
+        (?\e$(7#;\e(B . ?\e$,1G*\e(B)
+        (?\e$(7#<\e(B . ?\e$,1G+\e(B)
+        (?\e$(7#=\e(B . ?\e$,1G,\e(B)
+        (?\e$(7#>\e(B . ?\e$,1G-\e(B)
+        (?\e$(7#?\e(B . ?\e$,1G.\e(B)
+        (?\e$(7#@\e(B . ?\e$,1G/\e(B)
+        (?\e$(7#A\e(B . ?\e$,1G0\e(B)
+        (?\e$(7#B\e(B . ?\e$,1G1\e(B)
+        (?\e$(7#C\e(B . ?\e$,1G2\e(B)
+        (?\e$(7#D\e(B . ?\e$,1G3\e(B)
+        (?\e$(7#E\e(B . ?\e$,1G4\e(B)
+        (?\e$(7#F\e(B . ?\e$,1G5\e(B)
+        (?\e$(7#G\e(B . ?\e$,1G6\e(B)
+        (?\e$(7#H\e(B . ?\e$,1G7\e(B)
+        (?\e$(7#I\e(B . ?\e$,1G8\e(B)
+        (?\e$(7#J\e(B . ?\e$,1G9\e(B)
+        (?\e$(7#K\e(B . ?\e$,1G:\e(B)
+        (?\e$(7#L\e(B . ?\e$,1G;\e(B)
+        (?\e$(7#M\e(B . ?\e$,1G<\e(B)
+        (?\e$(7#O\e(B . ?\e$,1G>\e(B)
+        (?\e$(7#P\e(B . ?\e$,1G?\e(B)
+        (?\e$(7#Q\e(B . ?\e$,1G@\e(B)
+        (?\e$(7#R\e(B . ?\e$,1GA\e(B)
+        (?\e$(7#S\e(B . ?\e$,1GB\e(B)
+        (?\e$(7#T\e(B . ?\e$,1GC\e(B)
+        (?\e$(7#U\e(B . ?\e$,1GD\e(B)
+        (?\e$(7#V\e(B . ?\e$,1GE\e(B)
+        (?\e$(7#W\e(B . ?\e$,1GF\e(B)
+        (?\e$(7#X\e(B . ?\e$,1GG\e(B)
+        (?\e$(7#Y\e(B . ?\e$,1GH\e(B)
+        (?\e$(7#Z\e(B . ?\e$,1GI\e(B)
+        (?\e$(7#[\e(B . ?\e$,1GJ\e(B)
+        (?\e$(7#\\e(B . ?\e$,1GK\e(B)
+        (?\e$(7#]\e(B . ?\e$,1GL\e(B)
+        (?\e$(7#`\e(B . ?\e$,1GO\e(B)))
+
+      (ipa
+       '((?\e,0 \e(B . ?i)
+        (?\e,0!\e(B . ?\e$,1#j\e(B)
+        (?\e,0"\e(B . ?e)
+        (?\e,0#\e(B . ?\e$,1#[\e(B)
+        (?\e,0$\e(B . ?\e,Af\e(B)
+        (?\e,0%\e(B . ?a)
+        (?\e,0&\e(B . ?\e$,1#h\e(B)
+        (?\e,0'\e(B . ?\e$,1#Y\e(B)
+        (?\e,0(\e(B . ?\e$,1#P\e(B)
+        (?\e,0)\e(B . ?\e$,1#o\e(B)
+        (?\e,0*\e(B . ?\e$,1#d\e(B)
+        (?\e,0+\e(B . ?\e$,1$,\e(B)
+        (?\e,0,\e(B . ?\e$,1#Q\e(B)
+        (?\e,0-\e(B . ?y)
+        (?\e,0.\e(B . ?\e$,1$/\e(B)
+        (?\e,0/\e(B . ?\e,Ax\e(B)
+        (?\e,00\e(B . ?\e$,1 s\e(B)
+        (?\e,01\e(B . ?\e$,1#v\e(B)
+        (?\e,02\e(B . ?\e$,1$)\e(B)
+        (?\e,03\e(B . ?\e$,1#u\e(B)
+        (?\e,04\e(B . ?u)
+        (?\e,05\e(B . ?\e$,1$*\e(B)
+        (?\e,06\e(B . ?o)
+        (?\e,07\e(B . ?\e$,1#T\e(B)
+        (?\e,08\e(B . ?\e$,1#R\e(B)
+        (?\e,0:\e(B . ?\e$,1#Z\e(B)
+        (?\e,0@\e(B . ?p)
+        (?\e,0A\e(B . ?b)
+        (?\e,0B\e(B . ?t)
+        (?\e,0C\e(B . ?d)
+        (?\e,0D\e(B . ?k)
+        (?\e,0E\e(B . ?g)
+        (?\e,0F\e(B . ?f)
+        (?\e,0G\e(B . ?v)
+        (?\e,0H\e(B . ?\e$,1'8\e(B)
+        (?\e,0I\e(B . ?\e,Ap\e(B)
+        (?\e,0J\e(B . ?s)
+        (?\e,0K\e(B . ?z)
+        (?\e,0L\e(B . ?\e$,1$#\e(B)
+        (?\e,0M\e(B . ?\e$,1$2\e(B)
+        (?\e,0N\e(B . ?\e,Ag\e(B)
+        (?\e,0O\e(B . ?x)
+        (?\e,0P\e(B . ?\e$,1$!\e(B)
+        (?\e,0Q\e(B . ?h)
+        (?\e,0R\e(B . ?m)
+        (?\e,0S\e(B . ?n)
+        (?\e,0T\e(B . ?\e$,1#r\e(B)
+        (?\e,0U\e(B . ?\e$,1 k\e(B)
+        (?\e,0V\e(B . ?r)
+        (?\e,0W\e(B . ?\e$,1$ \e(B)
+        (?\e,0X\e(B . ?\e$,1#y\e(B)
+        (?\e,0Y\e(B . ?j)
+        (?\e,0Z\e(B . ?l)
+        (?\e,0[\e(B . ?\e$,1$.\e(B)
+        (?\e,0\\e(B . ?\e$,1$?\e(B)
+        (?\e,0]\e(B . ?\e$,1#e\e(B)
+        (?\e,0^\e(B . ?w)
+        (?\e,0_\e(B . ?\e$,1$-\e(B)
+        (?\e,0p\e(B . ?\e$,1$h\e(B)
+        (?\e,0q\e(B . ?\e$,1$l\e(B)
+        (?\e,0r\e(B . ?\e$,1$p\e(B)))
+
+      (ethiopic
+       '((?\e$(3!!\e(B . ?\e$,1M@\e(B)
+        (?\e$(3!"\e(B . ?\e$,1MA\e(B)
+        (?\e$(3!#\e(B . ?\e$,1MB\e(B)
+        (?\e$(3!$\e(B . ?\e$,1MC\e(B)
+        (?\e$(3!%\e(B . ?\e$,1MD\e(B)
+        (?\e$(3!&\e(B . ?\e$,1ME\e(B)
+        (?\e$(3!'\e(B . ?\e$,1MF\e(B)
+        (?\e$(3!)\e(B . ?\e$,1MH\e(B)
+        (?\e$(3!*\e(B . ?\e$,1MI\e(B)
+        (?\e$(3!+\e(B . ?\e$,1MJ\e(B)
+        (?\e$(3!,\e(B . ?\e$,1MK\e(B)
+        (?\e$(3!-\e(B . ?\e$,1ML\e(B)
+        (?\e$(3!.\e(B . ?\e$,1MM\e(B)
+        (?\e$(3!/\e(B . ?\e$,1MN\e(B)
+        (?\e$(3!0\e(B . ?\e$,1MO\e(B)
+        (?\e$(3!1\e(B . ?\e$,1MP\e(B)
+        (?\e$(3!2\e(B . ?\e$,1MQ\e(B)
+        (?\e$(3!3\e(B . ?\e$,1MR\e(B)
+        (?\e$(3!4\e(B . ?\e$,1MS\e(B)
+        (?\e$(3!5\e(B . ?\e$,1MT\e(B)
+        (?\e$(3!6\e(B . ?\e$,1MU\e(B)
+        (?\e$(3!7\e(B . ?\e$,1MV\e(B)
+        (?\e$(3!8\e(B . ?\e$,1MW\e(B)
+        (?\e$(3!9\e(B . ?\e$,1MX\e(B)
+        (?\e$(3!:\e(B . ?\e$,1MY\e(B)
+        (?\e$(3!;\e(B . ?\e$,1MZ\e(B)
+        (?\e$(3!<\e(B . ?\e$,1M[\e(B)
+        (?\e$(3!=\e(B . ?\e$,1M\\e(B)
+        (?\e$(3!>\e(B . ?\e$,1M]\e(B)
+        (?\e$(3!?\e(B . ?\e$,1M^\e(B)
+        (?\e$(3!@\e(B . ?\e$,1M_\e(B)
+        (?\e$(3!A\e(B . ?\e$,1M`\e(B)
+        (?\e$(3!B\e(B . ?\e$,1Ma\e(B)
+        (?\e$(3!C\e(B . ?\e$,1Mb\e(B)
+        (?\e$(3!D\e(B . ?\e$,1Mc\e(B)
+        (?\e$(3!E\e(B . ?\e$,1Md\e(B)
+        (?\e$(3!F\e(B . ?\e$,1Me\e(B)
+        (?\e$(3!G\e(B . ?\e$,1Mf\e(B)
+        (?\e$(3!H\e(B . ?\e$,1Mg\e(B)
+        (?\e$(3!I\e(B . ?\e$,1Mh\e(B)
+        (?\e$(3!J\e(B . ?\e$,1Mi\e(B)
+        (?\e$(3!K\e(B . ?\e$,1Mj\e(B)
+        (?\e$(3!L\e(B . ?\e$,1Mk\e(B)
+        (?\e$(3!M\e(B . ?\e$,1Ml\e(B)
+        (?\e$(3!N\e(B . ?\e$,1Mm\e(B)
+        (?\e$(3!O\e(B . ?\e$,1Mn\e(B)
+        (?\e$(3!P\e(B . ?\e$,1Mo\e(B)
+        (?\e$(3!Q\e(B . ?\e$,1Mp\e(B)
+        (?\e$(3!R\e(B . ?\e$,1Mq\e(B)
+        (?\e$(3!S\e(B . ?\e$,1Mr\e(B)
+        (?\e$(3!T\e(B . ?\e$,1Ms\e(B)
+        (?\e$(3!U\e(B . ?\e$,1Mt\e(B)
+        (?\e$(3!V\e(B . ?\e$,1Mu\e(B)
+        (?\e$(3!W\e(B . ?\e$,1Mv\e(B)
+        (?\e$(3!X\e(B . ?\e$,1Mw\e(B)
+        (?\e$(3!Y\e(B . ?\e$,1Mx\e(B)
+        (?\e$(3!Z\e(B . ?\e$,1My\e(B)
+        (?\e$(3![\e(B . ?\e$,1Mz\e(B)
+        (?\e$(3!\\e(B . ?\e$,1M{\e(B)
+        (?\e$(3!]\e(B . ?\e$,1M|\e(B)
+        (?\e$(3!^\e(B . ?\e$,1M}\e(B)
+        (?\e$(3!_\e(B . ?\e$,1M~\e(B)
+        (?\e$(3!`\e(B . ?\e$,1M\7f\e(B)
+        (?\e$(3!a\e(B . ?\e$,1N \e(B)
+        (?\e$(3!b\e(B . ?\e$,1N!\e(B)
+        (?\e$(3!c\e(B . ?\e$,1N"\e(B)
+        (?\e$(3!d\e(B . ?\e$,1N#\e(B)
+        (?\e$(3!e\e(B . ?\e$,1N$\e(B)
+        (?\e$(3!f\e(B . ?\e$,1N%\e(B)
+        (?\e$(3!g\e(B . ?\e$,1N&\e(B)
+        (?\e$(3!i\e(B . ?\e$,1N(\e(B)
+        (?\e$(3!k\e(B . ?\e$,1N*\e(B)
+        (?\e$(3!l\e(B . ?\e$,1N+\e(B)
+        (?\e$(3!m\e(B . ?\e$,1N,\e(B)
+        (?\e$(3!n\e(B . ?\e$,1N-\e(B)
+        (?\e$(3!q\e(B . ?\e$,1N0\e(B)
+        (?\e$(3!r\e(B . ?\e$,1N1\e(B)
+        (?\e$(3!s\e(B . ?\e$,1N2\e(B)
+        (?\e$(3!t\e(B . ?\e$,1N3\e(B)
+        (?\e$(3!u\e(B . ?\e$,1N4\e(B)
+        (?\e$(3!v\e(B . ?\e$,1N5\e(B)
+        (?\e$(3!w\e(B . ?\e$,1N6\e(B)
+        (?\e$(3!y\e(B . ?\e$,1N8\e(B)
+        (?\e$(3!{\e(B . ?\e$,1N:\e(B)
+        (?\e$(3!|\e(B . ?\e$,1N;\e(B)
+        (?\e$(3!}\e(B . ?\e$,1N<\e(B)
+        (?\e$(3!~\e(B . ?\e$,1N=\e(B)
+        (?\e$(3"#\e(B . ?\e$,1N@\e(B)
+        (?\e$(3"$\e(B . ?\e$,1NA\e(B)
+        (?\e$(3"%\e(B . ?\e$,1NB\e(B)
+        (?\e$(3"&\e(B . ?\e$,1NC\e(B)
+        (?\e$(3"'\e(B . ?\e$,1ND\e(B)
+        (?\e$(3"(\e(B . ?\e$,1NE\e(B)
+        (?\e$(3")\e(B . ?\e$,1NF\e(B)
+        (?\e$(3"*\e(B . ?\e$,1NG\e(B)
+        (?\e$(3"+\e(B . ?\e$,1NH\e(B)
+        (?\e$(3",\e(B . ?\e$,1NI\e(B)
+        (?\e$(3"-\e(B . ?\e$,1NJ\e(B)
+        (?\e$(3".\e(B . ?\e$,1NK\e(B)
+        (?\e$(3"/\e(B . ?\e$,1NL\e(B)
+        (?\e$(3"0\e(B . ?\e$,1NM\e(B)
+        (?\e$(3"1\e(B . ?\e$,1NN\e(B)
+        (?\e$(3"2\e(B . ?\e$,1NO\e(B)
+        (?\e$(3"3\e(B . ?\e$,1NP\e(B)
+        (?\e$(3"4\e(B . ?\e$,1NQ\e(B)
+        (?\e$(3"5\e(B . ?\e$,1NR\e(B)
+        (?\e$(3"6\e(B . ?\e$,1NS\e(B)
+        (?\e$(3"7\e(B . ?\e$,1NT\e(B)
+        (?\e$(3"8\e(B . ?\e$,1NU\e(B)
+        (?\e$(3"9\e(B . ?\e$,1NV\e(B)
+        (?\e$(3":\e(B . ?\e$,1NW\e(B)
+        (?\e$(3";\e(B . ?\e$,1NX\e(B)
+        (?\e$(3"<\e(B . ?\e$,1NY\e(B)
+        (?\e$(3"=\e(B . ?\e$,1NZ\e(B)
+        (?\e$(3">\e(B . ?\e$,1N[\e(B)
+        (?\e$(3"?\e(B . ?\e$,1N\\e(B)
+        (?\e$(3"@\e(B . ?\e$,1N]\e(B)
+        (?\e$(3"A\e(B . ?\e$,1N^\e(B)
+        (?\e$(3"B\e(B . ?\e$,1N_\e(B)
+        (?\e$(3"C\e(B . ?\e$,1N`\e(B)
+        (?\e$(3"D\e(B . ?\e$,1Na\e(B)
+        (?\e$(3"E\e(B . ?\e$,1Nb\e(B)
+        (?\e$(3"F\e(B . ?\e$,1Nc\e(B)
+        (?\e$(3"G\e(B . ?\e$,1Nd\e(B)
+        (?\e$(3"H\e(B . ?\e$,1Ne\e(B)
+        (?\e$(3"I\e(B . ?\e$,1Nf\e(B)
+        (?\e$(3"K\e(B . ?\e$,1Nh\e(B)
+        (?\e$(3"M\e(B . ?\e$,1Nj\e(B)
+        (?\e$(3"N\e(B . ?\e$,1Nk\e(B)
+        (?\e$(3"O\e(B . ?\e$,1Nl\e(B)
+        (?\e$(3"P\e(B . ?\e$,1Nm\e(B)
+        (?\e$(3"S\e(B . ?\e$,1Np\e(B)
+        (?\e$(3"T\e(B . ?\e$,1Nq\e(B)
+        (?\e$(3"U\e(B . ?\e$,1Nr\e(B)
+        (?\e$(3"V\e(B . ?\e$,1Ns\e(B)
+        (?\e$(3"W\e(B . ?\e$,1Nt\e(B)
+        (?\e$(3"X\e(B . ?\e$,1Nu\e(B)
+        (?\e$(3"Y\e(B . ?\e$,1Nv\e(B)
+        (?\e$(3"Z\e(B . ?\e$,1Nw\e(B)
+        (?\e$(3"[\e(B . ?\e$,1Nx\e(B)
+        (?\e$(3"\\e(B . ?\e$,1Ny\e(B)
+        (?\e$(3"]\e(B . ?\e$,1Nz\e(B)
+        (?\e$(3"^\e(B . ?\e$,1N{\e(B)
+        (?\e$(3"_\e(B . ?\e$,1N|\e(B)
+        (?\e$(3"`\e(B . ?\e$,1N}\e(B)
+        (?\e$(3"a\e(B . ?\e$,1N~\e(B)
+        (?\e$(3"b\e(B . ?\e$,1N\7f\e(B)
+        (?\e$(3"c\e(B . ?\e$,1O \e(B)
+        (?\e$(3"d\e(B . ?\e$,1O!\e(B)
+        (?\e$(3"e\e(B . ?\e$,1O"\e(B)
+        (?\e$(3"f\e(B . ?\e$,1O#\e(B)
+        (?\e$(3"g\e(B . ?\e$,1O$\e(B)
+        (?\e$(3"h\e(B . ?\e$,1O%\e(B)
+        (?\e$(3"i\e(B . ?\e$,1O&\e(B)
+        (?\e$(3"j\e(B . ?\e$,1O'\e(B)
+        (?\e$(3"k\e(B . ?\e$,1O(\e(B)
+        (?\e$(3"l\e(B . ?\e$,1O)\e(B)
+        (?\e$(3"m\e(B . ?\e$,1O*\e(B)
+        (?\e$(3"n\e(B . ?\e$,1O+\e(B)
+        (?\e$(3"o\e(B . ?\e$,1O,\e(B)
+        (?\e$(3"p\e(B . ?\e$,1O-\e(B)
+        (?\e$(3"q\e(B . ?\e$,1O.\e(B)
+        (?\e$(3"s\e(B . ?\e$,1O0\e(B)
+        (?\e$(3"u\e(B . ?\e$,1O2\e(B)
+        (?\e$(3"v\e(B . ?\e$,1O3\e(B)
+        (?\e$(3"w\e(B . ?\e$,1O4\e(B)
+        (?\e$(3"x\e(B . ?\e$,1O5\e(B)
+        (?\e$(3"{\e(B . ?\e$,1O8\e(B)
+        (?\e$(3"|\e(B . ?\e$,1O9\e(B)
+        (?\e$(3"}\e(B . ?\e$,1O:\e(B)
+        (?\e$(3"~\e(B . ?\e$,1O;\e(B)
+        (?\e$(3#!\e(B . ?\e$,1O<\e(B)
+        (?\e$(3#"\e(B . ?\e$,1O=\e(B)
+        (?\e$(3##\e(B . ?\e$,1O>\e(B)
+        (?\e$(3#%\e(B . ?\e$,1O@\e(B)
+        (?\e$(3#'\e(B . ?\e$,1OB\e(B)
+        (?\e$(3#(\e(B . ?\e$,1OC\e(B)
+        (?\e$(3#)\e(B . ?\e$,1OD\e(B)
+        (?\e$(3#*\e(B . ?\e$,1OE\e(B)
+        (?\e$(3#-\e(B . ?\e$,1OH\e(B)
+        (?\e$(3#.\e(B . ?\e$,1OI\e(B)
+        (?\e$(3#/\e(B . ?\e$,1OJ\e(B)
+        (?\e$(3#0\e(B . ?\e$,1OK\e(B)
+        (?\e$(3#1\e(B . ?\e$,1OL\e(B)
+        (?\e$(3#2\e(B . ?\e$,1OM\e(B)
+        (?\e$(3#3\e(B . ?\e$,1ON\e(B)
+        (?\e$(3#5\e(B . ?\e$,1OP\e(B)
+        (?\e$(3#6\e(B . ?\e$,1OQ\e(B)
+        (?\e$(3#7\e(B . ?\e$,1OR\e(B)
+        (?\e$(3#8\e(B . ?\e$,1OS\e(B)
+        (?\e$(3#9\e(B . ?\e$,1OT\e(B)
+        (?\e$(3#:\e(B . ?\e$,1OU\e(B)
+        (?\e$(3#;\e(B . ?\e$,1OV\e(B)
+        (?\e$(3#=\e(B . ?\e$,1OX\e(B)
+        (?\e$(3#>\e(B . ?\e$,1OY\e(B)
+        (?\e$(3#?\e(B . ?\e$,1OZ\e(B)
+        (?\e$(3#@\e(B . ?\e$,1O[\e(B)
+        (?\e$(3#A\e(B . ?\e$,1O\\e(B)
+        (?\e$(3#B\e(B . ?\e$,1O]\e(B)
+        (?\e$(3#C\e(B . ?\e$,1O^\e(B)
+        (?\e$(3#D\e(B . ?\e$,1O_\e(B)
+        (?\e$(3#E\e(B . ?\e$,1O`\e(B)
+        (?\e$(3#F\e(B . ?\e$,1Oa\e(B)
+        (?\e$(3#G\e(B . ?\e$,1Ob\e(B)
+        (?\e$(3#H\e(B . ?\e$,1Oc\e(B)
+        (?\e$(3#I\e(B . ?\e$,1Od\e(B)
+        (?\e$(3#J\e(B . ?\e$,1Oe\e(B)
+        (?\e$(3#K\e(B . ?\e$,1Of\e(B)
+        (?\e$(3#L\e(B . ?\e$,1Og\e(B)
+        (?\e$(3#M\e(B . ?\e$,1Oh\e(B)
+        (?\e$(3#N\e(B . ?\e$,1Oi\e(B)
+        (?\e$(3#O\e(B . ?\e$,1Oj\e(B)
+        (?\e$(3#P\e(B . ?\e$,1Ok\e(B)
+        (?\e$(3#Q\e(B . ?\e$,1Ol\e(B)
+        (?\e$(3#R\e(B . ?\e$,1Om\e(B)
+        (?\e$(3#S\e(B . ?\e$,1On\e(B)
+        (?\e$(3#U\e(B . ?\e$,1Op\e(B)
+        (?\e$(3#V\e(B . ?\e$,1Oq\e(B)
+        (?\e$(3#W\e(B . ?\e$,1Or\e(B)
+        (?\e$(3#X\e(B . ?\e$,1Os\e(B)
+        (?\e$(3#Y\e(B . ?\e$,1Ot\e(B)
+        (?\e$(3#Z\e(B . ?\e$,1Ou\e(B)
+        (?\e$(3#[\e(B . ?\e$,1Ov\e(B)
+        (?\e$(3#\\e(B . ?\e$,1Ow\e(B)
+        (?\e$(3#]\e(B . ?\e$,1Ox\e(B)
+        (?\e$(3#^\e(B . ?\e$,1Oy\e(B)
+        (?\e$(3#_\e(B . ?\e$,1Oz\e(B)
+        (?\e$(3#`\e(B . ?\e$,1O{\e(B)
+        (?\e$(3#a\e(B . ?\e$,1O|\e(B)
+        (?\e$(3#b\e(B . ?\e$,1O}\e(B)
+        (?\e$(3#c\e(B . ?\e$,1O~\e(B)
+        (?\e$(3#d\e(B . ?\e$,1O\7f\e(B)
+        (?\e$(3#e\e(B . ?\e$,1P \e(B)
+        (?\e$(3#f\e(B . ?\e$,1P!\e(B)
+        (?\e$(3#g\e(B . ?\e$,1P"\e(B)
+        (?\e$(3#h\e(B . ?\e$,1P#\e(B)
+        (?\e$(3#i\e(B . ?\e$,1P$\e(B)
+        (?\e$(3#j\e(B . ?\e$,1P%\e(B)
+        (?\e$(3#k\e(B . ?\e$,1P&\e(B)
+        (?\e$(3#l\e(B . ?\e$,1P'\e(B)
+        (?\e$(3#m\e(B . ?\e$,1P(\e(B)
+        (?\e$(3#n\e(B . ?\e$,1P)\e(B)
+        (?\e$(3#o\e(B . ?\e$,1P*\e(B)
+        (?\e$(3#p\e(B . ?\e$,1P+\e(B)
+        (?\e$(3#q\e(B . ?\e$,1P,\e(B)
+        (?\e$(3#r\e(B . ?\e$,1P-\e(B)
+        (?\e$(3#s\e(B . ?\e$,1P.\e(B)
+        (?\e$(3#u\e(B . ?\e$,1P0\e(B)
+        (?\e$(3#w\e(B . ?\e$,1P2\e(B)
+        (?\e$(3#x\e(B . ?\e$,1P3\e(B)
+        (?\e$(3#y\e(B . ?\e$,1P4\e(B)
+        (?\e$(3#z\e(B . ?\e$,1P5\e(B)
+        (?\e$(3#}\e(B . ?\e$,1P8\e(B)
+        (?\e$(3#~\e(B . ?\e$,1P9\e(B)
+        (?\e$(3$!\e(B . ?\e$,1P:\e(B)
+        (?\e$(3$"\e(B . ?\e$,1P;\e(B)
+        (?\e$(3$#\e(B . ?\e$,1P<\e(B)
+        (?\e$(3$$\e(B . ?\e$,1P=\e(B)
+        (?\e$(3$%\e(B . ?\e$,1P>\e(B)
+        (?\e$(3$'\e(B . ?\e$,1P@\e(B)
+        (?\e$(3$(\e(B . ?\e$,1PA\e(B)
+        (?\e$(3$)\e(B . ?\e$,1PB\e(B)
+        (?\e$(3$*\e(B . ?\e$,1PC\e(B)
+        (?\e$(3$+\e(B . ?\e$,1PD\e(B)
+        (?\e$(3$,\e(B . ?\e$,1PE\e(B)
+        (?\e$(3$-\e(B . ?\e$,1PF\e(B)
+        (?\e$(3$.\e(B . ?\e$,1PG\e(B)
+        (?\e$(3$/\e(B . ?\e$,1PH\e(B)
+        (?\e$(3$0\e(B . ?\e$,1PI\e(B)
+        (?\e$(3$1\e(B . ?\e$,1PJ\e(B)
+        (?\e$(3$2\e(B . ?\e$,1PK\e(B)
+        (?\e$(3$3\e(B . ?\e$,1PL\e(B)
+        (?\e$(3$4\e(B . ?\e$,1PM\e(B)
+        (?\e$(3$5\e(B . ?\e$,1PN\e(B)
+        (?\e$(3$6\e(B . ?\e$,1PO\e(B)
+        (?\e$(3$7\e(B . ?\e$,1PP\e(B)
+        (?\e$(3$8\e(B . ?\e$,1PQ\e(B)
+        (?\e$(3$9\e(B . ?\e$,1PR\e(B)
+        (?\e$(3$:\e(B . ?\e$,1PS\e(B)
+        (?\e$(3$;\e(B . ?\e$,1PT\e(B)
+        (?\e$(3$<\e(B . ?\e$,1PU\e(B)
+        (?\e$(3$=\e(B . ?\e$,1PV\e(B)
+        (?\e$(3$>\e(B . ?\e$,1PW\e(B)
+        (?\e$(3$?\e(B . ?\e$,1PX\e(B)
+        (?\e$(3$@\e(B . ?\e$,1PY\e(B)
+        (?\e$(3$A\e(B . ?\e$,1PZ\e(B)
+        (?\e$(3$B\e(B . ?\e$,1P[\e(B)
+        (?\e$(3$C\e(B . ?\e$,1P\\e(B)
+        (?\e$(3$D\e(B . ?\e$,1P]\e(B)
+        (?\e$(3$E\e(B . ?\e$,1P^\e(B)
+        (?\e$(3$F\e(B . ?\e$,1P_\e(B)
+        (?\e$(3$G\e(B . ?\e$,1P`\e(B)
+        (?\e$(3$H\e(B . ?\e$,1Pa\e(B)
+        (?\e$(3$I\e(B . ?\e$,1Pb\e(B)
+        (?\e$(3$J\e(B . ?\e$,1Pc\e(B)
+        (?\e$(3$K\e(B . ?\e$,1Pd\e(B)
+        (?\e$(3$L\e(B . ?\e$,1Pe\e(B)
+        (?\e$(3$M\e(B . ?\e$,1Pf\e(B)
+        (?\e$(3$O\e(B . ?\e$,1Ph\e(B)
+        (?\e$(3$P\e(B . ?\e$,1Pi\e(B)
+        (?\e$(3$Q\e(B . ?\e$,1Pj\e(B)
+        (?\e$(3$R\e(B . ?\e$,1Pk\e(B)
+        (?\e$(3$S\e(B . ?\e$,1Pl\e(B)
+        (?\e$(3$T\e(B . ?\e$,1Pm\e(B)
+        (?\e$(3$U\e(B . ?\e$,1Pn\e(B)
+        (?\e$(3$V\e(B . ?\e$,1Po\e(B)
+        (?\e$(3$W\e(B . ?\e$,1Pp\e(B)
+        (?\e$(3$X\e(B . ?\e$,1Pq\e(B)
+        (?\e$(3$Y\e(B . ?\e$,1Pr\e(B)
+        (?\e$(3$Z\e(B . ?\e$,1Ps\e(B)
+        (?\e$(3$[\e(B . ?\e$,1Pt\e(B)
+        (?\e$(3$\\e(B . ?\e$,1Pu\e(B)
+        (?\e$(3$]\e(B . ?\e$,1Pv\e(B)
+        (?\e$(3$^\e(B . ?\e$,1Pw\e(B)
+        (?\e$(3$_\e(B . ?\e$,1Px\e(B)
+        (?\e$(3$`\e(B . ?\e$,1Py\e(B)
+        (?\e$(3$a\e(B . ?\e$,1Pz\e(B)
+        (?\e$(3$h\e(B . ?\e$,1Q!\e(B)
+        (?\e$(3$i\e(B . ?\e$,1Q"\e(B)
+        (?\e$(3$j\e(B . ?\e$,1Q#\e(B)
+        (?\e$(3$k\e(B . ?\e$,1Q$\e(B)
+        (?\e$(3$l\e(B . ?\e$,1Q%\e(B)
+        (?\e$(3$m\e(B . ?\e$,1Q&\e(B)
+        (?\e$(3$n\e(B . ?\e$,1Q'\e(B)
+        (?\e$(3$o\e(B . ?\e$,1Q(\e(B)
+        (?\e$(3$p\e(B . ?\e$,1Q)\e(B)
+        (?\e$(3$q\e(B . ?\e$,1Q*\e(B)
+        (?\e$(3$r\e(B . ?\e$,1Q+\e(B)
+        (?\e$(3$s\e(B . ?\e$,1Q,\e(B)
+        (?\e$(3$t\e(B . ?\e$,1Q-\e(B)
+        (?\e$(3$u\e(B . ?\e$,1Q.\e(B)
+        (?\e$(3$v\e(B . ?\e$,1Q/\e(B)
+        (?\e$(3$w\e(B . ?\e$,1Q0\e(B)
+        (?\e$(3$x\e(B . ?\e$,1Q1\e(B)
+        (?\e$(3$y\e(B . ?\e$,1Q2\e(B)
+        (?\e$(3$z\e(B . ?\e$,1Q3\e(B)
+        (?\e$(3${\e(B . ?\e$,1Q4\e(B)
+        (?\e$(3$|\e(B . ?\e$,1Q5\e(B)
+        (?\e$(3$}\e(B . ?\e$,1Q6\e(B)
+        (?\e$(3$~\e(B . ?\e$,1Q7\e(B)
+        (?\e$(3%!\e(B . ?\e$,1Q8\e(B)
+        (?\e$(3%"\e(B . ?\e$,1Q9\e(B)
+        (?\e$(3%#\e(B . ?\e$,1Q:\e(B)
+        (?\e$(3%$\e(B . ?\e$,1Q;\e(B)
+        (?\e$(3%%\e(B . ?\e$,1Q<\e(B)))
+
+      (indian-is13194
+       '((?\e(5!\e(B . ?\e$,15A\e(B)
+        (?\e(5"\e(B . ?\e$,15B\e(B)
+        (?\e(5#\e(B . ?\e$,15C\e(B)
+        (?\e(5$\e(B . ?\e$,15E\e(B)
+        (?\e(5%\e(B . ?\e$,15F\e(B)
+        (?\e(5&\e(B . ?\e$,15G\e(B)
+        (?\e(5'\e(B . ?\e$,15H\e(B)
+        (?\e(5(\e(B . ?\e$,15I\e(B)
+        (?\e(5)\e(B . ?\e$,15J\e(B)
+        (?\e(5*\e(B . ?\e$,15K\e(B)
+        (?\e(5+\e(B . ?\e$,15N\e(B)
+        (?\e(5,\e(B . ?\e$,15O\e(B)
+        (?\e(5-\e(B . ?\e$,15P\e(B)
+        (?\e(5.\e(B . ?\e$,15M\e(B)
+        (?\e(5/\e(B . ?\e$,15R\e(B)
+        (?\e(50\e(B . ?\e$,15S\e(B)
+        (?\e(51\e(B . ?\e$,15T\e(B)
+        (?\e(52\e(B . ?\e$,15M\e(B)
+        (?\e(53\e(B . ?\e$,15U\e(B)
+        (?\e(54\e(B . ?\e$,15V\e(B)
+        (?\e(55\e(B . ?\e$,15W\e(B)
+        (?\e(56\e(B . ?\e$,15X\e(B)
+        (?\e(57\e(B . ?\e$,15Y\e(B)
+        (?\e(58\e(B . ?\e$,15Z\e(B)
+        (?\e(59\e(B . ?\e$,15[\e(B)
+        (?\e(5:\e(B . ?\e$,15\\e(B)
+        (?\e(5;\e(B . ?\e$,15]\e(B)
+        (?\e(5<\e(B . ?\e$,15^\e(B)
+        (?\e(5=\e(B . ?\e$,15_\e(B)
+        (?\e(5>\e(B . ?\e$,15`\e(B)
+        (?\e(5?\e(B . ?\e$,15a\e(B)
+        (?\e(5@\e(B . ?\e$,15b\e(B)
+        (?\e(5A\e(B . ?\e$,15c\e(B)
+        (?\e(5B\e(B . ?\e$,15d\e(B)
+        (?\e(5C\e(B . ?\e$,15e\e(B)
+        (?\e(5D\e(B . ?\e$,15f\e(B)
+        (?\e(5E\e(B . ?\e$,15g\e(B)
+        (?\e(5F\e(B . ?\e$,15h\e(B)
+        (?\e(5G\e(B . ?\e$,15i\e(B)
+        (?\e(5H\e(B . ?\e$,15j\e(B)
+        (?\e(5I\e(B . ?\e$,15k\e(B)
+        (?\e(5J\e(B . ?\e$,15l\e(B)
+        (?\e(5K\e(B . ?\e$,15m\e(B)
+        (?\e(5L\e(B . ?\e$,15n\e(B)
+        (?\e(5M\e(B . ?\e$,15o\e(B)
+        (?\e(5N\e(B . ?\e$,16?\e(B)
+        (?\e(5O\e(B . ?\e$,15p\e(B)
+        (?\e(5P\e(B . ?\e$,15q\e(B)
+        (?\e(5Q\e(B . ?\e$,15r\e(B)
+        (?\e(5R\e(B . ?\e$,15s\e(B)
+        (?\e(5S\e(B . ?\e$,15t\e(B)
+        (?\e(5T\e(B . ?\e$,15u\e(B)
+        (?\e(5U\e(B . ?\e$,15v\e(B)
+        (?\e(5V\e(B . ?\e$,15w\e(B)
+        (?\e(5W\e(B . ?\e$,15x\e(B)
+        (?\e(5X\e(B . ?\e$,15y\e(B)
+        (?\e(5Z\e(B . ?\e$,15~\e(B)
+        (?\e(5[\e(B . ?\e$,15\7f\e(B)
+        (?\e(5\\e(B . ?\e$,16 \e(B)
+        (?\e(5]\e(B . ?\e$,16!\e(B)
+        (?\e(5^\e(B . ?\e$,16"\e(B)
+        (?\e(5_\e(B . ?\e$,16#\e(B)
+        (?\e(5`\e(B . ?\e$,16&\e(B)
+        (?\e(5a\e(B . ?\e$,16'\e(B)
+        (?\e(5b\e(B . ?\e$,16(\e(B)
+        (?\e(5c\e(B . ?\e$,16%\e(B)
+        (?\e(5d\e(B . ?\e$,16*\e(B)
+        (?\e(5e\e(B . ?\e$,16+\e(B)
+        (?\e(5f\e(B . ?\e$,16,\e(B)
+        (?\e(5g\e(B . ?\e$,16)\e(B)
+        (?\e(5h\e(B . ?\e$,16-\e(B)
+        (?\e(5i\e(B . ?\e$,15|\e(B)
+        (?\e(5j\e(B . ?\e$,16D\e(B)
+        (?\e(5q\e(B . ?\e$,16F\e(B)
+        (?\e(5r\e(B . ?\e$,16G\e(B)
+        (?\e(5s\e(B . ?\e$,16H\e(B)
+        (?\e(5t\e(B . ?\e$,16I\e(B)
+        (?\e(5u\e(B . ?\e$,16J\e(B)
+        (?\e(5v\e(B . ?\e$,16K\e(B)
+        (?\e(5w\e(B . ?\e$,16L\e(B)
+        (?\e(5x\e(B . ?\e$,16M\e(B)
+        (?\e(5y\e(B . ?\e$,16N\e(B)
+        (?\e(5z\e(B . ?\e$,16O\e(B)))
+
+      (katakana-jisx0201
+       '((?\e(I!\e(B . ?\e$,3sa\e(B)
+        (?\\e(I"\e(B . ?\\e$,3sb\e(B)
+        (?\\e(I#\e(B . ?\\e$,3sc\e(B)
+        (?\e(I$\e(B . ?\e$,3sd\e(B)
+        (?\e(I%\e(B . ?\e$,3se\e(B)
+        (?\e(I&\e(B . ?\e$,3sf\e(B)
+        (?\e(I'\e(B . ?\e$,3sg\e(B)
+        (?\e(I(\e(B . ?\e$,3sh\e(B)
+        (?\e(I)\e(B . ?\e$,3si\e(B)
+        (?\e(I*\e(B . ?\e$,3sj\e(B)
+        (?\e(I+\e(B . ?\e$,3sk\e(B)
+        (?\e(I,\e(B . ?\e$,3sl\e(B)
+        (?\e(I-\e(B . ?\e$,3sm\e(B)
+        (?\e(I.\e(B . ?\e$,3sn\e(B)
+        (?\e(I/\e(B . ?\e$,3so\e(B)
+        (?\e(I0\e(B . ?\e$,3sp\e(B)
+        (?\e(I1\e(B . ?\e$,3sq\e(B)
+        (?\e(I2\e(B . ?\e$,3sr\e(B)
+        (?\e(I3\e(B . ?\e$,3ss\e(B)
+        (?\e(I4\e(B . ?\e$,3st\e(B)
+        (?\e(I5\e(B . ?\e$,3su\e(B)
+        (?\e(I6\e(B . ?\e$,3sv\e(B)
+        (?\e(I7\e(B . ?\e$,3sw\e(B)
+        (?\e(I8\e(B . ?\e$,3sx\e(B)
+        (?\e(I9\e(B . ?\e$,3sy\e(B)
+        (?\e(I:\e(B . ?\e$,3sz\e(B)
+        (?\e(I;\e(B . ?\e$,3s{\e(B)
+        (?\e(I<\e(B . ?\e$,3s|\e(B)
+        (?\e(I=\e(B . ?\e$,3s}\e(B)
+        (?\e(I>\e(B . ?\e$,3s~\e(B)
+        (?\e(I?\e(B . ?\e$,3s\7f\e(B)
+        (?\e(I@\e(B . ?\e$,3t \e(B)
+        (?\e(IA\e(B . ?\e$,3t!\e(B)
+        (?\e(IB\e(B . ?\e$,3t"\e(B)
+        (?\e(IC\e(B . ?\e$,3t#\e(B)
+        (?\e(ID\e(B . ?\e$,3t$\e(B)
+        (?\e(IE\e(B . ?\e$,3t%\e(B)
+        (?\e(IF\e(B . ?\e$,3t&\e(B)
+        (?\e(IG\e(B . ?\e$,3t'\e(B)
+        (?\e(IH\e(B . ?\e$,3t(\e(B)
+        (?\e(II\e(B . ?\e$,3t)\e(B)
+        (?\e(IJ\e(B . ?\e$,3t*\e(B)
+        (?\e(IK\e(B . ?\e$,3t+\e(B)
+        (?\e(IL\e(B . ?\e$,3t,\e(B)
+        (?\e(IM\e(B . ?\e$,3t-\e(B)
+        (?\e(IN\e(B . ?\e$,3t.\e(B)
+        (?\e(IO\e(B . ?\e$,3t/\e(B)
+        (?\e(IP\e(B . ?\e$,3t0\e(B)
+        (?\e(IQ\e(B . ?\e$,3t1\e(B)
+        (?\e(IR\e(B . ?\e$,3t2\e(B)
+        (?\e(IS\e(B . ?\e$,3t3\e(B)
+        (?\e(IT\e(B . ?\e$,3t4\e(B)
+        (?\e(IU\e(B . ?\e$,3t5\e(B)
+        (?\e(IV\e(B . ?\e$,3t6\e(B)
+        (?\e(IW\e(B . ?\e$,3t7\e(B)
+        (?\e(IX\e(B . ?\e$,3t8\e(B)
+        (?\e(IY\e(B . ?\e$,3t9\e(B)
+        (?\e(IZ\e(B . ?\e$,3t:\e(B)
+        (?\e(I[\e(B . ?\e$,3t;\e(B)
+        (?\e(I\\e(B . ?\e$,3t<\e(B)
+        (?\e(I]\e(B . ?\e$,3t=\e(B)
+        (?\e(I^\e(B . ?\e$,3t>\e(B)
+        (?\e(I_\e(B . ?\e$,3t?\e(B)))
+
+      (chinese-sisheng
+       '((?\e(0!\e(B . ?\e$,1 !\e(B)
+        (?\e(0"\e(B . ?\e,Aa\e(B)
+        (?\e(0#\e(B . ?\e$,1".\e(B)
+        (?\e(0$\e(B . ?\e,A`\e(B)
+        (?\e(0%\e(B . ?\e$,1 3\e(B)
+        (?\e(0&\e(B . ?\e,Ai\e(B)
+        (?\e(0'\e(B . ?\e$,1 ;\e(B)
+        (?\e(0(\e(B . ?\e,Ah\e(B)
+        (?\e(0)\e(B . ?\e$,1 K\e(B)
+        (?\e(0*\e(B . ?\e,Am\e(B)
+        (?\e(0+\e(B . ?\e$,1"0\e(B)
+        (?\e(0,\e(B . ?\e,Al\e(B)
+        (?\e(0-\e(B . ?\e$,1 m\e(B)
+        (?\e(0.\e(B . ?\e,As\e(B)
+        (?\e(0/\e(B . ?\e$,1"2\e(B)
+        (?\e(00\e(B . ?\e,Ar\e(B)
+        (?\e(01\e(B . ?\e$,1!+\e(B)
+        (?\e(02\e(B . ?\e,Az\e(B)
+        (?\e(03\e(B . ?\e$,1"4\e(B)
+        (?\e(04\e(B . ?\e,Ay\e(B)
+        (?\e(05\e(B . ?\e$,1"6\e(B)
+        (?\e(06\e(B . ?\e$,1"8\e(B)
+        (?\e(07\e(B . ?\e$,1":\e(B)
+        (?\e(08\e(B . ?\e$,1"<\e(B)
+        (?\e(09\e(B . ?\e,A|\e(B)
+        (?\e(0:\e(B . ?\e,Aj\e(B)
+        (?\e(0<\e(B . ?\e$,1m\7f\e(B)
+        (?\e(0=\e(B . ?\e$,1 d\e(B)
+        (?\e(0>\e(B . ?\e$,1 h\e(B)
+        (?\e(0?\e(B . ?\e$,1"Y\e(B)
+        (?\e(0A\e(B . ?\e$,1$i\e(B)
+        (?\e(0B\e(B . ?\e$,1$j\e(B)
+        (?\e(0C\e(B . ?\e$,1$g\e(B)
+        (?\e(0D\e(B . ?\e$,1$k\e(B)
+        (?\e(0E\e(B . ?\e$,2@%\e(B)
+        (?\e(0F\e(B . ?\e$,2@&\e(B)
+        (?\e(0G\e(B . ?\e$,2@'\e(B)
+        (?\e(0H\e(B . ?\e$,2@(\e(B)
+        (?\e(0I\e(B . ?\e$,2@)\e(B)
+        (?\e(0J\e(B . ?\e$,2@*\e(B)
+        (?\e(0K\e(B . ?\e$,2@+\e(B)
+        (?\e(0L\e(B . ?\e$,2@,\e(B)
+        (?\e(0M\e(B . ?\e$,2@-\e(B)
+        (?\e(0N\e(B . ?\e$,2@.\e(B)
+        (?\e(0O\e(B . ?\e$,2@/\e(B)
+        (?\e(0P\e(B . ?\e$,2@0\e(B)
+        (?\e(0Q\e(B . ?\e$,2@1\e(B)
+        (?\e(0R\e(B . ?\e$,2@2\e(B)
+        (?\e(0S\e(B . ?\e$,2@3\e(B)
+        (?\e(0T\e(B . ?\e$,2@4\e(B)
+        (?\e(0U\e(B . ?\e$,2@5\e(B)
+        (?\e(0V\e(B . ?\e$,2@6\e(B)
+        (?\e(0W\e(B . ?\e$,2@7\e(B)
+        (?\e(0X\e(B . ?\e$,2@8\e(B)
+        (?\e(0Y\e(B . ?\e$,2@9\e(B)
+        (?\e(0Z\e(B . ?\e$,2@:\e(B)
+        (?\e(0[\e(B . ?\e$,2@;\e(B)
+        (?\e(0\\e(B . ?\e$,2@<\e(B)
+        (?\e(0]\e(B . ?\e$,2@=\e(B)
+        (?\e(0^\e(B . ?\e$,2@>\e(B)
+        (?\e(0_\e(B . ?\e$,2@?\e(B)
+        (?\e(0`\e(B . ?\e$,2@@\e(B)
+        (?\e(0a\e(B . ?\e$,2@A\e(B)
+        (?\e(0b\e(B . ?\e$,2@B\e(B)
+        (?\e(0c\e(B . ?\e$,2@C\e(B)
+        (?\e(0d\e(B . ?\e$,2@D\e(B)
+        (?\e(0e\e(B . ?\e$,2@E\e(B)
+        (?\e(0f\e(B . ?\e$,2@F\e(B)
+        (?\e(0g\e(B . ?\e$,2@G\e(B)
+        (?\e(0h\e(B . ?\e$,2@H\e(B)
+        (?\e(0i\e(B . ?\e$,2@I\e(B)))
+
+      (lao
+       '((?\e(1!\e(B . ?\e$,1D!\e(B)
+        (?\e(1"\e(B . ?\e$,1D"\e(B)
+        (?\e(1$\e(B . ?\e$,1D$\e(B)
+        (?\e(1'\e(B . ?\e$,1D'\e(B)
+        (?\e(1(\e(B . ?\e$,1D(\e(B)
+        (?\e(1*\e(B . ?\e$,1D*\e(B)
+        (?\e(1-\e(B . ?\e$,1D-\e(B)
+        (?\e(14\e(B . ?\e$,1D4\e(B)
+        (?\e(15\e(B . ?\e$,1D5\e(B)
+        (?\e(16\e(B . ?\e$,1D6\e(B)
+        (?\e(17\e(B . ?\e$,1D7\e(B)
+        (?\e(19\e(B . ?\e$,1D9\e(B)
+        (?\e(1:\e(B . ?\e$,1D:\e(B)
+        (?\e(1;\e(B . ?\e$,1D;\e(B)
+        (?\e(1<\e(B . ?\e$,1D<\e(B)
+        (?\e(1=\e(B . ?\e$,1D=\e(B)
+        (?\e(1>\e(B . ?\e$,1D>\e(B)
+        (?\e(1?\e(B . ?\e$,1D?\e(B)
+        (?\e(1A\e(B . ?\e$,1DA\e(B)
+        (?\e(1B\e(B . ?\e$,1DB\e(B)
+        (?\e(1C\e(B . ?\e$,1DC\e(B)
+        (?\e(1E\e(B . ?\e$,1DE\e(B)
+        (?\e(1G\e(B . ?\e$,1DG\e(B)
+        (?\e(1J\e(B . ?\e$,1DJ\e(B)
+        (?\e(1K\e(B . ?\e$,1DK\e(B)
+        (?\e(1M\e(B . ?\e$,1DM\e(B)
+        (?\e(1N\e(B . ?\e$,1DN\e(B)
+        (?\e(1O\e(B . ?\e$,1DO\e(B)
+        (?\e(1P\e(B . ?\e$,1DP\e(B)
+        (?\e(1Q\e(B . ?\e$,1DQ\e(B)
+        (?\e(1R\e(B . ?\e$,1DR\e(B)
+        (?\e(1S\e(B . ?\e$,1DS\e(B)
+        (?\e(1T\e(B . ?\e$,1DT\e(B)
+        (?\e(1U\e(B . ?\e$,1DU\e(B)
+        (?\e(1V\e(B . ?\e$,1DV\e(B)
+        (?\e(1W\e(B . ?\e$,1DW\e(B)
+        (?\e(1X\e(B . ?\e$,1DX\e(B)
+        (?\e(1Y\e(B . ?\e$,1DY\e(B)
+        (?\e(1[\e(B . ?\e$,1D[\e(B)
+        (?\e(1\\e(B . ?\e$,1D\\e(B)
+        (?\e(1]\e(B . ?\e$,1D]\e(B)
+        (?\e(1`\e(B . ?\e$,1D`\e(B)
+        (?\e(1a\e(B . ?\e$,1Da\e(B)
+        (?\e(1b\e(B . ?\e$,1Db\e(B)
+        (?\e(1c\e(B . ?\e$,1Dc\e(B)
+        (?\e(1d\e(B . ?\e$,1Dd\e(B)
+        (?\e(1f\e(B . ?\e$,1Df\e(B)
+        (?\e(1h\e(B . ?\e$,1Dh\e(B)
+        (?\e(1i\e(B . ?\e$,1Di\e(B)
+        (?\e(1j\e(B . ?\e$,1Dj\e(B)
+        (?\e(1k\e(B . ?\e$,1Dk\e(B)
+        (?\e(1l\e(B . ?\e$,1Dl\e(B)
+        (?\e(1m\e(B . ?\e$,1Dm\e(B)
+        (?\e(1p\e(B . ?\e$,1Dp\e(B)
+        (?\e(1q\e(B . ?\e$,1Dq\e(B)
+        (?\e(1r\e(B . ?\e$,1Dr\e(B)
+        (?\e(1s\e(B . ?\e$,1Ds\e(B)
+        (?\e(1t\e(B . ?\e$,1Dt\e(B)
+        (?\e(1u\e(B . ?\e$,1Du\e(B)
+        (?\e(1v\e(B . ?\e$,1Dv\e(B)
+        (?\e(1w\e(B . ?\e$,1Dw\e(B)
+        (?\e(1x\e(B . ?\e$,1Dx\e(B)
+        (?\e(1y\e(B . ?\e$,1Dy\e(B)
+        (?\e(1|\e(B . ?\e$,1D|\e(B)
+        (?\e(1}\e(B . ?\e$,1D}\e(B))))
+  (let ((table (make-char-table 'safe-chars))
+       safe-charsets)
+    (dolist (cs '(vietnamese-viscii lao chinese-sisheng ipa
+                 katakana-jisx0201 thai-tis620 tibetan-iso-8bit
+                 indian-is13194 ethiopic))
+      ;; These tables could be used as translation-table-for-encode by
+      ;; the relevant coding systems.
+      (let ((encode-translator
+            (if (coding-system-p cs)
+                (set (intern (format "ucs-%s-encode-table" cs))
+                     (make-translation-table)))))
+       (dolist (pair (symbol-value cs))
+         (aset ucs-mule-to-mule-unicode (car pair) (cdr pair))
+         (if encode-translator
+             (aset encode-translator (cdr pair) (car pair))))
+       (if (charsetp cs)
+           (push cs safe-charsets)
+         (setq safe-charsets
+               (append (delq 'ascii (coding-system-get cs 'safe-charsets))
+                       safe-charsets)))))
+    (dolist (c safe-charsets)
+      (aset table (make-char c) t))
+    (coding-system-put 'mule-utf-8 'safe-charsets
+                      (append (coding-system-get 'mule-utf-8 'safe-charsets)
+                              safe-charsets))
+    (register-char-codings 'mule-utf-8 table)))
+
+(provide 'ucs-tables)
+
+;;; ucs-tables.el ends here
index d128b83..a495721 100644 (file)
 ;;**
 ;;*******************************************************************
 
-(defmacro xml-node-name       (node)
+(defsubst xml-node-name (node)
   "Return the tag associated with NODE.
 The tag is a lower-case symbol."
-  (list 'car node))
+  (car node))
 
-(defmacro xml-node-attributes (node)
+(defsubst xml-node-attributes (node)
   "Return the list of attributes of NODE.
 The list can be nil."
-  (list 'nth 1 node))
+  (nth 1 node))
 
-(defmacro xml-node-children   (node)
+(defsubst xml-node-children (node)
   "Return the list of children of NODE.
 This is a list of nodes, and it can be nil."
-  (list 'cddr node))
+  (cddr node))
 
 (defun xml-get-children (node child-name)
   "Return the children of NODE whose tag is CHILD-NAME.
 CHILD-NAME should be a lower case symbol."
-  (let ((children (xml-node-children node))
-       match)
-    (while children
-      (if (car children)
-         (if (equal (xml-node-name (car children)) child-name)
-             (set 'match (append match (list (car children))))))
-      (set 'children (cdr children)))
-    match))
+  (let ((match ()))
+    (dolist (child (xml-node-children node))
+      (if child
+         (if (equal (xml-node-name child) child-name)
+             (push child match))))
+    (nreverse match)))
 
 (defun xml-get-attribute (node attribute)
   "Get from NODE the value of ATTRIBUTE.
@@ -155,16 +153,17 @@ and returned as the first element of the list"
              (forward-char -1)
              (if (null xml)
                  (progn
-                   (set 'result (xml-parse-tag end parse-dtd))
+                   (setq result (xml-parse-tag end parse-dtd))
                    (cond
+                    ((null result))
                     ((listp (car result))
-                     (set 'dtd (car result))
+                     (setq dtd (car result))
                      (add-to-list 'xml (cdr result)))
                     (t
                      (add-to-list 'xml result))))
 
                ;;  translation of rule [1] of XML specifications
-               (error "XML files can have only one toplevel tag.")))
+               (error "XML files can have only one toplevel tag")))
          (goto-char end)))
       (if parse-dtd
          (cons dtd (reverse xml))
@@ -197,7 +196,7 @@ Returns one of:
    ((looking-at "<!DOCTYPE")
     (let (dtd)
       (if parse-dtd
-         (set 'dtd (xml-parse-dtd end))
+         (setq dtd (xml-parse-dtd end))
        (xml-skip-dtd end))
       (skip-chars-forward " \t\n")
       (if dtd
@@ -206,36 +205,31 @@ Returns one of:
    ;;  skip comments
    ((looking-at "<!--")
     (search-forward "-->" end)
-    (skip-chars-forward " \t\n")
-    (xml-parse-tag end))
+    nil)
    ;;  end tag
    ((looking-at "</")
     '())
    ;;  opening tag
    ((looking-at "<\\([^/> \t\n]+\\)")
-    (let* ((node-name (match-string 1))
-          (children (list (intern node-name)))
-          (case-fold-search nil) ;; XML is case-sensitive
+    (goto-char (match-end 1))
+    (let* ((case-fold-search nil) ;; XML is case-sensitive.
+          (node-name (match-string 1))
+          ;; Parse the attribute list.
+          (children (list (xml-parse-attlist end) (intern node-name)))
           pos)
-      (goto-char (match-end 1))
-
-      ;; parses the attribute list
-      (set 'children (append children (list (xml-parse-attlist end))))
 
       ;; is this an empty element ?
       (if (looking-at "/>")
          (progn
            (forward-char 2)
-           (skip-chars-forward " \t\n")
-           (append children '("")))
+           (nreverse (cons '("") children)))
 
        ;; is this a valid start tag ?
-       (if (= (char-after) ?>)
+       (if (eq (char-after) ?>)
            (progn
              (forward-char 1)
-             (skip-chars-forward " \t\n")
-             ;;  Now check that we have the right end-tag. Note that this one might
-             ;;  contain spaces after the tag name
+             ;;  Now check that we have the right end-tag. Note that this
+             ;;  one might contain spaces after the tag name
              (while (not (looking-at (concat "</" node-name "[ \t\n]*>")))
                (cond
                 ((looking-at "</")
@@ -244,9 +238,11 @@ Returns one of:
                          node-name
                          ") at pos " (number-to-string (point)))))
                 ((= (char-after) ?<)
-                 (set 'children (append children (list (xml-parse-tag end)))))
+                 (let ((tag (xml-parse-tag end)))
+                   (when tag
+                     (push tag children))))
                 (t
-                 (set 'pos (point))
+                 (setq pos (point))
                  (search-forward "<" end)
                  (forward-char -1)
                  (let ((string (buffer-substring-no-properties pos (point)))
@@ -256,56 +252,57 @@ Returns one of:
                    ;; Not done, since as per XML specifications, the XML processor
                    ;; should always pass the whole string to the application.
                    ;;      (while (string-match "\\s +" string pos)
-                   ;;        (set 'string (replace-match " " t t string))
-                   ;;        (set 'pos (1+ (match-beginning 0))))
-                   
-                   (set 'children (append children
-                                          (list (xml-substitute-special string))))))))
+                   ;;        (setq string (replace-match " " t t string))
+                   ;;        (setq pos (1+ (match-beginning 0))))
+
+                   (setq string (xml-substitute-special string))
+                   (setq children
+                         (if (stringp (car children))
+                             ;; The two strings were separated by a comment.
+                             (cons (concat (car children) string)
+                                   (cdr children))
+                           (cons string children)))))))
              (goto-char (match-end 0))
-             (skip-chars-forward " \t\n")
              (if (> (point) end)
-                 (error "XML: End tag for %s not found before end of region."
+                 (error "XML: End tag for %s not found before end of region"
                         node-name))
-             children
-             )
+             (nreverse children))
 
          ;;  This was an invalid start tag
          (error "XML: Invalid attribute list")
          ))))
    (t ;; This is not a tag.
-    (error "XML: Invalid character."))
+    (error "XML: Invalid character"))
    ))
 
 (defun xml-parse-attlist (end)
   "Return the attribute-list that point is looking at.
 The search for attributes end at the position END in the current buffer.
 Leaves the point on the first non-blank character after the tag."
-  (let ((attlist '())
+  (let ((attlist ())
        name)
     (skip-chars-forward " \t\n")
     (while (looking-at "\\([a-zA-Z_:][-a-zA-Z0-9._:]*\\)[ \t\n]*=[ \t\n]*")
-      (set 'name (intern (match-string 1)))
+      (setq name (intern (match-string 1)))
       (goto-char (match-end 0))
 
       ;; Do we have a string between quotes (or double-quotes),
       ;;  or a simple word ?
-      (unless (looking-at "\"\\([^\"]+\\)\"")
-       (unless (looking-at "'\\([^\"]+\\)'")
-         (error "XML: Attribute values must be given between quotes.")))
+      (unless (looking-at "\"\\([^\"]*\\)\"")
+       (unless (looking-at "'\\([^']*\\)'")
+         (error "XML: Attribute values must be given between quotes")))
 
       ;; Each attribute must be unique within a given element
       (if (assoc name attlist)
-         (error "XML: each attribute must be unique within an element."))
+         (error "XML: each attribute must be unique within an element"))
       
-      (set 'attlist (append attlist
-                           (list (cons name (match-string-no-properties 1)))))
+      (push (cons name (match-string-no-properties 1)) attlist)
       (goto-char (match-end 0))
       (skip-chars-forward " \t\n")
       (if (> (point) end)
-         (error "XML: end of attribute list not found before end of region."))
+         (error "XML: end of attribute list not found before end of region"))
       )
-    attlist
-    ))
+    (nreverse attlist)))
 
 ;;*******************************************************************
 ;;**
@@ -335,25 +332,25 @@ This follows the rule [28] in the XML specifications."
 (defun xml-parse-dtd (end)
   "Parse the DTD that point is looking at.
 The DTD must end before the position END in the current buffer."
-  (let (dtd type element end-pos)
-    (forward-char (length "<!DOCTYPE"))
-    (skip-chars-forward " \t\n")
-    (if (looking-at ">")
-       (error "XML: invalid DTD (excepting name of the document)"))
-
-    ;;  Get the name of the document
-    (looking-at "\\sw+")
-    (set 'dtd (list 'dtd (match-string-no-properties 0)))
+  (forward-char (length "<!DOCTYPE"))
+  (skip-chars-forward " \t\n")
+  (if (looking-at ">")
+      (error "XML: invalid DTD (excepting name of the document)"))
+  
+  ;;  Get the name of the document
+  (looking-at "\\sw+")
+  (let ((dtd (list (match-string-no-properties 0) 'dtd))
+       type element end-pos)
     (goto-char (match-end 0))
 
     (skip-chars-forward " \t\n")
 
     ;;  External DTDs => don't know how to handle them yet
     (if (looking-at "SYSTEM")
-       (error "XML: Don't know how to handle external DTDs."))
+       (error "XML: Don't know how to handle external DTDs"))
     
     (if (not (= (char-after) ?\[))
-       (error "XML: Unknown declaration in the DTD."))
+       (error "XML: Unknown declaration in the DTD"))
 
     ;;  Parse the rest of the DTD
     (forward-char 1)
@@ -367,16 +364,16 @@ The DTD must end before the position END in the current buffer."
 
        (setq element (intern (match-string-no-properties 1))
              type    (match-string-no-properties 2))
-       (set 'end-pos (match-end 0))
+       (setq end-pos (match-end 0))
        
        ;;  Translation of rule [46] of XML specifications
        (cond
         ((string-match "^EMPTY[ \t\n]*$" type)     ;; empty declaration
-         (set 'type 'empty))
+         (setq type 'empty))
         ((string-match "^ANY[ \t\n]*$" type)       ;; any type of contents
-         (set 'type 'any))
+         (setq type 'any))
         ((string-match "^(\\(.*\\))[ \t\n]*$" type) ;; children ([47])
-         (set 'type (xml-parse-elem-type (match-string-no-properties 1 type))))
+         (setq type (xml-parse-elem-type (match-string-no-properties 1 type))))
         ((string-match "^%[^;]+;[ \t\n]*$" type)   ;; substitution
          nil)
         (t
@@ -384,13 +381,12 @@ The DTD must end before the position END in the current buffer."
 
        ;;  rule [45]: the element declaration must be unique
        (if (assoc element dtd)
-           (error "XML: elements declaration must be unique in a DTD (<%s>)."
+           (error "XML: elements declaration must be unique in a DTD (<%s>)"
                   (symbol-name element)))
        
        ;;  Store the element in the DTD
-       (set 'dtd (append dtd (list (list element type))))
-       (goto-char end-pos)
-       )
+       (push (list element type) dtd)
+       (goto-char end-pos))
 
 
        (t
@@ -400,8 +396,7 @@ The DTD must end before the position END in the current buffer."
 
     ;;  Skip the end of the DTD
     (search-forward ">" end)
-  dtd
-  ))
+    (nreverse dtd)))
 
 
 (defun xml-parse-elem-type (string)
@@ -413,11 +408,11 @@ The DTD must end before the position END in the current buffer."
          (setq elem     (match-string 1 string)
                modifier (match-string 2 string))
          (if (string-match "|" elem)
-             (set 'elem (append '(choice)
+             (setq elem (cons 'choice
                               (mapcar 'xml-parse-elem-type
                                       (split-string elem "|"))))
            (if (string-match "," elem)
-               (set 'elem (append '(seq)
+               (setq elem (cons 'seq
                                 (mapcar 'xml-parse-elem-type
                                         (split-string elem ","))))
              )))
@@ -425,19 +420,18 @@ The DTD must end before the position END in the current buffer."
          (setq elem     (match-string 1 string)
                modifier (match-string 2 string))))
 
-      (if (and (stringp elem)
-              (string= elem "#PCDATA"))
-         (set 'elem 'pcdata))
+    (if (and (stringp elem) (string= elem "#PCDATA"))
+       (setq elem 'pcdata))
     
-      (cond
-       ((string= modifier "+")
-       (list '+ elem))
-       ((string= modifier "*")
-       (list '* elem))
-       ((string= modifier "?")
-       (list '? elem))
-       (t
-       elem))))
+    (cond
+     ((string= modifier "+")
+      (list '+ elem))
+     ((string= modifier "*")
+      (list '* elem))
+     ((string= modifier "?")
+      (list '? elem))
+     (t
+      elem))))
 
 
 ;;*******************************************************************
@@ -449,15 +443,15 @@ The DTD must end before the position END in the current buffer."
 (defun xml-substitute-special (string)
   "Return STRING, after subsituting special XML sequences."
   (while (string-match "&amp;" string)
-    (set 'string (replace-match "&"  t nil string)))
+    (setq string (replace-match "&"  t nil string)))
   (while (string-match "&lt;" string)
-    (set 'string (replace-match "<"  t nil string)))
+    (setq string (replace-match "<"  t nil string)))
   (while (string-match "&gt;" string)
-    (set 'string (replace-match ">"  t nil string)))
+    (setq string (replace-match ">"  t nil string)))
   (while (string-match "&apos;" string)
-    (set 'string (replace-match "'"  t nil string)))
+    (setq string (replace-match "'"  t nil string)))
   (while (string-match "&quot;" string)
-    (set 'string (replace-match "\"" t nil string)))
+    (setq string (replace-match "\"" t nil string)))
   string)
 
 ;;*******************************************************************
@@ -468,50 +462,39 @@ The DTD must end before the position END in the current buffer."
 ;;*******************************************************************
 
 (defun xml-debug-print (xml)
-  (while xml
-    (xml-debug-print-internal (car xml) "")
-    (set 'xml (cdr xml)))
-  )
+  (dolist (node xml)
+    (xml-debug-print-internal node "")))
 
-(defun xml-debug-print-internal (xml &optional indent-string)
+(defun xml-debug-print-internal (xml indent-string)
   "Outputs the XML tree in the current buffer.
 The first line indented with INDENT-STRING."
   (let ((tree xml)
        attlist)
-    (unless indent-string
-      (set 'indent-string ""))
-    
     (insert indent-string "<" (symbol-name (xml-node-name tree)))
     
     ;;  output the attribute list
-    (set 'attlist (xml-node-attributes tree))
+    (setq attlist (xml-node-attributes tree))
     (while attlist
       (insert " ")
       (insert (symbol-name (caar attlist)) "=\"" (cdar attlist) "\"")
-      (set 'attlist (cdr attlist)))
+      (setq attlist (cdr attlist)))
     
     (insert ">")
     
-    (set 'tree (xml-node-children tree))
+    (setq tree (xml-node-children tree))
 
     ;;  output the children
-    (while tree
+    (dolist (node tree)
       (cond
-       ((listp (car tree))
+       ((listp node)
        (insert "\n")
-       (xml-debug-print-internal (car tree) (concat indent-string "  "))
-       )
-       ((stringp (car tree))
-       (insert (car tree))
-       )
+       (xml-debug-print-internal node (concat indent-string "  ")))
+       ((stringp node) (insert node))
        (t
-       (error "Invalid XML tree")))
-      (set 'tree (cdr tree))
-     )
+       (error "Invalid XML tree"))))
 
     (insert "\n" indent-string
-           "</" (symbol-name (xml-node-name xml)) ">")
-    ))
+           "</" (symbol-name (xml-node-name xml)) ">")))
 
 (provide 'xml)
 
index 0c9338f..b6ee4d0 100644 (file)
@@ -281,4 +281,4 @@ static char *gnus[] = {
 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
 };
-SIMPLE  =                    T                                                  BITPIX  =                    8                                                  NAXIS   =                    2                                                  NAXIS1  =                  271                                                  NAXIS2  =                  273                                                  HISTORY Written by XV 3.10a                                                     END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Â½Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Â½Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Â½Â½Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Â½Â½Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Â½Â½Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Â½Â½Â½Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«Ã«\8eëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8eëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8eëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëë½½½½½½ë\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8eëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8e\8e\8e\8eëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8eë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e½½½½½½½½ë\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e½½½½½½½½½½ë\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½ëëëëëëëëëëëëëëëëëëë½½½½½½½½ë\8e\8eëë½½½½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëëëë½½½½½½½ëëëëëëë½½½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëë½½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëë½½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëë½½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½ëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëë½½½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½\8e\8e½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëë\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½ëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëë½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½½½ëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëë½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëë½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëë½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëë½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8eë½½½½½ëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8eë½½½½ë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8eë½½½ë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëë½½½½½½½½\8e\8e½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëë½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëë½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8eëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëë½½½½½½½½½½½½½½\8e\8e\8e\8e½½½½½½½½½½½½½½½ëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëë½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eë½½½½ëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eë½½½½ëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëë½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eë½½½ëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½ëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëë½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e½½ëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëë½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eë½ëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëë½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëë½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëë½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eë½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëë½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëë½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e½½½\8e\8e½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëë½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½\8e½½½½\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½½½\8e\8e\8e\8e\8e\8e½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëë½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëë½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëë½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½ëëëëëëë½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½ëë½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8eëëëëëë\8e\8eëëëëë½½ëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8eëëëëëë\8e\8eëëëëë½½½ëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8eëëë½½½½½ëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½½ëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëë\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëë\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eë½½½½½½ëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½ëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëë½½½½½½ëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8eëë½½½½½½½ëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e½½½½½½\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8e\8e\8e\8e\8e\8e\8e\8e½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\8e\8e\8eëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
+
index 17646c7..452beb9 100644 (file)
+2002-05-01 20:09:21 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no>
+
+       * gnus.el: Oort Gnus v0.06 is released.
+
+2002-05-01  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * lpath.el: Bind url-package-version.
+
+2002-05-01  Simon Josefsson  <jas@extundo.com>
+
+       * nnfolder.el (nnfolder-request-delete-group): Figure out nov/mrk
+       filename before deleting the group itself, because the presence of
+       a group filename decides if long filenames are used or not.
+
+       * gnus-art.el (gnus-button-alist): Don't inline
+       gnus-button-url-regexp.  This makes it possible to change g-b-u-r
+       without also modifying g-button-alist.
+       (gnus-button-alist): Fix type to allow variable as well as regexp.
+       (gnus-article-add-buttons): Evaluate regexp.  Strings evaluate to
+       themselves, variables to its contents.
+       (gnus-button-entry): Ditto.
+
+2002-05-01  Simon Josefsson  <jas@extundo.com>
+
+       * imap.el (imap-parse-resp-text-code, imap-parse-status): Treat
+       UIDNEXT as a string.
+
+       * nnimap.el (nnimap-string-lessp-numerical): New function.
+       (nnimap-retrieve-groups): Compare UIDNEXT as strings instead of
+       integers.
+
+2002-04-29  Simon Josefsson  <jas@extundo.com>
+
+       * nnmail.el (nnmail-cache-insert): Accept optional group
+       parameter.
+
+       * nnimap.el (nnimap-retrieve-groups): Don't send STATUS when
+       n-r-g-a is disabled.
+
+2002-04-29  Simon Josefsson  <jas@extundo.com>
+
+       * nnimap.el (nnimap-split-fancy): Fix doc.
+       (nnimap-split-fancy): Fix doc.
+
+       * nnimap.el (nnimap-retrieve-groups-asynchronous): New variable.
+       (nnimap-mailbox-info): New internal variable.
+       (nnimap-retrieve-groups): Implement faster new mail check.
+
+       * nnimap.el (nnimap-split-articles): Support
+       nnmail-cache-accepted-message-ids.
+       (nnimap-request-accept-article): Ditto.
+
+       * imap.el (imap-mailbox-status-asynch): New command.
+
+2002-04-29  Nevin Kapur  <nevin@jhu.edu>
+
+       * gnus.el (gnus-find-subscribed-addresses): Return nil when there
+       are no subscribed mail groups.
+        - Strip quoted names when comparing addresses
+
+2002-04-28  Jesper Harder  <harder@ifa.au.dk>
+
+       * mm-decode.el (mm-text-html-renderer): Change customize type to
+       const.
+
+       * gnus-msg.el (gnus-discouraged-post-methods): Fix typo.
+       (gnus-debug-exclude-variables): do.
+
+2002-04-27  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-msg.el (gnus-article-mail): Use gnus-msg-mail instead.
+       Trivial change from Karl Pfl\e,Ad\e(Bsterer <sigurd@12move.de>.
+
+2002-04-27  Katsumi Yamaoka <yamaoka@jpl.org>
+       
+       * dns.el (dns-make-network-process): New macro.
+       (query-dns): Use it.
+
+2002-04-27  ShengHuo ZHU  <zsh@cs.rochester.edu>
+       
+       * gnus-msg.el (gnus-summary-reply): Remove unbound variable
+       article-buffer.
+
+       * mm-url.el (mm-url-package-name): New variable.
+       (mm-url-package-version): New variable.
+       (mm-url-insert-file-contents): Bind url-package-name and
+       url-package-version here.
+       * nnrss.el (nnrss-insert-w3): Move the bindings.
+
+       * nnrss.el (nnrss-insert-w3): Bind url-package-name and
+       url-package-version. Trivial change from Andrew J Cosgriff
+       <ajc@polydistortion.net>
+
+       * mm-decode.el (mm-save-part): Fill in file name when GUI saving
+       attachments. Trivial change from Peter 'Luna' Runestig
+       <peter@runestig.com>.
+
+2002-04-19  Jesper Harder  <harder@ifa.au.dk>
+
+       * nnkiboze.el (nnkiboze-request-scan): Call
+       nnkiboze-possibly-change-group.
+       (nnkiboze-generate-group): Use mm-with-unibyte to avoid encoding
+       problems.
+       (nnkiboze-generate-group): Set newsrc to the *highest* article
+       number kibozed, not the lowest.
+       
+2002-04-15  Jesper Harder  <harder@ifa.au.dk>
+
+       * gnus-art.el (article-unsplit-urls): Allow trailing SPC.
+
+2002-04-24  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+       From Dan Christensen <jdc+news@uwo.ca>.
+
+       * nndoc.el (nndoc-type-alist, nndoc-lanl-gov-announce-type-p)
+       (nndoc-transform-lanl-gov-announce, nndoc-generate-lanl-gov-head):
+       Recognize math postings.  Extract Date (now ignores "(15kb)").
+       Extract email address using gnus-extract-address-components
+       instead of just taking the first word.  Create Date and From
+       headers for message which are missing these headers.  Get rid
+       of spurious \\ lines (purely cosmetic).  Extend body-end and
+       file-end regexps, to exclude more garbage from the message.
+       Make URL rephrasing regexp more flexible, to match current 
+       format.
+
+2002-04-23  Simon Josefsson  <jas@extundo.com>
+
+       * netrc.el: New file, functions copied from gnus-util.el by Ted
+       Zlatanov <tzz@lifelogs.com>.
+
+       * gnus-util.el: Require netrc.
+       (gnus-netrc-get, gnus-netrc-machine, gnus-parse-netrc): Aliased to
+       new code in netrc.el.
+
+2002-04-23  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+       * gnus-msg.el (gnus-summary-resend-message-edit): Remove
+       message-ignored-resent-headers, too.  From Matthieu Moy
+       <Matthieu.Moy@imag.fr>.
+
+2002-04-22  Bj\e,Av\e(Brn Torkelsson  <torkel@acc.umu.se>
+
+       * gnus-srvr.el (gnus-server-browse-in-group-buffer): it is a
+       boolean not a string
+       * gnus-group.el (gnus-group-line-format): add description of %C
+       * gnus-group.el (gnus-group-line-format-alist): add gnus-tmp-comment
+         as %C
+       * gnus-group.el (gnus-group-insert-group-line): add gnus-tmp-comment
+
+2002-04-22  Paul Jarc  <prj@po.cwru.edu>
+
+       * nnmaildir.el (nnmaildir-request-scan): typo: set
+       nnmaildir-get-new-mail, not nnmaildir-new-mail.  Don't call
+       nnmail-get-new-mail for 'find-new-groups.
+
+2002-04-21  Paul Jarc  <prj@po.cwru.edu>
+
+       * nnmaildir.el (nnmaildir-request-update-info,
+       nnmaildir-request-group, nnmaildir-retrieve-groups): remove
+       unnecessary calls to nnmaildir-request-scan.
+
+2002-04-20  Josh Huber  <huber@alum.wpi.edu>
+
+       * gnus-msg.el:
+       * gnus-msg.el (gnus-message-replysign): New.
+       * gnus-msg.el (gnus-message-replyencrypt): New.
+       * gnus-msg.el (gnus-message-replysignencrypted): New.
+       * gnus-msg.el (gnus-summary-reply): Use the three new variables
+       (above) to automatically encrypt/sign to encrypted/signed
+       messages.
+       * message.el:
+       * message.el (message-mode-map): Add keybinding for
+       `message-to-list-only'
+       * message.el (message-mode): Add description for
+       `message-to-list-only'
+       * message.el (message-to-list-only): New.
+       * message.el (message-make-mft): Changed to use the cl loop macro,
+       and added optional flag to return only the matched list. (for use
+       in new message-to-list-only function)
+
+2002-04-20  Josh Huber  <huber@alum.wpi.edu>
+
+       * gnus-msg.el:
+       * gnus-msg.el (gnus-message-replysign):
+       * gnus-msg.el (gnus-replysign): New.
+       * gnus-msg.el (gnus-replyencrypt): New.
+       * gnus-msg.el (gnus-replysignencrypted): New.
+       * gnus-msg.el (gnus-summary-reply):
+       * message.el:
+       * message.el (message-mode-map):
+       * message.el (message-mode):
+       * message.el (message-to-list-only): New.
+       * message.el (message-make-mft):
+
+2002-04-19  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-win.el (gnus-configure-windows-hook): Fix typo.
+
+2002-04-18  Josh Huber  <huber@alum.wpi.edu>
+
+       * message.el (message-gen-unsubscribed-mft): accept a prefix
+       argument so CC can be included with C-u C-c C-f C-a
+
+2002-04-17  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+       From Ted Zlatanov <teodor.zlatanov@divine.com>.
+
+       * spam.el (spam-whitelist, spam-blacklist, spam-enter-whitelist):
+       Improve docstring.
+       (spam-enter-blacklist): New command.
+
+       * gnus-sum.el (gnus-spam-mark): New mark.
+       (gnus-auto-expirable-marks): Add gnus-spam-mark.
+       (gnus-summary-make-tool-bar): Correct conditional.
+       (gnus-summary-limit-to-unread): Add gnus-spam-mark.
+       (gnus-summary-mark-as-spam): New command.
+
+2002-04-13  Josh Huber  <huber@alum.wpi.edu>
+
+       * mml-sec.el (mml-secure-message): changed to support arbritrary
+       modes.
+       * mml-sec.el (mml-secure-message-encrypt-(smime|pgp|pgpmime)):
+       changed to support "signencrypt" mode.
+       * mml.el (mml-parse-1): changed to support different secure modes
+       more easily. (for signencrypt)
+
+2002-04-11  Stefan Monnier  <monnier@cs.yale.edu>
+
+       * gnus-sum.el (gnus-update-summary-mark-positions)
+       (gnus-summary-toggle-header):
+       * gnus-uu.el (gnus-uu-binhex-article, gnus-uu-reginize-string)
+       (gnus-uu-expand-numbers, gnus-uu-post-make-mime)
+       (gnus-uu-post-encoded):
+       * nnfolder.el (nnfolder-possibly-change-group):
+       * nnimap.el (nnimap-retrieve-headers):
+       * nnmbox.el (nnmbox-create-mbox): Don't assume point-min == 1.
+
+2002-04-08  Stefan Monnier  <monnier@cs.yale.edu>
+
+       * nnml.el (nnml-save-nov, nnml-generate-nov-file):
+       * pop3.el (pop3-md5): Don't hardcode point-min == 1.
+
+2002-04-12  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-srvr.el (gnus-server-set-info): Clear
+       `gnus-server-method-cache' when `gnus-server-alist' is changed.
+       From Daiki Ueno <ueno@unixuser.org>.
+
+2002-04-11  Simon Josefsson  <jas@extundo.com>
+
+       * gnus-sum.el (gnus-summary-force-verify-and-decrypt): Force
+       viewing of security buttons.  Thanks to Nicolas Kowalski
+       <Nicolas.Kowalski@imag.fr>.
+
+       * smime.el (smime-CA-directory): Fix doc.  Thanks to Arne
+       J\e,Ax\e(Brgensen <arne+usenet@daimi.au.dk>.
+       (smime-sign-buffer): Work in XEmacs.  Thanks to Nicolas Kowalski
+       <Nicolas.Kowalski@imag.fr>.
+       (smime-decrypt-buffer): Ditto.
+
+2002-04-11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-art.el (gnus-article-prepare): Place point on the emtpy
+       header line.
+
+2002-04-11  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * gnus.el (gnus-refer-article-method): Change `dejanews' to `google'.
+
+2002-04-08  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-sum.el (gnus-summary-delete-marked-with): Fix typo.
+
+2002-04-07  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-view.el (mm-inline-text-html-render-with-w3): Don't ignore
+       errors when debug.
+
+2002-04-07  Josh Huber  <huber@alum.wpi.edu>
+
+       * message.el (message-make-mft): Changed MFT code from using
+       message-recipients (which included Bcc) to use only the To and CC
+       headers.
+
+2002-04-05  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * gnus-art.el (gnus-treat-from-picon): Add to gnus-picon group and
+       add link.
+       (gnus-treat-mail-picon): Ditto.
+       (gnus-treat-newsgroups-picon): Ditto.
+       (gnus-picon-databases): Fix custom type.
+       (gnus-picon-databases): Add link.
+       (gnus-article-x-face-command): Add to gnus-picon group.
+
+2002-04-01  Jesper Harder  <harder@ifa.au.dk>
+
+       * message.el (message-buffer-naming-style): Remove.
+
+2002-04-02  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-group.el (gnus-group-make-tool-bar): Load tool-bar first.
+
+       * message.el (message-tool-bar-map): Ditto.
+
+       * gnus-sum.el (gnus-summary-make-tool-bar): Ditto.
+
+2002-04-01  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * nnwarchive.el (nnwarchive-mail-archive-article): Fix typo.
+
+2002-04-01  Paul Jarc  <prj@po.cwru.edu>
+
+       * nnmaildir.el: fixed some buggy invocations of nnmaildir--pgname.
+
+2002-03-31  Andrew Cohen  <cohen@andy.bu.edu>
+
+       * dns.el: open-network-stream under XEmacs does udp.
+
+2002-03-31  Lars Magne Ingebrigtsen  <larsi@quimbies.gnus.org>
+
+       * spam.el (spam-enter-whitelist): New function.
+       (spam-parse-whitelist): Ditto.
+       (spam-refresh-list-cache): Ditto.
+       (spam-address-whitelisted-p): New function.
+
+       * dns.el (query-dns): Use TCP when make-network-process isn't
+       available.
+       (dns-servers): New variable.
+       (dns-parse-resolv-conf): New function.
+       (query-dns): Use it.
+
+       * spam.el: New file.
+
+       * dns.el (query-dns): Test.
+
+2002-03-31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * lpath.el (featurep): Bind make-network-process.
+
+2002-03-31  Paul Jarc <prj@po.cwru.edu>
+
+       * nnmaildir.el: Use defstruct.  Use a single copy of
+       nnmail-extra-headers to save memory.  Store server's group name
+       prefix instead of each group's prefixed name.
+       * nnnil.el (nnnil-retrieve-headers, nnnil-request-list): Erase
+       nntp-server-buffer.
+
+2002-03-31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * dns.el: New file.
+
+2002-03-28  Simon Josefsson  <jas@extundo.com>
+
+       * gnus-sum.el (gnus-summary-dummy-line-format):
+       * gnus.el (gnus-summary-line-format): Fixing links to Info.
+       Trivial change from Bj\e,Av\e(Brn Torkelsson <torkel@pdc.kth.se>.
+
+2002-03-29  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+       * gnus-sum.el (gnus-summary-move-article)
+       (gnus-summary-copy-article): Mention `gnus-move-split-methods' in
+       the doc string.
+
+2002-03-28  Simon Josefsson  <jas@extundo.com>
+
+       * mml-sec.el (mml-secure-message): Search after
+       mail-header-separator from top of message.
+
+2002-03-28  Paul Jarc <prj@po.cwru.edu>
+
+       * nnmaildir.el: Cosmetic changes.
+       (nnmaildir--with-nntp-buffer, nnmaildir--with-work-buffer,
+       nnmaildir--with-nov-buffer, nnmaildir--with-move-buffer,
+       nnmaildir--group-ls): New macros/functions.  Use them.
+       (nnmaildir--unlink): Evalutate argument only once.
+
+2002-03-27  Jesper Harder  <harder@ifa.au.dk>
+
+       * gnus-sum.el (gnus-summary-highlight): Use `eq' when comparing
+       symbols.
+       (gnus-summary-highlight-line): Use `gnus-point-at-bol' and
+       `gnus-point-at-eol'.
+
+2002-03-27  Paul Jarc <prj@po.cwru.edu>
+
+       * nnmaildir.el (nnmaildir--subdir, nnmaildir--nov-dir,
+       nnmaildir--marks-dir): New macros.  Use them.
+       Use inhibit-quit for atomicity instead of in-memory journaling.
+       (nnmaildir--edit-prep): New function.
+       (Local Variables): Use it.
+
+2002-03-26  Pavel@Janik.cz (Pavel Jan\e,Bm\e(Bk)
+
+       * gnus-sum.el (gnus-summary-make-menu-bar): Fix typo.
+
+2002-03-25  Simon Josefsson  <jas@extundo.com>
+
+       * message.el (message-mode): Fix doc.
+
+2002-03-25  Simon Josefsson  <jas@extundo.com>
+
+       * message.el (message-subject-re-regexp): Skip Re[42]: junk.  From
+       Matthieu Moy <Matthieu.Moy@imag.fr>.
+
+2002-03-24  Jesper Harder  <harder@ifa.au.dk>
+
+       * mml-sec.el (mml-unsecure-message): Add docstring.
+
+2002-03-23  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * nnmail.el (nnmail-large-newsgroup): Fix doc, allow non-numeric
+       value.
+       Trivial change from andre@slamdunknetworks.com
+
+2002-03-22  Josh Huber  <huber@alum.wpi.edu>
+
+       * mml.el (mml-mode-map): Added a keybinding for
+       `mml-unsecure-message'.  Also, added a menu entry for said
+       function in the Attachments menu.
+
+2002-03-22  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * canlock.el (canlock-version): Remove.
+       (canlock-sha1-with-openssl): Don't use `canlock-string-as-unibyte'
+       here; simplify \x insertions.
+       (canlock-sha1): New function, always return a unibyte string.
+       (canlock-make-cancel-key): Use `canlock-sha1'; simplify truncation
+       of a password.
+       (canlock-insert-header): Use `canlock-sha1'.
+       (canlock-verify): Ditto.
+
+2002-03-21  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-fix-before-sending): Add an option that
+       ignores illegible text.
+       Trivial change from Mark Milhollan <mlm@attglobal.net>
+
+       * message.el (message-font-lock-keywords): Support multi-line MML
+       tags.
+
+       * gnus-sum.el (gnus-print-buffer): Remove gnus-decoration.
+       Trivial change from lorentey@elte.hu (L\e,Bu\e(Brentey K\e,Ba\e(Broly)
+
+2002-03-20  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-sum.el (gnus-summary-make-menu-bar): Use intern'ed function
+       symbols for "View as different encoding" submenu.
+
+2002-03-19  Simon Josefsson  <jas@extundo.com>
+
+       * gnus-sum.el (gnus-summary-make-menu-bar): Add "View as different
+       encoding" submenu.
+
+2002-03-19  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-group.el (gnus-group-process-prefix): Make sure there is a mark.
+
+2002-03-19  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+       * gnus-sum.el (gnus-sum-thread-tree-root)
+       (gnus-sum-thread-tree-single-indent)
+       (gnus-sum-thread-tree-vertical, gnus-sum-thread-tree-indent)
+       (gnus-sum-thread-tree-leaf-with-other)
+       (gnus-sum-thread-tree-single-leaf): Make customizable.
+
+2002-03-16  Simon Josefsson  <jas@extundo.com>
+
+       * gnus-util.el (gnus-extract-address-components): Don't break on
+       names such as James "Kibo" Parry.  From Francis Litterio
+       <franl_removethis@world.std.com>.
+
+2002-03-13  Simon Josefsson  <jas@extundo.com>
+
+       * pop3.el (pop3-open-server): Revert multibyte change.  From
+       Pavel@Janik.cz (Pavel Jan\e,Bm\e(Bk).
+
+       * message.el (message-send-mail-with-qmail): Make it work.  From
+       Pavel@Janik.cz (Pavel Jan\e,Bm\e(Bk).
+
+2002-03-13  Josh Huber  <huber@alum.wpi.edu>
+
+       * message.el (message-make-mft): Set case-fold-search while
+       generating the MFT.  Also, a little cleanup in the MFT code.
+
+2002-03-12  Simon Josefsson  <jas@extundo.com>
+
+       * message.el (message-qmail-inject-args): May be function.
+       (message-send-mail-with-qmail): Call function if m-q-i-a is
+       function.  From fn@hungry.org (Faried Nawaz).
+
+2002-03-12  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-abbrevs-loaded): Remove.
+       (mailabbrev): Require it.
+
+       * nnslashdot.el (nnslashdot-request-article): Remove IFRAME.
+
+2002-03-12  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * pop3.el (pop3-open-server): Set process buffer unibyte.
+
+2002-03-10  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-fun.el (gnus-subscribe-to-mailing-list): New function.
+
+2002-03-10  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * nnslashdot.el (nnslashdot-request-article): Remove javascript
+       too.
+
+2002-03-09  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-sum.el (gnus-summary-save-parts-default-mime): Remove
+       duplication.
+       (gnus-summary-save-parts-type-history): Ditto.
+       (gnus-summary-save-parts-last-directory): Ditto.
+       Trivial change from andre@slamdunknetworks.com
+
+2002-03-09  Paul Jarc  <prj@po.cwru.edu
+
+       * gnus-start.el (gnus-auto-subscribed-groups): Include nnmaildir.
+
+2002-03-06  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * nnslashdot.el (nnslashdot-request-article): Use "<!-- no ad 6
+       -->" as the end of the first article.
+
+       * gnus-msg.el (gnus-summary-resend-message-edit): New function.
+       From Matthieu Moy <Matthieu.Moy@imag.fr>
+
+       * message.el (message-add-action): Use add-to-list.
+       (message-delete-action): New function.
+
+       * nndoc.el (nndoc-mail-in-mail-type-p): Break a long regexp into
+       pieces.
+
+2002-03-05  Paul Jarc  <prj@po.cwru.edu>
+
+       * nnnil.el: New file.
+       * gnus.el (gnus-valid-select-methods): Include nnnil.
+
+2002-03-05  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-syntax-checks): Because canlock is
+       supported, we disable sender syntax check.
+       (message-shoot-gnksa-feet): Add cancel-messages option doc.
+
+       * gnus-draft.el (gnus-draft-send): If interactive, use its default
+       value of message-syntax-checks.
+
+       * qp.el (quoted-printable-decode-region): Doc addition.
+       From: Eli Zaretskii <eliz@is.elta.co.il>
+
+       * mail-source.el (make-source-make-complex-temp-name): Use
+       make-temp-file.
+
+       * mm-util.el (mm-make-temp-file): New function.
+       * nneething.el (nneething-file-name): Use it.
+       * mml-smime.el (mml-smime-encrypt): Ditto.
+       * mm-view.el (mm-inline-wash-with-file): Ditto.
+       * mm-decode.el (mm-display-external, mm-create-image-xemacs): Ditto.
+       * gnus-uu.el (gnus-uu-decode-binhex, gnus-uu-decode-binhex-view)
+       (gnus-uu-digest-mail-forward, gnus-uu-initialize): Ditto.
+       * gnus-start.el (gnus-slave-save-newsrc): Ditto.
+       * gnus-fun.el (gnus-convert-image-to-gray-x-face): Ditto.
+       * gnus-art.el (gnus-mime-print-part): Ditto.
+
+2002-03-04  Paul Jarc  <prj@po.cwru.edu>
+
+       * message.el (nnmaildir-article-number-to-base-name): New
+       function.
+       (nnmaildir-base-name-to-article-number): New function.
+
+2002-03-04  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * smime.el (smime-make-temp-file): Don't quote
+       `temporary-file-directory'.
+
+2002-03-04  Simon Josefsson  <jas@extundo.com>
+
+       * smime.el (smime-sign-region): Rename argument keyfiles to
+       keyfile. You only sign something with one key.
+       (smime-sign-buffer): Better completing-read prompt.
+       (smime-decrypt-buffer): Ditto.
+
+       * smime.el (smime-make-temp-file): Make it work under XEmacs.
+
+       * mm-view.el (mm-view-pkcs7-decrypt): Better prompt for
+       completing-read.
+       (mm-view-pkcs7-decrypt): CRLF->LF.
+
+2002-03-04  Paul Jarc  <prj@po.cwru.edu>
+
+       * message.el (message-hierarchical-addresses): New variable.
+       (message-get-reply-headers): Use it.
+       From Ted Zlatanov <teodor.zlatanov@divine.com>
+
+2002-03-03  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-mode): If buffer-file-name, don't set auto
+       save file name.
+       Trivial change from Geoff Greene <ggreene@wpi.edu>
+
+2002-03-02  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-util.el (gnus-multiple-choice): Use message. XEmacs only
+       takes one argument in read-char.
+
+       * message.el (message-fix-before-sending): Forward a char.
+       Check mmu-multibyte-p, add control-1.
+
+2002-03-01  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-start.el (gnus-read-init-file): Ditto.
+
+       * gnus-agent.el (gnus-agent-fetch-session): Ditto.
+
+       * dgnushack.el (dgnushack-make-load): Ditto.
+
+       * mail-source.el (mail-source-fetch): Extract the right error
+       code.
+
+       * message.el (message-fix-before-sending): Check illegible text.
+
+       * gnus-util.el (gnus-multiple-choice): New function.
+
+       * gnus-kill.el (gnus-score-insert-help): Removed, because it is
+       also defined in gnus-score.el.
+
+2002-03-01  Paul Jarc  <prj@po.cwru.edu>
+
+       * message.el (message-get-reply-headers): downcase email addresses
+       for comaparisons for duplicate removal.
+
+2002-03-01  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-view.el (mm-view-pkcs7-verify): New function. A bogus
+       implementation of PKCS#7, which just allows users read the
+       message.
+       (mm-view-pkcs7): Use it.
+
+2002-02-27  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.el (large-newsgroup-initial): New parameter.
+
+       * gnus-sum.el (gnus-articles-to-read): Use large-newsgroup-initial.
+       (gnus-summary-insert-old-articles): Ditto.
+
+2002-02-26  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-sum.el (gnus-articles-to-read): `gnus-large-newsgroup' is
+       used as the default answer of the question, "How many articles?".
+       From TSUCHIYA Masatoshi <tsuchiya@namazu.org>
+
+       * nnagent.el (nnagent-retrieve-headers): Remove articles with
+       small numbers.
+
+2002-02-24  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * deuglify.el: Fix comments.
+
+2002-02-23  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * html2text.el (html2text-clean-anchor): If there is no HREF,
+       insert nothing.
+
+       * mml.el (mml-generate-mime-1): Add cdr.
+       From: andre@slamdunknetworks.com
+
+       * mm-view.el (mm-text-html-renderer-alist): Add html2text.
+       (mm-text-html-washer-alist): Ditto.
+
+       * mm-decode.el (mm-text-html-renderer): Add html2text.
+
+       * html2text.el: Face lift.
+
+       * html2text.el: New file from Joakim Hove <hove@phys.ntnu.no>.
+
+2002-02-22  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-sum.el: Add gnus-article-outlook-deuglify-article.
+
+       * deuglify.el: Change copy right. Add autoload. Add coding-system.
+
+       * deuglify.el: New file. The original file name is
+       gnus-outlook-deuglify.el from Raymond Scholz <rscholz@zonix.de>.
+
+       * mm-decode.el (mm-display-external): Use
+       mm-file-name-rewrite-functions.  From <andre@slamdunknetworks.com>
+
+2002-02-22  Paul Jarc  <prj@po.cwru.edu>
+
+       * nnmaildir.el (nnmaildir-request-list): Report the highest
+       article number, not the total number of articles.
+
+2002-02-21  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-sum.el: Move uu key map here.
+       (gnus-summary-make-menu-bar): Add gnus-summary-save-parts.
+
+2002-02-21  Paul Jarc  <prj@po.cwru.edu>
+
+       * nnmaildir.el (nnmaildir-request-expire-articles): Use
+       nnmail-expiry-wait* if expire-age parameter is not set.
+
+2002-02-21  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-group.el (gnus-group-sort-groups-by-real-name): New
+       function.
+       (gnus-group-sort-selected-groups-by-real-name): New function.
+       (gnus-group-make-menu-bar): Add sort by real name.
+
+       * gnus-sum.el (gnus-dependencies-add-header): If replaced, don't
+       rebuild.
+       (gnus-summary-edit-article-done): Gnus-get-newsgroup-headers takes
+       nil as dependencies as well.
+
+2002-02-20  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * nndoc.el (nndoc-dissect-mime-parts-sub): Fix MIME-Version header
+       for mime-parts.
+
+       * gnus-art.el (gnus-article-edit-done): Widen the buffer.
+
+       * gnus-group.el (gnus-group-name-decode): Don't test
+       multibyte-string, because it breaks XEmacs.
+       From: TSUCHIYA Masatoshi <tsuchiya@pine.kuee.kyoto-u.ac.jp>
+
+       * message.el (message-send-mail): Be talkative.
+
+       * mm-decode.el (mm-inlined-types): Add application/x-emacs-lisp.
+       (mm-automatic-display): Ditto.
+
+       * mailcap.el (mailcap-mime-data): Ditto.
+       From: Reiner Steib <4uce.02.r.steib@gmx.net>
+
+2002-02-20  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * many files: Remove trailing whitespaces, replace spc+tab with
+       tab, replace leading whitespaces with tabs.
+
+2002-02-19  Paul Jarc  <prj@po.cwru.edu>
+
+       * gnus-sum.el (gnus-summary-toggle-header): Fix handling of
+       articles with no body and no blank line after the header.
+
+2002-02-19  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-decode.el (mm-dissect-multipart): Consider the case of empty
+       parts.
+
+       * ietf-drums.el (ietf-drums-syntax-table): Modify syntax of
+       non-ascii chars.
+
+       * rfc2231.el (rfc2231-parse-string): Support non-ascii chars.
+
+       * gnus-art.el (gnus-article-wash-html-with-w3): Remove
+       w3-delay-image-loads.
+       * mm-view.el (mm-inline-text-html-render-with-w3): Ditto.
+       (mm-w3-prepare-buffer): Ditto.
+
+       * mail-source.el (mail-source-fetch-directory): Run scripts.
+
+2002-02-19  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-fun.el (gnus-respond-to-confirmation): Do the right thing
+       for Majordomo confirmations.
+
+2002-02-18  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-fun.el (gnus-respond-to-confirmation): New command.
+
+2002-02-11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * nnultimate.el (nnultimate-retrieve-headers): Clean up.
+
+2002-02-18  Paul Jarc  <prj@po.cwru.edu>
+
+       * gnus-util.el (gnus-parent-id): Ignore trailing whitespace in the
+       References header field.  From Mark Thomas <mthomas@cmu.edu>.
+
+2002-02-18  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-view.el (mm-inline-render-with-file): With unibyte buffer.
+       (mm-inline-render-with-stdin): Ditto.
+       (mm-inline-render-with-function): Ditto.
+       (mm-inline-wash-with-file): Bind coding-system-for-write.
+       (mm-inline-wash-with-stdin): Ditto.
+
+2002-02-18  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       Suggested by Felix Natter <fnatter@gmx.net>
+
+       * gnus-art.el (gnus-mime-view-part-externally): Rename from
+       gnus-mime-externalize-view.
+       (gnus-mime-view-part-internally): Rename from
+       gnus-mime-internalize-view.
+       (gnus-article-view-part-externally): Rename from
+       gnus-article-externalize-part.
+       (gnus-mime-action-alist): Change correspondingly.
+       (gnus-mime-button-commands): Ditto.
+       (gnus-mime-action-alist): Remove duplication.
+
+       * gnus-sum.el (gnus-summary-mime-map): Change correspondingly.
+
+2002-02-18  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-decode.el (mm-dissect-buffer): Add loose-mime parameter.
+
+       * gnus-art.el (gnus-display-mime): Use it.
+
+       * mm-partial.el (mm-partial-find-parts): Use it.
+
+       * gnus-sum.el (gnus-article-loose-mime): Rename from
+       gnus-article-no-strict-mime.
+       (gnus-summary-save-parts): Use it.
+
+2002-02-18  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-fun.el (gnus-convert-gray-x-face-to-xpm): Remove unused
+       local variable.
+
+       * gnus-art.el (article-display-x-face): Don't sort multiple
+       X-Faces.
+
+2002-02-18  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-fun.el (gnus-convert-gray-x-face-to-xpm): Improved to speed
+       up.  Suggested by Yuuichi Teranishi <teranisi@gohome.org>.
+
+       * gnus-art.el (article-display-x-face): Sort gray X-Faces.
+
+2002-02-17  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       Some ideas is inspired by code from Hrvoje Niksic
+       <hniksic@arsdigita.com>
+
+       * gnus-art.el (gnus-article-wash-function): Set the default to
+       nil, so that we use mm-text-html-renderer instead.
+       (article-wash-html): Use mm-text-html-renderer.
+
+       * mm-decode.el (mm-inline-media-tests): Use mm-inline-text-*.
+       (mm-text-html-renderer): New variable.
+       (mm-inline-text-html-renderer): Set the default to nil, so that we
+       use mm-text-html-renderer instead.
+
+       * mm-view.el (mm-inline-text-html): New function.
+       (mm-text-html-renderer-alist): New variable.
+       (mm-inline-text-vcard): New function.
+       (mm-inline-text): Split.
+       (mm-links-remove-leading-blank): New function.
+       (mm-inline-render-with-file): New function.
+       (mm-inline-render-with-stdin): New function.
+       (mm-inline-render-with-function): New function.
+       (mm-text-html-washer-alist): New variable.
+       (mm-inline-wash-with-file): New function.
+       (mm-inline-wash-with-stdin): New function.
+
+2002-02-17  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message-utils.el: Fix installation doc.
+       From: Reiner Steib <4uce.02.r.steib@gmx.net>
+
+2002-02-16  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-msg.el (gnus-discouraged-post-methods): New variable.
+       (gnus-post-method): Use it.
+       (gnus-summary-cancel-article): Find the correct post-method.
+
+       * gnus-soup.el (gnus-soup-send-packet): Via ... using ...
+       * message.el (message-send-news): Ditto.
+       Suggested by Lloyd Zusman <ljz@asfast.com> and IPmonger
+       <ipmonger@delamancha.org>
+
+       * gnus.el (gnus-select-method): Fix doc.
+       (gnus-server-string): Use 'using nntp'.
+
+       * gnus-agent.el (gnus-slave-unplugged): New command.
+       From: Felix Natter <fnatter@gmx.net>
+
+2002-02-15  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-article-edit-done): Kill-all-local-variables.
+       Call edit-done-function first, then change the window
+       configuration.
+       (gnus-article-edit-mode-map): Add message key bindings. Add menu.
+       (gnus-article-edit-mode): mml-mode.
+
+       * gnus-util.el (gnus-byte-compile): Work around a bug in XEmacs
+       21.4. Suggested by Russ Allbery <rra@stanford.edu> .
+
+       * message-utils.el: Adopt the file.
+
+       * message-utils.el: New file.
+       From Holger Schauer <Holger.Schauer@gmx.de>
+
+2002-02-14  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-sum.el (gnus-summary-move-article): Select-article only
+       when gnus-move-split-methods is non-nil. And we don't render or
+       mark the article.
+
+       * gnus-fun.el (gnus-shell-command-to-string): New function.
+       (gnus-shell-command-on-region): New function.
+       (gnus-random-x-face): Use them.
+       (gnus-x-face-from-file): Ditto.
+       (gnus-convert-image-to-gray-x-face): Ditto.
+       (gnus-convert-gray-x-face-to-xpm): Ditto.
+       (gnus-convert-image-to-x-face-command): Don't use 2>/dev/null.
+
+2002-02-14  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-treat-display-xface): Don't use
+       `shell-command-to-string' when compiling.
+       (gnus-treat-display-grey-xface): Ditto.
+
+2002-02-13  Paul Jarc  <prj@po.cwru.edu>
+
+       * nnmaildir.el (nnmaildir--article-count): If the group is
+       completely empty, report minimum article number as 1 instead of 0.
+
+2002-02-13  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-agent.el (gnus-get-predicate): Use nconc.
+
+       * gnus-sum.el (gnus-summary-display-make-predicate): Use
+       gnus-summary-display-cache as cache.
+
+       * nndoc.el (nndoc-type-alist): Add mail-in-mail type.
+       (nndoc-mail-in-mail-type-p): New function.
+       (nndoc-mail-in-mail-article-begin): New function.
+
+2002-02-12  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mailcap.el (mailcap-mime-data): Use enriched-decode.
+
+       * gnus-cite.el (gnus-article-fill-cited-article): Bind
+       use-hard-newlines to nil.
+
+       * gnus-xmas.el (gnus-xmas-image-type-available-p): Assume that
+       image is not available if window-system is not available.
+
+       * gnus-sum.el (gnus-summary-display-make-predicate): Add unread.
+
+2002-02-11  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.el (gnus-article-unpropagated-mark-lists): Don't propagate
+       bookmark, because update-mark doesn't handle it correctly.
+
+2002-02-09  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-soup.el (gnus-soup-send-packet): Send news and mail
+       directly instead of calling message-send-mail.
+
+       * gnus-start.el (gnus-read-descriptions-file): Use
+       gnus-default-charset.
+
+       * mm-util.el (mm-guess-mime-charset): New function.
+
+       * gnus.el (gnus-default-charset): Use it.
+       (gnus-group-charset-alist): Remove .*, Let gnus-default-charset be
+       the default.
+
+2002-02-08  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-treat-display-grey-xface): New variable.
+       (article-display-x-face): Use it.  Disable grey xface, if
+       uncompface is not found.
+
+       * message.el (message-mode): Don't enable multibyte on an indirect
+       buffer.
+
+       * nnrss.el (nnrss-content-function): New variable.
+       (nnrss-request-article): Use it.
+
+2002-02-08  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.el: Add article-unsplit-urls.
+       * gnus-sum.el: Ditto.
+       * gnus-art.el (gnus-treat-strip-cr): New variable.
+       (gnus-treatment-function-alist): Use it.
+       (article-unsplit-urls): New function.
+       (gnus-article-make-menu-bar): Use it.
+       From: Michael Cook <michael.cook@cisco.com>
+
+2002-02-08  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-agent.el (gnus-agent-braid-nov): Find the first article to
+       copy.
+
+2002-02-07  Paul Jarc  <prj@po.cwru.edu>
+
+       * gnus-util.el (gnus-split-references): Allow (broken) Message-IDs
+       with internal whitespace.
+       (gnus-parent-id): Ditto.
+
+2002-02-07  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-article-treat-body-boundary): Add
+       gnus-decoration property.
+       * gnus-msg.el (gnus-copy-article-buffer): Remove gnus-decoration.
+
+       * message.el (message-mode): Set local-abbrev-table.
+       From Matt Armstrong <matt@lickey.com>.
+
+       * gnus-art.el (gnus-article-treat-unfold-headers): Don't remove
+       too many spaces.
+
+       * rfc2047.el (rfc2047-unfold-region): Ditto.
+       (rfc2047-decode-region): Don't unfold. Let
+       gnus-article-treat-unfold-headers do it.
+
+       * gnus-sum.el (gnus-dependencies-add-header): Fix typo.
+       From: Jesper Harder <harder@ifa.au.dk>
+
+2002-02-06  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-msg.el (gnus-posting-styles): Add x-face-file.
+       (gnus-configure-posting-styles): Use it.
+       (gnus-configure-posting-styles): Remove trailing newspaces.
+
+2002-02-06  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-sum.el (gnus-articles-to-read): Fetch all if the predicate
+       is non-nil.
+
+       * mm-util.el (mm-use-find-coding-systems-region): Add doc.
+
+       * gnus.el (gnus-server-to-method): Switch position with
+       gnus-server-get-method.
+       (gnus-agent): Add doc.
+
+       * gnus-sum.el (gnus-article-no-strict-mime): New variable.
+       (gnus-summary-save-parts): Use it.
+
+       * gnus-art.el (gnus-display-mime): Use it.
+       * mm-partial.el (mm-partial-find-parts): Use it.
+
+       * nnweb.el (nnweb-google-parse-1): Use a correct format of date.
+
+       * gnus-agent.el (gnus-agent-summary-make-menu-bar): Fix typo.
+       From Stefan Reich\e,Av\e(Br <xsteve@riic.at>.
+
+       * nnagent.el (nnagent-request-expire-articles): Don't delete
+       files.
+
+2002-02-05  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-gen-unsubscribed-mft): New function.
+       From Sriram Karra <karra@cs.utah.edu>.
+
+       * gnus.el (gnus-article-unpropagated-mark-lists): Backslash the
+       open parenthesis.
+
+       * mm-view.el (mm-w3-prepare-buffer): Bind url-gateway-unplugged.
+       (mm-inline-text-html-render-with-w3): Ditto.
+       * gnus-art.el (gnus-article-wash-html-with-w3): Ditto.
+       Suggested by Dave Love  <d.love@dl.ac.uk>.
+
+       * mm-url.el (mm-url-load-url): Require w3-vars for old versions.
+
+       * nntp.el (nntp-send-command-and-decode): Check PROCESS.
+       * nntp.el (nntp-send-command): Ditto.
+       * nntp.el (nntp-send-command-nodelete): Ditto.
+
+2002-02-04  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-url.el (mm-url-load-url): New function.
+       (mm-url-insert-file-contents): Use it.
+
+       * gnus-msg.el (gnus-summary-mail-forward): Use gnus-article-charset.
+
+       * message.el (message-forward-make-body): Correctly copy
+       forward-buffer.
+
+       * rfc2047.el (rfc2047-decode-region): Don't decode us-ascii characters.
+
+2002-02-04  Simon Josefsson  <jas@extundo.com>
+
+       * gnus-art.el (gnus-article-followup-with-original): Mark with
+       force, prevent errors when following up from article buffer.
+       (gnus-article-reply-with-original): Ditto.
+
+       * binhex.el (binhex-decoder-switches): Fix doc.  From
+       Pavel@Janik.cz (Pavel Jan\e,Bm\e(Bk).
+
+2002-02-04  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-treatment-function-alist): Move hide-citation,
+       highlight-citation after emphasize.
+
+2002-02-04  Simon Josefsson  <jas@extundo.com>
+
+       * nnfolder.el (nnfolder-open-marks):
+
+       * nnml.el (nnml-open-marks): Message when done.  From David
+       Edmondson <dme@sun.com>.
+
+2002-02-03  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * imap.el (imap-anonymous-auth): Fix typo.
+       From: Steinar Bang <sb@dod.no>
+
+       * gnus-cache.el (gnus-cache-braid-nov): Use set-buffer instead of
+       save-excursion.
+       (gnus-cache-braid-heads): Ditto.
+
+       * gnus-agent.el (gnus-agent-copy-nov-line): Move to the correct
+       line, because there are extra articles in the overview buffer.
+
+       * nntp.el (nntp-retrieve-groups): Check whether BUF is live.
+
+       * message.el (message-forward-rmail-make-body): Directly use
+       rmail-msg-restore-non-pruned-header to avoid calling
+       vertical-motion.
+
+2002-02-02  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-cache.el (gnus-summary-insert-cached-articles):
+       (gnus-summary-limit-include-cached): gnus-newsgroup-cached is sorted.
+
+       * gnus-group.el (gnus-group-mark-article-read): Nreverse
+       gnus-newsgroups-unselected.
+
+       * gnus-agent.el (gnus-summary-set-agent-mark): Use
+       gnus-add-to-sorted-list.
+
+       * gnus-sum.el (gnus-summary-update-info): gnus-newsgroup-unreads
+       gnus-newsgroup-unselected are sorted. Use gnus-sorted-union.
+       (gnus-build-all-threads): Use gnus-add-to-sorted-list.
+       (gnus-update-read-articles): UNREAD is sorted.
+       (gnus-newsgroup-unreads, gnus-newsgroup-unselected)
+       (gnus-newsgroup-marked, gnus-newsgroup-cached)
+       (gnus-newsgroup-expirable, gnus-newsgroup-downloadable)
+       (gnus-newsgroup-dormant): Require sorted.
+
+       * gnus-dired.el (gnus-dired-find-file-mailcap): Correctly handle
+       directories.
+       (gnus-dired-print): New function.
+
+       * gnus-art.el (gnus-mime-print-part): Add argument filename. Call
+       ps-despool.
+
+2002-02-02  Simon Josefsson  <jas@extundo.com>
+
+       * gnus-dired.el (turn-on-gnus-dired-mode): Autoload.  Make defun.
+
+2002-02-02  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-start.el (gnus-1): Call gnus-agentize if gnus-agent is
+       t. This makes gnus-agent customizable without putting
+       gnus-agentize into .gnus.
+
+       * gnus.el (gnus-agent): Make it customizable.
+
+       * gnus-dired.el: New file.
+       From Benjamin Rutt <brutt@bloomington.in.us>
+
+       * gnus-cache.el (gnus-cache-articles-in-group): Remove from active
+       if no article.
+       (gnus-cache-possibly-remove-article): Ditto.
+       (gnus-cache-possibly-enter-article): Use gnus-add-to-sorted-list.
+
+2002-02-01  Simon Josefsson  <jas@extundo.com>
+
+       * gnus-int.el (gnus-request-accept-article): Use gnus-get-function.
+
+2002-02-01  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * mm-view.el (mm-w3m-mode-dont-bind-keys): New variable.
+       (mm-setup-w3m): Don't bind keys listed in the above.
+
+2002-02-01  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * mm-view.el (mm-inline-text-html-render-with-w3m): Bind
+       `w3m-safe-url-regexp' with nil if `mm-inline-text-html-with-images'
+       is non-nil; bind `w3m-force-redisplay' with nil.
+
+       * gnus-art.el (gnus-article-wash-html-with-w3m): Ditto.
+
+       * mm-decode.el (mm-inline-text-html-with-images): Supplement docs.
+
+2002-01-31  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * nnfolder.el (nnfolder-request-replace-article): Unfold. Don't
+       use mail-header-unfold-field.
+
+       * gnus-cache.el (gnus-summary-insert-cached-articles): Use
+       gnus-summary-limit.
+
+       * gnus-range.el (gnus-add-to-sorted-list): New function.
+       * gnus-sum.el (gnus-mark-article-as-read): Use it.
+       (gnus-mark-article-as-unread): Ditto.
+       (gnus-summary-mark-article-as-unread): Ditto.
+       (gnus-build-get-header): Ditto.
+       (gnus-summary-prepare-threads): Ditto.
+       (gnus-summary-insert-pseudos): Ditto.
+       (gnus-articles-to-read): Use gnus-sorted-union and gnus-sorted-nunion.
+       (gnus-summary-insert-new-articles): Use gnus-sorted-nunion.
+       (gnus-summary-insert-old-articles): Ditto.
+
+       * gnus-msg.el (gnus-posting-styles): Add new format of header.
+       (gnus-configure-posting-styles): Support the new format.
+
+       * mail-source.el (mail-source-bind, mail-source-bind-common): Set
+       edebug-form-spec to (sexp body).
+       Suggested by Joe Wells <jbw@izanami.cee.hw.ac.uk>.
+
+       * message.el (message-reply-headers): Add doc.
+
+2002-01-30  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-group.el (gnus-group-delete-group): Nix the entry in
+       gnus-cache-active-hashtb.
+
+       * gnus-agent.el (gnus-agent-mark-unread-afer-downloaded): New variable.
+       (gnus-agent-summary-fetch-group): Use it.
+
+       * gnus-msg.el (gnus-debug-files): New variable.
+       (gnus-debug-exclude-variables): New variable.
+       (gnus-debug): Use them.
+
+       * gnus-range.el (gnus-range-length): Don't use gnus-uncompress-range.
+
+2002-01-30  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-cite-prefix-regexp): Use text-mode-syntax-table.
+       (message-mode-syntax-table): Move back the previous position.
+
+       * nnagent.el (nnagent-retrieve-headers): Use gnus-sorted-difference.
+
+       * gnus-agent.el (gnus-agent-retrieve-headers): Use
+       gnus-sorted-difference.
+
+       * nnsoup.el (nnsoup-request-expire-articles): Use
+       gnus-sorted-difference.
+
+       * nnheader.el: Autoload gnus-sorted-difference.
+
+       * nnfolder.el (nnfolder-request-expire-articles): Use
+       gnus-sorted-difference.
+
+       * gnus-cache.el (gnus-cache-retrieve-headers): Use
+       gnus-sorted-difference.
+
+       * gnus-range.el: Autoload cookies.
+       (gnus-sorted-difference): New function.
+       (gnus-sorted-ndifference): New function.
+       (gnus-sorted-nintersection): Rename from
+       gnus-set-sorted-intersection.
+       (gnus-sorted-nunion): Rename from gnus-set-sorted-union.
+       (gnus-list-range-difference): Rename from
+       gnus-inverse-list-range-intersection.
+       (gnus-inverse-list-range-intersection): Use defalias.
+
+       * gnus-sum.el (gnus-select-newsgroup): Use gnus-sorted-difference,
+       gnus-sorted-ndifference, and gnus-sorted-nintersection.
+       (gnus-articles-to-read): Use gnus-sorted-difference.
+       (gnus-summary-limit-mark-excluded-as-read): Use
+       gnus-sorted-intersection and gnus-sorted-ndifference.
+       (gnus-list-of-read-articles): Use gnus-list-range-difference.
+       (gnus-summary-insert-articles): Use gnus-sorted-difference.
+
+       * gnus-sum.el (gnus-summary-update-info): Use gnus-sorted-union.
+
+2002-01-30  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-article-wash-html-with-w3m): Add keymap
+       property to the buffer for using emacs-w3m command keys.
+
+       * mm-decode.el (mm-inline-text-html-with-w3m-keymap): New user
+       option.
+
+       * mm-view.el (mm-w3m-mode-map): New variable.
+       (mm-w3m-mode-command-alist): New variable.
+       (mm-w3m-minor-mode): Removed.
+       (mm-setup-w3m): Setup `mm-w3m-mode-map'; don't add minor mode.
+       (mm-inline-text-html-render-with-w3m): Add keymap property to the
+       buffer for using emacs-w3m command keys.
+
+2002-01-29  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-mode-syntax-table): Move forward.
+       (message-cite-prefix-regexp): Auto detect non word constituents.
+       (message-cite-prefix-regexp): Don't use with-syntax-table.
+
+       * gnus-sum.el (gnus-summary-update-info): Use
+       gnus-list-range-intersection.
+
+       * gnus-agent.el (gnus-agent-fetch-headers): Use
+       gnus-list-range-intersection.
+
+       * gnus-range.el (gnus-range-normalize): Use correct predicate.
+       (gnus-list-range-intersection): Use it.
+       (gnus-inverse-list-range-intersection): Ditto.
+       (gnus-sorted-intersection): Add doc.
+       (gnus-set-sorted-intersection): Add doc.
+       (gnus-sorted-union): New function.
+       (gnus-set-sorted-union): New function.
+
+       * gnus-range.el (gnus-list-range-intersection): Correct the logic.
+       (gnus-inverse-list-range-intersection): Ditto.
+
+2002-01-29  Karl Kleinpaste  <karl@charcoal.com>
+
+       * mm-uu.el (mm-uu-type-alist): Add optional leading `0'.
+
+       * gnus-uu.el (gnus-uu-shar-name-marker): Add optional leading `0'
+       and permit `:' and `\' in order to handle full Windows pathnames.
+       (gnus-uu-begin-string): Add optional leading `0'.  Leading `0' is
+       technically not correct per standard, but seems to have common use.
+
+2002-01-29  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-uu.el (gnus-uu-expand-numbers): Ignore errors when
+       replacing numbers.
+
+2002-01-28  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-article-followup-with-original): Use (mark).
+
+       * gnus-score.el (gnus-score-insert-help): Move to (point-min).
+       Don't split when the window is small, e.g. when a small *BBDB*
+       window is the lowest one.
+
+       * gnus-agent.el (gnus-agent-retrieve-headers): Use
+       nnheader-find-nov-line to speed up. Use nreverse, because it is
+       sorted. Use nnheader-insert-nov-file.
+
+2002-01-28  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * mm-decode.el (mm-inline-text-html-with-images): New user option.
+
+       * mm-view.el (mm-inline-text-html-render-with-w3m): Bind the value
+       of `w3m-display-inline-images' with the value of
+       `mm-inline-text-html-with-images'.
+       From: TSUCHIYA Masatoshi <tsuchiya@namazu.org>.
+
+       * gnus-art.el (gnus-article-wash-html-with-w3m): Ditto.
+
+2002-01-27  Richard M. Stallman  <rms@gnu.org>
+
+       * time-date.el: Add autoload cookies.  Many doc fixes.
+       (time-add): New function.
+       (time-subtract): Renamed from subtract-time.
+       (subtract-time): New alias for time-subtract.
+
+2002-01-28  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-article-wash-html-with-w3m): Replace w3m to
+       emacs-w3m in doc-string.
+
+       * lpath.el: Bind `w3m-cid-retrieve-function-alist' and
+       `w3m-current-buffer'.
+
+2002-01-27  TSUCHIYA Masatoshi  <tsuchiya@namazu.org>
+
+       * gnus-art.el (gnus-article-wash-html-with-w3m): Handle cid: URLs.
+
+       * mm-view.el (mm-setup-w3m): Add `mm-w3m-cid-retrieve' to
+       `w3m-cid-retrieve-function-alist' for `gnus-article-mode'.
+       (mm-w3m-cid-retrieve): New function.
+       (mm-inline-text-html-render-with-w3m): Handle cid: URLs.
+
+2002-01-27  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-agent.el (gnus-agent-fetch-articles): Don't save empty articles.
+
+2002-01-27  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-util.el (gnus-cache-file-contents): Don't use equalp.
+
+2002-01-26  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * nnheader.el (nnheader-insert-nov-file): Increased cutoff to
+       32K.
+
+       * gnus-sum.el (gnus-summary-expire-articles): Clean up.
+
+       * nnmail.el (nnmail-article-group): Decode headers before running
+       split rules over them.
+       (nnmail-mail-splitting-charset): New variable.
+
+       * smiley.el: Replaced with smiley-ems.el.
+
+2002-01-26  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-url.el (mm-url-predefined-programs): Add w3m.
+       (mm-url-program): Ditto.
+
+2002-01-26  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * nnml.el (nnml-use-compressed-files): New variable.
+       (nnml-filenames-are-evil): Removed.
+       (nnml-current-group-article-to-file-alist): Don't use.
+       (nnml-update-file-alist): Inhibit.
+       (nnml-article-to-file): Use new var.
+
+2002-01-26  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-util.el (gnus-parse-without-error): Add edebug-form-spec.
+
+       * nnagent.el (nnagent-retrieve-headers): loop until eobp.
+
+2002-01-26  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-agent.el (gnus-agent-load-alist): Use new caching
+       function.
+
+       * gnus-util.el (gnus-cache-file-contents): New function.
+
+       * gnus-agent.el (gnus-agent-file-loading-cache): New variable.
+       (gnus-agent-load-alist): Use it.
+
+       * nnagent.el (nnagent-retrieve-headers): Use optimized function.
+
+       * nnheader.el (nnheader-insert-nov-file): New function.
+
+       * gnus-util.el (gnus-parse-without-error): Correct the loop.
+
+       * gnus-sum.el (gnus-dependencies-add-header): Use in-reply-to if
+       there are no references.
+       (gnus-extract-message-id-from-in-reply-to): New function.
+       (gnus-nov-parse-line): Use in-reply-to if there are no
+       references.
+
+2002-01-25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * nnagent.el (nnagent-retrieve-headers): Use new macro.
+
+       * gnus-util.el (gnus-parse-without-error): New macro.
+
+2002-01-25  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-article-wash-html-with-w3m): Call w3m-region.
+       (gnus-article-wash-function): use locate-library to decide which
+       to use.
+
+2002-01-25  Simon Josefsson  <jas@extundo.com>
+
+       * pop3.el (pop3-munge-message-separator): Work if no date.
+       Trivial patch from Marius Vollmer <mvo@zagadka.ping.de>.
+
+2002-01-25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-agent.el (gnus-agent-save-alist): Fix.
+
+       * nnagent.el (nnagent-retrieve-headers): Must have cut too much by
+       mistake.  Reinstated lost code.
+
+2002-01-25  Josh Huber  <huber@alum.wpi.edu>
+
+       * mml2015.el (mml2015-mailcrypt-decrypt): Display a signature if
+       one exists in the case of an encrypted message with an internal
+       signature.
+
+2002-01-25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-agent.el (gnus-agent-save-alist): Optimized.
+
+2002-01-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * dgnushack.el: Commented out the experimental code.
+
+2002-01-25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-range.el (gnus-inverse-list-range-intersection): Off-by-one
+       error.
+
+       * gnus.el (gnus-server-to-method): Made into subst.
+       (gnus-server-method-cache): New variable.
+       (gnus-server-to-method): Use it.
+       (gnus-group-method-cache): New variable.
+       (gnus-find-method-for-group-1): Renamed.
+       (gnus-find-method-for-group): New function.
+       (gnus-group-method-cache): Removed.
+
+       * gnus-sum.el (gnus-compute-unseen-list): Use new optimized
+       function.
+
+       * gnus-range.el (gnus-members-of-range): New function.
+       (gnus-list-range-intersection): Renamed.
+       (gnus-inverse-list-range-intersection): New function.
+
+       * gnus-sum.el (gnus-compute-unseen-list): Made into own function.
+
+       * nnagent.el (nnagent-retrieve-headers): New implementation.
+
+       * gnus-agent.el (gnus-agent-get-undownloaded-list): New, faster
+       implementation.
+
+2002-01-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lpath.el: Fbind `w3m-charset-to-coding-system'; bind
+       `w3m-meta-content-type-charset-regexp'.
+
+       * mm-view.el (mm-inline-text-html-render-with-w3m): Decode
+       charset-encoded html contents.
+
+2002-01-24  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-agent.el (gnus-agent-request-article): Make sure it is not
+       an empty file.
+
+       * nnweb.el (url): Ignore errors when request url.
+
+       * nnrss.el: Clean up the comments.
+
+2002-01-24  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lpath.el: Fbind `w3m-region'; bind `w3m-mode-map'.
+
+       * mm-decode.el (mm-inline-text-html-renderer): New user option.
+       (mm-inline-media-tests): Test whether the value of
+       `mm-inline-text-html-renderer' is a function for text/html.
+
+       * mm-view.el (mm-inline-text-html-render-with-w3): New function
+       separated from `mm-inline-text'.
+       (mm-w3m-minor-mode): New variable.
+       (mm-w3m-setup): New variable.
+       (mm-setup-w3m): New function.
+       (mm-inline-text-html-render-with-w3m): New function.
+       (mm-inline-text): Funcall `mm-inline-text-html-renderer' for
+       text/html.
+
+2002-01-23  Paul Jarc  <prj@po.cwru.edu>
+
+       * lpath.el: fbind make-symbolic-link and unix-sync for nnmaildir.
+
+2002-01-23  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-xmas.el (gnus-xmas-redefine): Quote `gnus-completing-read'
+       and `gnus-xmas-completing-read'.
+
+2002-01-19  TSUCHIYA Masatoshi  <tsuchiya@namazu.org>
+
+       * nneething.el (nneething-message-id-number): Abolished.
+       (nneething-encode-file-name): Not encode numerical characters.
+       (nneething-make-head): `nneething-message-id-number' is not
+       used to generate message IDs.
+
+2002-01-23  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-art.el (gnus-emphasis-alist): Include !? as sentence-ending
+       characters.
+
+2002-01-22  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-xmas.el (gnus-xmas-completing-read): New function.
+       (gnus-xmas-redefine): Redefine conditionally.
+
+2002-01-22  Josh Huber  <huber@alum.wpi.edu>
+
+       * mml.el (mml-parse-1): Fixed usage of recipients in the secure
+       tag.
+
+2002-01-22  Josh Huber  <huber@alum.wpi.edu>
+
+       * message.el (message-font-lock-keywords): Added the secure tag.
+       * mml-sec.el: Added functions to generate/modify/remove the secure
+       tag while in message mode.
+       * mml-sec.el (mml-secure-message): New.
+       * mml-sec.el (mml-unsecure-message): New.
+       * mml-sec.el (mml-secure-message-sign-smime): New.
+       * mml-sec.el (mml-secure-message-sign-pgp): New.
+       * mml-sec.el (mml-secure-message-sign-pgpmime): New.
+       * mml-sec.el (mml-secure-message-encrypt-smime): New.
+       * mml-sec.el (mml-secure-message-encrypt-pgp): New.
+       * mml-sec.el (mml-secure-message-encrypt-pgpmime): New.
+       * mml.el (mml-parse-1): Added code to recognise the secure tag and
+       convert it to either a part or multipart depending on if there are
+       other parts in the message.
+       * mml.el (mml-mode-map): Changed default sign/encrypt keybindings
+       to use the secure tag, rather than the part tag.
+       * mml.el (mml-preview): Added a save-excursion to keep cursor
+       position after doing an MML preview.
+
+2002-01-22  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * nnheader.el (nnheader-parse-overview-file): New function.
+       (nnheader-write-overview-file): New function.
+
+2002-01-21  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.el (gnus-group-fast-parameter): Check better if expansion
+       in wanted.
+
+       * nnweb.el (nnweb-type-definition): Clean up.
+
+2002-01-21  Alastair Burt  <burt@dfki.de>
+
+       * gnus-art.el (gnus-mm-display-part): Make sure that the summary
+       buffer exists before jumping to it.
+
+2002-01-21  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-art.el (gnus-article-wash-html-with-w3): Made into own
+       function.
+       (article-wash-html): Use it.
+       (gnus-article-wash-function): New variable.
+       (gnus-article-wash-html-with-w3m): New function.
+
+2002-01-20  Bj\e,Av\e(Brn Torkelsson  <torkel@acc.umu.se>
+
+       * dgnushack.el (dgnushack-compile): Compile smiley-ems for
+       XEmacs.
+
+2002-01-20  John H. Palmieri  <palmieri@math.washington.edu>
+
+       * gnus-fun.el (gnus-convert-image-to-gray-x-face): More standard
+       command line.
+
+2002-01-21  Simon Josefsson  <jas@extundo.com>
+
+       * canlock.el (base64-encode-string): Autoload it from base64.
+       (canlock-make-cancel-key): Base64 encode unibyte string.
+
+2002-01-20  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * nnfolder.el (nnfolder-request-accept-article): Unfold
+       x-from-line.
+       (nnfolder-request-replace-article): Ditto.
+
+2002-01-20  Nevin Kapur  <nevin@jhu.edu>
+
+       * gnus-group.el (gnus-group-best-unread-group): Use the right
+       positioning function.
+
 2002-01-20  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
+       * smiley-ems.el (smiley-region): Use new function.
+       (smiley-update-cache): Use general image functions.
+       (smiley-region): Use general functions.
+
+       * gnus-util.el (gnus-graphic-display-p): New function.
+
+       * nnmail.el (nnmail-article-group): Allow outputting traces of
+       non-strings.
+
+       * nndoc.el (nndoc-type-alist): Rules for exim bounces.
+       (nndoc-exim-bounce-type-p): New function.
+
+       * message.el (message-dont-send): Doc fix.
+
        * gnus-util.el (gnus-completing-read): Remove
        inherit-input-method.
 
+       * gnus-art.el (gnus-treat-smiley): Doc fix.
+
+       * gnus-agent.el (gnus-agent-fetch-headers): Ignore seen and recent
+       articles.
+
+2002-01-19  Simon Josefsson  <jas@extundo.com>
+
+       * imap.el (imap-gssapi-open): Don't wait for logout to complete.
+       (imap-kerberos4-open): Ditto.
+       (imap-open): Set port correctly, don't set auth.
+
+2002-01-20  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.el (gnus-version-number): Bump version number.
+
 2002-01-20 05:33:30 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no>
 
        * gnus.el: Oort Gnus v0.05 is released.
 2002-01-20  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * nnkiboze.el (nnkiboze-generate-group): Make sure the directory
-       exists. 
+       exists.
 
        * gnus-spec.el (gnus-string-width-function): New function.
        (gnus-tilde-cut-form): Use it.
        (gnus-tilde-max-form): Ditto.
-       (gnus-use-correct-string-widths): Default to (featurep 'xemacs). 
+       (gnus-use-correct-string-widths): Default to (featurep 'xemacs).
        (gnus-substring-function): Use it.
        (gnus-tilde-cut-form): Ditto.
        (gnus-substring-function): New function.
 2002-01-19  Daniel Pittman  <daniel@rimspace.net>
 
        * gnus-sum.el (gnus-summary-first-unseen-or-unread-subject): New
-       functions. 
+       functions.
 
 2002-01-19  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el (gnus-group-find-parameter): Clean up.        
+       * gnus.el (gnus-group-find-parameter): Clean up.
 
        * gnus-sum.el (gnus-summary-goto-subject): Error on non-numerical
-       articles. 
+       articles.
 
        * gnus-util.el (gnus-completing-read-with-default): Renamed.
 
 
 2002-01-19  Paul Stodghill  <stodghil@cs.cornell.edu>
 
-       * gnus-agent.el (gnus-category-name): Intern the category name. 
+       * gnus-agent.el (gnus-category-name): Intern the category name.
 
 2002-01-19  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
 2002-01-16  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * gnus-sum.el (gnus-summary-initial-limit): Inline
-       gnus-summary-limit-children. 
+       gnus-summary-limit-children.
        (gnus-summary-initial-limit): Don't limit if
        gnus-newsgroup-display is nil.
        (gnus-summary-initial-limit): No, don't.
 
        * gnus-util.el
        (gnus-put-text-property-excluding-characters-with-faces): Inline
-       gnus-put-text-property. 
+       gnus-put-text-property.
 
        * gnus-spec.el (gnus-default-format-specs): New variable.
 
        * gnus-start.el (gnus-read-newsrc-file): Don't clear
-       gnus-format-specs. 
-       (gnus-read-newsrc-el-file): Default to gnus-default-format-specs. 
+       gnus-format-specs.
+       (gnus-read-newsrc-el-file): Default to gnus-default-format-specs.
 
        * gnus-spec.el (gnus-update-format-specifications): Really check
        the Gnus version of the .newsrc.eld file.
        before splitting.
 
        * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Inline some
-       functions. 
+       functions.
        (gnus-gather-threads-by-references): Inline
-       `gnus-split-references'. 
+       `gnus-split-references'.
 
        * gnus-spec.el (gnus-summary-line-format-spec): New, optimized
        default value of gnus-summary-line-format-spec.
 
        * gnus.el: We don't need gnus-article-show-all-headers.
 
-       * gnus-art.el (article-show-all, gnus-article-show-all-header): 
+       * gnus-art.el (article-show-all, gnus-article-show-all-header):
        Ditto.
 
        * gnus-sum.el (gnus-summary-select-article): Don't call
 
 2002-01-12  Simon Josefsson  <jas@extundo.com>
 
-       * nnimap.el (nnimap-need-unselect-to-notice-new-mail) 
+       * nnimap.el (nnimap-need-unselect-to-notice-new-mail)
        (nnimap-before-find-minmax-bugworkaround): Use it.
        (nnimap-find-minmax-uid): Don't reselect current mailbox.
        (nnimap-dont-close): New variable.
 2002-01-12  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * gnus-art.el (gnus-article-reply-with-original): Use
-       `mark-active'. 
+       `mark-active'.
 
-       * gnus-msg.el (gnus-summary-reply): Don't bug out on regions. 
+       * gnus-msg.el (gnus-summary-reply): Don't bug out on regions.
 
        * gnus-logic.el (gnus-advanced-score-rule): Thinko fix.
        (gnus-score-advanced): Clean up.
-       (gnus-score-advanced): Accept a multiple of the score. 
+       (gnus-score-advanced): Accept a multiple of the score.
 
 2002-01-12  Simon Josefsson  <jas@extundo.com>
 
        * gnus-sum.el (gnus-summary-buffer-name): Return the dead name if
        it exists.
        (gnus-summary-setup-buffer): Wake up dead summary buffers.
-       (gnus-summary-buffer-name): Don't return the dead name after all. 
+       (gnus-summary-buffer-name): Don't return the dead name after all.
        (gnus-summary-setup-buffer): Kill the dead buffer.
 
        * gnus-art.el (gnus-article-followup-with-original): Store the
 
        * gnus-fun.el (gnus-display-x-face-in-from): Fake it.
        From: Karl Kleinpaste <karl@charcoal.com>
-       
+
        * gnus-art.el (article-display-x-face): Ditto.
        (gnus-article-reply-with-original): Use gnus-region-active-p.
        (gnus-article-followup-with-original): Ditto.
 
        * gnus-sum.el (gnus-summary-read-group-1): Don't select
        downloadable article either.
-       
+
 2002-01-11  ShengHuo ZHU  <zsh@cs.rochester.edu>
 
        * gnus-art.el (article-display-x-face): Insert From:.
        gnus-article-prepare-hook.
 
        * gnus-agent.el (gnus-agent-retrieve-headers): Load agentview.
-       (gnus-agent-toggle-plugged): Use gnus-agent-go-online. Move 
+       (gnus-agent-toggle-plugged): Use gnus-agent-go-online. Move
        gnus-agent-possibly-synchronize-flags to the last.
        (gnus-agent-go-online): New function. New variable.
 
 
 2002-01-11  ShengHuo ZHU  <zsh@cs.rochester.edu>
 
-       * message.el (message-ignored-news-headers) 
+       * message.el (message-ignored-news-headers)
        (message-ignored-mail-headers): Add X-Gnus-Agent-Meta-Information:.
        Suggested by ARISAWA Akihiro <ari@atesoft.advantest.co.jp>
 
        (gnus-agent-regenerate): Show messages.
 
 2002-01-11  ShengHuo ZHU  <zsh@cs.rochester.edu>
-       
+
        * gnus-agent.el (gnus-agent-regenerate-group): New function.
        (gnus-agent-regenerate): New function.
        (gnus-agent-save-alist): Sort.
 
        * nnagent.el (nnagent-retrieve-headers): Don't use nnml
        function. Insert undownloaded NOV.
-       
+
        * gnus-agent.el (gnus-agent-retrieve-headers): New function.
        (gnus-agent-request-article): New function.
 
        (gnus-request-head): Use gnus-agent-request-article.
        (gnus-request-body): Ditto.
 
-       * gnus-art.el (gnus-request-article-this-buffer): Use 
+       * gnus-art.el (gnus-request-article-this-buffer): Use
        gnus-agent-request-article.
 
        * gnus-sum.el (gnus-summary-read-group-1): Don't show the first
        (gnus-convert-image-to-gray-x-face): Ditto.
 
        * gnus-sum.el (gnus-summary-make-menu-bar): Add a :keys to
-       gnus-summary0show-raw-article.
+       gnus-summary-show-raw-article.
 
 2002-01-02  ShengHuo ZHU  <zsh@cs.rochester.edu>
 
 2001-12-29  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * gnus-art.el (gnus-treat-unfold-lines): New variable.
-       (gnus-treat-unfold-headers): Remamed.
+       (gnus-treat-unfold-headers): Renamed.
        (gnus-article-treat-unfold-headers): New command and keystroke.
 
        * rfc2047.el (rfc2047-encode-message-header): Clean up.
 2001-12-03 11:00:00  ShengHuo ZHU  <zsh@cs.rochester.edu>
 
        * pop3.el (pop3-munge-message-separator): Only use valid date.
-       From Michael Welsh Duggan <md5i@cs.cmu.edu>.
+       Trivial patch from Michael Welsh Duggan <md5i@cs.cmu.edu>.
 
        * Makefile.in: gnus-load.elc may not be generated.
 
        * gnus-sum.el (gnus-summary-edit-article): Remove a hack.
        * gnus-art.el (gnus-mime-save-part-and-strip): New function.
        (gnus-mime-action-alist): Use it.
-       (gnus-mime-button-commands): USe it.
+       (gnus-mime-button-commands): Use it.
        * mm-extern.el (mm-extern-local-file): Error when the file is gone.
        (mm-inline-external-body): unwind-protect.
 
 
        * ChangeLog: Moved to ChangeLog.1.
 
+    Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+  Copying and distribution of this file, with or without modification,
+  are permitted provided the copyright notice and this notice are preserved.
+
 ;; Local Variables:
 ;; coding: iso-2022-7bit
 ;; End:
index 3cfb883..c88d229 100644 (file)
@@ -10095,6 +10095,10 @@ Sat Aug 29 19:32:06 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
        * gnus.el: Gnus v0.2 is released.
 
+    Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+  Copying and distribution of this file, with or without modification,
+  are permitted provided the copyright notice and this notice are preserved.
+       
 ;; Local Variables:
 ;; coding: iso-2022-7bit
 ;; End:
index 678b73f..8cdd747 100644 (file)
@@ -1,5 +1,5 @@
 ;;; binhex.el --- elisp native binhex decode
-;; Copyright (c) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (c) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: binhex news
@@ -43,7 +43,7 @@ input and write the converted data to its standard output."
   :group 'gnus-extract)
 
 (defcustom binhex-decoder-switches '("-d")
-  "*List of command line flags passed to the command named by binhex-decoder-program."
+  "*List of command line flags passed to the command `binhex-decoder-program'."
   :group 'gnus-extract
   :type '(repeat string))
 
index 845095f..13e7fbc 100644 (file)
 
 ;;; Code:
 
-(defconst canlock-version "0.8")
-
 (eval-when-compile
   (require 'cl))
 
 (autoload 'sha1-binary "sha1-el")
+(autoload 'base64-encode-string "base64")
 
 (defgroup canlock nil
   "The Cancel-Lock feature."
@@ -96,13 +95,6 @@ buffer does not look like a news message."
   :type 'boolean
   :group 'canlock)
 
-(eval-when-compile
-  (defmacro canlock-string-as-unibyte (string)
-    "Return a unibyte string with the same individual bytes as STRING."
-    (if (fboundp 'string-as-unibyte)
-       (list 'string-as-unibyte string)
-      string)))
-
 (defun canlock-sha1-with-openssl (message)
   "Make a SHA-1 digest of MESSAGE using OpenSSL."
   (let (default-enable-multibyte-characters)
@@ -116,11 +108,22 @@ buffer does not look like a news message."
               canlock-openssl-program t t nil canlock-openssl-args)
        (goto-char (point-min))
        (insert "\"")
-       (while (re-search-forward "[0-9a-f][0-9a-f]" nil t)
-         (replace-match (concat "\\\\x" (match-string 0))))
+       (while (re-search-forward "\\([0-9a-f][0-9a-f]\\)" nil t)
+         (replace-match "\\\\x\\1"))
        (insert "\"")
        (goto-char (point-min))
-       (canlock-string-as-unibyte (read (current-buffer)))))))
+       (read (current-buffer))))))
+
+(eval-when-compile
+  (defmacro canlock-string-as-unibyte (string)
+    "Return a unibyte string with the same individual bytes as STRING."
+    (if (fboundp 'string-as-unibyte)
+       (list 'string-as-unibyte string)
+      string)))
+
+(defun canlock-sha1 (message)
+  "Make a SHA-1 digest of MESSAGE as a unibyte string of length 20 bytes."
+  (canlock-string-as-unibyte (funcall canlock-sha1-function message)))
 
 (defvar canlock-read-passwd nil)
 (defun canlock-read-passwd (prompt &rest args)
@@ -140,26 +143,20 @@ If ARGS, PROMPT is used as an argument to `format'."
 
 (defun canlock-make-cancel-key (message-id password)
   "Make a Cancel-Key header."
-  (cond ((> (length password) 20)
-        (setq password (funcall canlock-sha1-function password)))
-       ((< (length password) 20)
-        (setq password (concat
-                        password
-                        (make-string (- 20 (length password)) 0)))))
-  (setq password (concat password (make-string 44 0)))
-  (let ((ipad (mapconcat (lambda (char)
-                          (char-to-string (logxor 54 char)))
+  (when (> (length password) 20)
+    (setq password (canlock-sha1 password)))
+  (setq password (concat password (make-string (- 64 (length password)) 0)))
+  (let ((ipad (mapconcat (lambda (byte)
+                          (char-to-string (logxor 54 byte)))
                         password ""))
-       (opad (mapconcat (lambda (char)
-                          (char-to-string (logxor 92 char)))
+       (opad (mapconcat (lambda (byte)
+                          (char-to-string (logxor 92 byte)))
                         password "")))
     (base64-encode-string
-     (funcall canlock-sha1-function
-             (concat
-              opad
-              (funcall canlock-sha1-function
-                       (concat ipad
-                               (canlock-string-as-unibyte message-id))))))))
+     (canlock-sha1
+      (concat opad
+             (canlock-sha1
+              (concat ipad (canlock-string-as-unibyte message-id))))))))
 
 (defun canlock-narrow-to-header ()
   "Narrow the buffer to the head of the message."
@@ -250,8 +247,7 @@ message."
                (insert "Cancel-Key: sha1:" key-for-key "\n"))
              (when key-for-lock
                (insert "Cancel-Lock: sha1:"
-                       (base64-encode-string (funcall canlock-sha1-function
-                                                      key-for-lock))
+                       (base64-encode-string (canlock-sha1 key-for-lock))
                        "\n")))))))))
 
 ;;;###autoload
@@ -307,9 +303,9 @@ nil instead of to signal an error by setting the option
        (when locks
          (when id-for-lock
            (setq key-for-lock
-                 (base64-encode-string (funcall canlock-sha1-function
-                                                (canlock-make-cancel-key
-                                                 id-for-lock password))))
+                 (base64-encode-string
+                  (canlock-sha1 (canlock-make-cancel-key id-for-lock
+                                                         password))))
            (when (and locks (not match))
              (setq match (string-equal key-for-lock (pop locks)))))
          (setq locks (if match "good" "bad")))
diff --git a/lisp/deuglify.el b/lisp/deuglify.el
new file mode 100644 (file)
index 0000000..e3a9bf3
--- /dev/null
@@ -0,0 +1,441 @@
+;;; deuglify.el --- deuglify broken Outlook (Express) articles
+
+;; Copyright (C) 2002 Free Software Foundation, Inc.
+;; Copyright (C) 2001,2002 Raymond Scholz
+
+;; Author: Raymond Scholz <rscholz@zonix.de>
+;;         Thomas Steffen (unwrapping algorithm,
+;;                         based on an idea of Stefan Monnier)
+;; Keywords: mail, news
+
+;; This file is part of GNU Emacs.
+
+;; 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.
+
+;;; Commentary:
+
+;; This file enables Gnus to repair broken citations produced by
+;; common user agents like MS Outlook (Express).  It may repair
+;; articles of other user agents too.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;
+;; Outlook sometimes wraps cited lines before sending a message as
+;; seen in this example:
+;;
+;; Example #1
+;; ----------
+;;
+;; John Doe wrote:
+;;
+;; > This sentence no verb.  This sentence no verb.  This sentence
+;; no
+;; > verb.  This sentence no verb.  This sentence no verb.  This
+;; > sentence no verb.
+;;
+;; The function `gnus-outlook-unwrap-lines' tries to recognize those
+;; erroneously wrapped lines and will unwrap them.  I.e. putting the
+;; wrapped parts ("no" in this example) back where they belong (at the
+;; end of the cited line above).
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Note that some people not only use broken user agents but also
+;; practice a bad citation style by omitting blank lines between the
+;; cited text and their own text.
+;:
+;; Example #2
+;; ----------
+;;
+;; John Doe wrote:
+;;
+;; > This sentence no verb.  This sentence no verb.  This sentence no
+;; You forgot in all your sentences.
+;; > verb.  This sentence no verb.  This sentence no verb.  This
+;; > sentence no verb.
+;;
+;; Unwrapping "You forgot in all your sentences." would be illegal as
+;; this part wasn't intended to be cited text.
+;; `gnus-outlook-unwrap-lines' will only unwrap lines if the resulting
+;; citation line will be of a certain maximum length.  You can control
+;; this by adjusting `gnus-outlook-deuglify-unwrap-max'.  Also
+;; unwrapping will only be done if the line above the (possibly)
+;; wrapped line has a minimum length of `gnus-outlook-deuglify-unwrap-min'.
+;;
+;; Furthermore no unwrapping will be undertaken if the last character
+;; is one of the chars specified in
+;; `gnus-outlook-deuglify-unwrap-stop-chars'.  Setting this to ".?!"
+;; inhibits unwrapping if the cited line ends with a full stop,
+;; question mark or exclamation mark.  Note that this variable
+;; defaults to `nil', triggering a few false positives but generally
+;; giving you better results.
+;;
+;; Unwrapping works on every level of citation.  Thus you will be able
+;; repair broken citations of broken user agents citing broken
+;; citations of broken user agents citing broken citations...
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Citations are commonly introduced with an attribution line
+;; indicating who wrote the cited text.  Outlook adds superfluous
+;; information that can be found in the header of the message to this
+;; line and often wraps it.
+;;
+;; If that weren't enough, lots of people write their own text above
+;; the cited text and cite the complete original article below.
+;;
+;; Example #3
+;; ----------
+;;
+;; Hey, John.  There's no in all your sentences!
+;;
+;; John Doe <john.doe@some.domain> wrote in message
+;; news:a87usw8$dklsssa$2@some.news.server...
+;; > This sentence no verb.  This sentence no verb.  This sentence
+;; no
+;; > verb.  This sentence no verb.  This sentence no verb.  This
+;; > sentence no verb.
+;; >
+;; > Bye, John
+;;
+;; Repairing the attribution line will be done by function
+;; `gnus-outlook-repair-attribution' which calls other function that
+;; try to recognize and repair broken attribution lines.  See variable
+;; `gnus-outlook-deuglify-attrib-cut-regexp' for stuff that should be
+;; cut off from the beginning of an attribution line and variable
+;; `gnus-outlook-deuglify-attrib-verb-regexp' for the verbs that are
+;; required to be found in an attribution line.  These function return
+;; the point where the repaired attribution line starts.
+;;
+;; Rearranging the article so that the cited text appears above the
+;; new text will be done by function
+;; `gnus-outlook-rearrange-citation'.  This function calls
+;; `gnus-outlook-repair-attribution' to find and repair an attribution
+;; line.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Well, and that's what the message will look like after applying
+;; deuglification:
+;;
+;; Example #3 (deuglified)
+;; -----------------------
+;;
+;; John Doe <john.doe@some.domain> wrote:
+;;
+;; > This sentence no verb.  This sentence no verb.  This sentence no
+;; > verb.  This sentence no verb.  This sentence no verb.  This
+;; > sentence no verb.
+;; >
+;; > Bye, John
+;;
+;; Hey, John.  There's no in all your sentences!
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; 
+;; Usage
+;; -----
+;;
+;; Press `W k' in the Summary Buffer.
+;;
+;; Non recommended usage :-)
+;; ---------------------
+;;
+;; To automatically invoke deuglification on every article you read,
+;; put something like that in your .gnus:
+;;
+;; (add-hook 'gnus-article-decode-hook 'gnus-outlook-unwrap-lines)
+;;
+;; or _one_ of the following lines:
+;;
+;; ;; repair broken attribution lines
+;; (add-hook 'gnus-article-decode-hook 'gnus-outlook-repair-attribution)
+;;
+;; ;; repair broken attribution lines and citations
+;; (add-hook 'gnus-article-decode-hook 'gnus-outlook-rearrange-citation)
+;;
+;; Note that there always may be some false positives, so I suggest
+;; using the manual invocation.  After deuglification you may want to
+;; refill the whole article using `W w'.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Limitations
+;; -----------
+;;
+;; As I said before there may (or will) be a few false positives on
+;; unwrapping cited lines with `gnus-outlook-unwrap-lines'.
+;;
+;; `gnus-outlook-repair-attribution' will only fix the first
+;; attribution line found in the article.  Furthermore it fixed to
+;; certain kinds of attributions.  And there may be horribly many
+;; false positives, vanishing lines and so on -- so don't trust your
+;; eyes.  Again I recommend manual invocation.
+;;
+;; `gnus-outlook-rearrange-citation' carries all the limitations of
+;; `gnus-outlook-repair-attribution'.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; See ChangeLog for other changes.
+;;
+;; Revision 1.5  2002/01/27 14:39:17  rscholz
+;; * New variable `gnus-outlook-deuglify-no-wrap-chars' to inhibit
+;;   unwrapping if one these chars is first in the possibly wrapped line.
+;; * Improved rearranging of the article.
+;; * New function `gnus-outlook-repair-attribution-block' for repairing
+;;   those big "Original Message (following some headers)" attributions.
+;;
+;; Revision 1.4  2002/01/03 14:05:00  rscholz
+;; Renamed `gnus-outlook-deuglify-article' to
+;; `gnus-article-outlook-deuglify-article'.
+;; Made it easier to deuglify the article while being in Gnus' Article
+;; Edit Mode. (suggested by Phil Nitschke)
+;;
+;;
+;; Revision 1.3  2002/01/02 23:35:54  rscholz
+;; Fix a bug that caused succeeding long attribution lines to be
+;; unwrapped.  Minor doc fixes and regular expression tuning.
+;;
+;; Revision 1.2  2001/12/30 20:14:34  rscholz
+;; Clean up source.
+;;
+;; Revision 1.1  2001/12/30 20:13:32  rscholz
+;; Initial revision
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; Code:
+
+(require 'gnus-art)
+(require 'gnus-sum)
+
+(defconst gnus-outlook-deuglify-version "1.5 Gnus version"
+  "Version of gnus-outlook-deuglify.")
+
+;;; User Customizable Variables:
+
+(defgroup gnus-outlook-deuglify nil
+  "Deuglify articles generated by broken user agents like MS 
+Outlook (Express).")
+
+;;;###autoload
+(defcustom gnus-outlook-deuglify-unwrap-min 45
+  "Minimum length of the cited line above the (possibly) wrapped line."
+  :type 'number
+  :group 'gnus-outlook-deuglify)
+
+;;;###autoload
+(defcustom gnus-outlook-deuglify-unwrap-max 95
+  "Maximum length of the cited line after unwrapping."
+  :type 'number
+  :group 'gnus-outlook-deuglify)
+
+(defcustom gnus-outlook-deuglify-cite-marks ">|#%"
+  "Characters that indicate cited lines."
+  :type 'string
+  :group 'gnus-outlook-deuglify)
+
+(defcustom gnus-outlook-deuglify-unwrap-stop-chars nil ;; ".?!" or nil
+  "Characters that inhibit unwrapping if they are the last one on the
+cited line above the possible wrapped line."
+  :type 'string
+  :group 'gnus-outlook-deuglify)
+
+(defcustom gnus-outlook-deuglify-no-wrap-chars "`"
+  "Characters that inhibit unwrapping if they are the first one in the
+possibly wrapped line."
+  :type 'string
+  :group 'gnus-outlook-deuglify)
+
+(defcustom  gnus-outlook-deuglify-attrib-cut-regexp
+  "\\(On \\|Am \\)?\\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),[^,]+, "
+  "Regular expression matching the beginning of an attribution line
+that should be cut off."
+  :type 'string
+  :group 'gnus-outlook-deuglify)
+
+(defcustom gnus-outlook-deuglify-attrib-verb-regexp
+  "wrote\\|writes\\|says\\|schrieb\\|schreibt\\|meinte\\|skrev\\|a Ã©crit\\|schreef"
+  "Regular expression matching the verb used in an attribution line."
+  :type 'string
+  :group 'gnus-outlook-deuglify)
+
+(defcustom  gnus-outlook-deuglify-attrib-end-regexp
+  ": *\\|\\.\\.\\."
+  "Regular expression matching the end of an attribution line."
+  :type 'string
+  :group 'gnus-outlook-deuglify)
+
+
+;; Functions
+
+;; TODO: don't kill MIME parts
+;;;###autoload
+(defun gnus-outlook-unwrap-lines ()
+  "Unwrap lines that appear to be wrapped citation lines.  You can
+control what lines will be unwrapped by frobbing
+`gnus-outlook-deuglify-unwrap-min' and
+`gnus-outlook-deuglify-unwrap-max', indicating the miminum and maximum
+length of an unwrapped citation line."
+  (interactive)
+  (save-excursion
+    (let ((case-fold-search nil)
+         (inhibit-read-only t)
+         (cite-marks gnus-outlook-deuglify-cite-marks)
+         (no-wrap gnus-outlook-deuglify-no-wrap-chars)
+         (stop-chars gnus-outlook-deuglify-unwrap-stop-chars))
+      (gnus-with-article-buffer
+       (article-goto-body)
+       (while (re-search-forward
+               (concat
+                "^\\([ \t" cite-marks "]*\\)"
+                "\\([" cite-marks "].*[^\n " stop-chars "]\\)[ \t]?\n"
+                "\\1\\([^\n " cite-marks no-wrap "]+.*\\)$")
+              nil t)
+         (let ((len12 (- (match-end 2) (match-beginning 1)))
+             (len3 (- (match-end 3) (match-beginning 3))))
+           (if (and (> len12 gnus-outlook-deuglify-unwrap-min)
+                    (< (+ len12 len3) gnus-outlook-deuglify-unwrap-max))
+               (progn 
+                 (replace-match "\\1\\2 \\3")
+                 (goto-char (match-beginning 0))))))))))
+
+;; TODO: respect signatures, don't kill MIME parts
+(defun gnus-outlook-rearrange-article (from-where)
+  "Put the text from `from-where' to the end of buffer at the top of
+the article buffer."
+  (save-excursion
+    (let ((inhibit-read-only t)
+         (cite-marks gnus-outlook-deuglify-cite-marks))
+      (gnus-with-article-buffer
+       (unless (search-forward-regexp
+                  (concat "^[ \t]*[^" cite-marks "\n]") nil t)
+         (kill-region from-where (point-max))
+         (article-goto-body)
+         (yank)
+         (insert "\n"))))))
+
+;; John Doe <john.doe@some.domain> wrote in message
+;; news:a87usw8$dklsssa$2@some.news.server...
+
+(defun gnus-outlook-repair-attribution-outlook ()
+  "Repair a broken attribution line (Outlook)."
+  (save-excursion
+    (let ((case-fold-search nil)
+         (inhibit-read-only t)
+         (cite-marks gnus-outlook-deuglify-cite-marks))
+      (gnus-with-article-buffer
+       (article-goto-body)
+       (if (re-search-forward
+            (concat "^\\([^" cite-marks "].+\\)"
+                    "\\(" gnus-outlook-deuglify-attrib-verb-regexp "\\)"
+                    "\\(.*\n?[^\n" cite-marks "].*\\)?"
+                    "\\(" gnus-outlook-deuglify-attrib-end-regexp "\\)$")
+            nil t)
+           (progn
+             (replace-match "\\1\\2\\4")
+             (match-beginning 0)))))))
+
+
+;; ----- Original Message -----
+;; From: "John Doe" <john.doe@some.domain>
+;; To: "Doe Foundation" <info@doefnd.org>
+;; Sent: Monday, November 19, 2001 12:13 PM
+;; Subject: More Doenuts
+
+(defun gnus-outlook-repair-attribution-block ()
+  "Repair a big broken attribution block."
+  (save-excursion
+    (let ((case-fold-search nil)
+         (inhibit-read-only t)
+         (cite-marks gnus-outlook-deuglify-cite-marks))
+      (gnus-with-article-buffer
+       (article-goto-body)
+       (if (re-search-forward
+            (concat "^----* ?[^-]+ ?----*\n"
+                    "[^\n]+: \\([^\n]+\\)\n"
+                    "[^\n]+: [^\n]+\n"
+                    "[^\n]+: [^\n]+\n"
+                    "[^\n]+: [^\n]+$")
+            nil t)
+           (progn
+             (replace-match "\\1 wrote:")
+             (match-beginning 0)))))))
+
+;; On Wed, 16 Jan 2002 23:23:30 +0100, John Doe <john.doe@some.domain> wrote:
+
+(defun gnus-outlook-repair-attribution-other ()
+  "Repair a broken attribution line (other user agents than Outlook)."
+  (save-excursion
+    (let ((case-fold-search nil)
+         (inhibit-read-only t)
+         (cite-marks gnus-outlook-deuglify-cite-marks))
+      (gnus-with-article-buffer
+       (article-goto-body)
+       (if (re-search-forward
+            (concat "^\\("gnus-outlook-deuglify-attrib-cut-regexp"\\)?"
+                    "\\([^" cite-marks "].+\\)\n\\([^\n" cite-marks "].*\\)?"
+                    "\\(" gnus-outlook-deuglify-attrib-verb-regexp "\\).*"
+                    "\\(" gnus-outlook-deuglify-attrib-end-regexp "\\)$")
+            nil t)
+           (progn
+             (replace-match "\\4 \\5\\6\\7")
+             (match-beginning 0)))))))
+
+;;;###autoload
+(defun gnus-outlook-repair-attribution ()
+  "Repair a broken attribution line."
+  (interactive)
+  (or
+   (gnus-outlook-repair-attribution-other)
+   (gnus-outlook-repair-attribution-block)
+   (gnus-outlook-repair-attribution-outlook)))
+
+(defun gnus-outlook-rearrange-citation ()
+  "Repair broken citations."
+  (let ((attrib-start (gnus-outlook-repair-attribution)))
+    ;; rearrange citations if an attribution line has been recognized
+    (if attrib-start
+       (gnus-outlook-rearrange-article attrib-start))))
+
+;;;###autoload
+(defun gnus-outlook-deuglify-article ()
+  "Deuglify broken Outlook (Express) articles."
+  (interactive)
+  ;; apply treatment of dumb quotes
+  (gnus-article-treat-dumbquotes)
+  ;; repair wrapped cited lines
+  (gnus-outlook-unwrap-lines)
+  ;; repair attribution line
+  (gnus-outlook-rearrange-citation))
+
+;;;###autoload
+(defun gnus-article-outlook-deuglify-article ()
+  "Deuglify broken Outlook (Express) articles and redisplay."
+  (interactive)
+  (gnus-outlook-deuglify-article)
+  (with-current-buffer (or gnus-article-buffer (current-buffer))
+    (gnus-article-prepare-display)))
+
+(provide 'deuglify)
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
+
+;;; deuglify.el ends here
index 8f51880..ea3d548 100644 (file)
@@ -1,5 +1,5 @@
 ;;; dgnushack.el --- a hack to set the load path for byte-compiling
-;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
        (t (concat filename ".elc"))))
 
 (require 'bytecomp)
+;; To avoid having defsubsts and inlines happen.
+;(if (featurep 'xemacs)
+;    (require 'byte-optimize)
+;  (require 'byte-opt))
+;(defun byte-optimize-inline-handler (form)
+;  "byte-optimize-handler for the `inline' special-form."
+;  (cons 'progn (cdr form)))
+;(defalias 'byte-compile-file-form-defsubst 'byte-compile-file-form-defun)
 
 (when (boundp 'MULE)
   (let (current-load-list)
@@ -337,8 +345,7 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
                     (while form
                       (setq elem (pop form))
                       (unless (memq (car-safe elem)
-                                    '(\` backquote
-                                      defcustom defface defgroup
+                                    '(defcustom defface defgroup
                                       define-widget quote))
                         (while (consp elem)
                           (push (car elem) form)
@@ -457,8 +464,11 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
          (unless (or (condition-case code
                          (require 'w3-parse)
                        (error
-                        (message "No w3: %s %s retrying..." code
-                                 (locate-library "w3-parse"))
+                        (message "No w3: %s%s, retrying..."
+                                 (error-message-string code)
+                                 (if (setq code (locate-library "w3-parse"))
+                                     (concat " (" code ")")
+                                   ""))
                         nil))
                      ;; Maybe mis-configured Makefile is used (e.g.
                      ;; configured for FSFmacs but XEmacs is running).
@@ -481,22 +491,35 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
          (condition-case code
              (progn (require 'mh-e) nil)
            (error
-            (message "No mh-e: %s %s (ignored)" code (locate-library "mh-e"))
+            (message "No mh-e: %s%s (ignored)"
+                     (error-message-string code)
+                     (if (setq code (locate-library "mh-e"))
+                         (concat " (" code ")")
+                       ""))
             '("gnus-mh.el")))
          (condition-case code
              (progn (require 'xml) nil)
            (error
-            (message "No xml: %s %s (ignored)" code (locate-library "xml"))
+            (message "No xml: %s%s (ignored)"
+                     (error-message-string code)
+                     (if (setq code (locate-library "xml"))
+                         (concat " (" code ")")
+                       ""))
             '("nnrss.el")))
          (condition-case code
              (progn (require 'bbdb) nil)
            (error
-            (message "No bbdb: %s %s (ignored)" code (locate-library "bbdb"))
+            (message "No bbdb: %s%s (ignored)"
+                     (error-message-string code)
+                     (if (setq code (locate-library "bbdb"))
+                         (concat " (" code ")")
+                       ""))
             '("gnus-bbdb.el")))
          (unless (featurep 'xemacs)
-           '("gnus-xmas.el" "messagexmas.el" "nnheaderxm.el" "smiley.el"))
-         (when (or (featurep 'xemacs) (<= emacs-major-version 20))
-           '("smiley-ems.el"))
+           '("gnus-xmas.el" "messagexmas.el" "nnheaderxm.el"))
+         (when (and (not (featurep 'xemacs))
+                    (<= emacs-major-version 20))
+           '("smiley.el"))
          (when (and (fboundp 'base64-decode-string)
                     (subrp (symbol-function 'base64-decode-string)))
            '("base64.el"))
diff --git a/lisp/dns.el b/lisp/dns.el
new file mode 100644 (file)
index 0000000..475909a
--- /dev/null
@@ -0,0 +1,342 @@
+;;; dns.el --- Domain Name Service lookups
+;; Copyright (C) 2002 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: network
+
+;; This file is part of GNU Emacs.
+
+;; 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.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'mm-util)
+
+(defvar dns-timeout 5
+  "How many seconds to wait when doing DNS queries.")
+
+(defvar dns-servers nil
+  "Which DNS servers to query.
+If nil, /etc/resolv.conf will be consulted.")
+
+;;; Internal code:
+
+(defvar dns-query-types
+  '((A 1)
+    (NS 2)
+    (MD 3)
+    (MF 4)
+    (CNAME 5)
+    (SOA 6)
+    (MB 7)
+    (MG 8)
+    (MR 9)
+    (NULL 10)
+    (WKS 11)
+    (PRT 12)
+    (HINFO 13)
+    (MINFO 14)
+    (MX 15)
+    (TXT 16)
+    (AXFR 252)
+    (MAILB 253)
+    (MAILA 254)
+    (* 255))
+  "Names of query types and their values.")
+
+(defvar dns-classes
+  '((IN 1)
+    (CS 2)
+    (CH 3)
+    (HS 4))
+  "Classes of queries.")
+
+(defun dns-write-bytes (value &optional length)
+  (let (bytes)
+    (dotimes (i (or length 1))
+      (push (% value 256) bytes)
+      (setq value (/ value 256)))
+    (dolist (byte bytes)
+      (insert byte))))
+
+(defun dns-read-bytes (length)
+  (let ((value 0))
+    (dotimes (i length)
+      (setq value (logior (* value 256) (following-char)))
+      (forward-char 1))
+    value))
+
+(defun dns-get (type spec)
+  (cadr (assq type spec)))
+
+(defun dns-inverse-get (value spec)
+  (let ((found nil))
+    (while (and (not found)
+               spec)
+      (if (eq value (cadr (car spec)))
+         (setq found (caar spec))
+       (pop spec)))
+    found))
+
+(defun dns-write-name (name)
+  (dolist (part (split-string name "\\."))
+    (dns-write-bytes (length part))
+    (insert part))
+  (dns-write-bytes 0))
+
+(defun dns-read-string-name (string buffer)
+  (mm-with-unibyte-buffer
+    (insert string)
+    (goto-char (point-min))
+    (dns-read-name buffer)))
+
+(defun dns-read-name (&optional buffer)
+  (let ((ended nil)
+       (name nil)
+       length)
+    (while (not ended)
+      (setq length (dns-read-bytes 1))
+      (if (= 192 (logand length (lsh 3 6)))
+         (let ((offset (+ (* (logand 63 length) 256)
+                          (dns-read-bytes 1))))
+           (save-excursion
+             (when buffer
+               (set-buffer buffer))
+             (goto-char (1+ offset))
+             (setq ended (dns-read-name buffer))))
+       (if (zerop length)
+           (setq ended t)
+         (push (buffer-substring (point)
+                                 (progn (forward-char length) (point)))
+               name))))
+    (if (stringp ended)
+       (if (null name)
+           ended
+         (concat (mapconcat 'identity (nreverse name) ".") "." ended))
+      (mapconcat 'identity (nreverse name) "."))))
+
+(defun dns-write (spec &optional tcp-p)
+  "Write a DNS packet according to SPEC.
+If TCP-P, the first two bytes of the package with be the length field."
+  (with-temp-buffer
+    (dns-write-bytes (dns-get 'id spec) 2)
+    (dns-write-bytes
+     (logior
+      (lsh (if (dns-get 'response-p spec) 1 0) -7)
+      (lsh
+       (cond
+       ((eq (dns-get 'opcode spec) 'query) 0)
+       ((eq (dns-get 'opcode spec) 'inverse-query) 1)
+       ((eq (dns-get 'opcode spec) 'status) 2)
+       (t (error "No such opcode: %s" (dns-get 'opcode spec))))
+       -3)
+      (lsh (if (dns-get 'authoritative-p spec) 1 0) -2)
+      (lsh (if (dns-get 'truncated-p spec) 1 0) -1)
+      (lsh (if (dns-get 'recursion-desired-p spec) 1 0) 0)))
+    (dns-write-bytes
+     (cond 
+      ((eq (dns-get 'response-code spec) 'no-error) 0)
+      ((eq (dns-get 'response-code spec) 'format-error) 1)
+      ((eq (dns-get 'response-code spec) 'server-failure) 2)
+      ((eq (dns-get 'response-code spec) 'name-error) 3)
+      ((eq (dns-get 'response-code spec) 'not-implemented) 4)
+      ((eq (dns-get 'response-code spec) 'refused) 5)
+      (t 0)))
+    (dns-write-bytes (length (dns-get 'queries spec)) 2)
+    (dns-write-bytes (length (dns-get 'answers spec)) 2)
+    (dns-write-bytes (length (dns-get 'authorities spec)) 2)
+    (dns-write-bytes (length (dns-get 'additionals spec)) 2)
+    (dolist (query (dns-get 'queries spec))
+      (dns-write-name (car query))
+      (dns-write-bytes (cadr (assq (or (dns-get 'type query) 'A)
+                                  dns-query-types)) 2)
+      (dns-write-bytes (cadr (assq (or (dns-get 'class query) 'IN)
+                                  dns-classes)) 2))
+    (dolist (slot '(answers authorities additionals))
+      (dolist (resource (dns-get slot spec))
+       (dns-write-name (car resource))
+      (dns-write-bytes (cadr (assq (dns-get 'type resource) dns-query-types))
+                      2)
+      (dns-write-bytes (cadr (assq (dns-get 'class resource) dns-classes))
+                      2)
+      (dns-write-bytes (dns-get 'ttl resource) 4)
+      (dns-write-bytes (length (dns-get 'data resource)) 2)
+      (insert (dns-get 'data resource))))
+    (when tcp-p
+      (goto-char (point-min))
+      (dns-write-bytes (buffer-size) 2))
+    (buffer-string)))
+
+(defun dns-read (packet)
+  (mm-with-unibyte-buffer
+    (let ((spec nil)
+         queries answers authorities additionals)
+      (insert packet)
+      (goto-char (point-min))
+      (push (list 'id (dns-read-bytes 2)) spec)
+      (let ((byte (dns-read-bytes 1)))
+       (push (list 'response-p (if (zerop (logand byte (lsh 1 7))) nil t))
+             spec)
+       (let ((opcode (logand byte (lsh 7 3))))
+         (push (list 'opcode
+                     (cond ((eq opcode 0) 'query)
+                           ((eq opcode 1) 'inverse-query)
+                           ((eq opcode 2) 'status)))
+               spec))
+       (push (list 'authoritative-p (if (zerop (logand byte (lsh 1 2)))
+                                        nil t)) spec)
+       (push (list 'truncated-p (if (zerop (logand byte (lsh 1 2))) nil t))
+             spec)
+       (push (list 'recursion-desired-p
+                   (if (zerop (logand byte (lsh 1 0))) nil t)) spec))
+      (let ((rc (logand (dns-read-bytes 1) 15)))
+       (push (list 'response-code
+                   (cond
+                    ((eq rc 0) 'no-error)
+                    ((eq rc 1) 'format-error)
+                    ((eq rc 2) 'server-failure)
+                    ((eq rc 3) 'name-error)
+                    ((eq rc 4) 'not-implemented)
+                    ((eq rc 5) 'refused)))
+             spec))
+      (setq queries (dns-read-bytes 2))
+      (setq answers (dns-read-bytes 2))
+      (setq authorities (dns-read-bytes 2))
+      (setq additionals (dns-read-bytes 2))
+      (let ((qs nil))
+       (dotimes (i queries)
+         (push (list (dns-read-name)
+                     (list 'type (dns-inverse-get (dns-read-bytes 2)
+                                                  dns-query-types))
+                     (list 'class (dns-inverse-get (dns-read-bytes 2)
+                                                   dns-classes)))
+               qs))
+       (push (list 'queries qs) spec))
+    (dolist (slot '(answers authorities additionals))
+      (let ((qs nil)
+           type)
+       (dotimes (i (symbol-value slot))
+         (push (list (dns-read-name)
+                     (list 'type
+                           (setq type (dns-inverse-get (dns-read-bytes 2)
+                                                       dns-query-types)))
+                     (list 'class (dns-inverse-get (dns-read-bytes 2)
+                                                   dns-classes))
+                     (list 'ttl (dns-read-bytes 4))
+                     (let ((length (dns-read-bytes 2)))
+                       (list 'data
+                             (dns-read-type
+                              (buffer-substring
+                               (point)
+                               (progn (forward-char length) (point)))
+                              type))))
+               qs))
+       (push (list slot qs) spec)))
+    (nreverse spec))))
+
+(defun dns-read-type (string type)
+  (let ((buffer (current-buffer))
+       (point (point)))
+    (prog1
+       (mm-with-unibyte-buffer
+         (insert string)
+         (goto-char (point-min))
+         (cond
+          ((eq type 'A)
+           (let ((bytes nil))
+             (dotimes (i 4)
+               (push (dns-read-bytes 1) bytes))
+             (mapconcat 'number-to-string (nreverse bytes) ".")))
+          ((eq type 'NS)
+           (dns-read-string-name string buffer))
+          ((eq type 'CNAME)
+           (dns-read-string-name string buffer))
+          (t string)))
+      (goto-char point))))
+
+(defun dns-parse-resolv-conf ()
+  (when (file-exists-p "/etc/resolv.conf")
+    (with-temp-buffer
+      (insert-file-contents "/etc/resolv.conf")
+      (goto-char (point-min))
+      (while (re-search-forward "^nameserver[\t ]+\\([^ \t\n]+\\)" nil t)
+       (push (match-string 1) dns-servers))
+      (setq dns-servers (nreverse dns-servers)))))
+
+;;; Interface functions.
+
+(defmacro dns-make-network-process (server)
+  (if (featurep 'xemacs)
+      `(let ((coding-system-for-read 'binary)
+            (coding-system-for-write 'binary))
+        (open-network-stream "dns" (current-buffer) ,server "domain" 'udp))
+    `(let ((server ,server)
+          (coding-system-for-read 'binary)
+          (coding-system-for-write 'binary))
+       (if (fboundp 'make-network-process)
+          (make-network-process
+           :name "dns"
+           :coding 'binary
+           :buffer (current-buffer)
+           :host server
+           :service "domain"
+           :type 'datagram)
+        (open-network-stream "dns" (current-buffer) server "domain")))))
+
+(defun query-dns (name &optional type fullp)
+  "Query a DNS server for NAME of TYPE.
+If FULLP, return the entire record returned."
+  (setq type (or type 'A))
+  (unless dns-servers
+    (dns-parse-resolv-conf)
+    (unless dns-servers
+      (error "No DNS server configuration found")))
+  (mm-with-unibyte-buffer
+    (let ((process (dns-make-network-process (car dns-servers)))
+         (tcp-p (and (not (fboundp 'make-network-process))
+                     (not (featurep 'xemacs))))
+         (step 100)
+         (times (* dns-timeout 1000))
+         (id (random 65000)))
+      (process-send-string
+       process
+       (dns-write `((id ,id)
+                   (opcode query)
+                   (queries ((,name (type ,type))))
+                   (recursion-desired-p t))
+                 tcp-p))
+      (while (and (zerop (buffer-size))
+                 (> times 0))
+       (accept-process-output process 0 step)
+       (decf times step))
+      (ignore-errors
+       (delete-process process))
+      (when tcp-p
+       (goto-char (point-min))
+       (delete-region (point) (+ (point) 2)))
+      (unless (zerop (buffer-size))
+       (let ((result (dns-read (buffer-string))))
+         (if fullp
+             result
+           (let ((answer (car (dns-get 'answers result))))
+             (when (eq type (dns-get 'type answer))
+               (dns-get 'data answer)))))))))
+
+(provide 'dns)
+
+;;; dns.el ends here
index eacc400..d945cac 100644 (file)
@@ -140,6 +140,18 @@ If this is `ask' the hook will query the user."
                 (const :tag "Ask" ask))
   :group 'gnus-agent)
 
+(defcustom gnus-agent-mark-unread-after-downloaded t
+  "Indicate whether to mark articles unread after downloaded."
+  :version "21.1"
+  :type 'boolean
+  :group 'gnus-agent)
+
+(defcustom gnus-agent-download-marks '(download)
+  "Marks for downloading."
+  :version "21.1"
+  :type '(repeat (symbol :tag "Mark"))
+  :group 'gnus-agent)
+
 ;;; Internal variables
 
 (defvar gnus-agent-history-buffers nil)
@@ -155,6 +167,7 @@ If this is `ask' the hook will query the user."
 (defvar gnus-agent-file-name nil)
 (defvar gnus-agent-send-mail-function nil)
 (defvar gnus-agent-file-coding-system 'raw-text)
+(defvar gnus-agent-file-loading-cache nil)
 
 ;; Dynamic variables
 (defvar gnus-headers)
@@ -392,6 +405,13 @@ If this is `ask' the hook will query the user."
   (gnus))
 
 ;;;###autoload
+(defun gnus-slave-unplugged (&optional arg)
+  "Read news as a slave unplugged."
+  (interactive "P")
+  (setq gnus-plugged nil)
+  (gnus arg nil 'slave))
+
+;;;###autoload
 (defun gnus-agentize ()
   "Allow Gnus to be an offline newsreader.
 The normal usage of this command is to put the following as the
@@ -684,7 +704,8 @@ the actual number of articles toggled is returned."
          (push article gnus-newsgroup-undownloaded))
       (setq gnus-newsgroup-undownloaded
            (delq article gnus-newsgroup-undownloaded))
-      (push article gnus-newsgroup-downloadable))
+      (setq gnus-newsgroup-downloadable
+           (gnus-add-to-sorted-list gnus-newsgroup-downloadable article)))
     (gnus-summary-update-mark
      (if unmark gnus-undownloaded-mark gnus-downloadable-mark)
      'unread)))
@@ -696,12 +717,21 @@ the actual number of articles toggled is returned."
               (gnus-agent-method-p gnus-command-method))
       (gnus-agent-load-alist gnus-newsgroup-name)
       ;; First mark all undownloaded articles as undownloaded.
-      (dolist (article (mapcar (lambda (header) (mail-header-number header))
-                              gnus-newsgroup-headers))
-       (unless (or (cdr (assq article gnus-agent-article-alist))
-                   (memq article gnus-newsgroup-downloadable)
-                   (memq article gnus-newsgroup-cached))
-         (push article gnus-newsgroup-undownloaded)))
+      (let ((articles (mapcar (lambda (header) (mail-header-number header))
+                             gnus-newsgroup-headers))
+           (agent-articles gnus-agent-article-alist)
+           candidates article)
+       (while (setq article (pop articles))
+         (while (and agent-articles
+                     (< (caar agent-articles) article))
+           (setq agent-articles (cdr agent-articles)))
+         (when (or (not (cdar agent-articles))
+                   (not (= (caar agent-articles) article)))
+           (push article candidates)))
+       (dolist (article candidates)
+         (unless (or (memq article gnus-newsgroup-downloadable)
+                     (memq article gnus-newsgroup-cached))
+           (push article gnus-newsgroup-undownloaded))))
       ;; Then mark downloaded downloadable as not-downloadable,
       ;; if you get my drift.
       (dolist (article gnus-newsgroup-downloadable)
@@ -736,7 +766,8 @@ the actual number of articles toggled is returned."
            (dolist (article articles)
              (setq gnus-newsgroup-downloadable
                    (delq article gnus-newsgroup-downloadable))
-             (gnus-summary-mark-article article gnus-unread-mark))))
+             (if gnus-agent-mark-unread-after-downloaded
+                 (gnus-summary-mark-article article gnus-unread-mark)))))
       (when (and (not state)
                 gnus-plugged)
        (gnus-agent-toggle-plugged nil)))))
@@ -949,32 +980,33 @@ the actual number of articles toggled is returned."
          (while pos
            (narrow-to-region (cdar pos) (or (cdadr pos) (point-max)))
            (goto-char (point-min))
-           (when (search-forward "\n\n" nil t)
-             (when (search-backward "\nXrefs: " nil t)
-               ;; Handle crossposting.
-               (skip-chars-forward "^ ")
-               (skip-chars-forward " ")
-               (setq crosses nil)
-               (while (looking-at "\\([^: \n]+\\):\\([0-9]+\\) +")
-                 (push (cons (buffer-substring (match-beginning 1)
-                                               (match-end 1))
-                             (buffer-substring (match-beginning 2)
-                                               (match-end 2)))
-                       crosses)
-                 (goto-char (match-end 0)))
-               (gnus-agent-crosspost crosses (caar pos))))
-           (goto-char (point-min))
-           (if (not (re-search-forward "^Message-ID: *<\\([^>\n]+\\)>" nil t))
-               (setq id "No-Message-ID-in-article")
-             (setq id (buffer-substring (match-beginning 1) (match-end 1))))
-           (write-region-as-coding-system
-            gnus-agent-file-coding-system
-            (point-min) (point-max)
-            (concat dir (number-to-string (caar pos))) nil 'silent)
-           (when (setq elem (assq (caar pos) gnus-agent-article-alist))
-             (setcdr elem t))
-           (gnus-agent-enter-history
-            id (or crosses (list (cons group (caar pos)))) date)
+           (unless (eobp)  ;; Don't save empty articles.
+             (when (search-forward "\n\n" nil t)
+               (when (search-backward "\nXrefs: " nil t)
+                 ;; Handle cross posting.
+                 (skip-chars-forward "^ ")
+                 (skip-chars-forward " ")
+                 (setq crosses nil)
+                 (while (looking-at "\\([^: \n]+\\):\\([0-9]+\\) +")
+                   (push (cons (buffer-substring (match-beginning 1)
+                                                 (match-end 1))
+                               (buffer-substring (match-beginning 2)
+                                                 (match-end 2)))
+                         crosses)
+                   (goto-char (match-end 0)))
+                 (gnus-agent-crosspost crosses (caar pos))))
+             (goto-char (point-min))
+             (if (not (re-search-forward
+                       "^Message-ID: *<\\([^>\n]+\\)>" nil t))
+                 (setq id "No-Message-ID-in-article")
+               (setq id (buffer-substring (match-beginning 1) (match-end 1))))
+             (write-region-as-coding-system
+              gnus-agent-file-coding-system (point-min) (point-max)
+              (concat dir (number-to-string (caar pos))) nil 'silent)
+             (when (setq elem (assq (caar pos) gnus-agent-article-alist))
+               (setcdr elem t))
+             (gnus-agent-enter-history
+              id (or crosses (list (cons group (caar pos)))) date))
            (widen)
            (pop pos)))
        (gnus-agent-save-alist group)))))
@@ -1036,13 +1068,14 @@ the actual number of articles toggled is returned."
           (setq articles (nthcdr i articles))))
     ;; add article with marks to list of article headers we want to fetch.
     (dolist (arts (gnus-info-marks (gnus-get-info group)))
-      (setq articles (gnus-range-add articles (cdr arts))))
+      (unless (memq (car arts) '(seen recent))
+       (setq articles (gnus-range-add articles (cdr arts)))))
     (setq articles (sort (gnus-uncompress-sequence articles) '<))
     ;; Remove known articles.
     (when (gnus-agent-load-alist group)
-      (setq articles (gnus-sorted-intersection
+      (setq articles (gnus-list-range-intersection
                      articles
-                     (gnus-uncompress-range
+                     (list
                       (cons (1+ (caar (last gnus-agent-article-alist)))
                             (cdr (gnus-active group)))))))
     ;; Fetch them.
@@ -1069,79 +1102,88 @@ the actual number of articles toggled is returned."
        articles))))
 
 (defsubst gnus-agent-copy-nov-line (article)
-  (let (b e)
+  (let (art b e)
     (set-buffer gnus-agent-overview-buffer)
-    (unless (eobp)
+    (while (and (not (eobp))
+               (< (setq art (read (current-buffer))) article))
+      (forward-line 1))
+    (beginning-of-line)
+    (if (or (eobp)
+           (not (eq article art)))
+       (set-buffer nntp-server-buffer)
       (setq b (point))
-      (if (eq article (read (current-buffer)))
-         (setq e (progn (forward-line 1) (point)))
-       (progn
-         (beginning-of-line)
-         (setq e b)))
+      (setq e (progn (forward-line 1) (point)))
       (set-buffer nntp-server-buffer)
       (insert-buffer-substring gnus-agent-overview-buffer b e))))
 
 (defun gnus-agent-braid-nov (group articles file)
-  (set-buffer gnus-agent-overview-buffer)
-  (goto-char (point-min))
-  (set-buffer nntp-server-buffer)
-  (erase-buffer)
-  (nnheader-insert-file-contents file)
-  (goto-char (point-max))
-  (if (or (= (point-min) (point-max))
-         (progn
-           (forward-line -1)
-           (< (read (current-buffer)) (car articles))))
-      ;; We have only headers that are after the older headers,
-      ;; so we just append them.
-      (progn
-       (goto-char (point-max))
-       (insert-buffer-substring gnus-agent-overview-buffer))
-    ;; We do it the hard way.
-    (nnheader-find-nov-line (car articles))
-    (gnus-agent-copy-nov-line (car articles))
-    (pop articles)
-    (while (and articles
-               (not (eobp)))
-      (while (and (not (eobp))
-                 (< (read (current-buffer)) (car articles)))
-       (forward-line 1))
-      (beginning-of-line)
-      (unless (eobp)
-       (gnus-agent-copy-nov-line (car articles))
-       (setq articles (cdr articles))))
+  (let (start last)
+    (set-buffer gnus-agent-overview-buffer)
+    (goto-char (point-min))
+    (set-buffer nntp-server-buffer)
+    (erase-buffer)
+    (nnheader-insert-file-contents file)
+    (goto-char (point-max))
+    (unless (or (= (point-min) (point-max))
+               (progn
+                 (forward-line -1)
+                 (< (setq last (read (current-buffer))) (car articles))))
+      ;; We do it the hard way.
+      (nnheader-find-nov-line (car articles))
+      (gnus-agent-copy-nov-line (pop articles))
+      (while (and articles
+                 (not (eobp)))
+       (while (and (not (eobp))
+                   (< (read (current-buffer)) (car articles)))
+         (forward-line 1))
+       (beginning-of-line)
+       (unless (eobp)
+         (gnus-agent-copy-nov-line (pop articles)))))
+    ;; Copy the rest lines
     (set-buffer nntp-server-buffer)
+    (goto-char (point-max))
     (when articles
-      (let (b e)
+      (when last
        (set-buffer gnus-agent-overview-buffer)
-       (setq b (point)
-             e (point-max))
        (while (and (not (eobp))
-                   (<= (read (current-buffer)) (car articles)))
-         (forward-line 1)
-         (setq b (point)))
-       (set-buffer nntp-server-buffer)
-       (insert-buffer-substring gnus-agent-overview-buffer b e)))))
+                   (<= (read (current-buffer)) last))
+         (forward-line 1))
+       (beginning-of-line)
+       (setq start (point))
+       (set-buffer nntp-server-buffer))
+      (insert-buffer-substring gnus-agent-overview-buffer start))))
 
 (defun gnus-agent-load-alist (group &optional dir)
   "Load the article-state alist for GROUP."
-  (setq gnus-agent-article-alist
-       (gnus-agent-read-file
-        (if dir
-            (expand-file-name ".agentview" dir)
-          (gnus-agent-article-name ".agentview" group)))))
+  (let ((file))
+    (setq gnus-agent-article-alist
+         (gnus-cache-file-contents
+          (if dir
+              (expand-file-name ".agentview" dir)
+            (gnus-agent-article-name ".agentview" group))
+          'gnus-agent-file-loading-cache
+          'gnus-agent-read-file))))
 
 (defun gnus-agent-save-alist (group &optional articles state dir)
   "Save the article-state alist for GROUP."
-  (let ((file-name-coding-system nnmail-pathname-coding-system)
-       (pathname-coding-system nnmail-pathname-coding-system)
-       print-level print-length item)
-    (dolist (art articles)
-      (if (setq item (memq art gnus-agent-article-alist))
-         (setcdr item state)
-       (push  (cons art state) gnus-agent-article-alist)))
-    (setq gnus-agent-article-alist
-         (sort gnus-agent-article-alist 'car-less-than-car))
+  (let* ((file-name-coding-system nnmail-pathname-coding-system)
+        (pathname-coding-system nnmail-pathname-coding-system)
+        (prev (cons nil gnus-agent-article-alist))
+        (all prev)
+        print-level print-length item article)
+    (while (setq article (pop articles))
+      (while (and (cdr prev)
+                 (< (caadr prev) article))
+       (setq prev (cdr prev)))
+      (cond
+       ((not (cdr prev))
+       (setcdr prev (list (cons article state))))
+       ((> (caadr prev) article)
+       (setcdr prev (cons (cons article state) (cdr prev))))
+       ((= (caadr prev) article)
+       (setcdr (cadr prev) state)))
+      (setq prev (cdr prev)))
+    (setq gnus-agent-article-alist (cdr all))
     (with-temp-file (if dir
                        (expand-file-name ".agentview" dir)
                      (gnus-agent-article-name ".agentview" group))
@@ -1187,12 +1229,12 @@ the actual number of articles toggled is returned."
                      (gnus-agent-fetch-group-1 group gnus-command-method))))))
          (error
           (unless (funcall gnus-agent-confirmation-function
-                           (format "Error (%s).  Continue? " err))
+                           (format "Error (%s).  Continue? " (cadr err)))
             (error "Cannot fetch articles into the Gnus agent")))
          (quit
           (unless (funcall gnus-agent-confirmation-function
                            (format "Quit fetching session (%s).  Continue? "
-                                   err))
+                                   (cadr err)))
             (signal 'quit "Cannot fetch articles into the Gnus agent"))))
        (pop methods))
       (run-hooks 'gnus-agent-fetch-hook)
@@ -1262,18 +1304,20 @@ the actual number of articles toggled is returned."
       (when arts
        (gnus-agent-fetch-articles group arts)))
     ;; Perhaps we have some additional articles to fetch.
-    (setq arts (assq 'download (gnus-info-marks
-                               (setq info (gnus-get-info group)))))
-    (when (cdr arts)
-      (gnus-message 8 "Agent is downloading marked articles...")
-      (gnus-agent-fetch-articles
-       group (gnus-uncompress-range (cdr arts)))
-      (setq marks (delq arts (gnus-info-marks info)))
-      (gnus-info-set-marks info marks)
-      (gnus-dribble-enter
-       (concat "(gnus-group-set-info '"
-              (gnus-prin1-to-string info)
-              ")")))))
+    (dolist (mark gnus-agent-download-marks)
+      (setq arts (assq mark (gnus-info-marks
+                            (setq info (gnus-get-info group)))))
+      (when (cdr arts)
+       (gnus-message 8 "Agent is downloading marked articles...")
+       (gnus-agent-fetch-articles
+        group (gnus-uncompress-range (cdr arts)))
+       (when (eq mark 'download)
+         (setq marks (delq arts (gnus-info-marks info)))
+         (gnus-info-set-marks info marks)
+         (gnus-dribble-enter
+          (concat "(gnus-group-set-info '"
+                  (gnus-prin1-to-string info)
+                  ")")))))))
 
 ;;;
 ;;; Agent Category Mode
@@ -1597,9 +1641,11 @@ The following commands are available:
 (defun gnus-get-predicate (predicate)
   "Return the predicate for CATEGORY."
   (or (cdr (assoc predicate gnus-category-predicate-cache))
-      (cdar (push (cons predicate
-                       (gnus-category-make-function predicate))
-                 gnus-category-predicate-cache))))
+      (let ((func (gnus-category-make-function predicate)))
+       (setq gnus-category-predicate-cache
+             (nconc gnus-category-predicate-cache
+                    (list (cons predicate func))))
+       func)))
 
 (defun gnus-group-category (group)
   "Return the category GROUP belongs to."
@@ -1834,15 +1880,15 @@ The following commands are available:
          (erase-buffer)
          (let ((nnheader-file-coding-system
                 gnus-agent-file-coding-system))
-           (nnheader-insert-file-contents file))
-         (goto-char (point-min))
+           (nnheader-insert-nov-file file (car articles)))
+         (nnheader-find-nov-line (car articles))
          (while (not (eobp))
            (when (looking-at "[0-9]")
              (push (read (current-buffer)) cached-articles))
            (forward-line 1))
-         (setq cached-articles (sort cached-articles '<))))
+         (setq cached-articles (nreverse cached-articles))))
       (if (setq uncached-articles
-               (gnus-set-difference articles cached-articles))
+               (gnus-sorted-difference articles cached-articles))
          (progn
            (set-buffer nntp-server-buffer)
            (erase-buffer)
@@ -1890,8 +1936,9 @@ The following commands are available:
                  (gnus-agent-directory)
                  (gnus-agent-group-path group) "/"
                  (number-to-string article)))
-       (buffer-read-only nil))
-    (when (file-exists-p file)
+        (buffer-read-only nil))
+    (when (and (file-exists-p file)
+              (> (nth 7 (file-attributes file)) 0))
       (erase-buffer)
       (gnus-kill-all-overlays)
       (insert-file-contents-as-coding-system gnus-cache-coding-system file)
index 272d68e..7ab2441 100644 (file)
@@ -278,6 +278,7 @@ asynchronously.      The compressed face will be piped to this command."
                           x-face-mule-gnus-article-display-x-face))
                     'function))))
   ;;:version "21.1"
+  :group 'gnus-picon
   :group 'gnus-article-washing)
 
 (defcustom gnus-article-x-face-too-ugly nil
@@ -316,7 +317,7 @@ directly.")
 
 (defcustom gnus-emphasis-alist
   (let ((format
-        "\\(\\s-\\|^\\|\\=\\|[-\"]\\|\\s(\\)\\(%s\\(\\w+\\(\\s-+\\w+\\)*[.,]?\\)%s\\)\\(\\([-,.;:\"]\\|\\s)\\)+\\s-\\|[?!.]\\s-\\|\\s)\\|\\s-\\)")
+        "\\(\\s-\\|^\\|\\=\\|[-\"]\\|\\s(\\)\\(%s\\(\\w+\\(\\s-+\\w+\\)*[.,]?\\)%s\\)\\(\\([-,.;:!?\"]\\|\\s)\\)+\\s-\\|[?!.]\\s-\\|\\s)\\|\\s-\\)")
        (types
         '(("\\*" "\\*" bold)
           ("_" "_" underline)
@@ -754,10 +755,13 @@ be controlled by `gnus-treat-body-boundary'."
                 string))
 
 (defcustom gnus-picon-databases '("/usr/lib/picon" "/usr/local/faces")
-  "*Defines the location of the faces database.
+  "Defines the location of the faces database.
 For information on obtaining this database of pretty pictures, please
 see http://www.cs.indiana.edu/picons/ftp/index.html"
-  :type 'directory
+  :type '(repeat directory)
+  :link '(url-link :tag "download" 
+                  "http://www.cs.indiana.edu/picons/ftp/index.html")
+  :link '(custom-manual "(gnus)Picons")
   :group 'gnus-picon)
 
 (defun gnus-picons-installed-p ()
@@ -816,28 +820,13 @@ used."
     ("toggle display" . gnus-article-press-button)
     ("toggle display" . gnus-article-view-part-as-charset)
     ("view as type" . gnus-mime-view-part-as-type)
-    ("internalize type" . gnus-mime-internalize-part)
-    ("externalize type" . gnus-mime-externalize-part))
+    ("view internally" . gnus-mime-view-part-internally)
+    ("view externally" . gnus-mime-view-part-externally))
   "An alist of actions that run on the MIME attachment."
   :group 'gnus-article-mime
   :type '(repeat (cons (string :tag "name")
                       (function))))
 
-(defcustom gnus-mime-action-alist
-  '(("save to file" . gnus-mime-save-part)
-    ("display as text" . gnus-mime-inline-part)
-    ("view the part" . gnus-mime-view-part)
-    ("pipe to command" . gnus-mime-pipe-part)
-    ("toggle display" . gnus-article-press-button)
-    ("view as type" . gnus-mime-view-part-as-type)
-    ("internalize type" . gnus-mime-internalize-part)
-    ("externalize type" . gnus-mime-externalize-part))
-  "An alist of actions that run on the MIME attachment."
-  :version "21.1"
-  :group 'gnus-article-mime
-  :type '(repeat (cons (string :tag "name")
-                      (function))))
-
 ;;;
 ;;; The treatment variables
 ;;;
@@ -908,6 +897,13 @@ See Info node `(gnus)Customizing Articles' for details."
   :group 'gnus-article-treat
   :type gnus-article-treat-custom)
 
+(defcustom gnus-treat-unsplit-urls nil
+  "Remove newlines from within URLs.
+Valid values are nil, t, `head', `last', an integer or a predicate.
+See Info node `(gnus)Customizing Articles' for details."
+  :group 'gnus-article-treat
+  :type gnus-article-treat-custom)
+
 (defcustom gnus-treat-leading-whitespace nil
   "Remove leading whitespace in headers.
 Valid values are nil, t, `head', `last', an integer or a predicate.
@@ -1113,7 +1109,8 @@ See Info node `(gnus)Customizing Articles' for details."
 (put 'gnus-treat-overstrike 'highlight t)
 
 (defcustom gnus-treat-display-xface
-  (and (or (and (fboundp 'image-type-available-p)
+  (and (not noninteractive)
+       (or (and (fboundp 'image-type-available-p)
                (image-type-available-p 'xbm)
                (string-match "^0x" (shell-command-to-string "uncompface")))
           (and (featurep 'xemacs)
@@ -1135,7 +1132,7 @@ See Info node `(gnus)Customizing Articles' and Info node
           (gnus-image-type-available-p 'xpm)
           (gnus-image-type-available-p 'pbm)))
   "If non-nil, gnus uses `smiley-mule' for displaying smileys rather than
-`smiley-ems'.  It defaults to t when Emacs 20 or earlier is running.
+`smiley'.  It defaults to t when Emacs 20 or earlier is running.
 `smiley-mule' is boundled in BITMAP-MULE package.  You can set it to t
 even if you are using Emacs 21+.  It has no effect on XEmacs."
   :group 'gnus-article-various
@@ -1153,7 +1150,21 @@ even if you are using Emacs 21+.  It has no effect on XEmacs."
 
 (defvar gnus-article-smiley-mule-loaded-p nil
   "Internal variable used to say whether `smiley-mule' is loaded (whether
-smiley functions are not overridden by `smiley-ems').")
+smiley functions are not overridden by `smiley').")
+
+(defcustom gnus-treat-display-grey-xface
+  (and (not noninteractive)
+       (or (featurep 'xemacs)
+          (and (fboundp 'display-images-p)
+               (display-images-p)))
+       (string-match "^0x" (shell-command-to-string "uncompface"))
+       t)
+  "Display grey X-Face headers.
+Valid values are nil, t."
+  :group 'gnus-article-treat
+  :version "21.3"
+  :type 'boolean)
+(put 'gnus-treat-display-grey-xface 'highlight t)
 
 (defcustom gnus-treat-display-smileys
   (if (or (and (featurep 'xemacs)
@@ -1183,6 +1194,9 @@ Valid values are nil, t, `head', `last', an integer or a predicate.
 See Info node `(gnus)Customizing Articles' and Info node
 `(gnus)Picons' for details."
   :group 'gnus-article-treat
+  :group 'gnus-picon
+  :link '(info-link "(gnus)Customizing Articles")
+  :link '(info-link "(gnus)Picons")
   :type gnus-article-treat-head-custom)
 (put 'gnus-treat-from-picon 'highlight t)
 
@@ -1195,6 +1209,9 @@ Valid values are nil, t, `head', `last', an integer or a predicate.
 See Info node `(gnus)Customizing Articles' and Info node
 `(gnus)Picons' for details."
   :group 'gnus-article-treat
+  :group 'gnus-picon
+  :link '(info-link "(gnus)Customizing Articles")
+  :link '(info-link "(gnus)Picons")
   :type gnus-article-treat-head-custom)
 (put 'gnus-treat-mail-picon 'highlight t)
 
@@ -1207,6 +1224,9 @@ Valid values are nil, t, `head', `last', an integer or a predicate.
 See Info node `(gnus)Customizing Articles' and Info node
 `(gnus)Picons' for details."
   :group 'gnus-article-treat
+  :group 'gnus-picon
+  :link '(info-link "(gnus)Customizing Articles")
+  :link '(info-link "(gnus)Picons")
   :type gnus-article-treat-head-custom)
 (put 'gnus-treat-newsgroups-picon 'highlight t)
 
@@ -1272,6 +1292,14 @@ See Info node `(gnus)Customizing Articles' for details."
   :group 'mime-security
   :type gnus-article-treat-custom)
 
+(defcustom gnus-treat-monafy nil
+  "Display body part with mona font.
+Valid values are nil, t, `head', `last', an integer or a predicate.
+See Info node `(gnus)Customizing Articles' for details."
+  :group 'gnus-article-treat
+  :group 'mime-security
+  :type gnus-article-treat-custom)
+
 (defvar gnus-article-encrypt-protocol-alist
   '(("PGP" . mml2015-self-encrypt)))
 
@@ -1283,6 +1311,9 @@ It is a string, such as \"PGP\". If nil, ask user."
   :type 'string
   :group 'mime-security)
 
+(defvar gnus-article-wash-function nil
+  "Function used for converting HTML into text.")
+
 ;;; Internal variables
 
 (defvar gnus-english-month-names
@@ -1299,12 +1330,14 @@ It is a string, such as \"PGP\". If nil, ask user."
   '((gnus-treat-decode-article-as-default-mime-charset
      gnus-article-decode-article-as-default-mime-charset)
     (gnus-treat-x-pgp-sig gnus-article-verify-x-pgp-sig)
+    (gnus-treat-monafy gnus-article-monafy)
     (gnus-treat-strip-banner gnus-article-strip-banner)
     (gnus-treat-strip-headers-in-body gnus-article-strip-headers-in-body)
     (gnus-treat-buttonize gnus-article-add-buttons)
     (gnus-treat-fill-article gnus-article-fill-cited-article)
     (gnus-treat-fill-long-lines gnus-article-fill-long-lines)
     (gnus-treat-strip-cr gnus-article-remove-cr)
+    (gnus-treat-unsplit-urls gnus-article-unsplit-urls)
     (gnus-treat-date-ut gnus-article-date-ut)
     (gnus-treat-date-local gnus-article-date-local)
     (gnus-treat-date-english gnus-article-date-english)
@@ -1315,8 +1348,6 @@ It is a string, such as \"PGP\". If nil, ask user."
     (gnus-treat-hide-headers gnus-article-maybe-hide-headers)
     (gnus-treat-hide-boring-headers gnus-article-hide-boring-headers)
     (gnus-treat-hide-signature gnus-article-hide-signature)
-    (gnus-treat-hide-citation gnus-article-hide-citation)
-    (gnus-treat-hide-citation-maybe gnus-article-hide-citation-maybe)
     (gnus-treat-strip-list-identifiers gnus-article-hide-list-identifiers)
     (gnus-treat-leading-whitespace gnus-article-remove-leading-whitespace)
     (gnus-treat-strip-pgp gnus-article-hide-pgp)
@@ -1325,7 +1356,6 @@ It is a string, such as \"PGP\". If nil, ask user."
     (gnus-treat-mail-picon gnus-treat-mail-picon)
     (gnus-treat-newsgroups-picon gnus-treat-newsgroups-picon)
     (gnus-treat-highlight-headers gnus-article-highlight-headers)
-    (gnus-treat-highlight-citation gnus-article-highlight-citation)
     (gnus-treat-highlight-signature gnus-article-highlight-signature)
     (gnus-treat-strip-trailing-blank-lines
      gnus-article-remove-trailing-blank-lines)
@@ -1344,6 +1374,9 @@ It is a string, such as \"PGP\". If nil, ask user."
     (gnus-treat-display-smileys gnus-treat-smiley)
     (gnus-treat-capitalize-sentences gnus-article-capitalize-sentences)
     (gnus-treat-emphasize gnus-article-emphasize)
+    (gnus-treat-hide-citation gnus-article-hide-citation)
+    (gnus-treat-hide-citation-maybe gnus-article-hide-citation-maybe)
+    (gnus-treat-highlight-citation gnus-article-highlight-citation)
     (gnus-treat-body-boundary gnus-article-treat-body-boundary)
     (gnus-treat-play-sounds gnus-earcon-display)))
 
@@ -1865,11 +1898,11 @@ unfolded."
            (with-temp-buffer
              (insert header)
              (goto-char (point-min))
-             (while (re-search-forward "[\t ]*\n[\t ]+" nil t)
+             (while (re-search-forward "\n[\t ]" nil t)
                (replace-match " " t t)))
            (setq length (- (point-max) (point-min) 1)))
          (when (< length (window-width))
-           (while (re-search-forward "[\t ]*\n[\t ]+" nil t)
+           (while (re-search-forward "\n[\t ]" nil t)
              (replace-match " " t t)))
          (goto-char (point-max)))))))
 
@@ -1884,13 +1917,13 @@ unfolded."
        (goto-char (point-max))))))
 
 (defun gnus-treat-smiley ()
-  "Display textual emoticons (\"smileys\") as small graphical icons."
+  "Toggle display of textual emoticons (\"smileys\") as small graphical icons."
   (interactive)
   (unless (featurep 'xemacs)
     (when (and (>= emacs-major-version 21)
               (not gnus-article-should-use-smiley-mule)
               gnus-article-smiley-mule-loaded-p)
-      (load "smiley-ems" nil t)
+      (load "smiley" nil t)
       (setq gnus-article-smiley-mule-loaded-p nil))
     (when (and gnus-article-should-use-smiley-mule
               (not gnus-article-smiley-mule-loaded-p))
@@ -1941,7 +1974,8 @@ unfolded."
                  (while (>= (1- (window-width)) (length str))
                    (setq str (concat str gnus-body-boundary-delimiter)))
                  (substring str 0 (1- (window-width))))
-               "\n")))))
+               "\n")
+       (gnus-add-text-properties start (point) '(gnus-decoration 'header))))))
 
 (defun article-fill-long-lines ()
   "Fill lines that are wider than the window width."
@@ -2028,10 +2062,24 @@ unfolded."
              (set-buffer gnus-original-article-buffer))
            (save-restriction
              (mail-narrow-to-head)
-             (while (gnus-article-goto-header "x-face\\(-[0-9]+\\)?")
-               (when (match-beginning 2)
-                 (setq grey t))
-               (push (mail-header-field-value) x-faces))
+             (if gnus-treat-display-grey-xface
+                 (progn
+                   (while (gnus-article-goto-header "X-Face\\(-[0-9]+\\)?")
+                     (if (match-beginning 2)
+                         (progn
+                           (setq grey t)
+                           (push (cons (- (string-to-number (match-string 2)))
+                                       (mail-header-field-value))
+                                 x-faces))
+                       (push (cons 0 (mail-header-field-value)) x-faces)))
+                   (dolist (x-face (prog1
+                                       (if grey
+                                           (sort x-faces 'car-less-than-car)
+                                         (nreverse x-faces))
+                                     (setq x-faces nil)))
+                     (push (cdr x-face) x-faces)))
+               (while (gnus-article-goto-header "X-Face")
+                 (push (mail-header-field-value) x-faces)))
              (setq from (message-fetch-field "from"))))
          (if grey
              (let ((xpm (gnus-convert-gray-x-face-to-xpm x-faces))
@@ -2241,6 +2289,16 @@ If READ-CHARSET, ask for a coding system."
     (let ((buffer-read-only nil))
       (rfc1843-decode-region (point-min) (point-max)))))
 
+(defun article-unsplit-urls ()
+  "Remove the newlines that some other mailers insert into URLs."
+  (interactive)
+  (save-excursion
+    (let ((buffer-read-only nil))
+      (goto-char (point-min))
+      (while (re-search-forward
+             "^\\(\\(https?\\|ftp\\)://\\S-+\\) *\n\\(\\S-+\\)" nil t)
+       (replace-match "\\1\\3" t)))))
+
 (defun article-wash-html (&optional read-charset)
   "Format an html article.
 If READ-CHARSET, ask for a coding system."
@@ -2266,14 +2324,43 @@ If READ-CHARSET, ask for a coding system."
       (save-window-excursion
        (save-restriction
          (narrow-to-region (point) (point-max))
-         (mm-setup-w3)
-         (let ((w3-strict-width (window-width))
-               (url-standalone-mode t)
-               (w3-honor-stylesheets nil)
-               (w3-delay-image-loads t))
-           (condition-case var
-               (w3-region (point-min) (point-max))
-             (error))))))))
+         (let* ((func (or gnus-article-wash-function mm-text-html-renderer))
+                (entry (assq func mm-text-html-washer-alist)))
+           (if entry
+               (setq func (cdr entry)))
+           (cond
+            ((gnus-functionp func)
+             (funcall func))
+            (t
+             (apply (car func) (cdr func))))))))))
+
+(defun gnus-article-wash-html-with-w3 ()
+  "Wash the current buffer with w3."
+  (mm-setup-w3)
+  (let ((w3-strict-width (window-width))
+       (url-standalone-mode t)
+       (url-gateway-unplugged t)
+       (w3-honor-stylesheets nil))
+    (condition-case ()
+       (w3-region (point-min) (point-max))
+      (error))))
+
+(defun gnus-article-wash-html-with-w3m ()
+  "Wash the current buffer with emacs-w3m."
+  (mm-setup-w3m)
+  (save-restriction
+    (narrow-to-region (point) (point-max))
+    (let ((w3m-safe-url-regexp (if mm-inline-text-html-with-images
+                                  nil
+                                "\\`cid:"))
+         (w3m-display-inline-images mm-inline-text-html-with-images)
+         w3m-force-redisplay)
+      (w3m-region (point-min) (point-max)))
+    (when mm-inline-text-html-with-w3m-keymap
+      (add-text-properties
+       (point-min) (point-max)
+       (append '(mm-inline-text-html-with-w3m t)
+              (gnus-local-map-property mm-w3m-mode-map))))))
 
 (defun article-hide-list-identifiers ()
   "Remove list identifies from the Subject header.
@@ -3287,7 +3374,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
                   mml2015-use
                   (mml2015-clear-verify-function))
          (with-temp-buffer
-           (insert-buffer gnus-original-article-buffer)
+           (insert-buffer-substring gnus-original-article-buffer)
            (setq items (split-string sig))
            (message-narrow-to-head)
            (let ((inhibit-point-motion-hooks t)
@@ -3355,6 +3442,21 @@ If variable `gnus-use-long-file-name' is non-nil, it is
   (if (gnus-buffer-live-p gnus-original-article-buffer)
       (canlock-verify gnus-original-article-buffer)))
 
+(defun article-monafy ()
+  "Display body part with mona font."
+  (interactive)
+  (unless (if (featurep 'xemacs)
+             (find-face 'gnus-mona-face)
+           (facep 'gnus-mona-face))
+    (require 'navi2ch-mona)
+    (set-face-font (make-face 'gnus-mona-face) navi2ch-mona-font))
+  (save-excursion
+    (let ((buffer-read-only nil))
+      (article-goto-body)
+      (gnus-overlay-put
+       (gnus-make-overlay (point) (point-max))
+       'face 'gnus-mona-face))))
+
 (eval-and-compile
   (mapcar
    (lambda (func)
@@ -3377,6 +3479,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
    '(article-hide-headers
      article-verify-x-pgp-sig
      article-verify-cancel-lock
+     article-monafy
      article-hide-boring-headers
      article-toggle-headers
      article-treat-overstrike
@@ -3389,6 +3492,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
      article-de-base64-unreadable
      article-decode-HZ
      article-wash-html
+     article-unsplit-urls
      article-hide-list-identifiers
      article-hide-pgp
      article-strip-banner
@@ -3493,6 +3597,8 @@ If variable `gnus-use-long-file-name' is non-nil, it is
        ["Treat overstrike" gnus-article-treat-overstrike t]
        ["Remove carriage return" gnus-article-remove-cr t]
        ["Remove leading whitespace" gnus-article-remove-leading-whitespace t]
+       ["Treat html" gnus-article-wash-html t]
+       ["Remove newlines from within URLs" gnus-article-unsplit-urls t]
        ["Decode HZ" gnus-article-decode-HZ t]))
 
     ;; Note "Commands" menu is defined in gnus-sum.el for consistency
@@ -3569,7 +3675,7 @@ commands:
     ;; Init original article buffer.
     (save-excursion
       (set-buffer (gnus-get-buffer-create gnus-original-article-buffer))
-      (set-buffer-multibyte nil)
+      (set-buffer-multibyte t)
       (setq major-mode 'gnus-original-article-mode)
       (make-local-variable 'gnus-original-article))
     (if (get-buffer name)
@@ -3628,9 +3734,7 @@ commands:
   (set-buffer gnus-article-buffer)
   (let (buffer-read-only)
     (erase-buffer)
-    (set-buffer-multibyte nil)
-    (insert-buffer-substring gnus-original-article-buffer)
-    (set-buffer-multibyte t)))
+    (insert-buffer-substring gnus-original-article-buffer)))
 
 (defun gnus-article-make-full-mail-header (&optional number charset)
   "Create a new mail header structure in a raw article buffer."
@@ -3769,6 +3873,8 @@ If ALL-HEADERS is non-nil, no headers are hidden."
                   gnus-article-mime-handle-alist))
              (gnus-set-mode-line 'article))
            (article-goto-body)
+           (unless (bobp)
+             (forward-line -1))
            (set-window-point (get-buffer-window (current-buffer)) (point))
            (gnus-configure-windows 'article)
            t))))))
@@ -3938,8 +4044,8 @@ General format specifiers can also be used.  See
     (gnus-mime-save-part-and-strip "\C-o" "Save and Strip")
     (gnus-mime-copy-part "c" "View As Text, In Other Buffer")
     (gnus-mime-inline-part "i" "View As Text, In This Buffer")
-    (gnus-mime-internalize-part "E" "View Internally")
-    (gnus-mime-externalize-part "e" "View Externally")
+    (gnus-mime-view-part-internally "E" "View Internally")
+    (gnus-mime-view-part-externally "e" "View Externally")
     (gnus-mime-print-part "p" "Print")
     (gnus-mime-pipe-part "|" "Pipe To Command...")
     (gnus-mime-action-on-part "." "Take action on the part")))
@@ -4150,13 +4256,13 @@ General format specifiers can also be used.  See
        (setq buffer-file-name nil))
       (goto-char (point-min)))))
 
-(defun gnus-mime-print-part (&optional handle)
+(defun gnus-mime-print-part (&optional handle filename)
   "Print the MIME part under point."
-  (interactive)
+  (interactive (list nil (ps-print-preprint current-prefix-arg)))
   (gnus-article-check-buffer)
   (let* ((handle (or handle (get-text-property (point) 'gnus-data)))
         (contents (and handle (mm-get-part handle)))
-        (file (make-temp-name (expand-file-name "mm." mm-tmp-directory)))
+        (file (mm-make-temp-file (expand-file-name "mm." mm-tmp-directory)))
         (printer (mailcap-mime-info (mm-handle-type handle) "print")))
     (when contents
        (if printer
@@ -4173,7 +4279,8 @@ General format specifiers can also be used.  See
              (delete-file file))
          (with-temp-buffer
            (insert contents)
-           (gnus-print-buffer))))))
+           (gnus-print-buffer))
+         (ps-despool filename)))))
 
 (defun gnus-mime-inline-part (&optional handle arg)
   "Insert the MIME part under point into the current buffer."
@@ -4228,7 +4335,7 @@ specified charset."
            (gnus-newsgroup-ignored-charsets 'gnus-all))
        (gnus-article-press-button)))))
 
-(defun gnus-mime-externalize-part (&optional handle)
+(defun gnus-mime-view-part-externally (&optional handle)
   "View the MIME part under point with an external viewer."
   (interactive)
   (gnus-article-check-buffer)
@@ -4244,7 +4351,7 @@ specified charset."
          (mm-remove-part handle)
        (mm-display-part handle)))))
 
-(defun gnus-mime-internalize-part (&optional handle)
+(defun gnus-mime-view-part-internally (&optional handle)
   "View the MIME part under point with an internal viewer.
 If no internal viewer is available, use an external viewer."
   (interactive)
@@ -4304,10 +4411,10 @@ If no internal viewer is available, use an external viewer."
   (interactive "p")
   (gnus-article-part-wrapper n 'gnus-mime-view-part-as-charset))
 
-(defun gnus-article-externalize-part (n)
+(defun gnus-article-view-part-externally (n)
   "View MIME part N externally, which is the numerical prefix."
   (interactive "p")
-  (gnus-article-part-wrapper n 'gnus-mime-externalize-part))
+  (gnus-article-part-wrapper n 'gnus-mime-view-part-externally))
 
 (defun gnus-article-inline-part (n)
   "Inline MIME part N, which is the numerical prefix."
@@ -4365,8 +4472,11 @@ If no internal viewer is available, use an external viewer."
        (let ((window (selected-window))
              (mail-parse-charset gnus-newsgroup-charset)
              (mail-parse-ignored-charsets
-              (save-excursion (set-buffer gnus-summary-buffer)
-                              gnus-newsgroup-ignored-charsets)))
+              (if (gnus-buffer-live-p gnus-summary-buffer)
+                  (save-excursion
+                    (set-buffer gnus-summary-buffer)
+                    gnus-newsgroup-ignored-charsets)
+                nil)))
          (save-excursion
            (unwind-protect
                (let ((win (gnus-get-buffer-window (current-buffer) t))
@@ -4482,7 +4592,9 @@ If no internal viewer is available, use an external viewer."
          ;; We have to do this since selecting the window
          ;; may change the point.  So we set the window point.
          (set-window-point window point)))
-      (let* ((handles (or ihandles (mm-dissect-buffer) (mm-uu-dissect)))
+      (let* ((handles (or ihandles (mm-dissect-buffer
+                                   nil gnus-article-loose-mime)
+                         (mm-uu-dissect)))
             buffer-read-only handle name type b e display)
        (when (and (not ihandles)
                   (not gnus-displaying-mime))
@@ -5140,9 +5252,9 @@ The text in the region will be yanked.  If the region isn't active,
 the entire article will be yanked."
   (interactive "P")
   (let ((article (cdr gnus-article-current)) cont)
-    (if (not (mark))
+    (if (not (mark t))
        (gnus-summary-reply (list (list article)) wide)
-      (setq cont (buffer-substring (point) (mark)))
+      (setq cont (buffer-substring (point) (mark t)))
       ;; Deactivate active regions.
       (when (and (boundp 'transient-mark-mode)
                 transient-mark-mode)
@@ -5157,9 +5269,9 @@ the entire article will be yanked."
   (interactive)
   (let ((article (cdr gnus-article-current))
        cont)
-    (if (not (gnus-region-active-p))
+    (if (not (mark t))
        (gnus-summary-followup (list (list article)))
-      (setq cont (buffer-substring (point) (mark)))
+      (setq cont (buffer-substring (point) (mark t)))
       ;; Deactivate active regions.
       (when (and (boundp 'transient-mark-mode)
                 transient-mark-mode)
@@ -5195,10 +5307,8 @@ If given a prefix, show the hidden text instead."
   (autoload 'nneething-get-file-name "nneething"))
 
 (defun gnus-request-article-this-buffer (article group)
-  "Get an article and insert it into this buffer.
-T-gnus change: Insert an article into `gnus-original-article-buffer'."
+  "Get an article and insert it into this buffer."
   (let (do-update-line sparse-header)
-    ;; The current buffer is `gnus-article-buffer'.
     (prog1
        (save-excursion
          (erase-buffer)
@@ -5251,16 +5361,6 @@ T-gnus change: Insert an article into `gnus-original-article-buffer'."
                                 (file-directory-p dir))
                        (setq article 'nneething)
                        (gnus-group-enter-directory dir))))))))
-         (setq gnus-original-article (cons group article))
-
-         ;; The current buffer is `gnus-original-article-buffer'.
-         (if (get-buffer gnus-original-article-buffer)
-             (set-buffer gnus-original-article-buffer)
-           (set-buffer (gnus-get-buffer-create gnus-original-article-buffer))
-           (set-buffer-multibyte nil)
-           (buffer-disable-undo)
-           (setq major-mode 'gnus-original-article-mode)
-           (setq buffer-read-only nil))
 
          (cond
           ;; Refuse to select canceled articles.
@@ -5273,6 +5373,15 @@ T-gnus change: Insert an article into `gnus-original-article-buffer'."
                            (assq article gnus-newsgroup-reads)))
                     gnus-canceled-mark))
            nil)
+          ;; We first check `gnus-original-article-buffer'.
+          ((and (get-buffer gnus-original-article-buffer)
+                (numberp article)
+                (save-excursion
+                  (set-buffer gnus-original-article-buffer)
+                  (and (equal (car gnus-original-article) group)
+                       (eq (cdr gnus-original-article) article))))
+           (insert-buffer-substring gnus-original-article-buffer)
+           'article)
           ;; Check the backlog.
           ((and gnus-keep-backlog
                 (gnus-backlog-request-article group article (current-buffer)))
@@ -5336,19 +5445,27 @@ T-gnus change: Insert an article into `gnus-original-article-buffer'."
       ;; Associate this article with the current summary buffer.
       (setq gnus-article-current-summary gnus-summary-buffer)
 
-      ;; Copy the requested article from `gnus-original-article-buffer'.
-      (unless (equal (buffer-name (current-buffer))
-                    (buffer-name (get-buffer gnus-original-article-buffer)))
-       ;; There may be the same article if the current buffer is
-       ;; `nntp-server-buffer' (e.g. a case that the command
-       ;; `gnus-cache-enter-article' is invoked), it should be erased.
-       (erase-buffer)
-       (insert-buffer gnus-original-article-buffer))
+      ;; Take the article from the original article buffer
+      ;; and place it in the buffer it's supposed to be in.
+      (when (and (get-buffer gnus-article-buffer)
+                (equal (buffer-name (current-buffer))
+                       (buffer-name (get-buffer gnus-article-buffer))))
+       (save-excursion
+         (if (get-buffer gnus-original-article-buffer)
+             (set-buffer gnus-original-article-buffer)
+           (set-buffer (gnus-get-buffer-create gnus-original-article-buffer))
+           (buffer-disable-undo)
+           (setq major-mode 'gnus-original-article-mode)
+           (setq buffer-read-only t))
+         (let (buffer-read-only)
+           (erase-buffer)
+           (insert-buffer-substring gnus-article-buffer))
+         (setq gnus-original-article (cons group article)))
 
-      ;; Decode charsets.
-      (run-hooks 'gnus-article-decode-hook)
-      ;; Mark article as decoded or not.
-      (setq gnus-article-decoded-p gnus-article-decode-hook)
+       ;; Decode charsets.
+       (run-hooks 'gnus-article-decode-hook)
+       ;; Mark article as decoded or not.
+       (setq gnus-article-decoded-p gnus-article-decode-hook))
 
       ;; Update sparse articles.
       (when (and do-update-line
@@ -5383,17 +5500,67 @@ T-gnus change: Insert an article into `gnus-original-article-buffer'."
 
 ;; Should we be using derived.el for this?
 (unless gnus-article-edit-mode-map
-  (setq gnus-article-edit-mode-map (make-sparse-keymap))
+  (setq gnus-article-edit-mode-map (make-keymap))
   (set-keymap-parent gnus-article-edit-mode-map text-mode-map)
 
   (gnus-define-keys gnus-article-edit-mode-map
+    "\C-c?"    describe-mode
     "\C-c\C-c" gnus-article-edit-done
-    "\C-c\C-k" gnus-article-edit-exit)
+    "\C-c\C-k" gnus-article-edit-exit
+    "\C-c\C-f\C-t" message-goto-to
+    "\C-c\C-f\C-o" message-goto-from
+    "\C-c\C-f\C-b" message-goto-bcc
+    ;;"\C-c\C-f\C-w" message-goto-fcc
+    "\C-c\C-f\C-c" message-goto-cc
+    "\C-c\C-f\C-s" message-goto-subject
+    "\C-c\C-f\C-r" message-goto-reply-to
+    "\C-c\C-f\C-n" message-goto-newsgroups
+    "\C-c\C-f\C-d" message-goto-distribution
+    "\C-c\C-f\C-f" message-goto-followup-to
+    "\C-c\C-f\C-m" message-goto-mail-followup-to
+    "\C-c\C-f\C-k" message-goto-keywords
+    "\C-c\C-f\C-u" message-goto-summary
+    "\C-c\C-f\C-i" message-insert-or-toggle-importance
+    "\C-c\C-f\C-a" message-gen-unsubscribed-mft
+    "\C-c\C-b" message-goto-body
+    "\C-c\C-i" message-goto-signature
+
+    "\C-c\C-t" message-insert-to
+    "\C-c\C-n" message-insert-newsgroups
+    "\C-c\C-o" message-sort-headers
+    "\C-c\C-e" message-elide-region
+    "\C-c\C-v" message-delete-not-region
+    "\C-c\C-z" message-kill-to-signature
+    "\M-\r" message-newline-and-reformat
+    "\C-c\C-a" mml-attach-file
+    "\C-a" message-beginning-of-line
+    "\t" message-tab
+    "\M-;" comment-region)
 
   (gnus-define-keys (gnus-article-edit-wash-map
                     "\C-c\C-w" gnus-article-edit-mode-map)
     "f" gnus-article-edit-full-stops))
 
+(easy-menu-define
+  gnus-article-edit-mode-field-menu gnus-article-edit-mode-map ""
+  '("Field"
+    ["Fetch To" message-insert-to t]
+    ["Fetch Newsgroups" message-insert-newsgroups t]
+    "----"
+    ["To" message-goto-to t]
+    ["From" message-goto-from t]
+    ["Subject" message-goto-subject t]
+    ["Cc" message-goto-cc t]
+    ["Reply-To" message-goto-reply-to t]
+    ["Summary" message-goto-summary t]
+    ["Keywords" message-goto-keywords t]
+    ["Newsgroups" message-goto-newsgroups t]
+    ["Followup-To" message-goto-followup-to t]
+    ["Mail-Followup-To" message-goto-mail-followup-to t]
+    ["Distribution" message-goto-distribution t]
+    ["Body" message-goto-body t]
+    ["Signature" message-goto-signature t]))
+
 (define-derived-mode gnus-article-edit-mode text-mode "Article Edit"
   "Major mode for editing articles.
 This is an extended text-mode.
@@ -5403,6 +5570,8 @@ This is an extended text-mode.
   (make-local-variable 'gnus-prev-winconf)
   (set (make-local-variable 'font-lock-defaults)
        '(message-font-lock-keywords t))
+  (set (make-local-variable 'mail-header-separator) "")
+  (easy-menu-add message-mode-field-menu message-mode-map)
   (setq buffer-read-only nil)
   (buffer-enable-undo)
   (widen))
@@ -5444,39 +5613,31 @@ groups."
   (interactive "P")
   (let ((func gnus-article-edit-done-function)
        (buf (current-buffer))
-       (start (window-start)))
+       (start (window-start))
+       (p (point))
+       (winconf gnus-prev-winconf))
     (remove-hook 'gnus-article-mode-hook
                 'gnus-article-mime-edit-article-unwind)
-    ;; We remove all text props from the article buffer.
-    (let ((content
-          (buffer-substring-no-properties (point-min) (point-max)))
-         (p (point)))
-      (erase-buffer)
-      (insert content)
-      (let ((winconf gnus-prev-winconf))
-       (gnus-article-mode)
-       (set-window-configuration winconf)
-       ;; Tippy-toe some to make sure that point remains where it was.
-       (save-current-buffer
-         (set-buffer buf)
-         (set-window-start (get-buffer-window (current-buffer)) start)
-         (goto-char p))))
+    (widen) ;; Widen it in case that users narrowed the buffer.
+    (funcall func arg)
+    (set-buffer buf)
+    ;; The cache and backlog have to be flushed somewhat.
+    (when gnus-keep-backlog
+      (gnus-backlog-remove-article
+       (car gnus-article-current) (cdr gnus-article-current)))
+    ;; Flush original article as well.
     (save-excursion
-      (set-buffer buf)
-      (let ((buffer-read-only nil))
-       (funcall func arg))
-      ;; The cache and backlog have to be flushed somewhat.
-      (when gnus-keep-backlog
-       (gnus-backlog-remove-article
-        (car gnus-article-current) (cdr gnus-article-current)))
-      ;; Flush original article as well.
-      (save-excursion
-       (when (get-buffer gnus-original-article-buffer)
-         (set-buffer gnus-original-article-buffer)
-         (setq gnus-original-article nil)))
-      (when gnus-use-cache
-       (gnus-cache-update-article
-        (car gnus-article-current) (cdr gnus-article-current))))
+      (when (get-buffer gnus-original-article-buffer)
+       (set-buffer gnus-original-article-buffer)
+       (setq gnus-original-article nil)))
+    (when gnus-use-cache
+      (gnus-cache-update-article
+       (car gnus-article-current) (cdr gnus-article-current)))
+    ;; We remove all text props from the article buffer.
+    (kill-all-local-variables)
+    (gnus-set-text-properties (point-min) (point-max) nil)
+    (gnus-article-mode)
+    (set-window-configuration winconf)
     (set-buffer buf)
     (set-window-start (get-buffer-window buf) start)
     (set-window-point (get-buffer-window buf) (point))))
@@ -5491,7 +5652,7 @@ groups."
          (window-start (window-start)))
       (erase-buffer)
       (if (gnus-buffer-live-p gnus-original-article-buffer)
-         (insert-buffer gnus-original-article-buffer))
+         (insert-buffer-substring gnus-original-article-buffer))
       (let ((winconf gnus-prev-winconf))
        (gnus-article-mode)
        (set-window-configuration winconf)
@@ -5561,7 +5722,7 @@ after replacing with the original article."
                             'gnus-article-mime-edit-exit
                             gnus-article-edit-mode-map)
   (erase-buffer)
-  (insert-buffer gnus-original-article-buffer)
+  (insert-buffer-substring gnus-original-article-buffer)
   (let ((ofn (symbol-function 'mime-edit-decode-single-part-in-buffer)))
     (fset 'mime-edit-decode-single-part-in-buffer
          (lambda (&rest args)
@@ -5652,7 +5813,7 @@ after replacing with the original article."
     ;; This is how URLs _should_ be embedded in text...
     ("<URL: *\\([^<>]*\\)>" 1 t gnus-button-embedded-url 1)
     ;; Raw URLs.
-    (,gnus-button-url-regexp 0 t browse-url 0))
+    (gnus-button-url-regexp 0 t browse-url 0))
   "*Alist of regexps matching buttons in article bodies.
 
 Each entry has the form (REGEXP BUTTON FORM CALLBACK PAR...), where
@@ -5666,7 +5827,7 @@ PAR: is a number of a regexp grouping whose text will be passed to CALLBACK.
 CALLBACK can also be a variable, in that case the value of that
 variable it the real callback function."
   :group 'gnus-article-buttons
-  :type '(repeat (list regexp
+  :type '(repeat (list (choice regexp variable)
                       (integer :tag "Button")
                       (sexp :tag "Form")
                       (function :tag "Callback")
@@ -5894,7 +6055,7 @@ specified by `gnus-button-alist'."
       (article-goto-body)
       (setq beg (point))
       (while (setq entry (pop alist))
-       (setq regexp (car entry))
+       (setq regexp (eval (car entry)))
        (goto-char beg)
        (while (re-search-forward regexp nil t)
          (let* ((start (and entry (match-beginning (nth 1 entry))))
@@ -6003,7 +6164,7 @@ specified by `gnus-button-alist'."
        (entry nil))
     (while alist
       (setq entry (pop alist))
-      (if (looking-at (car entry))
+      (if (looking-at (eval (car entry)))
          (setq alist nil)
        (setq entry nil)))
     entry))
index d8d6960..35dd546 100644 (file)
                     ,field-body ,field-name))
        ,field-body))
 
+(defvar gnus-bbdb/extract-message-sender-function
+  'gnus-bbdb/extract-message-sender)
+
+(defun gnus-bbdb/extract-message-sender ()
+  (let ((from (mime-entity-fetch-field gnus-current-headers "from"))
+       to)
+    (when from
+      (setq from (gnus-bbdb/extract-address-components
+                 (gnus-bbdb/decode-field-body from 'From)))
+      (if (and (car (cdr from))
+              (string-match (bbdb-user-mail-names) (car (cdr from)))
+              ;; if logged-in user sent this, use recipients.
+              (setq to (mime-entity-fetch-field gnus-current-headers "to")))
+         (gnus-bbdb/extract-address-components
+          (gnus-bbdb/decode-field-body to 'To))
+       from))))
+
 ;;;###autoload
 (defun gnus-bbdb/update-record (&optional offer-to-create)
-  "returns the record corresponding to the current GNUS message, creating
+  "Return the record corresponding to the current GNUS message, creating
 or modifying it as necessary.  A record will be created if
 bbdb/news-auto-create-p is non-nil, or if OFFER-TO-CREATE is true and
 the user confirms the creation."
   (if bbdb-use-pop-up
       (gnus-bbdb/pop-up-bbdb-buffer offer-to-create)
-    (let ((from (mime-entity-fetch-field gnus-current-headers "from")))
-      (when from
-       (setq from (gnus-bbdb/extract-address-components
-                   (gnus-bbdb/decode-field-body from 'From))))
-      (when (and (car (cdr from))
-                (string-match (bbdb-user-mail-names)
-                              (car (cdr from))))
-       ;; if logged-in user sent this, use recipients.
-       (let ((to (mime-entity-fetch-field gnus-current-headers "to")))
-         (when to
-           (setq from
-                 (gnus-bbdb/extract-address-components
-                  (gnus-bbdb/decode-field-body to 'To))))))
-      (when from
-       (save-excursion
-         (bbdb-annotate-message-sender from t
-                                       (or (bbdb-invoke-hook-for-value
-                                            bbdb/news-auto-create-p)
-                                           offer-to-create)
-                                       offer-to-create))))))
+    (let ((message-key
+          (intern (mail-header-id gnus-current-headers)))
+         record sender)
+      (or (and (setq record (bbdb-message-cache-lookup message-key))
+              (if (listp record)
+                  (nth 1 record)
+                record))
+         (when (setq sender
+                     (funcall gnus-bbdb/extract-message-sender-function))
+           (save-excursion
+             (setq record (bbdb-annotate-message-sender
+                           sender t
+                           (or (bbdb-invoke-hook-for-value
+                                bbdb/news-auto-create-p)
+                               offer-to-create)
+                           offer-to-create)))
+           (when record
+             ;; XXX: BBDB 2.3x not only redefines
+             ;; `bbdb-encache-message' as a macro but also the inherent
+             ;; semantics of message caching functions is changed, so
+             ;; the following calls are much the same here.
+             (if (functionp 'bbdb-encache-message)
+                 (car (bbdb-encache-message message-key (list record)))
+               (bbdb-encache-message message-key record))))))))
 
 ;;;###autoload
 (defun gnus-bbdb/annotate-sender (string &optional replace)
@@ -601,6 +622,7 @@ beginning of the message headers."
     (add-to-list 'bbdb-extract-field-value-function-list
                 'gnus-bbdb/extract-field-value-init))
   (add-hook 'gnus-article-prepare-hook 'gnus-bbdb/update-record)
+  (add-hook 'gnus-summary-exit-hook 'bbdb-flush-all-caches)
   (add-hook 'gnus-save-newsrc-hook 'bbdb-offer-save)
   (define-key gnus-summary-mode-map ":" 'gnus-bbdb/show-sender)
   (define-key gnus-summary-mode-map ";" 'gnus-bbdb/edit-notes)
index 680b4cf..69dc0d7 100644 (file)
@@ -1,5 +1,5 @@
 ;;; gnus-cache.el --- cache interface for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -210,7 +210,8 @@ it's not cached."
              ;; Update the active info.
              (set-buffer gnus-summary-buffer)
              (gnus-cache-possibly-update-active group (cons number number))
-             (push article gnus-newsgroup-cached)
+             (setq gnus-newsgroup-cached
+                   (gnus-add-to-sorted-list gnus-newsgroup-cached article))
              (gnus-summary-update-secondary-mark article))
            t))))))
 
@@ -283,9 +284,7 @@ it's not cached."
        ;; the normal way.
        (let ((gnus-use-cache nil))
          (gnus-retrieve-headers articles group fetch-old))
-      (let ((uncached-articles (gnus-sorted-intersection
-                               (gnus-sorted-complement articles cached)
-                               articles))
+      (let ((uncached-articles (gnus-sorted-difference articles cached))
            (cache-file (gnus-cache-file-name group ".overview"))
            type)
        ;; We first retrieve all the headers that we don't have in
@@ -368,21 +367,23 @@ Returns the list of articles removed."
 (defun gnus-summary-insert-cached-articles ()
   "Insert all the articles cached for this group into the current buffer."
   (interactive)
-  (let ((cached (sort (copy-sequence gnus-newsgroup-cached) '>))
+  (let ((cached gnus-newsgroup-cached)
        (gnus-verbose (max 6 gnus-verbose)))
-    (unless cached
-      (gnus-message 3 "No cached articles for this group"))
-    (while cached
-      (gnus-summary-goto-subject (pop cached) t))))
+    (if (not cached)
+       (gnus-message 3 "No cached articles for this group")
+      (save-excursion
+       (while cached
+         (gnus-summary-goto-subject (pop cached) t)))
+      (gnus-summary-limit (append gnus-newsgroup-cached gnus-newsgroup-limit))
+      (gnus-summary-position-point))))
 
 (defun gnus-summary-limit-include-cached ()
   "Limit the summary buffer to articles that are cached."
   (interactive)
-  (let ((cached (sort (copy-sequence gnus-newsgroup-cached) '>))
-       (gnus-verbose (max 6 gnus-verbose)))
-    (if cached
+  (let ((gnus-verbose (max 6 gnus-verbose)))
+    (if gnus-newsgroup-cached
        (progn
-         (gnus-summary-limit cached)
+         (gnus-summary-limit gnus-newsgroup-cached)
          (gnus-summary-position-point))
       (gnus-message 3 "No cached articles for this group"))))
 
@@ -472,8 +473,10 @@ Returns the list of articles removed."
                                  (point-max) t))
          (delete-region (progn (beginning-of-line) (point))
                         (progn (forward-line 1) (point)))))
-      (setq gnus-newsgroup-cached
-           (delq article gnus-newsgroup-cached))
+      (unless (setq gnus-newsgroup-cached
+                   (delq article gnus-newsgroup-cached))
+       (gnus-sethash gnus-newsgroup-name nil gnus-cache-active-hashtb)
+       (setq gnus-cache-active-altered t))
       (gnus-summary-update-secondary-mark article)
       t)))
 
@@ -487,9 +490,13 @@ Returns the list of articles removed."
                          (directory-files dir nil "^[0-9]+$" t))
                  '<))
       ;; Update the cache active file, just to synch more.
-      (when articles
-       (gnus-cache-update-active group (car articles) t)
-       (gnus-cache-update-active group (car (last articles))))
+      (if articles
+         (progn
+           (gnus-cache-update-active group (car articles) t)
+           (gnus-cache-update-active group (car (last articles))))
+       (when (gnus-gethash group gnus-cache-active-hashtb)
+         (gnus-sethash group nil gnus-cache-active-hashtb)
+         (setq gnus-cache-active-altered t)))
       articles)))
 
 (defun gnus-cache-braid-nov (group cached &optional file)
@@ -512,13 +519,13 @@ Returns the list of articles removed."
                  (< (read (current-buffer)) (car cached)))
        (forward-line 1))
       (beginning-of-line)
-      (save-excursion
-       (set-buffer cache-buf)
-       (if (search-forward (concat "\n" (int-to-string (car cached)) "\t")
-                           nil t)
-           (setq beg (progn (beginning-of-line) (point))
-                 end (progn (end-of-line) (point)))
-         (setq beg nil)))
+      (set-buffer cache-buf)
+      (if (search-forward (concat "\n" (int-to-string (car cached)) "\t")
+                         nil t)
+         (setq beg (progn (beginning-of-line) (point))
+               end (progn (end-of-line) (point)))
+       (setq beg nil))
+      (set-buffer nntp-server-buffer)
       (when beg
        (insert-buffer-substring cache-buf beg end)
        (insert "\n"))
index 39c3592..65ce313 100644 (file)
@@ -442,7 +442,8 @@ If WIDTH (the numerical prefix), use that text width when filling."
                 (concat "^" (regexp-quote (cdar marks)) " *"))
                (fill-prefix
                 (if (string= (cdar marks) "") ""
-                  (concat (cdar marks) " "))))
+                  (concat (cdar marks) " ")))
+               use-hard-newlines)
            (fill-region (point-min) (point-max)))
          (set-marker (caar marks) nil)
          (setq marks (cdr marks)))
diff --git a/lisp/gnus-dired.el b/lisp/gnus-dired.el
new file mode 100644 (file)
index 0000000..22104f6
--- /dev/null
@@ -0,0 +1,207 @@
+;;; gnus-dired.el --- utility functions where gnus and dired meet
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002
+;;        Free Software Foundation, Inc.
+
+;; Authors: Benjamin Rutt <brutt@bloomington.in.us>,
+;;          Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Keywords: mail, news, extensions
+
+;; This file is part of GNU Emacs.
+
+;; 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.
+
+;;; Commentary:
+
+;; This package provides utility functions for intersections of gnus
+;; and dired.  To enable the gnus-dired-mode minor mode which will
+;; have the effect of installing keybindings in dired-mode, place the
+;; following in your ~/.gnus:
+
+;; (require 'gnus-dired) ;, isn't needed due to autoload cookies
+;; (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
+
+;; Note that if you visit dired buffers before your ~/.gnus file has
+;; been read, those dired buffers won't have the keybindings in
+;; effect.  To get around that problem, you may want to add the above
+;; statements to your ~/.emacs instead.
+
+;;; Code:
+
+(require 'dired)
+(require 'gnus-ems)
+(require 'gnus-msg)
+(require 'gnus-util)
+(require 'message)
+(require 'mm-encode)
+(require 'mml)
+
+(defvar gnus-dired-mode nil
+  "Minor mode for intersections of gnus and dired.")
+
+(defvar gnus-dired-mode-map nil)
+
+(unless gnus-dired-mode-map
+  (setq gnus-dired-mode-map (make-sparse-keymap))
+
+  (gnus-define-keys gnus-dired-mode-map
+    "\C-c\C-a" gnus-dired-attach
+    "\C-c\C-f" gnus-dired-find-file-mailcap
+    "\C-cP" gnus-dired-print
+    ))
+
+(defun gnus-dired-mode (&optional arg)
+  "Minor mode for intersections of gnus and dired.
+
+\\{gnus-dired-mode-map}"
+  (interactive "P")
+  (when (eq major-mode 'dired-mode)
+    (set (make-local-variable 'gnus-dired-mode)
+        (if (null arg) (not gnus-dired-mode)
+          (> (prefix-numeric-value arg) 0)))
+    (when gnus-dired-mode
+      (gnus-add-minor-mode 'gnus-dired-mode "" gnus-dired-mode-map)
+      (gnus-run-hooks 'gnus-dired-mode-hook))))
+
+;;;###autoload
+(defun turn-on-gnus-dired-mode ()
+  "Convenience method to turn on gnus-dired-mode."
+  (gnus-dired-mode 1))
+
+;; Method to attach files to a gnus composition.
+(defun gnus-dired-attach (files-to-attach)
+  "Attach dired's marked files to a gnus message composition.
+If called non-interactively, FILES-TO-ATTACH should be a list of
+filenames."
+  (interactive
+   (list
+    (delq nil
+         (mapcar
+          ;; don't attach directories
+          (lambda (f) (if (file-directory-p f) nil f))
+          (nreverse (dired-map-over-marks (dired-get-filename) nil))))))
+  (let ((destination nil)
+       (files-str nil)
+       (bufs nil))
+    ;; warn if user tries to attach without any files marked
+    (if (null files-to-attach)
+       (error "No files to attach")
+      (setq files-str
+           (mapconcat
+            (lambda (f) (file-name-nondirectory f))
+            files-to-attach ", "))
+      (setq bufs (message-buffers))
+
+      ;; set up destination message buffer
+      (if (and bufs
+              (y-or-n-p "Attach files to existing message buffer? "))
+         (setq destination
+               (if (= (length bufs) 1)
+                   (get-buffer (car bufs))
+                 (completing-read "Attach to which message buffer: "
+                                  (mapcar
+                                   (lambda (b)
+                                     (cons b (get-buffer b)))
+                                   bufs)
+                                  nil t)))
+       ;; setup a new gnus message buffer
+       (gnus-setup-message 'message (message-mail))
+       (setq destination (current-buffer)))
+
+      ;; set buffer to destination buffer, and attach files
+      (set-buffer destination)
+      (goto-char (point-max))          ;attach at end of buffer
+      (while files-to-attach
+       (mml-attach-file (car files-to-attach)
+                        (or (mm-default-file-encoding (car files-to-attach))
+                            "application/octet-stream") nil)
+       (setq files-to-attach (cdr files-to-attach)))
+      (message "Attached file(s) %s" files-str))))
+
+(autoload 'mailcap-parse-mailcaps "mailcap" "" t)
+
+(defun gnus-dired-find-file-mailcap (&optional file-name arg)
+  "In dired, visit FILE-NAME according to the mailcap file.
+If ARG is non-nil, open it in a new buffer."
+  (interactive (list
+               (file-name-sans-versions (dired-get-filename) t)
+               current-prefix-arg))
+  (mailcap-parse-mailcaps)
+  (if (file-exists-p file-name)
+      (let (mime-type method)
+       (if (and (not arg)
+                (not (file-directory-p file-name))
+                (string-match "\\.[^\\.]+$" file-name)
+                (setq mime-type
+                      (mailcap-extension-to-mime
+                       (match-string 0 file-name)))
+                (stringp
+                 (setq method
+                       (cdr (assoc 'viewer
+                                   (car (mailcap-mime-info mime-type
+                                                           'all)))))))
+           (let ((view-command (mm-mailcap-command method file-name nil)))
+             (message "viewing via %s" view-command)
+             (start-process "*display*"
+                            nil
+                            shell-file-name
+                            shell-command-switch
+                            view-command))
+         (find-file file-name)))
+    (if (file-symlink-p file-name)
+       (error "File is a symlink to a nonexistent target")
+      (error "File no longer exists; type `g' to update Dired buffer"))))
+
+(defun gnus-dired-print (&optional file-name print-to)
+  "In dired, print FILE-NAME according to the mailcap file.
+
+If there is no print command, print in a PostScript image. If the
+optional argument PRINT-TO is nil, send the image to the printer. If
+PRINT-TO is a string, save the PostScript image in a file with that
+name.  If PRINT-TO is a number, prompt the user for the name of the
+file to save in."
+  (interactive (list
+               (file-name-sans-versions (dired-get-filename) t)
+               (ps-print-preprint current-prefix-arg)))
+  (mailcap-parse-mailcaps)
+  (cond
+   ((file-directory-p file-name)
+    (error "Can't print a directory"))
+   ((file-exists-p file-name)
+    (let (mime-type method)
+      (if (and (string-match "\\.[^\\.]+$" file-name)
+              (setq mime-type
+                    (mailcap-extension-to-mime
+                     (match-string 0 file-name)))
+              (stringp
+               (setq method (mailcap-mime-info mime-type "print"))))
+         (call-process shell-file-name nil
+                       (generate-new-buffer " *mm*")
+                       nil
+                       shell-command-switch
+                       (mm-mailcap-command method file-name mime-type))
+       (with-temp-buffer
+         (insert-file-contents file-name)
+         (gnus-print-buffer))
+       (ps-despool print-to))))
+   ((file-symlink-p file-name)
+     (error "File is a symlink to a nonexistent target"))
+    (t
+     (error "File no longer exists; type `g' to update Dired buffer"))))
+
+(provide 'gnus-dired)
+
+;;; gnus-dired.el ends here
index b2fbed5..47cfac7 100644 (file)
   (let ((article (gnus-summary-article-number))
        (group gnus-newsgroup-name))
     (gnus-summary-mark-as-read article gnus-canceled-mark)
-    (gnus-draft-setup-for-editing article group)
+    (gnus-draft-setup article group t)
     (set-buffer-modified-p t)
     (save-excursion
       (save-restriction
        (message-narrow-to-headers)
        (message-remove-header "date")))
-    (message-save-drafts)
+    (save-buffer)
     (let ((gnus-verbose-backends nil))
       (gnus-request-expire-articles (list article) group t))
     (push
 
 (defun gnus-draft-send (article &optional group interactive)
   "Send message ARTICLE."
-  (let ((message-syntax-checks (if interactive nil
+  (let ((message-syntax-checks (if interactive message-syntax-checks
                                 'dont-check-for-anything-just-trust-me))
        (message-inhibit-body-encoding (or (not group)
                                           (equal group "nndraft:queue")
        (message-setup-hook (and group (not (equal group "nndraft:queue"))
                                 message-setup-hook))
        type method)
-    (gnus-draft-setup-for-sending article (or group "nndraft:queue"))
+    (gnus-draft-setup article (or group "nndraft:queue"))
     ;; We read the meta-information that says how and where
     ;; this message is to be sent.
     (save-restriction
     (gnus-agent-restore-gcc)
     ;; Then we send it.  If we have no meta-information, we just send
     ;; it and let Message figure out how.
-    (when (let ((mail-header-separator ""))
-           (cond ((eq type 'news)
-                  (mime-edit-maybe-split-and-send
-                   (function
-                    (lambda ()
-                      (interactive)
-                      (funcall message-send-news-function method))))
-                  (funcall message-send-news-function method))
-                 ((eq type 'mail)
-                  (mime-edit-maybe-split-and-send
-                   (function
-                    (lambda ()
-                      (interactive)
-                      (funcall message-send-mail-function))))
-                  (funcall message-send-mail-function)
-                  t)))
+    (when (and (or (null method)
+                  (gnus-server-opened method)
+                  (gnus-open-server method))
+              (if type
+                  (let ((message-this-is-news (eq type 'news))
+                        (message-this-is-mail (eq type 'mail))
+                        (gnus-post-method method)
+                        (message-post-method method))
+                    (message-send-and-exit))
+                (message-send-and-exit)))
       (let ((gnus-verbose-backends nil))
        (gnus-request-expire-articles
         (list article) (or group "nndraft:queue") t)))))
 ;;;!!!This has been fixed in recent versions of Emacs and XEmacs,
 ;;;!!!but for the time being, we'll just run this tiny function uncompiled.
 
-(defun gnus-draft-setup-for-editing (narticle group)
+(defun gnus-draft-setup (narticle group &optional restore)
   (let (ga)
     (gnus-setup-message 'forward
       (let ((article narticle))
        (erase-buffer)
        (if (not (gnus-request-restore-buffer article group))
            (error "Couldn't restore the article")
-         (funcall gnus-draft-decoding-function)
+         (when (and restore
+                    (equal group "nndraft:queue"))
+           (funcall gnus-draft-decoding-function))
          ;; Insert the separator.
          (goto-char (point-min))
          (search-forward "\n\n")
                                                         'add '(reply)))))
         'send)))))
 
-(defvar gnus-draft-send-draft-buffer " *send draft*")
-(defun gnus-draft-setup-for-sending (narticle group)
-  (let ((article narticle))
-    (if (not (get-buffer gnus-draft-send-draft-buffer))
-       (get-buffer-create gnus-draft-send-draft-buffer))
-    (set-buffer gnus-draft-send-draft-buffer)
-    (erase-buffer)
-    (if (not (gnus-request-restore-buffer article group))
-       (error "Couldn't restore the article"))))
-
 (defun gnus-draft-article-sendable-p (article)
   "Say whether ARTICLE is sendable."
   (not (memq article gnus-newsgroup-unsendable)))
index 6d0d24e..8a4d70a 100644 (file)
   (autoload 'gnus-xmas-redefine "gnus-xmas")
   (autoload 'appt-select-lowest-window "appt"))
 
-(cond ((featurep 'xemacs)
-       (autoload 'smiley-region "smiley"))
-      ;; override XEmacs version
-      ((>= emacs-major-version 21)
-       (autoload 'smiley-region "smiley-ems"))
-      (t
-       (autoload 'smiley-region "smiley-mule")))
+(if (or (featurep 'xemacs)
+       (>= emacs-major-version 21))
+    (autoload 'smiley-region "smiley")
+  (autoload 'smiley-region "smiley-mule"))
 
 (defun gnus-kill-all-overlays ()
   "Delete all overlays in the current buffer."
index d24124a..4589fd7 100644 (file)
   :group 'gnus-fun
   :type 'string)
 
-(defcustom gnus-convert-image-to-x-face-command "giftopnm %s | ppmnorm 2>/dev/null | pnmscale -width 48 -height 48 | ppmtopgm | pgmtopbm | pbmtoxbm | compface"
+(defcustom gnus-convert-image-to-x-face-command "giftopnm %s | ppmnorm | pnmscale -width 48 -height 48 | ppmtopgm | pgmtopbm | pbmtoxbm | compface"
   "Command for converting a GIF to an X-Face."
   :group 'gnus-fun
   :type 'string)
 
+(defun gnus-shell-command-to-string (command)
+  "Like `shell-command-to-string' except not mingling ERROR."
+  (with-output-to-string
+    (call-process shell-file-name nil (list standard-output nil)
+                 nil shell-command-switch command)))
+
+(defun gnus-shell-command-on-region (start end command)
+  "A simplified `shell-command-on-region'.
+Output to the current buffer, replace text, and don't mingle error."
+  (call-process-region start end shell-file-name t
+                      (list (current-buffer) nil)
+                      nil shell-command-switch command))
+
 ;;;###autoload
 (defun gnus-random-x-face ()
   "Insert a random X-Face header from `gnus-x-face-directory'."
@@ -48,7 +61,7 @@
     (let* ((files (directory-files gnus-x-face-directory t "\\.pbm$"))
           (file (nth (random (length files)) files)))
       (when file
-       (shell-command-to-string
+       (gnus-shell-command-to-string
         (format gnus-convert-pbm-to-x-face-command
                 (shell-quote-argument file)))))))
 
   "Insert an X-Face header based on an image file."
   (interactive "fImage file name:" )
   (when (file-exists-p file)
-    (shell-command-to-string
+    (gnus-shell-command-to-string
      (format gnus-convert-image-to-x-face-command
             (shell-quote-argument file)))))
 
 (defun gnus-convert-image-to-gray-x-face (file depth)
-  (let* ((mapfile (make-temp-name (expand-file-name "gnus." mm-tmp-directory)))
+  (let* ((mapfile (mm-make-temp-file (expand-file-name "gnus."
+                                                      mm-tmp-directory)))
         (levels (expt 2 depth))
         (step (/ 255 (1- levels)))
         color-alist bits bits-list mask pixel x-faces)
@@ -76,8 +90,8 @@
        (push (cons (* step i) i) color-alist)))
     (when (file-exists-p file)
       (with-temp-buffer
-       (insert (shell-command-to-string
-                (format "giftopnm %s | ppmnorm 2>/dev/null | pnmscale -width 48 -height 48 | ppmquant -fs -map %s 2>/dev/null | ppmtopgm | pnmnoraw"
+       (insert (gnus-shell-command-to-string
+                (format "giftopnm %s | ppmnorm | pnmscale -width 48 -height 48 | ppmquant -fs -map %s | ppmtopgm | pnmnoraw"
                         (shell-quote-argument file)
                         mapfile)))
        (goto-char (point-min))
            (insert "P1\n48 48\n")
            (dolist (bits bits-list)
              (insert (if (zerop (logand bits mask)) "0 " "1 ")))
-           (shell-command-on-region
+           (gnus-shell-command-on-region
             (point-min) (point-max)
-            "pbmtoxbm | compface"
-            (current-buffer) t)
+            ;; the following is taken from xbmtoikon:
+            "pbmtoicon | sed '/^[      ]*[*\\\\/]/d; s/[       ]//g; s/,$//' | tr , '\\012' | sed 's/^0x//; s/^/0x/' | pr -l1 -t -w22 -3 -s, | sed 's/,*$/,/' | compface")
            (push (buffer-string) x-faces))))
       (dotimes (i (length x-faces))
        (insert (if (zerop i) "X-Face:" (format "X-Face-%s:" i))
   (let* ((depth (length faces))
         (scale (/ 255 (1- (expt 2 depth))))
         (ok-p t)
-        bit-list bit-lists pixels pixel)
-    (dolist (face faces)
-      (setq bit-list nil)
-      (with-temp-buffer
+        (coding-system-for-read 'binary)
+        (coding-system-for-write 'binary)
+        default-enable-multibyte-characters
+        start bit-array bit-arrays pixel)
+    (with-temp-buffer
+      (dolist (face faces)
+       (erase-buffer)
        (insert (uncompface face))
-       (shell-command-on-region
+       (gnus-shell-command-on-region
         (point-min) (point-max)
-        "pnmnoraw 2>/dev/null"
-        (current-buffer) t)
+        "pnmnoraw")
        (goto-char (point-min))
        (forward-line 2)
+       (setq start (point))
+       (insert "[")
        (while (not (eobp))
-         (cond
-          ((eq (following-char) ?0)
-           (push 0 bit-list))
-          ((eq (following-char) ?1)
-           (push 1 bit-list)))
-         (forward-char 1)))
-      (unless (= (length bit-list) (* 48 48))
-       (setq ok-p nil))
-      (push bit-list bit-lists))
-    (when ok-p
-      (dotimes (i (* 48 48))
-       (setq pixel 0)
-       (dotimes (plane depth)
-         (setq pixel (+ (* pixel 2) (nth i (nth plane bit-lists)))))
-       (push pixel pixels))
-      (with-temp-buffer
+         (forward-char 1)
+         (insert " "))
+       (insert "]")
+       (goto-char start)
+       (setq bit-array (read (current-buffer)))
+       (unless (= (length bit-array) (* 48 48))
+         (setq ok-p nil))
+       (push bit-array bit-arrays))
+      (when ok-p
+       (erase-buffer)
        (insert "P2\n48 48\n255\n")
-       (dolist (pixel pixels)
+       (dotimes (i (* 48 48))
+         (setq pixel 0)
+         (dotimes (plane depth)
+           (setq pixel (+ (* pixel 2) (aref (nth plane bit-arrays) i))))
          (insert (number-to-string (* scale pixel)) " "))
-       (shell-command-on-region
+       (gnus-shell-command-on-region
         (point-min) (point-max)
-        "ppmtoxpm 2>/dev/null"
-        (current-buffer) t)
+        "ppmtoxpm")
        (buffer-string)))))
 
 ;;;###autoload
index 98d08e3..10631dc 100644 (file)
@@ -159,6 +159,7 @@ with some simple extensions.
 %G    Group name (string)
 %g    Qualified group name (string)
 %c    Short (collapsed) group name.  See `gnus-group-uncollapsed-levels'.
+%C    Group comment (string)
 %D    Group description (string)
 %s    Select method (string)
 %o    Moderated group (char, \"m\")
@@ -192,7 +193,7 @@ of these specs, you must probably re-start Gnus to see them go into
 effect.
 
 General format specifiers can also be used.
-See (gnus)Formatting Variables."
+See `(gnus)Formatting Variables'."
   :link '(custom-manual "(gnus)Formatting Variables")
   :group 'gnus-group-visual
   :type 'string)
@@ -415,7 +416,7 @@ For example:
 (defcustom gnus-group-name-charset-group-alist
   (if (or (and (fboundp 'find-coding-system) (find-coding-system 'utf-8))
          (and (fboundp 'coding-system-p) (coding-system-p 'utf-8)))
-      '((".*" . utf-8))
+      '(("[^\000-\177]" . utf-8))
     nil)
   "Alist of group regexp and the charset for group names.
 
@@ -475,6 +476,7 @@ simple manner.")
     (?g gnus-tmp-group ?s)
     (?G gnus-tmp-qualified-group ?s)
     (?c (gnus-short-group-name gnus-tmp-group) ?s)
+    (?C gnus-tmp-comment ?s)
     (?D gnus-tmp-newsgroup-description ?s)
     (?o gnus-tmp-moderated ?c)
     (?O gnus-tmp-moderated-string ?s)
@@ -798,7 +800,8 @@ simple manner.")
        ["Sort by score" gnus-group-sort-groups-by-score t]
        ["Sort by level" gnus-group-sort-groups-by-level t]
        ["Sort by unread" gnus-group-sort-groups-by-unread t]
-       ["Sort by name" gnus-group-sort-groups-by-alphabet t])
+       ["Sort by name" gnus-group-sort-groups-by-alphabet t]
+       ["Sort by real name" gnus-group-sort-groups-by-real-name t])
        ("Sort process/prefixed"
        ["Default sort" gnus-group-sort-selected-groups
         (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))]
@@ -813,6 +816,8 @@ simple manner.")
        ["Sort by unread" gnus-group-sort-selected-groups-by-unread
         (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))]
        ["Sort by name" gnus-group-sort-selected-groups-by-alphabet
+        (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))]
+       ["Sort by real name" gnus-group-sort-selected-groups-by-real-name
         (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))])
        ("Mark"
        ["Mark group" gnus-group-mark-group
@@ -917,9 +922,11 @@ simple manner.")
 
 ;; Emacs 21 tool bar.  Should be no-op otherwise.
 (defun gnus-group-make-tool-bar ()
-  (if (and (fboundp 'tool-bar-add-item-from-menu)
-          (default-value 'tool-bar-mode)
-          (not gnus-group-toolbar-map))
+  (if (and
+       (condition-case nil (require 'tool-bar) (error nil))
+       (fboundp 'tool-bar-add-item-from-menu)
+       (default-value 'tool-bar-mode)
+       (not gnus-group-toolbar-map))
       (setq gnus-group-toolbar-map
            (let ((tool-bar-map (make-sparse-keymap))
                  (load-path (mm-image-load-path)))
@@ -1042,8 +1049,7 @@ The following commands are available:
       result)))
 
 (defun gnus-group-name-decode (string charset)
-  (if (and string charset (featurep 'mule)
-          (not (mm-multibyte-string-p string)))
+  (if (and string charset (featurep 'mule))
       (decode-coding-string string charset)
     string))
 
@@ -1051,6 +1057,35 @@ The following commands are available:
   (let ((charset (gnus-group-name-charset nil string)))
     (gnus-group-name-decode string charset)))
 
+(defun gnus-group-name-encode (string charset)
+  (if (and string charset (featurep 'mule))
+      (encode-coding-string string charset)
+    string))
+
+(defun gnus-group-encoded-name (string)
+  (let ((charset (gnus-group-name-charset nil string)))
+    (gnus-group-name-encode string charset)))
+
+(defun gnus-group-completing-read-group-name
+  (prompt table &optional predicate require-match initial-contents history)
+  (if (vectorp table)
+      (mapatoms
+       (lambda (group)
+        (push (list (gnus-group-decoded-name (symbol-name group))) table))
+       (prog1
+          table
+        (setq table nil)))
+    (dolist (entry (prog1
+                      table
+                    (setq table nil)))
+      (push (list (gnus-group-decoded-name (car entry))) table)))
+  (gnus-group-encoded-name
+   (completing-read
+    prompt table predicate
+    require-match
+    initial-contents
+    history)))
+
 (defun gnus-group-list-groups (&optional level unread lowest)
   "List newsgroups with level LEVEL or lower that have unread articles.
 Default is all subscribed groups.
@@ -1326,6 +1361,9 @@ if it is a string, only list groups matching REGEXP."
         (gnus-tmp-qualified-group
          (gnus-group-name-decode (gnus-group-real-name gnus-tmp-group)
                                  group-name-charset))
+        (gnus-tmp-comment 
+         (or (gnus-group-get-parameter gnus-tmp-group 'comment t)
+             gnus-tmp-group))
         (gnus-tmp-newsgroup-description
          (if gnus-description-hashtb
              (or (gnus-group-name-decode
@@ -1723,7 +1761,7 @@ Take into consideration N (the prefix) and the list of marked groups."
          (setq n (1- n))
          (gnus-group-next-group way)))
       (nreverse groups)))
-   ((gnus-region-active-p)
+   ((and (gnus-region-active-p) (mark))
     ;; Work on the region between point and mark.
     (let ((max (max (point) (mark)))
          groups)
@@ -1857,7 +1895,8 @@ be permanent."
 (defun gnus-fetch-group (group)
   "Start Gnus if necessary and enter GROUP.
 Returns whether the fetching was successful or not."
-  (interactive (list (completing-read "Group name: " gnus-active-hashtb)))
+  (interactive (list (gnus-group-completing-read-group-name
+                     "Group name: " gnus-active-hashtb)))
   (unless (get-buffer gnus-group-buffer)
     (gnus-no-server))
   (gnus-group-read-group nil nil group))
@@ -1936,7 +1975,7 @@ Return the name of the group if selection was successful."
 (defun gnus-group-jump-to-group (group)
   "Jump to newsgroup GROUP."
   (interactive
-   (list (completing-read
+   (list (gnus-group-completing-read-group-name
          "Group: " gnus-active-hashtb nil
          (gnus-read-active-file-p)
          gnus-group-jump-to-group-prompt
@@ -2085,7 +2124,7 @@ If EXCLUDE-GROUP, do not go to that group."
       (forward-line 1))
     (when best-point
       (goto-char best-point))
-    (gnus-summary-position-point)
+    (gnus-group-position-point)
     (and best-point (gnus-group-group-name))))
 
 (defun gnus-group-first-unread-group ()
@@ -2198,6 +2237,9 @@ doing the deletion."
          (gnus-group-goto-group group)
          (gnus-group-kill-group 1 t)
          (gnus-sethash group nil gnus-active-hashtb)
+         (when gnus-cache-active-hashtb
+           (gnus-sethash group nil gnus-cache-active-hashtb)
+           (setq gnus-cache-active-altered t))
          t))
     (gnus-group-position-point)))
 
@@ -2698,6 +2740,12 @@ If REVERSE, sort in reverse order."
   (interactive "P")
   (gnus-group-sort-groups 'gnus-group-sort-by-alphabet reverse))
 
+(defun gnus-group-sort-groups-by-real-name (&optional reverse)
+  "Sort the group buffer alphabetically by real (unprefixed) group name.
+If REVERSE, sort in reverse order."
+  (interactive "P")
+  (gnus-group-sort-groups 'gnus-group-sort-by-real-name reverse))
+
 (defun gnus-group-sort-groups-by-unread (&optional reverse)
   "Sort the group buffer by number of unread articles.
 If REVERSE, sort in reverse order."
@@ -2776,6 +2824,13 @@ sort in reverse order."
   (interactive (gnus-interactive "P\ny"))
   (gnus-group-sort-selected-groups n 'gnus-group-sort-by-alphabet reverse))
 
+(defun gnus-group-sort-selected-groups-by-real-name (&optional n reverse)
+  "Sort the group buffer alphabetically by real group name.
+Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
+sort in reverse order."
+  (interactive (gnus-interactive "P\ny"))
+  (gnus-group-sort-selected-groups n 'gnus-group-sort-by-real-name reverse))
+
 (defun gnus-group-sort-selected-groups-by-unread (&optional n reverse)
   "Sort the group buffer by number of unread articles.
 Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
@@ -3118,7 +3173,7 @@ If given numerical prefix, toggle the N next groups."
 Killed newsgroups are subscribed.  If SILENT, don't try to update the
 group line."
   (interactive
-   (list (completing-read
+   (list (gnus-group-completing-read-group-name
          "Group: " gnus-active-hashtb nil
          (gnus-read-active-file-p)
          nil
@@ -4051,7 +4106,9 @@ This command may read the active file."
              (while (<= n (cdr gnus-newsgroup-active))
                (unless (eq n article)
                  (push n gnus-newsgroup-unselected))
-               (setq n (1+ n))))))
+               (setq n (1+ n)))
+             (setq gnus-newsgroup-unselected
+                   (nreverse gnus-newsgroup-unselected)))))
       (gnus-activate-group group)
       (gnus-group-make-articles-read group
                                     (list article))
index cf9b67e..330b300 100644 (file)
@@ -203,16 +203,16 @@ If it is down, start it up (again)."
          (setq elem (list gnus-command-method nil)
                gnus-opened-servers (cons elem gnus-opened-servers)))
        ;; Set the status of this server.
-       (setcar (cdr elem) 
-               (if result 
+       (setcar (cdr elem)
+               (if result
                    (if (eq (cadr elem) 'offline)
                        'offline
                      'ok)
-                 (if (and gnus-agent 
+                 (if (and gnus-agent
                           (not (eq (cadr elem) 'offline))
                           (gnus-agent-method-p gnus-command-method))
                      (or gnus-server-unopen-status
-                         (if (gnus-y-or-n-p 
+                         (if (gnus-y-or-n-p
                               (format "Unable to open %s:%s, go offline? "
                                       (car gnus-command-method)
                                       (cadr gnus-command-method)))
@@ -507,9 +507,9 @@ If GROUP is nil, all groups on GNUS-COMMAND-METHOD are scanned."
   (goto-char (point-max))
   (unless (bolp)
     (insert "\n"))
-  (let ((func (car (or gnus-command-method
-                      (gnus-find-method-for-group group)))))
-    (funcall (intern (format "%s-request-accept-article" func))
+  (let ((gnus-command-method (or gnus-command-method
+                                (gnus-find-method-for-group group))))
+    (funcall (gnus-get-function gnus-command-method 'request-accept-article)
             (if (stringp group) (gnus-group-real-name group) group)
             (cadr gnus-command-method)
             last)))
index b134be9..dd6a774 100644 (file)
@@ -428,16 +428,6 @@ Returns the number of articles marked as read."
        0))))
 
 ;; Parse a Gnus killfile.
-(defun gnus-score-insert-help (string alist idx)
-  (save-excursion
-    (pop-to-buffer "*Score Help*")
-    (buffer-disable-undo)
-    (erase-buffer)
-    (insert string ":\n\n")
-    (while alist
-      (insert (format " %c: %s\n" (caar alist) (nth idx (car alist))))
-      (setq alist (cdr alist)))))
-
 (defun gnus-kill-parse-gnus-kill-file ()
   (goto-char (point-min))
   (gnus-kill-file-mode)
index 1ddd05b..7375288 100644 (file)
@@ -1,5 +1,5 @@
 ;;; mailcap.el --- MIME media types configuration
-;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: William M. Perry <wmperry@aventail.com>
 ;;     Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -87,6 +87,9 @@
      ("emacs-lisp"
       (viewer . mailcap-maybe-eval)
       (type   . "application/emacs-lisp"))
+     ("x-emacs-lisp"
+      (viewer . mailcap-maybe-eval)
+      (type   . "application/x-emacs-lisp"))
      ("x-tar"
       (viewer . mailcap-save-binary-file)
       (non-viewer . t)
       (viewer  . fundamental-mode)
       (type    . "text/plain"))
      ("enriched"
-      (viewer . enriched-decode-region)
+      (viewer . enriched-decode)
       (test   . (fboundp 'enriched-decode))
       (type   . "text/enriched"))
      ("html"
index 21a845e..60752ad 100644 (file)
@@ -121,16 +121,21 @@ the second with the current group name."
 See Info node `(gnus)Posting Styles'."
   :group 'gnus-message
   :type '(repeat (cons (choice (regexp)
-                              (function)
                               (variable)
+                              (list (const header)
+                                    (string :tag "Header")
+                                    (regexp :tag "Regexp"))
+                              (function)
                               (sexp))
                       (repeat (list
                                (choice (const signature)
                                        (const signature-file)
                                        (const organization)
                                        (const address)
+                                       (const x-face-file)
                                        (const name)
                                        (const body)
+                                       (symbol)
                                        (string :tag "Header"))
                                (choice (string)
                                        (function)
@@ -139,6 +144,7 @@ See Info node `(gnus)Posting Styles'."
 
 (defcustom gnus-gcc-mark-as-read nil
   "If non-nil, automatically mark Gcc articles as read."
+  :version "21.1"
   :group 'gnus-message
   :type 'boolean)
 
@@ -153,6 +159,7 @@ See Info node `(gnus)Posting Styles'."
 If it is `all', attach files as external parts;
 if a regexp and matches the Gcc group name, attach files as external parts;
 If nil, attach files as normal parts."
+  :version "21.1"
   :group 'gnus-message
   :type '(choice (const nil :tag "None")
                 (const all :tag "Any")
@@ -192,6 +199,53 @@ use this option with care."
                                       (symbol :tag "Charset")))))
   :group 'gnus-charset)
 
+(defcustom gnus-debug-files
+  '("gnus.el" "gnus-sum.el" "gnus-group.el"
+    "gnus-art.el" "gnus-start.el" "gnus-async.el"
+    "gnus-msg.el" "gnus-score.el" "gnus-win.el" "gnus-topic.el"
+    "gnus-agent.el" "gnus-cache.el" "gnus-srvr.el"
+    "mm-util.el" "mm-decode.el" "nnmail.el" "nntp.el" "message.el")
+  "Files whose variables will be reported in `gnus-bug'."
+  :version "21.1"
+  :group 'gnus-message
+  :type '(repeat (string :tag "File")))
+
+(defcustom gnus-debug-exclude-variables
+  '(mm-mime-mule-charset-alist
+    nnmail-split-fancy message-minibuffer-local-map)
+  "Variables that should not be reported in `gnus-bug'."
+  :version "21.1"
+  :group 'gnus-message
+  :type '(repeat (symbol :tag "Variable")))
+
+(defcustom gnus-discouraged-post-methods
+  '(nndraft nnml nnimap nnmaildir nnmh nnfolder nndir)
+  "A list of back ends that are not used in \"real\" newsgroups.
+This variable is used only when `gnus-post-method' is `current'."
+  :version "21.3"
+  :group 'gnus-group-foreign
+  :type '(repeat (symbol :tag "Back end")))
+
+(defcustom gnus-message-replysign
+  nil
+  "Automatically sign replys to signed messages.
+See also the `mml-default-sign-method' variable."
+  :group 'gnus-message
+  :type 'boolean)
+
+(defcustom gnus-message-replyencrypt
+  nil
+  "Automatically encrypt replys to encrypted messages.
+See also the `mml-default-encrypt-method' variable."
+  :group 'gnus-message
+  :type 'boolean)
+
+(defcustom gnus-message-replysignencrypted
+  nil
+  "Setting this causes automatically encryped messages to also be signed."
+  :group 'gnus-message
+  :type 'boolean)
+
 ;;; Internal variables.
 
 (defvar gnus-inhibit-posting-styles nil
@@ -277,7 +331,8 @@ Thank you for your help in stamping out bugs.
 (gnus-define-keys (gnus-send-bounce-map "D" gnus-summary-send-map)
   "b" gnus-summary-resend-bounced-mail
   ;; "c" gnus-summary-send-draft
-  "r" gnus-summary-resend-message)
+  "r" gnus-summary-resend-message
+  "e" gnus-summary-resend-message-edit)
 
 ;;; Internal functions.
 
@@ -679,7 +734,7 @@ post using the current select method."
   (let ((articles (gnus-summary-work-articles n))
        (message-post-method
         `(lambda (arg)
-           (gnus-post-method (not (eq symp 'a)) ,gnus-newsgroup-name)))
+           (gnus-post-method (eq ',symp 'a) ,gnus-newsgroup-name)))
        article)
     (while (setq article (pop articles))
       (when (gnus-summary-select-article t nil nil article)
@@ -751,6 +806,7 @@ header line with the old Message-ID."
              (gnus-article-delete-text-of-type 'annotation)
              (gnus-remove-text-with-property 'gnus-prev)
              (gnus-remove-text-with-property 'gnus-next)
+             (gnus-remove-text-with-property 'gnus-decoration)
              (gnus-remove-text-with-property 'x-face-mule-bitmap-image)
              (insert
               (prog1
@@ -921,7 +977,7 @@ If SILENT, don't prompt the user."
          method-alist))))
      ;; Override normal method.
      ((and (eq gnus-post-method 'current)
-          (not (eq (car group-method) 'nndraft))
+          (not (memq (car group-method) gnus-discouraged-post-methods))
           (gnus-get-function group-method 'request-post t))
       (assert (not arg))
       group-method)
@@ -1065,7 +1121,21 @@ If VERY-WIDE, make a very wide reply."
        (goto-char (point-max)))
       (message-reply nil wide)
       (when yank
-       (gnus-inews-yank-articles yank)))))
+       (gnus-inews-yank-articles yank))
+;;      (when (or gnus-message-replysign gnus-message-replyencrypt)
+;;     (let (signed encrypted)
+;;       (save-excursion
+;;         (set-buffer gnus-article-buffer)
+;;         (setq signed (memq 'signed gnus-article-wash-types))
+;;         (setq encrypted (memq 'encrypted gnus-article-wash-types)))
+;;       (cond ((and gnus-message-replysign signed)
+;;              (mml-secure-message mml-default-sign-method 'sign))
+;;             ((and gnus-message-replyencrypt encrypted)
+;;              (mml-secure-message mml-default-encrypt-method
+;;                                  (if gnus-message-replysignencrypted
+;;                                      'signencrypt
+;;                                    'encrypt))))))
+      )))
 
 (defun gnus-summary-reply-with-original (n &optional wide)
   "Start composing a reply mail to the current message.
@@ -1125,7 +1195,10 @@ The original article will be yanked."
 (defun gnus-summary-mail-forward (&optional full-headers post)
   "Forward the current message(s) to another user.
 If process marks exist, forward all marked messages;
-If FULL-HEADERS (the prefix), include full headers when forwarding."
+If FULL-HEADERS (the prefix), include full headers when forwarding.
+
+Note that this function definition for T-gnus is totally different
+from the original Gnus."
   (interactive "P")
   (if (null (cdr (gnus-summary-work-articles nil)))
       (gnus-setup-message 'forward
@@ -1200,7 +1273,7 @@ forward those articles instead."
 (defun gnus-summary-resend-message (address n)
   "Resend the current article to ADDRESS."
   (interactive
-   (list (message-read-from-minibuffer 
+   (list (message-read-from-minibuffer
          "Resend message(s) to: "
          (when (gnus-buffer-live-p gnus-original-article-buffer)
            ;; If some other article is currently selected, the
@@ -1218,6 +1291,56 @@ forward those articles instead."
        (message-resend address))
       (gnus-summary-mark-article-as-forwarded article))))
 
+;; From: Matthieu Moy <Matthieu.Moy@imag.fr>
+(defun gnus-summary-resend-message-edit ()
+  "Resend an article that has already been sent.
+A new buffer will be created to allow the user to modify body and
+contents of the message, and then, everything will happen as when
+composing a new message."
+  (interactive)
+  (let ((article (gnus-summary-article-number)))
+    (gnus-setup-message 'reply-yank
+      (gnus-summary-select-article t)
+      (set-buffer gnus-original-article-buffer)
+      (let ((cur (current-buffer))
+           (to (message-fetch-field "to")))
+       ;; Get a normal message buffer.
+       (message-pop-to-buffer (message-buffer-name "Resend" to))
+       (insert-buffer-substring cur)
+
+       ;; T-gnus change: Use MIME-Edit to recompose a message.
+       ;;(mime-to-mml)
+       (let ((ofn (symbol-function 'mime-edit-decode-single-part-in-buffer)))
+         (fset 'mime-edit-decode-single-part-in-buffer
+               (lambda (&rest args)
+                 (if (let ((content-type (car args)))
+                       (and (eq 'message (mime-content-type-primary-type
+                                          content-type))
+                            (eq 'rfc822 (mime-content-type-subtype
+                                         content-type))))
+                     (setcar (cdr args) 'not-decode-text))
+                 (apply ofn args)))
+         (unwind-protect
+             (mime-edit-again nil t)
+           (fset 'mime-edit-decode-single-part-in-buffer ofn)))
+       (message-narrow-to-head-1)
+       (insert "From: " (message-make-from) "\n")
+       (while (re-search-forward "^From:" nil t)
+         (beginning-of-line)
+         (insert "Original-"))
+       (message-remove-header "^>From[\t ]" t)
+
+       ;; Gnus will generate a new one when sending.
+       (message-remove-header "Message-ID")
+       (message-remove-header message-ignored-resent-headers t)
+       ;; Remove unwanted headers.
+       (goto-char (point-max))
+       (insert mail-header-separator)
+       (goto-char (point-min))
+       (re-search-forward "^To:\\|^Newsgroups:" nil 'move)
+       (forward-char 1)
+       (widen)))))
+
 (defun gnus-summary-post-forward (&optional full-headers)
   "Forward the current article to a newsgroup.
 If FULL-HEADERS (the prefix), include full headers when forwarding."
@@ -1356,7 +1479,7 @@ If YANK is non-nil, include the original article."
          (save-excursion (re-search-backward "[ \t\n]" nil t) (1+ (point)))
          (save-excursion (re-search-forward "[ \t\n]" nil t) (1- (point))))))
     (when address
-      (message-reply address)
+      (gnus-msg-mail address)
       (when yank
        (gnus-inews-yank-articles (list (cdr gnus-article-current)))))))
 
@@ -1447,10 +1570,7 @@ If YANK is non-nil, include the original article."
   "Attempts to go through the Gnus source file and report what variables have been changed.
 The source file has to be in the Emacs load path."
   (interactive)
-  (let ((files '("gnus.el" "gnus-sum.el" "gnus-group.el"
-                "gnus-art.el" "gnus-start.el" "gnus-async.el"
-                "gnus-msg.el" "gnus-score.el" "gnus-win.el" "gnus-topic.el"
-                "nnmail.el" "nntp.el" "message.el"))
+  (let ((files gnus-debug-files)
        (point (point))
        file expr olist sym)
     (gnus-message 4 "Please wait while we snoop your variables...")
@@ -1472,6 +1592,7 @@ The source file has to be in the Emacs load path."
              (ignore-errors
                (and (memq (car expr) '(defvar defcustom defvoo))
                     (stringp (nth 3 expr))
+                    (not (memq (nth 1 expr) gnus-debug-exclude-variables))
                     (or (not (boundp (nth 1 expr)))
                         (not (equal (eval (nth 2 expr))
                                     (symbol-value (nth 1 expr)))))
@@ -1710,6 +1831,7 @@ this is a reply."
                ;; Regexp string match on the group name.
                (string-match match group))
               ((eq match 'header)
+               ;; Obsolete format of header match.
                (and (gnus-buffer-live-p gnus-article-copy)
                     (with-current-buffer gnus-article-copy
                       (let ((header (message-fetch-field (pop style))))
@@ -1725,8 +1847,17 @@ this is a reply."
                  ;; Variable to be checked.
                  (symbol-value match))))
               ((listp match)
-               ;; This is a form to be evaled.
-               (eval match)))
+               (cond
+                ((eq (car match) 'header)
+                 ;; New format of header match.
+                 (and (gnus-buffer-live-p gnus-article-copy)
+                      (with-current-buffer gnus-article-copy
+                        (let ((header (message-fetch-field (nth 1 match))))
+                          (and header
+                               (string-match (nth 2 match) header))))))
+                (t
+                 ;; This is a form to be evaled.
+                 (eval match)))))
          ;; We have a match, so we set the variables.
          (dolist (attribute style)
            (setq element (pop attribute)
@@ -1755,13 +1886,20 @@ this is a reply."
                   ((listp value)
                    (eval value))))
            ;; Translate obsolescent value.
-           (when (eq element 'signature-file)
+           (cond
+            ((eq element 'signature-file)
              (setq element 'signature
                    filep t))
+            ((eq element 'x-face-file)
+             (setq element 'x-face
+                   filep t)))
            ;; Get the contents of file elems.
            (when (and filep v)
              (setq v (with-temp-buffer
                        (insert-file-contents v)
+                       (goto-char (point-max))
+                       (while (bolp)
+                         (delete-char -1))
                        (buffer-string))))
            (setq results (delq (assoc element results) results))
            (push (cons element v) results))))
index a577798..458729d 100644 (file)
@@ -162,8 +162,6 @@ options make any sense in this context."
   :group 'gnus-namazu)
 
 ;;; Internal Variable:
-(defvar gnus-namazu/group-alist nil
-  "Associative list to map groups in lower case to official names.")
 (defconst gnus-namazu/group-name-regexp "\\`nnvirtual:namazu-search\\?")
 
 ;; Multibyte group name:
@@ -207,21 +205,7 @@ options make any sense in this context."
             (setcdr pair gnus-namazu-coding-system)
           (push (cons gnus-namazu/group-name-regexp
                       gnus-namazu-coding-system)
-                gnus-group-name-charset-group-alist))))
-  (unless gnus-namazu-case-sensitive-filesystem
-    ;; FIXME: The alist to map group names in lower case to real names
-    ;; is reconstructed every when gnus-namazu/setup() is called.
-    ;; This reconstruction make gnus-namazu-search() slow.
-    (setq gnus-namazu/group-alist nil)
-    (dolist (server (gnus-namazu/indexed-servers))
-      (dolist (group (gnus-namazu/request-list server))
-       (let ((name (gnus-group-prefixed-name group server)))
-         (unless (assoc name gnus-namazu/group-alist)
-           (push (cons (downcase name) name) gnus-namazu/group-alist)))))))
-
-(defun gnus-namazu/shutdown ()
-  (setq gnus-namazu/group-alist nil))
-(add-hook 'gnus-exit-gnus-hook 'gnus-namazu/shutdown)
+                gnus-group-name-charset-group-alist)))))
 
 (defun gnus-namazu/request-list (server)
   "Return groups of the server SERVER."
@@ -279,9 +263,14 @@ options make any sense in this context."
   "Return the whole name from GROUP and METHOD."
   (if gnus-namazu-case-sensitive-filesystem
       (gnus-group-prefixed-name group method)
-    (let ((name (gnus-group-prefixed-name group method)))
-      (or (cdr (assoc (downcase name) gnus-namazu/group-alist))
-         name))))
+    (let* ((orig (gnus-group-prefixed-name group method))
+          (name (downcase orig)))
+      (catch 'found-group
+       (mapatoms (lambda (sym)
+                   (when (string= name (downcase (symbol-name sym)))
+                     (throw 'found-group (symbol-name sym))))
+                 gnus-newsrc-hashtb)
+       orig))))
 
 (defun gnus-namazu/check-cache-group (str)
   "Get the news group from the partial path STR of the cached article."
@@ -454,7 +443,7 @@ generate possible group names from it."
   (interactive)
   (let ((pos (point)))
     (cond
-     ((and (re-search-backward "\\+\\([a-z]*\\)" nil t)
+     ((and (re-search-backward "\\+\\([-a-z]*\\)" nil t)
           (= pos (match-end 0)))
       (let* ((partial (match-string 1))
             (completions
@@ -609,6 +598,23 @@ and make a virtual group contains its results."
                 '<)))
       (message "No entry."))))
 
+(let (current-load-list)
+  (defadvice gnus-offer-save-summaries
+    (before gnus-namazu-kill-summary-buffers activate compile)
+    "Advised by `gnus-namazu'.
+In order to avoid annoying questions, kill summary buffers which
+generated by `gnus-namazu' itself before `gnus-offer-save-summaries'
+is called."
+    (let ((buffers (buffer-list)))
+      (while buffers
+       (when (with-current-buffer (car buffers)
+               (and (eq major-mode 'gnus-summary-mode)
+                    (gnus-ephemeral-group-p gnus-newsgroup-name)
+                    (string-match gnus-namazu/group-name-regexp
+                                  gnus-newsgroup-name)))
+         (kill-buffer (car buffers)))
+       (setq buffers (cdr buffers))))))
+
 (defun gnus-namazu-insinuate ()
   (add-hook
    'gnus-group-mode-hook
index 9358c13..b609074 100644 (file)
@@ -1,6 +1,6 @@
 ;;; gnus-range.el --- range and sequence functions for Gnus
 
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -34,7 +34,7 @@
 (defsubst gnus-range-normalize (range)
   "Normalize RANGE.
 If RANGE is a single range, return (RANGE). Otherwise, return RANGE."
-  (if (listp (cdr range)) (list range) range))
+  (if (listp (cdr-safe range)) range (list range)))
 
 (defun gnus-last-element (list)
   "Return last element of LIST."
@@ -61,6 +61,43 @@ If RANGE is a single range, return (RANGE). Otherwise, return RANGE."
       (setq list2 (cdr list2)))
     list1))
 
+;;;###autoload
+(defun gnus-sorted-difference (list1 list2)
+  "Return a list of elements of LIST1 that do not appear in LIST2.
+Both lists have to be sorted over <.
+The tail of LIST1 is not copied."
+  (let (out)
+    (while (and list1 list2)
+      (cond ((= (car list1) (car list2))
+            (setq list1 (cdr list1)
+                  list2 (cdr list2)))
+           ((< (car list1) (car list2))
+            (setq out (cons (car list1) out))
+            (setq list1 (cdr list1)))
+           (t
+            (setq list2 (cdr list2)))))
+    (nconc (nreverse out) list1)))
+
+;;;###autoload
+(defun gnus-sorted-ndifference (list1 list2)
+  "Return a list of elements of LIST1 that do not appear in LIST2.
+Both lists have to be sorted over <.
+LIST1 is modified."
+  (let* ((top (cons nil list1))
+        (prev top))
+    (while (and list1 list2)
+      (cond ((= (car list1) (car list2))
+            (setcdr prev (cdr list1))
+            (setq list1 (cdr list1)
+                  list2 (cdr list2)))
+           ((< (car list1) (car list2))
+            (setq prev list1
+                  list1 (cdr list1)))
+           (t
+            (setq list2 (cdr list2)))))
+    (cdr top)))
+
+;;;###autoload
 (defun gnus-sorted-complement (list1 list2)
   "Return a list of elements that are in LIST1 or LIST2 but not both.
 Both lists have to be sorted over <."
@@ -79,6 +116,7 @@ Both lists have to be sorted over <."
               (setq list2 (cdr list2)))))
       (nconc (nreverse out) (or list1 list2)))))
 
+;;;###autoload
 (defun gnus-intersection (list1 list2)
   (let ((result nil))
     (while list2
@@ -87,8 +125,10 @@ Both lists have to be sorted over <."
       (setq list2 (cdr list2)))
     result))
 
+;;;###autoload
 (defun gnus-sorted-intersection (list1 list2)
-  ;; LIST1 and LIST2 have to be sorted over <.
+  "Return intersection of LIST1 and LIST2.
+LIST1 and LIST2 have to be sorted over <."
   (let (out)
     (while (and list1 list2)
       (cond ((= (car list1) (car list2))
@@ -101,9 +141,13 @@ Both lists have to be sorted over <."
             (setq list2 (cdr list2)))))
     (nreverse out)))
 
-(defun gnus-set-sorted-intersection (list1 list2)
-  ;; LIST1 and LIST2 have to be sorted over <.
-  ;; This function modifies LIST1.
+;;;###autoload
+(defalias 'gnus-set-sorted-intersection 'gnus-sorted-nintersection)
+
+;;;###autoload
+(defun gnus-sorted-nintersection (list1 list2)
+  "Return intersection of LIST1 and LIST2 by modifying cdr pointers of LIST1.
+LIST1 and LIST2 have to be sorted over <."
   (let* ((top (cons nil list1))
         (prev top))
     (while (and list1 list2)
@@ -119,6 +163,55 @@ Both lists have to be sorted over <."
     (setcdr prev nil)
     (cdr top)))
 
+;;;###autoload
+(defun gnus-sorted-union (list1 list2)
+  "Return union of LIST1 and LIST2.
+LIST1 and LIST2 have to be sorted over <."
+  (let (out)
+    (while (and list1 list2)
+      (cond ((= (car list1) (car list2))
+            (setq out (cons (car list1) out)
+                  list1 (cdr list1)
+                  list2 (cdr list2)))
+           ((< (car list1) (car list2))
+            (setq out (cons (car list1) out)
+                  list1 (cdr list1)))
+           (t
+            (setq out (cons (car list2) out)
+                  list2 (cdr list2)))))
+    (while list1
+      (setq out (cons (car list1) out)
+           list1 (cdr list1)))
+    (while list2
+      (setq out (cons (car list2) out)
+           list2 (cdr list2)))
+    (nreverse out)))
+
+;;;###autoload
+(defun gnus-sorted-nunion (list1 list2)
+  "Return union of LIST1 and LIST2 by modifying cdr pointers of LIST1.
+LIST1 and LIST2 have to be sorted over <."
+  (let* ((top (cons nil list1))
+        (prev top))
+    (while (and list1 list2)
+      (cond ((= (car list1) (car list2))
+            (setq prev list1
+                  list1 (cdr list1)
+                  list2 (cdr list2)))
+           ((< (car list1) (car list2))
+            (setq prev list1
+                  list1 (cdr list1)))
+           (t
+            (setcdr prev (list (car list2)))
+            (setq prev (cdr prev)
+                  list2 (cdr list2))
+            (setcdr prev list1))))
+    (while list2
+      (setcdr prev (list (car list2)))
+      (setq prev (cdr prev)
+           list2 (cdr list2)))
+    (cdr top)))
+
 (defun gnus-compress-sequence (numbers &optional always-list)
   "Convert list of numbers to a list of ranges or a single range.
 If ALWAYS-LIST is non-nil, this function will always release a list of
@@ -325,9 +418,58 @@ modified."
        (setq ranges (cdr ranges)))
       (not not-stop))))
 
+(defun gnus-list-range-intersection (list ranges)
+  "Return a list of numbers in LIST that are members of RANGES.
+LIST is a sorted list."
+  (setq ranges (gnus-range-normalize ranges))
+  (let (number result)
+    (while (setq number (pop list))
+      (while (and ranges
+                 (if (numberp (car ranges))
+                     (< (car ranges) number)
+                   (< (cdar ranges) number)))
+       (setq ranges (cdr ranges)))
+      (when (and ranges
+                (if (numberp (car ranges))
+                     (= (car ranges) number)
+                  ;; (caar ranges) <= number <= (cdar ranges)
+                  (>= number (caar ranges))))
+       (push number result)))
+    (nreverse result)))
+
+(defalias 'gnus-inverse-list-range-intersection 'gnus-list-range-difference)
+
+(defun gnus-list-range-difference (list ranges)
+  "Return a list of numbers in LIST that are not members of RANGES.
+LIST is a sorted list."
+  (setq ranges (gnus-range-normalize ranges))
+  (let (number result)
+    (while (setq number (pop list))
+      (while (and ranges
+                 (if (numberp (car ranges))
+                     (< (car ranges) number)
+                   (< (cdar ranges) number)))
+       (setq ranges (cdr ranges)))
+      (when (or (not ranges)
+               (if (numberp (car ranges))
+                   (not (= (car ranges) number))
+                 ;; not ((caar ranges) <= number <= (cdar ranges))
+                 (< number (caar ranges))))
+       (push number result)))
+    (nreverse result)))
+
 (defun gnus-range-length (range)
   "Return the length RANGE would have if uncompressed."
-  (length (gnus-uncompress-range range)))
+  (cond
+   ((null range)
+    0)
+   ((not (listp (cdr range)))
+    (- (cdr range) (car range) -1))
+   (t
+    (let ((sum 0))
+      (dolist (x range sum)
+       (setq sum
+             (+ sum (if (consp x) (- (cdr x) (car x) -1) 1))))))))
 
 (defun gnus-sublist-p (list sublist)
   "Test whether all elements in SUBLIST are members of LIST."
@@ -393,6 +535,18 @@ modified."
     (if item (push item range))
     (reverse range)))
 
+;;;###autoload
+(defun gnus-add-to-sorted-list (list num)
+  "Add NUM into sorted LIST by side effect."
+  (let* ((top (cons nil list))
+        (prev top))
+    (while (and list (< (car list) num))
+      (setq prev list
+           list (cdr list)))
+    (unless (eq (car list) num)
+      (setcdr prev (cons num list)))
+    (cdr top)))
+
 (provide 'gnus-range)
 
 ;;; gnus-range.el ends here
index 30eb81e..b99a41d 100644 (file)
@@ -770,10 +770,13 @@ used as score."
        (insert (format format (caar alist) (nth idx (car alist))))
        (setq alist (cdr alist))
        (setq i (1+ i))))
+    (goto-char (point-min))
     ;; display ourselves in a small window at the bottom
     (gnus-appt-select-lowest-window)
-    (split-window)
-    (pop-to-buffer "*Score Help*")
+    (if (< (/ (window-height) 2) window-min-height)
+       (switch-to-buffer "*Score Help*")
+      (split-window)
+      (pop-to-buffer "*Score Help*"))
     (let ((window-min-height 1))
       (shrink-window-if-larger-than-buffer))
     (select-window (gnus-get-buffer-window gnus-summary-buffer t))))
index 9b974a8..baa6c2b 100644 (file)
@@ -1,6 +1,6 @@
 ;;; gnus-soup.el --- SOUP packet writing support for Gnus
 
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002
 ;;     Free Software Foundation, Inc.
 
 ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
@@ -541,25 +541,35 @@ Return whether the unpacking was successful."
                                     (match-beginning 1) (match-end 1)))))
              (switch-to-buffer tmp-buf)
              (erase-buffer)
+             (set-buffer-multibyte nil)
              (insert-buffer-substring msg-buf beg end)
-             (goto-char (point-min))
-             (search-forward "\n\n")
-             (forward-char -1)
-             (insert mail-header-separator)
-             (setq message-user-agent (gnus-extended-version))
              (cond
               ((string= (gnus-soup-reply-kind (car replies)) "news")
                (gnus-message 5 "Sending news message to %s..."
                              (mail-fetch-field "newsgroups"))
                (sit-for 1)
                (let ((message-syntax-checks
-                      'dont-check-for-anything-just-trust-me))
-                 (funcall message-send-news-function)))
+                      'dont-check-for-anything-just-trust-me)
+                     (method (if (message-functionp message-post-method)
+                                 (funcall message-post-method)
+                               message-post-method))
+                     result)
+                 (run-hooks 'message-send-news-hook)
+                 (gnus-open-server method)
+                 (message "Sending news via %s..."
+                          (gnus-server-string method))
+                 (unless (let ((mail-header-separator ""))
+                           (gnus-request-post method))
+                   (message "Couldn't send message via news: %s"
+                            (nnheader-get-report (car method))))))
               ((string= (gnus-soup-reply-kind (car replies)) "mail")
                (gnus-message 5 "Sending mail to %s..."
                              (mail-fetch-field "to"))
                (sit-for 1)
-               (message-send-mail))
+               (let ((mail-header-separator ""))
+                 (mm-with-unibyte-current-buffer
+                  (funcall (or message-send-mail-real-function
+                               message-send-mail-function)))))
               (t
                (error "Unknown reply kind")))
              (set-buffer msg-buf)
index 9d6b543..98c24ad 100644 (file)
@@ -72,7 +72,7 @@ See (gnus)Formatting Variables."
   "Whether server browsing should take place in the group buffer.
 If nil, a faster, but more primitive, buffer is used instead."
   :group 'gnus-server-visual
-  :type 'string)
+  :type 'boolean)
 
 ;;; Internal variables.
 
@@ -380,7 +380,11 @@ The following commands are available:
      (concat "(gnus-server-set-info \"" server "\" '"
             (prin1-to-string info) ")"))
     (let* ((server (nth 1 info))
-          (entry (assoc server gnus-server-alist)))
+          (entry (assoc server gnus-server-alist))
+          (cached (assoc server gnus-server-method-cache)))
+      (if cached
+         (setq gnus-server-method-cache
+               (delq cached gnus-server-method-cache)))
       (if entry (setcdr entry info)
        (setq gnus-server-alist
              (nconc gnus-server-alist (list (cons server info))))))))
index 705b9ce..cf4b856 100644 (file)
@@ -311,7 +311,7 @@ hierarchy in its entirety."
   :type 'boolean)
 
 (defcustom gnus-auto-subscribed-groups
-  "^nnml\\|^nnfolder\\|^nnmbox\\|^nnmh\\|^nnbabyl"
+  "^nnml\\|^nnfolder\\|^nnmbox\\|^nnmh\\|^nnbabyl\\|^nnmaildir"
   "*All new groups that match this regexp will be subscribed automatically.
 Note that this variable only deals with new groups.  It has no effect
 whatsoever on old groups.
@@ -457,7 +457,7 @@ Can be used to turn version control on or off."
            (condition-case var
                (load file nil t)
              (error
-              (error "Error in %s: %s" file var)))))))))
+              (error "Error in %s: %s" file (cadr var))))))))))
 
 ;; For subscribing new newsgroup
 
@@ -715,6 +715,8 @@ prompt the user for the name of an NNTP server to use."
     (nnheader-init-server-buffer)
     (setq gnus-slave slave)
     (gnus-read-init-file)
+    (if gnus-agent
+       (gnus-agentize))
 
     (when gnus-simple-splash
       (setq gnus-simple-splash nil)
@@ -1575,6 +1577,7 @@ newsgroup."
 ;; Go though `gnus-newsrc-alist' and compare with `gnus-active-hashtb'
 ;; and compute how many unread articles there are in each group.
 (defun gnus-get-unread-articles (&optional level)
+  (setq gnus-server-method-cache nil)
   (let* ((newsrc (cdr gnus-newsrc-alist))
         (level (or level gnus-activate-level (1+ gnus-level-subscribed)))
         (foreign-level
@@ -1942,7 +1945,7 @@ newsgroup."
     (goto-char (point-min))
     (let (group max min)
       (while (not (eobp))
-       (condition-case err
+       (condition-case ()
            (progn
              (narrow-to-region (point) (gnus-point-at-eol))
              ;; group gets set to a symbol interned in the hash table
@@ -2742,7 +2745,7 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
   (save-excursion
     (set-buffer gnus-dribble-buffer)
     (let ((slave-name
-          (make-temp-name (concat gnus-current-startup-file "-slave-")))
+          (mm-make-temp-file (concat gnus-current-startup-file "-slave-")))
          (modes (ignore-errors
                   (file-modes (concat gnus-current-startup-file ".eld")))))
       (gnus-write-buffer-as-coding-system gnus-ding-file-coding-system
@@ -2871,7 +2874,8 @@ The backup file \".newsrc.eld_\" will be created before re-reading."
                     (name (symbol-name group))
                     (charset
                      (or (gnus-group-name-charset method name)
-                         (gnus-parameter-charset name))))
+                         (gnus-parameter-charset name)
+                         gnus-default-charset)))
                (when (and str charset (featurep 'mule))
                  (setq str (decode-coding-string str charset)))
                (set group str)))
index 71c0525..9cfd3a7 100644 (file)
 
 (autoload 'gnus-summary-limit-include-cached "gnus-cache" nil t)
 (autoload 'gnus-cache-write-active "gnus-cache")
-(autoload 'gnus-set-summary-default-charset "gnus-i18n" nil t)
 (autoload 'gnus-mailing-list-insinuate "gnus-ml" nil t)
 (autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" nil t)
 (autoload 'mm-uu-dissect "mm-uu")
+(autoload 'gnus-article-outlook-deuglify-article "deuglify" 
+  "Deuglify broken Outlook (Express) articles and redisplay."
+  t)
 
 (defcustom gnus-kill-summary-on-exit t
   "*If non-nil, kill the summary buffer when you exit from it.
@@ -310,13 +312,13 @@ higest-scored article), `unseen' (place point on the subject line of
 the first unseen article), 'unseen-or-unread' (place point on the subject
 line of the first unseen article or, if all article have been seen, on the
 subject line of the first unread article), or a function to be called to
-place point on some subject line.."
+place point on some subject line."
   :group 'gnus-group-select
   :type '(choice (const best)
                 (const unread)
                 (const first)
                 (const unseen)
-                (const unseen-or-unread)))
+                (const unseen-or-unread)))
 
 (defcustom gnus-dont-select-after-jump-to-other-group nil
   "If non-nil, don't select the first unread article after entering the
@@ -444,6 +446,11 @@ this variable specifies group names."
   :group 'gnus-summary-marks
   :type 'character)
 
+(defcustom gnus-spam-mark ?H
+  "*Mark used for spam articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
 (defcustom gnus-souped-mark ?F
   "*Mark used for souped articles."
   :group 'gnus-summary-marks
@@ -560,7 +567,7 @@ this variable specifies group names."
   :type 'boolean)
 
 (defcustom gnus-auto-expirable-marks
-  (list gnus-killed-mark gnus-del-mark gnus-catchup-mark
+  (list gnus-spam-mark gnus-killed-mark gnus-del-mark gnus-catchup-mark
        gnus-low-score-mark gnus-ancient-mark gnus-read-mark
        gnus-souped-mark gnus-duplicate-mark)
   "*The list of marks converted into expiration if a group is auto-expirable."
@@ -604,7 +611,7 @@ with some simple extensions.
 %S  The subject
 
 General format specifiers can also be used.
-See (gnus)Formatting Variables."
+See `(gnus)Formatting Variables'."
   :link '(custom-manual "(gnus)Formatting Variables")
   :group 'gnus-threading
   :type 'string)
@@ -808,7 +815,7 @@ is not run if `gnus-visual' is nil."
   :group 'gnus-summary-visual
   :type 'hook)
 
-(defcustom gnus-parse-headers-hook '(gnus-set-summary-default-charset)
+(defcustom gnus-parse-headers-hook '(gnus-summary-inherit-default-charset)
   "*A hook called before parsing the headers."
   :group 'gnus-various
   :type 'hook)
@@ -861,30 +868,30 @@ automatically when it is selected."
   :type 'face)
 
 (defcustom gnus-summary-highlight
-  '(((= mark gnus-canceled-mark)
+  '(((eq mark gnus-canceled-mark)
      . gnus-summary-cancelled-face)
     ((and (> score default-high)
-         (or (= mark gnus-dormant-mark)
-             (= mark gnus-ticked-mark)))
+         (or (eq mark gnus-dormant-mark)
+             (eq mark gnus-ticked-mark)))
      . gnus-summary-high-ticked-face)
     ((and (< score default-low)
-         (or (= mark gnus-dormant-mark)
-             (= mark gnus-ticked-mark)))
+         (or (eq mark gnus-dormant-mark)
+             (eq mark gnus-ticked-mark)))
      . gnus-summary-low-ticked-face)
-    ((or (= mark gnus-dormant-mark)
-        (= mark gnus-ticked-mark))
+    ((or (eq mark gnus-dormant-mark)
+        (eq mark gnus-ticked-mark))
      . gnus-summary-normal-ticked-face)
-    ((and (> score default-high) (= mark gnus-ancient-mark))
+    ((and (> score default-high) (eq mark gnus-ancient-mark))
      . gnus-summary-high-ancient-face)
-    ((and (< score default-low) (= mark gnus-ancient-mark))
+    ((and (< score default-low) (eq mark gnus-ancient-mark))
      . gnus-summary-low-ancient-face)
-    ((= mark gnus-ancient-mark)
+    ((eq mark gnus-ancient-mark)
      . gnus-summary-normal-ancient-face)
-    ((and (> score default-high) (= mark gnus-unread-mark))
+    ((and (> score default-high) (eq mark gnus-unread-mark))
      . gnus-summary-high-unread-face)
-    ((and (< score default-low) (= mark gnus-unread-mark))
+    ((and (< score default-low) (eq mark gnus-unread-mark))
      . gnus-summary-low-unread-face)
-    ((= mark gnus-unread-mark)
+    ((eq mark gnus-unread-mark)
      . gnus-summary-normal-unread-face)
     ((and (> score default-high) (memq mark (list gnus-downloadable-mark
                                                  gnus-undownloaded-mark)))
@@ -1042,14 +1049,6 @@ when prompting the user for which type of files to save."
   :group 'gnus-summary
   :type 'regexp)
 
-
-(defcustom gnus-summary-save-parts-default-mime "image/.*"
-  "*A regexp to match MIME parts when saving multiple parts of a message
-with gnus-summary-save-parts (X m). This regexp will be used by default
-when prompting the user for which type of files to save."
-  :group 'gnus-summary
-  :type 'regexp)
-
 (defcustom gnus-read-all-available-headers nil
   "Whether Gnus should parse all headers made available to it.
 This is mostly relevant for slow backends where the user may
@@ -1060,9 +1059,20 @@ that were fetched.  Say, for nnultimate groups."
 
 (defcustom gnus-summary-muttprint-program "muttprint"
   "Command (and optional arguments) used to run Muttprint."
+  :version "21.3"
   :group 'gnus-summary
   :type 'string)
 
+(defcustom gnus-article-loose-mime nil
+  "If non-nil, don't require MIME-Version header.
+Some brain-damaged MUA/MTA, e.g. Lotus Domino 5.0.6 clients, does not
+supply the MIME-Version header or deliberately strip it From the mail.
+Set it to non-nil, Gnus will treat some articles as MIME even if
+the MIME-Version header is missed."
+  :version "21.3"
+  :type 'boolean
+  :group 'gnus-article)
+
 ;;; Internal variables
 
 (defvar gnus-summary-display-cache nil)
@@ -1086,9 +1096,6 @@ that were fetched.  Say, for nnultimate groups."
 (defvar gnus-summary-save-parts-type-history nil)
 (defvar gnus-summary-save-parts-last-directory nil)
 
-(defvar gnus-summary-save-parts-type-history nil)
-(defvar gnus-summary-save-parts-last-directory nil)
-
 ;; Avoid highlighting in kill files.
 (defvar gnus-summary-inhibit-highlight nil)
 (defvar gnus-newsgroup-selected-overlay nil)
@@ -1203,10 +1210,10 @@ end position and text.")
 (defvar gnus-newsgroup-limits nil)
 
 (defvar gnus-newsgroup-unreads nil
-  "List of unread articles in the current newsgroup.")
+  "Sorted list of unread articles in the current newsgroup.")
 
 (defvar gnus-newsgroup-unselected nil
-  "List of unselected unread articles in the current newsgroup.")
+  "Sorted list of unselected unread articles in the current newsgroup.")
 
 (defvar gnus-newsgroup-reads nil
   "Alist of read articles and article marks in the current newsgroup.")
@@ -1214,13 +1221,13 @@ end position and text.")
 (defvar gnus-newsgroup-expunged-tally nil)
 
 (defvar gnus-newsgroup-marked nil
-  "List of ticked articles in the current newsgroup (a subset of unread art).")
+  "Sorted list of ticked articles in the current newsgroup (a subset of unread art).")
 
 (defvar gnus-newsgroup-killed nil
   "List of ranges of articles that have been through the scoring process.")
 
 (defvar gnus-newsgroup-cached nil
-  "List of articles that come from the article cache.")
+  "Sorted list of articles that come from the article cache.")
 
 (defvar gnus-newsgroup-saved nil
   "List of articles that have been saved.")
@@ -1237,13 +1244,13 @@ end position and text.")
   "List of articles that have are recent in the current newsgroup.")
 
 (defvar gnus-newsgroup-expirable nil
-  "List of articles in the current newsgroup that can be expired.")
+  "Sorted list of articles in the current newsgroup that can be expired.")
 
 (defvar gnus-newsgroup-processable nil
   "List of articles in the current newsgroup that can be processed.")
 
 (defvar gnus-newsgroup-downloadable nil
-  "List of articles in the current newsgroup that can be processed.")
+  "Sorted list of articles in the current newsgroup that can be processed.")
 
 (defvar gnus-newsgroup-undownloaded nil
   "List of articles in the current newsgroup that haven't been downloaded..")
@@ -1255,7 +1262,7 @@ end position and text.")
   "List of articles in the current newsgroup that have bookmarks.")
 
 (defvar gnus-newsgroup-dormant nil
-  "List of dormant articles in the current newsgroup.")
+  "Sorted list of dormant articles in the current newsgroup.")
 
 (defvar gnus-newsgroup-unseen nil
   "List of unseen articles in the current newsgroup.")
@@ -1746,6 +1753,8 @@ increase the score of each group you read."
     "C" gnus-article-capitalize-sentences
     "c" gnus-article-remove-cr
     "Z" gnus-article-decode-HZ
+    "h" gnus-article-wash-html
+    "u" gnus-article-unsplit-urls
     "f" gnus-article-display-x-face
     "l" gnus-summary-stop-page-breaking
     "r" gnus-summary-caesar-message
@@ -1755,7 +1764,8 @@ increase the score of each group you read."
     "m" gnus-summary-toggle-mime
     "a" gnus-article-strip-headers-in-body ;; mnemonic: wash archive
     "p" gnus-article-verify-x-pgp-sig
-    "d" gnus-article-treat-dumbquotes)
+    "d" gnus-article-treat-dumbquotes
+    "k" gnus-article-outlook-deuglify-article)
 
   (gnus-define-keys (gnus-summary-wash-hide-map "W" gnus-summary-wash-map)
     "a" gnus-article-hide
@@ -1853,10 +1863,57 @@ increase the score of each group you read."
     "o" gnus-article-save-part
     "c" gnus-article-copy-part
     "C" gnus-article-view-part-as-charset
-    "e" gnus-article-externalize-part
+    "e" gnus-article-view-part-externally
     "E" gnus-article-encrypt-body
     "i" gnus-article-inline-part
-    "|" gnus-article-pipe-part))
+    "|" gnus-article-pipe-part)
+
+  (gnus-define-keys (gnus-uu-mark-map "P" gnus-summary-mark-map)
+    "p" gnus-summary-mark-as-processable
+    "u" gnus-summary-unmark-as-processable
+    "U" gnus-summary-unmark-all-processable
+    "v" gnus-uu-mark-over
+    "s" gnus-uu-mark-series
+    "r" gnus-uu-mark-region
+    "g" gnus-uu-unmark-region
+    "R" gnus-uu-mark-by-regexp
+    "G" gnus-uu-unmark-by-regexp
+    "t" gnus-uu-mark-thread
+    "T" gnus-uu-unmark-thread
+    "a" gnus-uu-mark-all
+    "b" gnus-uu-mark-buffer
+    "S" gnus-uu-mark-sparse
+    "k" gnus-summary-kill-process-mark
+    "y" gnus-summary-yank-process-mark
+    "w" gnus-summary-save-process-mark
+    "i" gnus-uu-invert-processable)
+
+  (gnus-define-keys (gnus-uu-extract-map "X" gnus-summary-mode-map)
+    ;;"x" gnus-uu-extract-any
+    "m" gnus-summary-save-parts
+    "u" gnus-uu-decode-uu
+    "U" gnus-uu-decode-uu-and-save
+    "s" gnus-uu-decode-unshar
+    "S" gnus-uu-decode-unshar-and-save
+    "o" gnus-uu-decode-save
+    "O" gnus-uu-decode-save
+    "b" gnus-uu-decode-binhex
+    "B" gnus-uu-decode-binhex
+    "p" gnus-uu-decode-postscript
+    "P" gnus-uu-decode-postscript-and-save)
+
+  (gnus-define-keys
+      (gnus-uu-extract-view-map "v" gnus-uu-extract-map)
+    "u" gnus-uu-decode-uu-view
+    "U" gnus-uu-decode-uu-and-save-view
+    "s" gnus-uu-decode-unshar-view
+    "S" gnus-uu-decode-unshar-and-save-view
+    "o" gnus-uu-decode-save-view
+    "O" gnus-uu-decode-save-view
+    "b" gnus-uu-decode-binhex-view
+    "B" gnus-uu-decode-binhex-view
+    "p" gnus-uu-decode-postscript-view
+    "P" gnus-uu-decode-postscript-and-save-view))
 
 (defvar gnus-article-post-menu nil)
 
@@ -1923,7 +1980,29 @@ increase the score of each group you read."
              ["Show X-Face" gnus-article-display-x-face t]
              ["Show picons in From" gnus-treat-from-picon t]
              ["Show picons in mail headers" gnus-treat-mail-picon t]
-             ["Show picons in news headers" gnus-treat-newsgroups-picon t])
+             ["Show picons in news headers" gnus-treat-newsgroups-picon t]
+             ("View as different encoding"
+              ,@(mapcar
+                 (lambda (cs)
+                   ;; Since easymenu under FSF Emacs doesn't allow lambda
+                   ;; forms for menu commands, we should provide intern'ed
+                   ;; function symbols.
+                   (let ((command (intern (format "\
+gnus-summary-show-article-from-menu-as-charset-%s" cs))))
+                     (fset command
+                           `(lambda ()
+                              (interactive)
+                              (let ((gnus-summary-show-article-charset-alist
+                                     '((1 . ,cs))))
+                                (gnus-summary-show-article 1))))
+                     `[,(symbol-name cs) ,command t]))
+                 (sort (if (fboundp 'coding-system-list)
+                           (coding-system-list)
+                         ;;(mapcar 'car mm-mime-mule-charset-alist)
+                         )
+                       (lambda (a b)
+                         (string< (symbol-name a)
+                                  (symbol-name b)))))))
             ("Washing"
              ("Remove Blanks"
               ["Leading" gnus-article-strip-leading-blank-lines t]
@@ -1954,8 +2033,12 @@ increase the score of each group you read."
              ["Toggle header" gnus-summary-toggle-header t]
              ["Unfold headers" gnus-article-treat-unfold-headers t]
              ["Fold newsgroups" gnus-article-treat-fold-newsgroups t]
+             ["Html" gnus-article-wash-html t]
+             ["URLs" gnus-article-unsplit-urls t]
              ["Verify X-PGP-Sig" gnus-article-verify-x-pgp-sig t]
-             ["HZ" gnus-article-decode-HZ t])
+             ["HZ" gnus-article-decode-HZ t]
+             ["OutlooK deuglify" gnus-article-outlook-deuglify-article t]
+             )
             ("Output"
              ["Save in default format" gnus-summary-save-article
               ,@(if (featurep 'xemacs) '(t)
@@ -2083,6 +2166,7 @@ increase the score of each group you read."
        ["Digest and mail" gnus-summary-digest-mail-forward t]
        ["Digest and post" gnus-summary-digest-post-forward t]
        ["Resend message" gnus-summary-resend-message t]
+       ["Resend message edit" gnus-summary-resend-message-edit t]
        ["Send bounced mail" gnus-summary-resend-bounced-mail t]
        ["Send a mail" gnus-summary-mail-other-window t]
        ["Create a local message" gnus-summary-news-other-window t]
@@ -2954,17 +3038,19 @@ buffer that was in action when the last article was fetched."
           0 nil 128 t nil "" nil 1)
          (goto-char (point-min))
          (setq pos (list (cons 'unread (and (search-forward "\200" nil t)
-                                            (- (point) 2)))))
+                                            (- (point) (point-min) 1)))))
          (goto-char (point-min))
          (push (cons 'replied (and (search-forward "\201" nil t)
-                                   (- (point) 2)))
+                                   (- (point) (point-min) 1)))
                pos)
          (goto-char (point-min))
-         (push (cons 'score (and (search-forward "\202" nil t) (- (point) 2)))
+         (push (cons 'score (and (search-forward "\202" nil t)
+                                 (- (point) (point-min) 1)))
                pos)
          (goto-char (point-min))
          (push (cons 'download
-                     (and (search-forward "\203" nil t) (- (point) 2)))
+                     (and (search-forward "\203" nil t)
+                          (- (point) (point-min) 1)))
                pos)))
       (setq gnus-summary-mark-positions pos))))
 
@@ -3556,13 +3642,13 @@ if it was already present.
 
 If `gnus-summary-ignore-duplicates' is nil then duplicate Message-IDs
 will not be entered in the DEPENDENCIES table.  Otherwise duplicate
-Message-IDs will be renamed be renamed to a unique Message-ID before
-being entered.
+Message-IDs will be renamed to a unique Message-ID before being
+entered.
 
 Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
   (let* ((id (mail-header-id header))
         (id-dep (and id (intern id dependencies)))
-        ref ref-dep ref-header)
+        ref ref-dep ref-header replaced)
     ;; Enter this `header' in the `dependencies' table.
     (cond
      ((not id-dep)
@@ -3579,7 +3665,8 @@ Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
      (force-new
       ;; Overrides an existing entry;
       ;; just set the header part of the entry.
-      (setcar (symbol-value id-dep) header))
+      (setcar (symbol-value id-dep) header)
+      (setq replaced t))
 
      ;; Renames the existing `header' to a unique Message-ID.
      ((not gnus-summary-ignore-duplicates)
@@ -3602,8 +3689,8 @@ Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
               (or (mail-header-xref header) "")))
       (setq header nil)))
 
-    (when header
-      ;; First check if that we are not creating a References loop.
+    (when (and header (not replaced))
+      ;; First check that we are not creating a References loop.
       (setq ref (gnus-parent-id (mail-header-references header)))
       (while (and ref
                  (setq ref-dep (intern-soft ref dependencies))
@@ -3625,6 +3712,11 @@ Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
        (set ref-dep (list nil (symbol-value id-dep)))))
     header))
 
+(defun gnus-extract-message-id-from-in-reply-to (string)
+  (if (string-match "<[^>]+>" string)
+      (substring string (match-beginning 0) (match-end 0))
+    nil))
+
 (defun gnus-build-sparse-threads ()
   (let ((headers gnus-newsgroup-headers)
        (mail-parse-charset gnus-newsgroup-charset)
@@ -3701,7 +3793,7 @@ Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
 (defsubst gnus-nov-parse-line (number dependencies &optional force-new)
   (let ((eol (gnus-point-at-eol))
        (buffer (current-buffer))
-       header)
+       header references in-reply-to)
 
     ;; overview: [num subject from date id refs chars lines misc]
     (unwind-protect
@@ -3728,6 +3820,12 @@ Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
 
       (widen))
 
+    (when (and (string= references "")
+              (setq in-reply-to (mail-header-extra header))
+              (setq in-reply-to (cdr (assq 'In-Reply-To in-reply-to))))
+      (mail-header-set-references
+       header (gnus-extract-message-id-from-in-reply-to in-reply-to)))
+
     (when gnus-alter-header-function
       (funcall gnus-alter-header-function header))
     (gnus-dependencies-add-header header dependencies force-new)))
@@ -3762,7 +3860,9 @@ the id of the parent article (if any)."
          (push header gnus-newsgroup-headers)
          (if (memq number gnus-newsgroup-unselected)
              (progn
-               (push number gnus-newsgroup-unreads)
+               (setq gnus-newsgroup-unreads
+                     (gnus-add-to-sorted-list gnus-newsgroup-unreads
+                                              number))
                (setq gnus-newsgroup-unselected
                      (delq number gnus-newsgroup-unselected)))
            (push number gnus-newsgroup-ancient)))))))
@@ -3788,7 +3888,9 @@ the id of the parent article (if any)."
              (if (memq (setq article (mail-header-number header))
                        gnus-newsgroup-unselected)
                  (progn
-                   (push article gnus-newsgroup-unreads)
+                   (setq gnus-newsgroup-unreads
+                         (gnus-add-to-sorted-list
+                          gnus-newsgroup-unreads article))
                    (setq gnus-newsgroup-unselected
                          (delq article gnus-newsgroup-unselected)))
                (push article gnus-newsgroup-ancient)))
@@ -4262,20 +4364,32 @@ Unscored articles will be counted as having a score of zero."
 
 (defvar gnus-tmp-thread-tree-header-string "")
 
-(defvar gnus-sum-thread-tree-root "> "
+(defcustom gnus-sum-thread-tree-root "> "
   "With %B spec, used for the root of a thread.
-If nil, use subject instead.")
-(defvar gnus-sum-thread-tree-single-indent ""
+If nil, use subject instead."
+  :type 'string
+  :group 'gnus-thread)
+(defcustom gnus-sum-thread-tree-single-indent ""
   "With %B spec, used for a thread with just one message.
-If nil, use subject instead.")
-(defvar gnus-sum-thread-tree-vertical "| "
-  "With %B spec, used for drawing a vertical line.")
-(defvar gnus-sum-thread-tree-indent "  "
-  "With %B spec, used for indenting.")
-(defvar gnus-sum-thread-tree-leaf-with-other "+-> "
-  "With %B spec, used for a leaf with brothers.")
-(defvar gnus-sum-thread-tree-single-leaf "\\-> "
-  "With %B spec, used for a leaf without brothers.")
+If nil, use subject instead."
+  :type 'string
+  :group 'gnus-thread)
+(defcustom gnus-sum-thread-tree-vertical "| "
+  "With %B spec, used for drawing a vertical line."
+  :type 'string
+  :group 'gnus-thread)
+(defcustom gnus-sum-thread-tree-indent "  "
+  "With %B spec, used for indenting."
+  :type 'string
+  :group 'gnus-thread)
+(defcustom gnus-sum-thread-tree-leaf-with-other "+-> "
+  "With %B spec, used for a leaf with brothers."
+  :type 'string
+  :group 'gnus-thread)
+(defcustom gnus-sum-thread-tree-single-leaf "\\-> "
+  "With %B spec, used for a leaf without brothers."
+  :type 'string
+  :group 'gnus-thread)
 
 (defun gnus-summary-prepare-threads (threads)
   "Prepare summary buffer from THREADS and indentation LEVEL.
@@ -4419,7 +4533,9 @@ or a straight list of headers."
            (setq gnus-newsgroup-unreads
                  (delq number gnus-newsgroup-unreads))
            (if gnus-newsgroup-auto-expire
-               (push number gnus-newsgroup-expirable)
+               (setq gnus-newsgroup-expirable
+                     (gnus-add-to-sorted-list
+                      gnus-newsgroup-expirable number))
              (push (cons number gnus-low-score-mark)
                    gnus-newsgroup-reads))))
 
@@ -4711,8 +4827,9 @@ If SELECT-ARTICLES, only select those articles from GROUP."
       (setq cached gnus-newsgroup-cached))
 
     (setq gnus-newsgroup-unreads
-         (gnus-set-difference
-          (gnus-set-difference gnus-newsgroup-unreads gnus-newsgroup-marked)
+         (gnus-sorted-ndifference
+          (gnus-sorted-ndifference gnus-newsgroup-unreads
+                                   gnus-newsgroup-marked)
           gnus-newsgroup-dormant))
 
     (setq gnus-newsgroup-processable nil)
@@ -4725,9 +4842,7 @@ If SELECT-ARTICLES, only select those articles from GROUP."
 
     (if (setq articles select-articles)
        (setq gnus-newsgroup-unselected
-             (gnus-sorted-intersection
-              gnus-newsgroup-unreads
-              (gnus-sorted-complement gnus-newsgroup-unreads articles)))
+             (gnus-sorted-difference gnus-newsgroup-unreads articles))
       (setq articles (gnus-articles-to-read group read-all)))
 
     (cond
@@ -4759,20 +4874,13 @@ If SELECT-ARTICLES, only select those articles from GROUP."
                    gnus-newsgroup-headers))
       (setq gnus-newsgroup-articles fetched-articles)
       (setq gnus-newsgroup-unreads
-           (gnus-set-sorted-intersection
+           (gnus-sorted-nintersection
             gnus-newsgroup-unreads fetched-articles))
-
-      ;; The `seen' marks are treated specially.
-      (if (not gnus-newsgroup-seen)
-         (setq gnus-newsgroup-unseen gnus-newsgroup-articles)
-       (dolist (article gnus-newsgroup-articles)
-         (unless (gnus-member-of-range article gnus-newsgroup-seen)
-           (push article gnus-newsgroup-unseen)))
-       (setq gnus-newsgroup-unseen (nreverse gnus-newsgroup-unseen)))
+      (gnus-compute-unseen-list)
 
       ;; Removed marked articles that do not exist.
       (gnus-update-missing-marks
-       (gnus-sorted-complement fetched-articles articles))
+       (gnus-sorted-difference articles fetched-articles))
       ;; We might want to build some more threads first.
       (when (and gnus-fetch-old-headers
                 (eq gnus-headers-retrieved-by 'nov))
@@ -4801,19 +4909,29 @@ If SELECT-ARTICLES, only select those articles from GROUP."
       ;; GROUP is successfully selected.
       (or gnus-newsgroup-headers t)))))
 
+(defun gnus-compute-unseen-list ()
+  ;; The `seen' marks are treated specially.
+  (if (not gnus-newsgroup-seen)
+      (setq gnus-newsgroup-unseen gnus-newsgroup-articles)
+    (setq gnus-newsgroup-unseen
+         (gnus-inverse-list-range-intersection
+          gnus-newsgroup-articles gnus-newsgroup-seen))))
+
 (defun gnus-summary-display-make-predicate (display)
   (require 'gnus-agent)
   (when (= (length display) 1)
     (setq display (car display)))
   (unless gnus-summary-display-cache
-    (dolist (elem (append (list (cons 'read 'read)
-                               (cons 'unseen 'unseen))
+    (dolist (elem (append '((unread . unread)
+                           (read . read)
+                           (unseen . unseen))
                          gnus-article-mark-lists))
       (push (cons (cdr elem)
                  (gnus-byte-compile
                   `(lambda () (gnus-article-marked-p ',(cdr elem)))))
            gnus-summary-display-cache)))
-  (let ((gnus-category-predicate-alist gnus-summary-display-cache))
+  (let ((gnus-category-predicate-alist gnus-summary-display-cache)
+       (gnus-category-predicate-cache gnus-summary-display-cache))
     (gnus-get-predicate display)))
 
 ;; Uses the dynamically bound `number' variable.
@@ -4865,7 +4983,8 @@ If SELECT-ARTICLES, only select those articles from GROUP."
          (if (or read-all
                  (and (zerop (length gnus-newsgroup-marked))
                       (zerop (length gnus-newsgroup-unreads)))
-                 (eq gnus-newsgroup-display 'gnus-not-ignore))
+                 ;; Fetch all if the predicate is non-nil.
+                 gnus-newsgroup-display)
              ;; We want to select the headers for all the articles in
              ;; the group, so we select either all the active
              ;; articles in the group, or (if that's nil), the
@@ -4874,9 +4993,9 @@ If SELECT-ARTICLES, only select those articles from GROUP."
               (gnus-uncompress-range (gnus-active group))
               (gnus-cache-articles-in-group group))
            ;; Select only the "normal" subset of articles.
-           (sort (append gnus-newsgroup-dormant gnus-newsgroup-marked
-                         (copy-sequence gnus-newsgroup-unreads))
-                 '<)))
+           (gnus-sorted-nunion
+            (gnus-sorted-union gnus-newsgroup-dormant gnus-newsgroup-marked)
+            gnus-newsgroup-unreads)))
         (scored-list (gnus-killed-articles gnus-newsgroup-killed articles))
         (scored (length scored-list))
         (number (length articles))
@@ -4886,26 +5005,30 @@ If SELECT-ARTICLES, only select those articles from GROUP."
          (cond
           ((numberp read-all)
            read-all)
+          ((numberp gnus-newsgroup-display)
+           gnus-newsgroup-display)
           (t
            (condition-case ()
                (cond
                 ((and (or (<= scored marked) (= scored number))
-                      (natnump gnus-large-newsgroup)
+                      (numberp gnus-large-newsgroup)
                       (> number gnus-large-newsgroup))
                  (let* ((cursor-in-echo-area nil)
+                        (initial (gnus-parameter-large-newsgroup-initial
+                                  gnus-newsgroup-name))
                         (input
-                         (read-from-minibuffer
+                         (read-string
                           (format
-                           "How many articles from %s (max %d): "
+                           "How many articles from %s (%s %d): "
                            (gnus-limit-string
                             (gnus-group-decoded-name gnus-newsgroup-name)
                             35)
+                           (if initial "max" "default")
                            number)
-                          (cons (number-to-string gnus-large-newsgroup)
-                                0))))
-                   (if (string-match "^[ \t]*$" input)
-                       number
-                     input)))
+                          (if initial
+                              (cons (number-to-string initial)
+                                    0)))))
+                   (if (string-match "^[ \t]*$" input) number input)))
                 ((and (> scored marked) (< scored number)
                       (> (- scored number) 20))
                  (let ((input
@@ -4936,9 +5059,7 @@ If SELECT-ARTICLES, only select those articles from GROUP."
          ;; Select the N most recent articles.
          (setq articles (nthcdr (- number select) articles))))
       (setq gnus-newsgroup-unselected
-           (gnus-sorted-intersection
-            gnus-newsgroup-unreads
-            (gnus-sorted-complement gnus-newsgroup-unreads articles)))
+           (gnus-sorted-difference gnus-newsgroup-unreads articles))
       (when gnus-alter-articles-to-read-function
        (setq gnus-newsgroup-unreads
              (sort
@@ -5506,29 +5627,24 @@ Return a list of headers that match SEQUENCE (see
       ;; Allow the user to mangle the headers before parsing them.
       (gnus-run-hooks 'gnus-parse-headers-hook)
       (goto-char (point-min))
-      (while (not (eobp))
-       (condition-case ()
-           (while (and (or sequence allp)
-                       (not (eobp)))
-             (setq number (read cur))
-             (when (not allp)
-               (while (and sequence
-                           (< (car sequence) number))
-                 (setq sequence (cdr sequence))))
-             (when (and (or allp
-                            (and sequence
-                                 (eq number (car sequence))))
-                        (progn
-                          (setq sequence (cdr sequence))
-                          (setq header (inline
-                                         (gnus-nov-parse-line
-                                          number dependencies force-new)))))
-               (push header headers))
-             (forward-line 1))
-         (error
-          (gnus-error 4 "Strange nov line (%d)"
-                      (count-lines (point-min) (point)))))
-       (forward-line 1))
+      (gnus-parse-without-error
+       (while (and (or sequence allp)
+                   (not (eobp)))
+         (setq number (read cur))
+         (when (not allp)
+           (while (and sequence
+                       (< (car sequence) number))
+             (setq sequence (cdr sequence))))
+         (when (and (or allp
+                        (and sequence
+                             (eq number (car sequence))))
+                    (progn
+                      (setq sequence (cdr sequence))
+                      (setq header (inline
+                                     (gnus-nov-parse-line
+                                      number dependencies force-new)))))
+           (push header headers))
+         (forward-line 1)))
       ;; A common bug in inn is that if you have posted an article and
       ;; then retrieves the active file, it will answer correctly --
       ;; the new article is included.  However, a NOV entry for the
@@ -5927,13 +6043,13 @@ displayed, no centering will be performed."
         (marked (gnus-info-marks info))
         (active (gnus-active group)))
     (and info active
-        (gnus-set-difference
-         (gnus-sorted-complement
-          (gnus-uncompress-range active)
-          (gnus-list-of-unread-articles group))
-         (append
-          (gnus-uncompress-range (cdr (assq 'dormant marked)))
-          (gnus-uncompress-range (cdr (assq 'tick marked))))))))
+        (gnus-list-range-difference
+         (gnus-list-range-difference
+          (gnus-sorted-complement
+           (gnus-uncompress-range active)
+           (gnus-list-of-unread-articles group))
+          (cdr (assq 'dormant marked)))
+         (cdr (assq 'tick marked))))))
 
 ;; Various summary commands
 
@@ -6010,13 +6126,10 @@ The prefix argument ALL means to select all articles."
        (when gnus-newsgroup-kill-headers
          (setq gnus-newsgroup-killed
                (gnus-compress-sequence
-                (nconc
-                 (gnus-set-sorted-intersection
-                  (gnus-uncompress-range gnus-newsgroup-killed)
-                  (setq gnus-newsgroup-unselected
-                        (sort gnus-newsgroup-unselected '<)))
-                 (setq gnus-newsgroup-unreads
-                       (sort gnus-newsgroup-unreads '<)))
+                (gnus-sorted-union
+                 (gnus-list-range-intersection
+                  gnus-newsgroup-unselected gnus-newsgroup-killed)
+                 gnus-newsgroup-unreads)
                 t)))
        (unless (listp (cdr gnus-newsgroup-killed))
          (setq gnus-newsgroup-killed (list gnus-newsgroup-killed)))
@@ -6026,7 +6139,8 @@ The prefix argument ALL means to select all articles."
            (set-buffer gnus-group-buffer)
            (gnus-undo-force-boundary))
          (gnus-update-read-articles
-          group (append gnus-newsgroup-unreads gnus-newsgroup-unselected))
+          group (gnus-sorted-union
+                 gnus-newsgroup-unreads gnus-newsgroup-unselected))
          ;; Set the current article marks.
          (let ((gnus-newsgroup-scored
                 (if (and (not gnus-save-score)
@@ -6236,7 +6350,9 @@ The state which existed when entering the ephemeral is reset."
   (let ((gnus-break-pages nil)
        (gnus-show-mime t))
     (gnus-summary-select-article gnus-show-all-headers t))
-  (select-window (get-buffer-window gnus-article-buffer)))
+  (let ((w (get-buffer-window gnus-article-buffer)))
+    (when w
+      (select-window (get-buffer-window gnus-article-buffer)))))
 
 ;;; Dead summaries.
 
@@ -6588,20 +6704,18 @@ be displayed."
          ;; The requested article is different from the current article.
          (progn
            (gnus-summary-display-article article all-headers)
-;;; Hidden headers are not hidden text any more.
-;;         (when (or all-headers gnus-show-all-headers)
-;;           (gnus-article-show-all-headers))
            (gnus-article-set-window-start
             (cdr (assq article gnus-newsgroup-bookmarks)))
            article)
-;;     (when (or all-headers gnus-show-all-headers)
-;;       (gnus-article-show-all-headers))
        'old))))
 
 (defun gnus-summary-force-verify-and-decrypt ()
   (interactive)
   (let ((mm-verify-option 'known)
-       (mm-decrypt-option 'known))
+       (mm-decrypt-option 'known)
+       (gnus-buttonized-mime-types (append (list "multipart/signed"
+                                                 "multipart/encrypted")
+                                           gnus-buttonized-mime-types)))
     (gnus-summary-select-article nil 'force)))
 
 (defun gnus-summary-set-current-mark (&optional current-mark)
@@ -7169,7 +7283,7 @@ If ALL is non-nil, limit strictly to unread articles."
      ;; Concat all the marks that say that an article is read and have
      ;; those removed.
      (list gnus-del-mark gnus-read-mark gnus-ancient-mark
-          gnus-killed-mark gnus-kill-file-mark
+          gnus-killed-mark gnus-spam-mark gnus-kill-file-mark
           gnus-low-score-mark gnus-expirable-mark
           gnus-canceled-mark gnus-catchup-mark gnus-sparse-mark
           gnus-duplicate-mark gnus-souped-mark)
@@ -7177,7 +7291,7 @@ If ALL is non-nil, limit strictly to unread articles."
 
 (defalias 'gnus-summary-delete-marked-with 'gnus-summary-limit-exclude-marks)
 (make-obsolete 'gnus-summary-delete-marked-with
-              'gnus-summary-limit-exlude-marks)
+              'gnus-summary-limit-exclude-marks)
 
 (defun gnus-summary-limit-exclude-marks (marks &optional reverse)
   "Exclude articles that are marked with MARKS (e.g. \"DK\").
@@ -7291,15 +7405,17 @@ fetched for this group."
   "Mark all unread excluded articles as read.
 If ALL, mark even excluded ticked and dormants as read."
   (interactive "P")
-  (let ((articles (gnus-sorted-complement
+  (setq gnus-newsgroup-limit (sort gnus-newsgroup-limit '<))
+  (let ((articles (gnus-sorted-ndifference
                   (sort
                    (mapcar (lambda (h) (mail-header-number h))
                            gnus-newsgroup-headers)
                    '<)
-                  (sort gnus-newsgroup-limit '<)))
+                  gnus-newsgroup-limit))
        article)
     (setq gnus-newsgroup-unreads
-         (gnus-intersection gnus-newsgroup-unreads gnus-newsgroup-limit))
+         (gnus-sorted-intersection gnus-newsgroup-unreads
+                                   gnus-newsgroup-limit))
     (if all
        (setq gnus-newsgroup-dormant nil
              gnus-newsgroup-marked nil
@@ -8160,6 +8276,7 @@ to save in."
          (copy-to-buffer buffer (point-min) (point-max))
          (set-buffer buffer)
          (gnus-article-delete-invisible-text)
+         (gnus-remove-text-with-property 'gnus-decoration)
          (when (gnus-visual-p 'article-highlight 'highlight)
            ;; Copy-to-buffer doesn't copy overlay.  So redo
            ;; highlight.
@@ -8284,22 +8401,20 @@ If ARG is a negative number, hide the unwanted header lines."
     (save-restriction
       (let* ((buffer-read-only nil)
             (inhibit-point-motion-hooks t)
-            hidden e)
-       (setq hidden
-             (if (numberp arg)
-                 (>= arg 0)
-               (save-restriction
-                 (article-narrow-to-head)
-                 (gnus-article-hidden-text-p 'headers))))
-       (goto-char (point-min))
-       (when (search-forward "\n\n" nil t)
-         (delete-region (point-min) (1- (point))))
+            hidden s e)
+       (save-restriction
+         (article-narrow-to-head)
+         (setq e (point-max)
+               hidden (if (numberp arg)
+                          (>= arg 0)
+                        (gnus-article-hidden-text-p 'headers))))
+       (delete-region (point-min) e)
        (goto-char (point-min))
-       (save-excursion
-         (set-buffer gnus-original-article-buffer)
-         (goto-char (point-min))
-         (setq e (1- (or (search-forward "\n\n" nil t) (point-max)))))
-       (insert-buffer-substring gnus-original-article-buffer 1 e)
+       (with-current-buffer gnus-original-article-buffer
+         (goto-char (setq s (point-min)))
+         (setq e (search-forward "\n\n" nil t)
+               e (if e (1- e) (point-max))))
+       (insert-buffer-substring gnus-original-article-buffer s e)
        (save-restriction
          (narrow-to-region (point-min) (point))
          (article-decode-encoded-words)
@@ -8364,6 +8479,10 @@ If TO-NEWSGROUP is string, do not prompt for a newsgroup to move to.
 If SELECT-METHOD is non-nil, do not move to a specific newsgroup, but
 re-spool using this method.
 
+When called interactively with TO-NEWSGROUP being nil, the value of
+the variable `gnus-move-split-methods' is used for finding a default
+for the target newsgroup.
+
 For this function to work, both the current newsgroup and the
 newsgroup that you want to move to have to support the `request-move'
 and `request-accept' functions.
@@ -8397,16 +8516,21 @@ ACTION can be either `move' (the default), `crosspost' or `copy'."
        art-group to-method new-xref article to-groups)
     (unless (assq action names)
       (error "Unknown action %s" action))
-    ;; We have to select an article to give
-    ;; `gnus-read-move-group-name' an opportunity to suggest an
-    ;; appropriate default.
-    (unless (gnus-buffer-live-p gnus-original-article-buffer)
-      (let ((gnus-display-mime-function nil)
-           (gnus-article-prepare-hook nil))
-       (gnus-summary-select-article nil nil nil (car articles))))
     ;; Read the newsgroup name.
     (when (and (not to-newsgroup)
               (not select-method))
+      (if (and gnus-move-split-methods
+              (not
+               (and (memq gnus-current-article articles)
+                    (gnus-buffer-live-p gnus-original-article-buffer))))
+         ;; When `gnus-move-split-methods' is non-nil, we have to
+         ;; select an article to give `gnus-read-move-group-name' an
+         ;; opportunity to suggest an appropriate default.  However,
+         ;; we needn't render or mark the article.
+         (let ((gnus-display-mime-function nil)
+               (gnus-article-prepare-hook nil)
+               (gnus-mark-article-hook nil))
+           (gnus-summary-select-article nil nil nil (car articles))))
       (setq to-newsgroup
            (gnus-read-move-group-name
             (cadr (assq action names))
@@ -8596,6 +8720,9 @@ ACTION can be either `move' (the default), `crosspost' or `copy'."
 (defun gnus-summary-copy-article (&optional n to-newsgroup select-method)
   "Move the current article to a different newsgroup.
 If TO-NEWSGROUP is string, do not prompt for a newsgroup to move to.
+When called interactively, if TO-NEWSGROUP is nil, use the value of
+the variable `gnus-move-split-methods' for finding a default target
+newsgroup.
 If SELECT-METHOD is non-nil, do not move to a specific newsgroup, but
 re-spool using this method."
   (interactive "P")
@@ -8780,12 +8907,10 @@ This will be the case if the article has both been mailed and posted."
          ;; really expired articles as nonexistent.
          (unless (eq es expirable)     ;If nothing was expired, we don't mark.
            (let ((gnus-use-cache nil))
-             (while expirable
-               (unless (memq (car expirable) es)
-                 (when (gnus-data-find (car expirable))
-                   (gnus-summary-mark-article
-                    (car expirable) gnus-canceled-mark)))
-               (setq expirable (cdr expirable))))))
+             (dolist (article expirable)
+               (when (and (not (memq article es))
+                          (gnus-data-find article))
+                 (gnus-summary-mark-article article gnus-canceled-mark))))))
        (gnus-message 6 "Expiring articles...done")))))
 
 (defun gnus-summary-expire-articles-now ()
@@ -8921,10 +9046,7 @@ groups."
                    (insert ".\n")
                    (let ((nntp-server-buffer (current-buffer)))
                      (setq header (car (gnus-get-newsgroup-headers
-                                        (save-excursion
-                                          (set-buffer gnus-summary-buffer)
-                                          gnus-newsgroup-dependencies)
-                                        t))))
+                                        nil t))))
                    (save-excursion
                      (set-buffer gnus-summary-buffer)
                      (gnus-data-set-header
@@ -9123,6 +9245,13 @@ the actual number of articles marked is returned."
   (interactive "p")
   (gnus-summary-mark-forward n gnus-expirable-mark))
 
+(defun gnus-summary-mark-as-spam (n)
+  "Mark N articles forward as spam.
+If N is negative, mark backward instead.  The difference between N and
+the actual number of articles marked is returned."
+  (interactive "p")
+  (gnus-summary-mark-forward n gnus-spam-mark))
+
 (defun gnus-summary-mark-article-as-replied (article)
   "Mark ARTICLE as replied to and update the summary line.
 ARTICLE can also be a list of articles."
@@ -9288,11 +9417,17 @@ Iff NO-EXPIRE, auto-expiry will be inhibited."
        (setq gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable))
        (setq gnus-newsgroup-reads (delq article gnus-newsgroup-reads))
        (cond ((= mark gnus-ticked-mark)
-              (push article gnus-newsgroup-marked))
+              (setq gnus-newsgroup-marked
+                    (gnus-add-to-sorted-list gnus-newsgroup-marked
+                                             article)))
              ((= mark gnus-dormant-mark)
-              (push article gnus-newsgroup-dormant))
+              (setq gnus-newsgroup-dormant
+                    (gnus-add-to-sorted-list gnus-newsgroup-dormant
+                                             article)))
              (t
-              (push article gnus-newsgroup-unreads)))
+              (setq gnus-newsgroup-unreads
+                    (gnus-add-to-sorted-list gnus-newsgroup-unreads
+                                             article))))
        (gnus-pull article gnus-newsgroup-reads)
 
        ;; See whether the article is to be put in the cache.
@@ -9404,9 +9539,10 @@ Iff NO-EXPIRE, auto-expiry will be inhibited."
   "Enter ARTICLE in the pertinent lists and remove it from others."
   ;; Make the article expirable.
   (let ((mark (or mark gnus-del-mark)))
-    (if (= mark gnus-expirable-mark)
-       (push article gnus-newsgroup-expirable)
-      (setq gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable)))
+    (setq gnus-newsgroup-expirable
+         (if (= mark gnus-expirable-mark)
+             (gnus-add-to-sorted-list gnus-newsgroup-expirable article)
+           (delq article gnus-newsgroup-expirable)))
     ;; Remove from unread and marked lists.
     (setq gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads))
     (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked))
@@ -9434,11 +9570,14 @@ Iff NO-EXPIRE, auto-expiry will be inhibited."
        (gnus-dup-unsuppress-article article))
 
       (cond ((= mark gnus-ticked-mark)
-            (push article gnus-newsgroup-marked))
+            (setq gnus-newsgroup-marked
+                  (gnus-add-to-sorted-list gnus-newsgroup-marked article)))
            ((= mark gnus-dormant-mark)
-            (push article gnus-newsgroup-dormant))
+            (setq gnus-newsgroup-dormant
+                  (gnus-add-to-sorted-list gnus-newsgroup-dormant article)))
            (t
-            (push article gnus-newsgroup-unreads)))
+            (setq gnus-newsgroup-unreads
+                  (gnus-add-to-sorted-list gnus-newsgroup-unreads article))))
       (gnus-pull article gnus-newsgroup-reads)
       t)))
 
@@ -10398,7 +10537,8 @@ If REVERSE, save parts that do not match TYPE."
     (save-excursion
       (set-buffer gnus-article-buffer)
       (let ((handles (or gnus-article-mime-handles
-                        (mm-dissect-buffer) (mm-uu-dissect))))
+                        (mm-dissect-buffer nil gnus-article-loose-mime)
+                        (mm-uu-dissect))))
        (when handles
          (gnus-summary-save-parts-1 type dir handles reverse)
          (unless gnus-article-mime-handles ;; Don't destroy this case.
@@ -10485,7 +10625,9 @@ If REVERSE, save parts that do not match TYPE."
          (gnus-data-enter
           after-article gnus-reffed-article-number
           gnus-unread-mark b (car pslist) 0 (- e b))
-         (push gnus-reffed-article-number gnus-newsgroup-unreads)
+         (setq gnus-newsgroup-unreads
+               (gnus-add-to-sorted-list gnus-newsgroup-unreads
+                                        gnus-reffed-article-number))
          (setq gnus-reffed-article-number (1- gnus-reffed-article-number))
          (setq pslist (cdr pslist)))))))
 
@@ -10648,39 +10790,35 @@ If REVERSE, save parts that do not match TYPE."
 (defun gnus-summary-highlight-line ()
   "Highlight current line according to `gnus-summary-highlight'."
   (let* ((list gnus-summary-highlight)
-        (p (point))
-        (end (progn (end-of-line) (point)))
-        ;; now find out where the line starts and leave point there.
-        (beg (progn (beginning-of-line) (point)))
+        (beg (gnus-point-at-bol))
         (article (gnus-summary-article-number))
         (score (or (cdr (assq (or article gnus-current-article)
                               gnus-newsgroup-scored))
                    gnus-summary-default-score 0))
         (mark (or (gnus-summary-article-mark) gnus-unread-mark))
-        (inhibit-read-only t))
+        (inhibit-read-only t)
+        (default gnus-summary-default-score)
+        (default-high gnus-summary-default-high-score)
+        (default-low gnus-summary-default-low-score))
     ;; Eval the cars of the lists until we find a match.
-    (let ((default gnus-summary-default-score)
-         (default-high gnus-summary-default-high-score)
-         (default-low gnus-summary-default-low-score))
-      (while (and list
-                 (not (eval (caar list))))
-       (setq list (cdr list))))
+    (while (and list
+               (not (eval (caar list))))
+      (setq list (cdr list)))
     (let ((face (cdar list)))
       (unless (eq face (get-text-property beg 'face))
        (gnus-put-text-property-excluding-characters-with-faces
-        beg end 'face
+        beg (gnus-point-at-eol) 'face
         (setq face (if (boundp face) (symbol-value face) face)))
        (when gnus-summary-highlight-line-function
-         (funcall gnus-summary-highlight-line-function article face))))
-    (goto-char p)))
+         (funcall gnus-summary-highlight-line-function article face))))))
 
 (defun gnus-update-read-articles (group unread &optional compute)
-  "Update the list of read articles in GROUP."
+  "Update the list of read articles in GROUP.
+UNREAD is a sorted list."
   (let* ((active (or gnus-newsgroup-active (gnus-active group)))
         (entry (gnus-gethash group gnus-newsrc-hashtb))
         (info (nth 2 entry))
         (prev 1)
-        (unread (sort (copy-sequence unread) '<))
         read)
     (if (or (not info) (not active))
        ;; There is no info on this group if it was, in fact,
@@ -10865,20 +11003,38 @@ If REVERSE, save parts that do not match TYPE."
 ;;; @ end
 ;;;
 
+(defun gnus-summary-inherit-default-charset ()
+  "Import `default-mime-charset' from summary buffer."
+  (if (buffer-live-p gnus-summary-buffer)
+      (if (local-variable-p 'default-mime-charset gnus-summary-buffer)
+         (progn
+           (make-local-variable 'default-mime-charset)
+           (setq default-mime-charset
+                 (with-current-buffer gnus-summary-buffer
+                   default-mime-charset)))
+       (kill-local-variable 'default-mime-charset))))
+
 (defun gnus-summary-setup-default-charset ()
   "Setup newsgroup default charset."
   (if (equal gnus-newsgroup-name "nndraft:drafts")
-      (setq gnus-newsgroup-charset nil)
-    (let* ((ignored-charsets
-           (or gnus-newsgroup-ephemeral-ignored-charsets
-               (append
-                (and gnus-newsgroup-name
-                     (gnus-parameter-ignored-charsets gnus-newsgroup-name))
-                gnus-newsgroup-ignored-charsets))))
+      (progn
+       (setq gnus-newsgroup-charset nil)
+       (make-local-variable 'default-mime-charset)
+       (setq default-mime-charset nil))
+    (let ((ignored-charsets
+          (or gnus-newsgroup-ephemeral-ignored-charsets
+              (append
+               (and gnus-newsgroup-name
+                    (gnus-parameter-ignored-charsets gnus-newsgroup-name))
+               gnus-newsgroup-ignored-charsets)))
+         charset)
       (setq gnus-newsgroup-charset
            (or gnus-newsgroup-ephemeral-charset
-               (and gnus-newsgroup-name
-                    (gnus-parameter-charset gnus-newsgroup-name))
+               (when (and gnus-newsgroup-name
+                          (setq charset (gnus-parameter-charset
+                                         gnus-newsgroup-name)))
+                 (make-local-variable 'default-mime-charset)
+                 (setq default-mime-charset charset))
                gnus-default-charset))
       (set (make-local-variable 'gnus-newsgroup-ignored-charsets)
           ignored-charsets))))
@@ -11103,9 +11259,10 @@ returned."
 
 (defun gnus-summary-insert-articles (articles)
   (when (setq articles
-             (gnus-set-difference articles
-                                  (mapcar (lambda (h) (mail-header-number h))
-                                          gnus-newsgroup-headers)))
+             (gnus-sorted-difference articles
+                                     (mapcar (lambda (h)
+                                               (mail-header-number h))
+                                             gnus-newsgroup-headers)))
     (setq gnus-newsgroup-headers
          (merge 'list
                 gnus-newsgroup-headers
@@ -11143,45 +11300,51 @@ If ALL is non-nil, already read articles become readable.
 If ALL is a number, fetch this number of articles."
   (interactive "P")
   (prog1
-      (let ((old (mapcar 'car gnus-newsgroup-data))
-           (i (car gnus-newsgroup-active))
+      (let ((old (sort (mapcar 'car gnus-newsgroup-data) '<))
            older len)
-       (while (<= i (cdr gnus-newsgroup-active))
-         (or (memq i old) (push i older))
-         (incf i))
+       (setq older
+             (gnus-sorted-difference
+              (gnus-uncompress-range (list gnus-newsgroup-active))
+              old))
        (setq len (length older))
        (cond
         ((null older) nil)
         ((numberp all)
          (if (< all len)
-             (setq older (subseq older 0 all))))
+             (setq older (last older all))))
         (all nil)
         (t
          (if (and (numberp gnus-large-newsgroup)
                   (> len gnus-large-newsgroup))
-             (let ((input
-                    (read-string
-                     (format
-                      "How many articles from %s (default %d): "
-                      (gnus-limit-string
-                       (gnus-group-decoded-name gnus-newsgroup-name) 35)
-                      len))))
+             (let* ((cursor-in-echo-area nil)
+                    (initial (gnus-parameter-large-newsgroup-initial 
+                              gnus-newsgroup-name))
+                    (input
+                     (read-string
+                      (format
+                       "How many articles from %s (%s %d): "
+                       (gnus-limit-string
+                        (gnus-group-decoded-name gnus-newsgroup-name) 35)
+                       (if initial "max" "default")
+                       len)
+                      (if initial
+                          (cons (number-to-string initial)
+                                0)))))
                (unless (string-match "^[ \t]*$" input)
                  (setq all (string-to-number input))
                  (if (< all len)
-                     (setq older (subseq older 0 all))))))))
+                     (setq older (last older all))))))))
        (if (not older)
            (message "No old news.")
-         (let ((gnus-fetch-old-headers t))
-           (gnus-summary-insert-articles older))
-         (gnus-summary-limit (gnus-union older old))))
+         (gnus-summary-insert-articles older)
+         (gnus-summary-limit (gnus-sorted-nunion old older))))
     (gnus-summary-position-point)))
 
 (defun gnus-summary-insert-new-articles ()
   "Insert all new articles in this group."
   (interactive)
   (prog1
-      (let ((old (mapcar 'car gnus-newsgroup-data))
+      (let ((old (sort (mapcar 'car gnus-newsgroup-data) '<))
            (old-active gnus-newsgroup-active)
            (nnmail-fetched-sources (list t))
            i new)
@@ -11196,8 +11359,8 @@ If ALL is a number, fetch this number of articles."
          (setq new (nreverse new))
          (gnus-summary-insert-articles new)
          (setq gnus-newsgroup-unreads
-               (append gnus-newsgroup-unreads new))
-         (gnus-summary-limit (gnus-union old new))))
+               (gnus-sorted-nunion gnus-newsgroup-unreads new))
+         (gnus-summary-limit (gnus-sorted-nunion old new))))
     (gnus-summary-position-point)))
 
 (gnus-summary-make-all-marking-commands)
index fe2d0e0..93d2c57 100644 (file)
@@ -41,6 +41,7 @@
 (require 'custom)
 (require 'nnheader)
 (require 'time-date)
+(require 'netrc)
 
 (eval-and-compile
   (autoload 'message-fetch-field "message")
          (setq start (- (length string) tail))))
       string))))
 
+;;; bring in the netrc functions as aliases
+(defalias 'gnus-netrc-get 'netrc-get)
+(defalias 'gnus-netrc-machine 'netrc-machine)
+(defalias 'gnus-parse-netrc 'netrc-parse)
+
 (defun gnus-boundp (variable)
   "Return non-nil if VARIABLE is bound and non-nil."
   (and (boundp variable)
         (string-match (concat "[ \t]*<" (regexp-quote address) ">") from)
         (and (setq name (substring from 0 (match-beginning 0)))
              ;; Strip any quotes from the name.
-             (string-match "\".*\"" name)
+             (string-match "^\".*\"$" name)
              (setq name (substring name 1 (1- (match-end 0))))))
     ;; If not, then "address (name)" is used.
     (or name
@@ -495,7 +501,7 @@ jabbering all the time."
   "Return a list of Message-IDs in REFERENCES."
   (let ((beg 0)
        ids)
-    (while (string-match "<[^> \t]+>" references beg)
+    (while (string-match "<[^<]+[^< \t]" references beg)
       (push (substring references (match-beginning 0) (setq beg (match-end 0)))
            ids))
     (nreverse ids)))
@@ -510,8 +516,8 @@ If N, return the Nth ancestor instead."
          (while (nthcdr n ids)
            (setq ids (cdr ids)))
          (car ids))
-      (when (string-match "<[^> \t]+>\\'" references)
-       (match-string 0 references)))))
+      (when (string-match "\\(<[^<]+>\\)[ \t]*\\'" references)
+       (match-string 1 references)))))
 
 (defun gnus-buffer-live-p (buffer)
   "Say whether BUFFER is alive or not."
@@ -946,93 +952,6 @@ ARG is passed to the first function."
        (apply 'run-hooks funcs)
       (set-buffer buf))))
 
-;;;
-;;; .netrc and .authinforc parsing
-;;;
-
-(defun gnus-parse-netrc (file)
-  "Parse FILE and return an list of all entries in the file."
-  (when (file-exists-p file)
-    (with-temp-buffer
-      (let ((tokens '("machine" "default" "login"
-                     "password" "account" "macdef" "force"
-                     "port"))
-           alist elem result pair)
-       (insert-file-contents file)
-       (goto-char (point-min))
-       ;; Go through the file, line by line.
-       (while (not (eobp))
-         (narrow-to-region (point) (gnus-point-at-eol))
-         ;; For each line, get the tokens and values.
-         (while (not (eobp))
-           (skip-chars-forward "\t ")
-           ;; Skip lines that begin with a "#".
-           (if (eq (char-after) ?#)
-               (goto-char (point-max))
-             (unless (eobp)
-               (setq elem
-                     (if (= (following-char) ?\")
-                         (read (current-buffer))
-                       (buffer-substring
-                        (point) (progn (skip-chars-forward "^\t ")
-                                       (point)))))
-               (cond
-                ((equal elem "macdef")
-                 ;; We skip past the macro definition.
-                 (widen)
-                 (while (and (zerop (forward-line 1))
-                             (looking-at "$")))
-                 (narrow-to-region (point) (point)))
-                ((member elem tokens)
-                 ;; Tokens that don't have a following value are ignored,
-                 ;; except "default".
-                 (when (and pair (or (cdr pair)
-                                     (equal (car pair) "default")))
-                   (push pair alist))
-                 (setq pair (list elem)))
-                (t
-                 ;; Values that haven't got a preceding token are ignored.
-                 (when pair
-                   (setcdr pair elem)
-                   (push pair alist)
-                   (setq pair nil)))))))
-         (when alist
-           (push (nreverse alist) result))
-         (setq alist nil
-               pair nil)
-         (widen)
-         (forward-line 1))
-       (nreverse result)))))
-
-(defun gnus-netrc-machine (list machine &optional port defaultport)
-  "Return the netrc values from LIST for MACHINE or for the default entry.
-If PORT specified, only return entries with matching port tokens.
-Entries without port tokens default to DEFAULTPORT."
-  (let ((rest list)
-       result)
-    (while list
-      (when (equal (cdr (assoc "machine" (car list))) machine)
-       (push (car list) result))
-      (pop list))
-    (unless result
-      ;; No machine name matches, so we look for default entries.
-      (while rest
-       (when (assoc "default" (car rest))
-         (push (car rest) result))
-       (pop rest)))
-    (when result
-      (setq result (nreverse result))
-      (while (and result
-                 (not (equal (or port defaultport "nntp")
-                             (or (gnus-netrc-get (car result) "port")
-                                 defaultport "nntp"))))
-       (pop result))
-      (car result))))
-
-(defun gnus-netrc-get (alist type)
-  "Return the value of token TYPE from ALIST."
-  (cdr (assoc type alist)))
-
 ;;; Various
 
 (defvar gnus-group-buffer)             ; Compiler directive
@@ -1179,7 +1098,9 @@ Return the modified alist."
           (string-equal (downcase x) (downcase y)))))
 
 (defcustom gnus-use-byte-compile t
-  "If non-nil, byte-compile crucial run-time codes."
+  "If non-nil, byte-compile crucial run-time codes.
+Setting it to `nil' has no effect after first time running
+`gnus-byte-compile'."
   :type 'boolean
   :version "21.1"
   :group 'gnus-various)
@@ -1188,6 +1109,10 @@ Return the modified alist."
   "Byte-compile FORM if `gnus-use-byte-compile' is non-nil."
   (if gnus-use-byte-compile
       (progn
+       (condition-case nil
+           ;; Work around a bug in XEmacs 21.4
+           (require 'byte-optimize)
+         (error))
        (require 'bytecomp)
        (defalias 'gnus-byte-compile 'byte-compile)
        (byte-compile form))
@@ -1300,6 +1225,92 @@ SPEC is a predicate specifier that contains stuff like `or', `and',
    history
    (car (symbol-value history))))
 
+(defun gnus-graphic-display-p ()
+  (or (and (fboundp 'display-graphic-p)
+          (display-graphic-p))
+      ;;;!!!This is bogus.  Fixme!
+      (and (featurep 'xemacs)
+          t)))
+
+(put 'gnus-parse-without-error 'lisp-indent-function 0)
+(put 'gnus-parse-without-error 'edebug-form-spec '(body))
+
+(defmacro gnus-parse-without-error (&rest body)
+  "Allow continuing onto the next line even if an error occurs."
+  `(while (not (eobp))
+     (condition-case ()
+        (progn
+          ,@body
+          (goto-char (point-max)))
+       (error
+       (gnus-error 4 "Invalid data on line %d"
+                   (count-lines (point-min) (point)))
+       (forward-line 1)))))
+
+(defun gnus-cache-file-contents (file variable function)
+  "Cache the contents of FILE in VARIABLE.  The contents come from FUNCTION."
+  (let ((time (nth 5 (file-attributes file)))
+       contents value)
+    (if (or (null (setq value (symbol-value variable)))
+           (not (equal (car value) file))
+           (not (equal (nth 1 value) time)))
+       (progn
+         (setq contents (funcall function file))
+         (set variable (list file time contents))
+         contents)
+      (nth 2 value))))
+
+(defun gnus-multiple-choice (prompt choice &optional idx)
+  "Ask user a multiple choice question.
+CHOICE is a list of the choice char and help message at IDX."
+  (let (tchar buf)
+    (save-window-excursion
+      (save-excursion
+       (while (not tchar)
+         (message "%s (%s?): "
+                  prompt
+                  (mapconcat (lambda (s) (char-to-string (car s)))
+                             choice ""))
+         (setq tchar (read-char))
+         (when (not (assq tchar choice))
+           (setq tchar nil)
+           (setq buf (get-buffer-create "*Gnus Help*"))
+           (pop-to-buffer buf)
+           (fundamental-mode)          ; for Emacs 20.4+
+           (buffer-disable-undo)
+           (erase-buffer)
+           (insert prompt ":\n\n")
+           (let ((max -1)
+                 (list choice)
+                 (alist choice)
+                 (idx (or idx 1))
+                 (i 0)
+                 n width pad format)
+             ;; find the longest string to display
+             (while list
+               (setq n (length (nth idx (car list))))
+               (unless (> max n)
+                 (setq max n))
+               (setq list (cdr list)))
+             (setq max (+ max 4))      ; %c, `:', SPACE, a SPACE at end
+             (setq n (/ (1- (window-width)) max)) ; items per line
+             (setq width (/ (1- (window-width)) n)) ; width of each item
+             ;; insert `n' items, each in a field of width `width'
+             (while alist
+               (if (< i n)
+                   ()
+                 (setq i 0)
+                 (delete-char -1)              ; the `\n' takes a char
+                 (insert "\n"))
+               (setq pad (- width 3))
+               (setq format (concat "%c: %-" (int-to-string pad) "s"))
+               (insert (format format (caar alist) (nth idx (car alist))))
+               (setq alist (cdr alist))
+               (setq i (1+ i))))))))
+    (if (buffer-live-p buf)
+       (kill-buffer buf))
+    tchar))
+
 (provide 'gnus-util)
 
 ;;; gnus-util.el ends here
index d539cd1..8f8c2dc 100644 (file)
@@ -1,6 +1,6 @@
 ;;; gnus-uu.el --- extract (uu)encoded files in Gnus
 ;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
-;;        2001 Free Software Foundation, Inc.
+;;        2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Created: 2 Oct 1993
@@ -320,7 +320,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
 
 (defvar gnus-uu-saved-article-name nil)
 
-(defvar gnus-uu-begin-string "^begin[ \t]+[0-7][0-7][0-7][ \t]+\\(.*\\)$")
+(defvar gnus-uu-begin-string "^begin[ \t]+0?[0-7][0-7][0-7][ \t]+\\(.*\\)$")
 (defvar gnus-uu-end-string "^end[ \t]*$")
 
 (defvar gnus-uu-body-line "^M")
@@ -335,7 +335,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
 
 (defvar gnus-uu-shar-file-name nil)
 (defvar gnus-uu-shar-name-marker
-  "begin [0-7][0-7][0-7][ \t]+\\(\\(\\w\\|\\.\\)*\\b\\)")
+  "begin 0?[0-7][0-7][0-7][ \t]+\\(\\(\\w\\|[.\\:]\\)*\\b\\)")
 
 (defvar gnus-uu-postscript-begin-string "^%!PS-")
 (defvar gnus-uu-postscript-end-string "^%%EOF$")
@@ -352,56 +352,6 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
 (defvar gnus-uu-digest-from-subject nil)
 (defvar gnus-uu-digest-buffer nil)
 
-;; Keymaps
-
-(gnus-define-keys (gnus-uu-mark-map "P" gnus-summary-mark-map)
-  "p" gnus-summary-mark-as-processable
-  "u" gnus-summary-unmark-as-processable
-  "U" gnus-summary-unmark-all-processable
-  "v" gnus-uu-mark-over
-  "s" gnus-uu-mark-series
-  "r" gnus-uu-mark-region
-  "g" gnus-uu-unmark-region
-  "R" gnus-uu-mark-by-regexp
-  "G" gnus-uu-unmark-by-regexp
-  "t" gnus-uu-mark-thread
-  "T" gnus-uu-unmark-thread
-  "a" gnus-uu-mark-all
-  "b" gnus-uu-mark-buffer
-  "S" gnus-uu-mark-sparse
-  "k" gnus-summary-kill-process-mark
-  "y" gnus-summary-yank-process-mark
-  "w" gnus-summary-save-process-mark
-  "i" gnus-uu-invert-processable)
-
-(gnus-define-keys (gnus-uu-extract-map "X" gnus-summary-mode-map)
-  ;;"x" gnus-uu-extract-any
-  "m" gnus-summary-save-parts
-  "u" gnus-uu-decode-uu
-  "U" gnus-uu-decode-uu-and-save
-  "s" gnus-uu-decode-unshar
-  "S" gnus-uu-decode-unshar-and-save
-  "o" gnus-uu-decode-save
-  "O" gnus-uu-decode-save
-  "b" gnus-uu-decode-binhex
-  "B" gnus-uu-decode-binhex
-  "p" gnus-uu-decode-postscript
-  "P" gnus-uu-decode-postscript-and-save)
-
-(gnus-define-keys
-    (gnus-uu-extract-view-map "v" gnus-uu-extract-map)
-  "u" gnus-uu-decode-uu-view
-  "U" gnus-uu-decode-uu-and-save-view
-  "s" gnus-uu-decode-unshar-view
-  "S" gnus-uu-decode-unshar-and-save-view
-  "o" gnus-uu-decode-save-view
-  "O" gnus-uu-decode-save-view
-  "b" gnus-uu-decode-binhex-view
-  "B" gnus-uu-decode-binhex-view
-  "p" gnus-uu-decode-postscript-view
-  "P" gnus-uu-decode-postscript-and-save-view)
-
-
 ;; Commands.
 
 (defun gnus-uu-decode-uu (&optional n)
@@ -456,7 +406,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
                          gnus-uu-default-dir
                          gnus-uu-default-dir))))
   (setq gnus-uu-binhex-article-name
-       (make-temp-name (concat gnus-uu-work-dir "binhex")))
+       (mm-make-temp-file (expand-file-name "binhex" gnus-uu-work-dir)))
   (gnus-uu-decode-with-method 'gnus-uu-binhex-article n dir))
 
 (defun gnus-uu-decode-uu-view (&optional n)
@@ -509,7 +459,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
         (read-file-name "Unbinhex, view and save in dir: "
                         gnus-uu-default-dir gnus-uu-default-dir)))
   (setq gnus-uu-binhex-article-name
-       (make-temp-name (concat gnus-uu-work-dir "binhex")))
+       (mm-make-temp-file (expand-file-name "binhex" gnus-uu-work-dir)))
   (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
     (gnus-uu-decode-binhex n file)))
 
@@ -520,7 +470,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
   "Digests and forwards all articles in this series."
   (interactive "P")
   (let ((gnus-uu-save-in-digest t)
-       (file (make-temp-name (nnheader-concat gnus-uu-tmp-dir "forward")))
+       (file (mm-make-temp-file (nnheader-concat gnus-uu-tmp-dir "forward")))
        (message-forward-as-mime message-forward-as-mime)
        (mail-parse-charset gnus-newsgroup-charset)
        (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets)
@@ -1001,7 +951,8 @@ When called interactively, prompt for REGEXP."
        (if (looking-at gnus-uu-binhex-begin-line)
            (progn
              (setq state (list 'begin))
-             (write-region 1 1 gnus-uu-binhex-article-name))
+             (write-region (point-min) (point-min)
+                           gnus-uu-binhex-article-name))
          (setq state (list 'middle)))
        (goto-char (point-max))
        (re-search-backward (concat gnus-uu-binhex-body-line "\\|"
@@ -1114,7 +1065,7 @@ When called interactively, prompt for REGEXP."
     (while (re-search-forward "[ \t]+" nil t)
       (replace-match "[ \t]+" t t))
 
-    (buffer-substring 1 (point-max))))
+    (buffer-substring (point-min) (point-max))))
 
 (defun gnus-uu-get-list-of-articles (n)
   ;; If N is non-nil, the article numbers of the N next articles
@@ -1206,10 +1157,11 @@ When called interactively, prompt for REGEXP."
        ;; Expand numbers.
        (goto-char (point-min))
        (while (re-search-forward "[0-9]+" nil t)
-         (replace-match
-          (format "%06d"
-                  (string-to-int (buffer-substring
-                                  (match-beginning 0) (match-end 0))))))
+         (ignore-errors
+           (replace-match
+            (format "%06d"
+                    (string-to-int (buffer-substring
+                                    (match-beginning 0) (match-end 0)))))))
        (setq string (buffer-substring 1 (point-max)))
        (setcar (car string-list) string)
        (setq string-list (cdr string-list))))
@@ -1781,8 +1733,7 @@ Gnus might fail to display all of it.")
                 gnus-uu-tmp-dir)))
 
       (setq gnus-uu-work-dir
-           (make-temp-name (concat gnus-uu-tmp-dir "gnus")))
-      (gnus-make-directory gnus-uu-work-dir)
+           (mm-make-temp-file (concat gnus-uu-tmp-dir "gnus") 'dir))
       (set-file-modes gnus-uu-work-dir 448)
       (setq gnus-uu-work-dir (file-name-as-directory gnus-uu-work-dir))
       (push (cons gnus-newsgroup-name gnus-uu-work-dir)
@@ -1964,7 +1915,7 @@ The user will be asked for a file name."
     (goto-char (point-min))
     (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$"))
     (forward-line -1)
-    (narrow-to-region 1 (point))
+    (narrow-to-region (point-min) (point))
     (unless (mail-fetch-field "mime-version")
       (widen)
       (insert "MIME-Version: 1.0\n"))
@@ -2054,7 +2005,7 @@ If no file has been included, the user will be asked for a file."
       (erase-buffer)
       (insert-buffer-substring post-buf beg-binary end-binary)
       (goto-char (point-min))
-      (setq length (count-lines 1 (point-max)))
+      (setq length (count-lines (point-min) (point-max)))
       (setq parts (/ length gnus-uu-post-length))
       (unless (< (% length gnus-uu-post-length) 4)
        (incf parts)))
@@ -2067,7 +2018,7 @@ If no file has been included, the user will be asked for a file."
     (re-search-forward
      (concat "^" (regexp-quote mail-header-separator) "$") nil t)
     (beginning-of-line)
-    (setq header (buffer-substring 1 (point)))
+    (setq header (buffer-substring (point-min) (point)))
 
     (goto-char (point-min))
     (when gnus-uu-post-separate-description
index 21b9843..fa04105 100644 (file)
 (require 'product)
 (provide 'gnus-vers)
 
-(defconst gnus-revision-number "02"
+(defconst gnus-revision-number "00"
   "Revision number for this version of gnus.")
 
 ;; Product information of this gnus.
 (product-provide 'gnus-vers
   (product-define "T-gnus" nil
-                 (list 6 15 5
+                 (list 6 15 6
                        (string-to-number gnus-revision-number))))
 
-(defconst gnus-original-version-number "0.05"
+(defconst gnus-original-version-number "0.06"
   "Version number for this version of Gnus.")
 
 (provide 'running-pterodactyl-gnus-0_73-or-later)
index 9d5188b..1234d2f 100644 (file)
@@ -198,7 +198,7 @@ See the Gnus manual for an explanation of the syntax used.")
 
 (defcustom gnus-configure-windows-hook nil
   "*A hook called when configuring windows."
-  :group 'gnus-windowns
+  :group 'gnus-windows
   :type 'hook)
 
 ;;; Internal variables.
index ba3e34a..c9b9d94 100644 (file)
@@ -439,6 +439,11 @@ call it with the value of the `gnus-data' text property."
   (defalias 'gnus-create-image 'gnus-xmas-create-image)
   (defalias 'gnus-remove-image 'gnus-xmas-remove-image)
 
+  (when (or (< emacs-major-version 21)
+           (and (= emacs-major-version 21)
+                (< emacs-minor-version 3)))
+    (defalias 'gnus-completing-read 'gnus-xmas-completing-read))
+
   ;; These ones are not defcutom'ed, sometimes not even defvar'ed. They
   ;; probably should. If that is done, the code below should then be moved
   ;; where each variable is defined, in order not to mess with user settings.
@@ -866,7 +871,8 @@ XEmacs compatibility workaround."
     gnus-mailing-list-menu))
 
 (defun gnus-xmas-image-type-available-p (type)
-  (featurep type))
+  (and window-system
+       (featurep (if (eq type 'pbm) 'xbm type))))
 
 (defun gnus-xmas-create-image (file &optional type data-p &rest props)
   (let ((type (if type
@@ -927,6 +933,21 @@ Warning: Don't insert text immediately after the image."
      nil)
    nil nil nil nil nil 'gnus-image))
 
+(defun gnus-xmas-completing-read (prompt table &optional
+                                        predicate require-match history)
+  (when (and history
+            (not (boundp history)))
+    (set history nil))
+  (completing-read
+   (if (symbol-value history)
+       (concat prompt " (" (car (symbol-value history)) "): ")
+     (concat prompt ": "))
+   table
+   predicate
+   require-match
+   nil
+   history))
+
 (provide 'gnus-xmas)
 
 ;;; gnus-xmas.el ends here
index 92fdcda..8d323f7 100644 (file)
@@ -1122,8 +1122,8 @@ used to 899, you would say something along these lines:
 This variable should be a list, where the first element is how the
 news is to be fetched, the second is the address.
 
-For instance, if you want to get your news via NNTP from
-\"flab.flab.edu\", you could say:
+For instance, if you want to get your news via \"flab.flab.edu\" using
+NNTP, you could say:
 
 \(setq gnus-select-method '(nntp \"flab.flab.edu\"))
 
@@ -1191,7 +1191,7 @@ variable instead."
 This is a list where each element is a complete select method (see
 `gnus-select-method').
 
-If, for instance, you want to read your mail with the nnml backend,
+If, for instance, you want to read your mail with the nnml back end,
 you could set this variable:
 
 \(setq gnus-secondary-select-methods '((nnml \"\")))"
@@ -1232,15 +1232,15 @@ It can also be a list of select methods, as well as the special symbol
 list, Gnus will try all the methods in the list until it finds a match."
   :group 'gnus-server
   :type '(choice (const :tag "default" nil)
-                (const :tag "DejaNews" (nnweb "refer" (nnweb-type dejanews)))
+                (const :tag "Google" (nnweb "refer" (nnweb-type google)))
                 gnus-select-method
                 (repeat :menu-tag "Try multiple"
                         :tag "Multiple"
-                        :value (current (nnweb "refer" (nnweb-type dejanews)))
+                        :value (current (nnweb "refer" (nnweb-type google)))
                         (choice :tag "Method"
                                 (const current)
-                                (const :tag "DejaNews"
-                                       (nnweb "refer" (nnweb-type dejanews)))
+                                (const :tag "Google"
+                                       (nnweb "refer" (nnweb-type google)))
                                 gnus-select-method))))
 
 (defcustom gnus-group-faq-directory
@@ -1467,6 +1467,7 @@ slower, and `std11-extract-address-components'."
     ("nnfolder" mail respool address)
     ("nngateway" post-mail address prompt-address physical-address)
     ("nnweb" none)
+    ("nngoogle" post)
     ("nnslashdot" post)
     ("nnultimate" none)
     ("nnrss" none)
@@ -1475,7 +1476,8 @@ slower, and `std11-extract-address-components'."
     ("nnlistserv" none)
     ("nnagent" post-mail)
     ("nnimap" post-mail address prompt-address physical-address)
-    ("nnmaildir" mail respool address))
+    ("nnmaildir" mail respool address)
+    ("nnnil" none))
   "*An alist of valid select methods.
 The first element of each list lists should be a string with the name
 of the select method.  The other elements may be the category of
@@ -1647,8 +1649,7 @@ Use with caution.")
    ("\\(^\\|:\\)han\\>" euc-kr)
    ("\\(^\\|:\\)alt.chinese.text.big5\\>" chinese-big5)
    ("\\(^\\|:\\)soc.culture.vietnamese\\>" vietnamese-viqr)
-   ("\\(^\\|:\\)\\(comp\\|rec\\|alt\\|sci\\|soc\\|news\\|gnu\\|bofh\\)\\>" iso-8859-1)
-   (".*" iso-8859-1))
+   ("\\(^\\|:\\)\\(comp\\|rec\\|alt\\|sci\\|soc\\|news\\|gnu\\|bofh\\)\\>" iso-8859-1))
  :variable-document
  "Alist of regexps (to match group names) and default charsets to be used when reading."
  :variable-group gnus-charset
@@ -1679,6 +1680,23 @@ posting an article."
  :parameter-document
  "Posting method for this group.")
 
+(gnus-define-group-parameter
+ large-newsgroup-initial
+ :type integer
+ :function-document
+ "Return GROUP's initial input of the number of articles."
+ :variable-document
+ "*Alist of group regexps and its initial input of the number of articles."
+ :parameter-type '(choice :tag "Initial Input for Large Newsgroup"
+                         (const :tag "All" nil)
+                         (integer))
+ :parameter-document "\
+
+This number will be prompted as the initial value of the number of
+articles to list when the group is a large newsgroup (see
+`gnus-large-newsgroup').  If it is `nil', the default value is the
+total number of articles in the group.")
+
 (defcustom gnus-group-uncollapsed-levels 1
   "Number of group name elements to leave alone when making a short group name."
   :group 'gnus-group-visual
@@ -1802,10 +1820,13 @@ face."
 (defvar gnus-plugged t
   "Whether Gnus is plugged or not.")
 
-(defvar gnus-agent-cache t
-  "Whether Gnus use agent cache.")
+(defcustom gnus-agent-cache t
+  "Whether Gnus use agent cache."
+  :version "21.3"
+  :group 'gnus-agent
+  :type 'boolean)
 
-(defcustom gnus-default-charset 'iso-8859-1
+(defcustom gnus-default-charset (mm-guess-mime-charset)
   "Default charset assumed to be used when viewing non-ASCII characters.
 This variable is overridden on a group-to-group basis by the
 gnus-group-charset-alist variable and is only used on groups not
@@ -1813,6 +1834,13 @@ covered by that variable."
   :type 'symbol
   :group 'gnus-charset)
 
+(defcustom gnus-agent nil
+  "Whether we want to use the Gnus agent or not.
+Putting (gnus-agentize) in ~/.gnus is obsolete by (setq gnus-agent t)."
+  :version "21.3"
+  :group 'gnus-agent
+  :type 'boolean)
+
 \f
 ;;; Internal variables
 
@@ -1823,9 +1851,7 @@ covered by that variable."
 (defvar gnus-original-article-buffer " *Original Article*")
 (defvar gnus-newsgroup-name nil)
 (defvar gnus-ephemeral-servers nil)
-
-(defvar gnus-agent nil
-  "Whether we want to use the Gnus agent or not.")
+(defvar gnus-server-method-cache nil)
 
 (defvar gnus-agent-fetching nil
   "Whether Gnus agent is in fetching mode.")
@@ -1833,7 +1859,7 @@ covered by that variable."
 (defvar gnus-agent-covered-methods nil)
 
 (defvar gnus-command-method nil
-  "Dynamically bound variable that says what the current backend is.")
+  "Dynamically bound variable that says what the current back end is.")
 
 (defvar gnus-current-select-method nil
   "The current method for selecting a newsgroup.")
@@ -1894,12 +1920,13 @@ covered by that variable."
 ;; `download' is a agent flag private to each gnus installation
 ;; `unsend' are for nndraft groups only
 ;; `score' is not a proper mark
+;; `bookmark': don't propagated it, or fix the bug in update-mark.
 (defconst gnus-article-unpropagated-mark-lists
-  '(seen cache download unsend score)
-  "Marks that shouldn't be propagated to backends.
-Typical marks are those that make no sense in a standalone backend,
+  '(seen cache download unsend score bookmark)
+  "Marks that shouldn't be propagated to back ends.
+Typical marks are those that make no sense in a standalone back end,
 such as a mark that says whether an article is stored in the cache
-(which doesn't make sense in a standalone backend).")
+\(which doesn't make sense in a standalone back end).")
 
 (defvar gnus-headers-retrieved-by nil)
 (defvar gnus-article-reply nil)
@@ -2182,6 +2209,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       gnus-article-display-x-face
       gnus-article-decode-HZ
       gnus-article-wash-html
+      gnus-article-unsplit-urls
       gnus-article-hide-pgp
       gnus-article-hide-pem gnus-article-hide-signature
       gnus-article-strip-leading-blank-lines gnus-article-date-local
@@ -2321,7 +2349,7 @@ possible.
 This restriction may disappear in later versions of Gnus.
 
 General format specifiers can also be used.
-See (gnus)Formatting Variables."
+See `(gnus)Formatting Variables'."
   :link '(custom-manual "(gnus)Formatting Variables")
   :type 'string
   :group 'gnus-summary-format)
@@ -2493,11 +2521,13 @@ with a `subscribed' parameter."
     (dolist (entry (cdr gnus-newsrc-alist))
       (setq group (car entry))
       (when (gnus-group-find-parameter group 'subscribed)
-       (setq address (or (gnus-group-fast-parameter group 'to-address)
-                         (gnus-group-fast-parameter group 'to-list)))
+       (setq address (mail-strip-quoted-names
+                      (or (gnus-group-fast-parameter group 'to-address)
+                          (gnus-group-fast-parameter group 'to-list))))
        (when address
          (push address addresses))))
-    (list (mapconcat 'regexp-quote addresses "\\|"))))
+    (when addresses
+      (list (mapconcat 'regexp-quote addresses "\\|")))))
 
 (defmacro gnus-string-or (&rest strings)
   "Return the first element of STRINGS that is a non-blank string.
@@ -2748,6 +2778,36 @@ that that variable is buffer-local to the summary buffers."
                                   (nth 1 method))))
       method)))
 
+(defsubst gnus-server-to-method (server)
+  "Map virtual server names to select methods."
+  (or (and server (listp server) server)
+      (cdr (assoc server gnus-server-method-cache))
+      (let ((result
+            (or
+             ;; Perhaps this is the native server?
+             (and (equal server "native") gnus-select-method)
+             ;; It should be in the server alist.
+             (cdr (assoc server gnus-server-alist))
+             ;; It could be in the predefined server alist.
+             (cdr (assoc server gnus-predefined-server-alist))
+             ;; If not, we look through all the opened server
+             ;; to see whether we can find it there.
+             (let ((opened gnus-opened-servers))
+               (while (and opened
+                           (not (equal server (format "%s:%s" (caaar opened)
+                                                      (cadaar opened)))))
+                 (pop opened))
+               (caar opened))
+             ;; It could be a named method, search all servers
+             (let ((servers gnus-secondary-select-methods))
+               (while (and servers
+                           (not (equal server (format "%s:%s" (caar servers)
+                                                      (cadar servers)))))
+                 (pop servers))
+               (car servers)))))
+       (push (cons server result) gnus-server-method-cache)
+       result)))
+
 (defsubst gnus-server-get-method (group method)
   ;; Input either a server name, and extended server name, or a
   ;; select method, and return a select method.
@@ -2765,33 +2825,6 @@ that that variable is buffer-local to the summary buffers."
        (t
         (gnus-server-add-address method))))
 
-(defun gnus-server-to-method (server)
-  "Map virtual server names to select methods."
-  (or
-   ;; Is this a method, perhaps?
-   (and server (listp server) server)
-   ;; Perhaps this is the native server?
-   (and (equal server "native") gnus-select-method)
-   ;; It should be in the server alist.
-   (cdr (assoc server gnus-server-alist))
-   ;; It could be in the predefined server alist.
-   (cdr (assoc server gnus-predefined-server-alist))
-   ;; If not, we look through all the opened server
-   ;; to see whether we can find it there.
-   (let ((opened gnus-opened-servers))
-     (while (and opened
-                (not (equal server (format "%s:%s" (caaar opened)
-                                           (cadaar opened)))))
-       (pop opened))
-     (caar opened))
-   ;; It could be a named method, search all servers
-   (let ((servers gnus-secondary-select-methods))
-     (while (and servers
-                (not (equal server (format "%s:%s" (caar servers)
-                                           (cadar servers)))))
-       (pop servers))
-     (car servers))))
-
 (defmacro gnus-method-equal (ss1 ss2)
   "Say whether two servers are equal."
   `(let ((s1 ,ss1)
@@ -3004,7 +3037,7 @@ The function `gnus-group-find-parameter' will do that for you."
                                                     symbol allow-list))
            (when result
              ;; Expand if necessary.
-             (if (and (stringp result) (string-match "\\\\" result))
+             (if (and (stringp result) (string-match "\\\\[0-9&]" result))
                  (setq result (gnus-expand-group-parameter (car head)
                                                            result group)))
              ;; Exit the loop early.
@@ -3263,7 +3296,7 @@ If NEWSGROUP is nil, return the global kill file name instead."
         (address (nth 1 server)))
     (if (and address
             (not (zerop (length address))))
-       (format "%s via %s" address (car server))
+       (format "%s using %s" address (car server))
       (format "%s" (car server)))))
 
 (defun gnus-find-method-for-group (group &optional info)
diff --git a/lisp/html2text.el b/lisp/html2text.el
new file mode 100644 (file)
index 0000000..22ae79b
--- /dev/null
@@ -0,0 +1,568 @@
+;;; html2text.el --- a simple html to plain text converter
+
+;; Copyright (C) 2002 Free Software Foundation, Inc.
+
+;; Author: Joakim Hove <hove@phys.ntnu.no>
+
+;; This file is part of GNU Emacs.
+
+;; 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.
+
+;;; Commentary:
+
+;; These functions provide a simple way to wash/clean html infected
+;; mails.  Definitely do not work in all cases, but some improvement
+;; in readability is generally obtained. Formatting is only done in
+;; the buffer, so the next time you enter the article it will be
+;; "re-htmlized".
+;;
+;; The main function is "html2text"
+
+;;; Code:
+
+;;
+;; <Global variables>
+;;
+
+(eval-when-compile
+  (require 'cl))
+
+(defvar html2text-format-single-element-list '(("hr" . html2text-clean-hr)))
+
+(defvar html2text-replace-list
+  '(("&nbsp;" . " ") ("&gt;" . ">") ("&lt;" . "<") ("&quot;" . "\""))
+  "The map of entity to text.
+
+This is an alist were each element is a dotted pair consisting of an
+old string, and a replacement string. This replacement is done by the
+function \"html2text-substitute\" which basically performs a
+replace-string operation for every element in the list. This is
+completely verbatim - without any use of REGEXP.")
+
+(defvar html2text-remove-tag-list
+  '("html" "body" "p" "img" "dir" "head" "div" "br" "font" "title" "meta")
+  "A list of removable tags.
+
+This is a list of tags which should be removed, without any
+formatting.  Observe that if you the tags in the list are presented
+*without* any \"<\" or \">\". All occurences of a tag appearing in
+this list are removed, irrespective of whether it is a closing or
+opening tag, or if the tag has additional attributes. The actual
+deletion is done by the function \"html2text-remove-tags\".
+
+For instance the text:
+
+\"Here comes something <font size\"+3\" face=\"Helvetica\"> big </font>.\"
+
+will be reduced to:
+
+\"Here comes something big.\"
+
+If this list contains the element \"font\".")
+
+(defvar html2text-format-tag-list
+  '(("b"         . html2text-clean-bold)
+    ("u"         . html2text-clean-underline)
+    ("i"         . html2text-clean-italic)
+    ("blockquote" . html2text-clean-blockquote)
+    ("a"          . html2text-clean-anchor)
+    ("ul"         . html2text-clean-ul)
+    ("ol"         . html2text-clean-ol)
+    ("dl"         . html2text-clean-dl)
+    ("center"     . html2text-clean-center))
+  "An alist of tags and processing functions.
+
+This is an alist where each dotted pair consists of a tag, and then
+the name of a function to be called when this tag is found. The
+function is called with the arguments p1, p2, p3 and p4. These are
+demontrated below:
+
+\"<b> This is bold text </b>\"
+ ^   ^                 ^    ^
+ |   |                 |    |
+p1  p2                p3   p4
+
+Then the called function will typically format the text somewhat and
+remove the tags.")
+
+(defvar html2text-remove-tag-list2  '("li" "dt" "dd" "meta")
+  "Another list of removable tags.
+
+This is a list of tags which are removed similarly to the list
+`html2text-remove-tag-list' - but these tags are retained for the
+formatting, and then moved afterward.")
+
+;;
+;; </Global variables>
+;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;
+;; <Utility functions>
+;;
+
+(defun html2text-buffer-head ()
+  (if (string= mode-name "Article")
+      (beginning-of-buffer)
+    (beginning-of-buffer)
+    )
+  )
+
+(defun html2text-replace-string (from-string to-string p1 p2)
+  (goto-char p1)
+  (let ((delta (- (string-width to-string) (string-width from-string)))
+       (change 0))
+    (while (search-forward from-string p2 t)
+      (replace-match to-string)
+      (setq change (+ change delta))
+      )
+    change
+    )
+  )
+
+;;
+;; </Utility functions>
+;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;
+;; <Functions related to attributes> i.e. <font size=+3>
+;;
+
+(defun html2text-attr-value (attr-list attr)
+  (nth 1 (assoc attr attr-list))
+  )
+
+(defun html2text-get-attr (p1 p2 tag)
+  (goto-char p1)
+  (re-search-forward " +[^ ]" p2 t)
+  (let* ((attr-string (buffer-substring-no-properties (1- (point)) (1- p2)))
+        (tmp-list (split-string attr-string))
+        (attr-list)
+        (counter 0)
+        (prev (car tmp-list))
+        (this (nth 1 tmp-list))
+        (next (nth 2 tmp-list))
+        (index 1))
+
+    (cond
+     ;; size=3
+     ((string-match "[^ ]=[^ ]" prev)
+      (let ((attr  (nth 0 (split-string prev "=")))
+           (value (nth 1 (split-string prev "="))))
+       (setq attr-list (cons (list attr value) attr-list))
+       )
+      )
+     ;; size= 3
+     ((string-match "[^ ]=\\'" prev)
+      (setq attr-list (cons (list (substring prev 0 -1) this) attr-list))
+      )
+     )
+
+    (while (< index (length tmp-list))
+      (cond
+       ;; size=3
+       ((string-match "[^ ]=[^ ]" this)
+       (let ((attr  (nth 0 (split-string this "=")))
+             (value (nth 1 (split-string this "="))))
+         (setq attr-list (cons (list attr value) attr-list))
+         )
+       )
+       ;; size =3
+       ((string-match "\\`=[^ ]" this)
+       (setq attr-list (cons (list prev (substring this 1)) attr-list)))
+
+       ;; size= 3
+       ((string-match "[^ ]=\\'" this)
+       (setq attr-list (cons (list (substring this 0 -1) next) attr-list))
+       )
+
+       ;; size = 3
+       ((string= "=" this)
+       (setq attr-list (cons (list prev next) attr-list))
+       )
+       )
+      (setq index (1+ index))
+      (setq prev this)
+      (setq this next)
+      (setq next (nth (1+ index) tmp-list))
+      )
+
+    ;;
+    ;; Tags with no accompanying "=" i.e. value=nil
+    ;;
+    (setq prev (car tmp-list))
+    (setq this (nth 1 tmp-list))
+    (setq next (nth 2 tmp-list))
+    (setq index 1)
+
+    (if (not (string-match "=" prev))
+       (progn
+         (if (not (string= (substring this 0 1) "="))
+             (setq attr-list (cons (list prev nil) attr-list))
+           )
+         )
+      )
+
+    (while (< index (1- (length tmp-list)))
+      (if (not (string-match "=" this))
+         (if (not (or (string= (substring next 0 1) "=")
+                      (string= (substring prev -1) "=")))
+             (setq attr-list (cons (list this nil) attr-list))
+           )
+       )
+      (setq index (1+ index))
+      (setq prev this)
+      (setq this next)
+      (setq next (nth (1+ index) tmp-list))
+      )
+
+    (if this
+       (progn
+         (if (not (string-match "=" this))
+             (progn
+               (if (not (string= (substring prev -1) "="))
+                   (setq attr-list (cons (list this nil) attr-list))
+                 )
+               )
+           )
+         )
+      )
+    attr-list ;; return - value
+    )
+  )
+
+;;
+;; </Functions related to attributes>
+;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;
+;; <Functions to be called to format a tag-pair>
+;;
+(defun html2text-clean-list-items (p1 p2 list-type)
+  (goto-char p1)
+  (let ((item-nr 0)
+       (items   0))
+    (while (re-search-forward "<li>" p2 t)
+      (setq items (1+ items)))
+    (goto-char p1)
+    (while (< item-nr items)
+      (setq item-nr (1+ item-nr))
+      (re-search-forward "<li>" (point-max) t)
+      (cond
+       ((string= list-type "ul") (insert " o "))
+       ((string= list-type "ol") (insert (format " %s: " item-nr)))
+       (t (insert " x ")))
+      )
+    )
+  )
+
+(defun html2text-clean-dtdd (p1 p2)
+  (goto-char p1)
+  (let ((items   0)
+       (item-nr 0))
+    (while (re-search-forward "<dt>" p2 t)
+      (setq items (1+ items)))
+    (goto-char p1)
+    (while (< item-nr items)
+      (setq item-nr (1+ item-nr))
+      (re-search-forward "<dt>\\([ ]*\\)" (point-max) t)
+      (if (match-string 1)
+         (kill-region (point) (- (point) (string-width (match-string 1))))
+       )
+      (let ((def-p1 (point))
+           (def-p2 0))
+       (re-search-forward "\\([ ]*\\)\\(</dt>\\|<dd>\\)" (point-max) t)
+       (if (match-string 1)
+           (progn
+             (let* ((mw1 (string-width (match-string 1)))
+                    (mw2 (string-width (match-string 2)))
+                    (mw  (+ mw1 mw2)))
+               (goto-char (- (point) mw))
+               (kill-region (point) (+ (point) mw1))
+               (setq def-p2 (point))
+               )
+             )
+         (setq def-p2 (- (point) (string-width (match-string 2)))))
+       (put-text-property def-p1 def-p2 'face 'bold)
+       )
+      )
+    )
+  )
+
+(defun html2text-delete-tags (p1 p2 p3 p4)
+  (kill-region p1 p2)
+  (kill-region (- p3 (- p2 p1)) (- p4 (- p2 p1)))
+  )
+
+(defun html2text-delete-single-tag (p1 p2)
+  (kill-region p1 p2)
+  )
+
+(defun html2text-clean-hr (p1 p2)
+  (html2text-delete-single-tag p1 p2)
+  (goto-char p1)
+  (newline 1)
+  (insert (make-string fill-column ?-))
+  )
+
+(defun html2text-clean-ul (p1 p2 p3 p4)
+  (html2text-delete-tags p1 p2 p3 p4)
+  (html2text-clean-list-items p1 (- p3 (- p1 p2)) "ul")
+  )
+
+(defun html2text-clean-ol (p1 p2 p3 p4)
+  (html2text-delete-tags p1 p2 p3 p4)
+  (html2text-clean-list-items p1 (- p3 (- p1 p2)) "ol")
+  )
+
+(defun html2text-clean-dl (p1 p2 p3 p4)
+  (html2text-delete-tags p1 p2 p3 p4)
+  (html2text-clean-dtdd p1 (- p3 (- p1 p2)))
+  )
+
+(defun html2text-clean-center (p1 p2 p3 p4)
+  (html2text-delete-tags p1 p2 p3 p4)
+  (center-region p1 (- p3 (- p2 p1)))
+  )
+
+(defun html2text-clean-bold (p1 p2 p3 p4)
+  (put-text-property p2 p3 'face 'bold)
+  (html2text-delete-tags p1 p2 p3 p4)
+  )
+
+(defun html2text-clean-title (p1 p2 p3 p4)
+  (put-text-property p2 p3 'face 'bold)
+  (html2text-delete-tags p1 p2 p3 p4)
+  )
+
+(defun html2text-clean-underline (p1 p2 p3 p4)
+  (put-text-property p2 p3 'face 'underline)
+  (html2text-delete-tags p1 p2 p3 p4)
+  )
+
+(defun html2text-clean-italic (p1 p2 p3 p4)
+  (put-text-property p2 p3 'face 'italic)
+  (html2text-delete-tags p1 p2 p3 p4)
+  )
+
+(defun html2text-clean-font (p1 p2 p3 p4)
+  (html2text-delete-tags p1 p2 p3 p4)
+  )
+
+(defun html2text-clean-blockquote (p1 p2 p3 p4)
+  (html2text-delete-tags p1 p2 p3 p4)
+  )
+
+(defun html2text-clean-anchor (p1 p2 p3 p4)
+  ;; If someone can explain how to make the URL clickable I will
+  ;; surely improve upon this.
+  (let* ((attr-list (html2text-get-attr p1 p2 "a"))
+        (href (html2text-attr-value attr-list "href")))
+    (kill-region p1 p4)
+    (when href
+      (goto-char p1)
+      (insert (substring href 1 -1 ))
+      (put-text-property p1 (point) 'face 'bold))))
+
+;;
+;; </Functions to be called to format a tag-pair>
+;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;
+;; <Functions to be called to fix up paragraphs>
+;;
+
+(defun html2text-fix-paragraph (p1 p2)
+  (goto-char p1)
+  (let ((has-br-line)
+       (refill-start)
+       (refill-stop))
+    (if (re-search-forward "<br>$" p2 t)
+       (setq has-br-line t)
+      )
+    (if has-br-line
+       (progn
+         (goto-char p1)
+         (if (re-search-forward ".+[^<][^b][^r][^>]$" p2 t)
+             (progn
+               (beginning-of-line)
+               (setq refill-start (point))
+               (goto-char p2)
+               (re-search-backward ".+[^<][^b][^r][^>]$" refill-start t)
+               (next-line 1)
+               (end-of-line)
+               ;; refill-stop should ideally be adjusted to
+               ;; accomodate the "<br>" strings which are removed
+               ;; between refill-start and refill-stop.  Can simply
+               ;; be returned from my-replace-string
+               (setq refill-stop (+ (point)
+                                    (html2text-replace-string
+                                     "<br>" ""
+                                     refill-start (point))))
+               ;; (message "Point = %s  refill-stop = %s" (point) refill-stop)
+               ;; (sleep-for 4)
+               (fill-region refill-start refill-stop)
+               )
+           )
+         )
+      )
+    )
+  (html2text-replace-string "<br>" "" p1 p2)
+  )
+
+;;
+;; This one is interactive ...
+;;
+(defun html2text-fix-paragraphs ()
+  "This _tries_ to fix up the paragraphs - this is done in quite a ad-hook
+fashion, quite close to pure guess-work. It does work in some cases though."
+  (interactive)
+  (html2text-buffer-head)
+  (replace-regexp "^<br>$" "")
+  ;; Removing lonely <br> on a single line, if they are left intact we
+  ;; dont have any paragraphs at all.
+  (html2text-buffer-head)
+  (while (< (point) (point-max))
+    (let ((p1 (point)))
+      (forward-paragraph 1)
+      ;;(message "Kaller fix med p1=%s  p2=%s " p1 (1- (point))) (sleep-for 5)
+      (html2text-fix-paragraph p1 (1- (point)))
+      (goto-char p1)
+      (if (< (point) (point-max))
+         (forward-paragraph 1))
+      )
+    )
+  )
+
+;;
+;; </Functions to be called to fix up paragraphs>
+;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;
+;; <Interactive functions>
+;;
+
+(defun html2text-remove-tags (tag-list)
+  "Removes the tags listed in the list \"html2text-remove-tag-list\".
+See the documentation for that variable."
+  (interactive)
+  (dolist (tag tag-list)
+    (html2text-buffer-head)
+    (while (re-search-forward (format "\\(</?%s[^>]*>\\)" tag) (point-max) t)
+      (let ((p1 (point)))
+       (search-backward "<")
+       (kill-region (point) p1)
+       )
+      )
+    )
+  )
+
+(defun html2text-format-tags ()
+  "See the variable \"html2text-format-tag-list\" for documentation"
+  (interactive)
+  (dolist (tag-and-function html2text-format-tag-list)
+    (let ((tag      (car tag-and-function))
+         (function (cdr tag-and-function)))
+      (html2text-buffer-head)
+      (while (re-search-forward (format "\\(<%s\\( [^>]*\\)?>\\)" tag)
+                               (point-max) t)
+       (let ((p1)
+             (p2 (point))
+             (p3) (p4)
+             (attr (match-string 1)))
+         (search-backward "<" (point-min) t)
+         (setq p1 (point))
+         (re-search-forward (format "</%s>" tag) (point-max) t)
+         (setq p4 (point))
+         (search-backward "</" (point-min) t)
+         (setq p3 (point))
+         (funcall function p1 p2 p3 p4)
+         (goto-char p1)
+         )
+       )
+      )
+    )
+  )
+
+(defun html2text-substitute ()
+  "See the variable \"html2text-replace-list\" for documentation"
+  (interactive)
+  (dolist (e html2text-replace-list)
+    (html2text-buffer-head)
+    (let ((old-string (car e))
+         (new-string (cdr e)))
+      (html2text-replace-string old-string new-string (point-min) (point-max))
+      )
+    )
+  )
+
+(defun html2text-format-single-elements ()
+  ""
+  (interactive)
+  (dolist (tag-and-function html2text-format-single-element-list)
+    (let ((tag      (car tag-and-function))
+         (function (cdr tag-and-function)))
+      (html2text-buffer-head)
+      (while (re-search-forward (format "\\(<%s\\( [^>]*\\)?>\\)" tag)
+                               (point-max) t)
+       (let ((p1)
+             (p2 (point)))
+         (search-backward "<" (point-min) t)
+         (setq p1 (point))
+         (funcall function p1 p2)
+         )
+       )
+      )
+    )
+  )
+
+;;
+;; Main function
+;;
+
+;;;###autoload
+(defun html2text ()
+  "Convert HTML to plain text in the current buffer."
+  (interactive)
+  (save-excursion
+    (let ((case-fold-search t)
+         (buffer-read-only))
+      (html2text-remove-tags html2text-remove-tag-list)
+      (html2text-format-tags)
+      (html2text-remove-tags html2text-remove-tag-list2)
+      (html2text-substitute)
+      (html2text-format-single-elements)
+      (html2text-fix-paragraphs))))
+
+;;
+;; </Interactive functions>
+;;
+
+;;; html2text.el ends here
index 76d243f..9c79e91 100644 (file)
     (modify-syntax-entry ?* " " table)
     (modify-syntax-entry ?\; " " table)
     (modify-syntax-entry ?\' " " table)
+    (if (featurep 'xemacs)
+       (let ((i 128))
+         (while (< i 256)
+           (modify-syntax-entry i "w" table)
+           (setq i (1+ i)))))
     table))
 
 (defun ietf-drums-token-to-list (token)
index ca6cc64..33f2d52 100644 (file)
@@ -518,7 +518,7 @@ If ARGS, PROMPT is used as an argument to `format'."
                                (not (string-match "failed" response))))
                (setq done process)
              (if (memq (process-status process) '(open run))
-                 (imap-send-command-wait "LOGOUT"))
+                 (imap-send-command "LOGOUT"))
              (delete-process process)
              nil)))))
     done))
@@ -576,7 +576,7 @@ If ARGS, PROMPT is used as an argument to `format'."
                                (not (string-match "failed" response))))
                (setq done process)
              (if (memq (process-status process) '(open run))
-                 (imap-send-command-wait "LOGOUT"))
+                 (imap-send-command "LOGOUT"))
              (delete-process process)
              nil)))))
     done))
@@ -755,7 +755,7 @@ Returns t if login was successful, nil otherwise."
       (while (or (not user) (not passwd))
        (setq user (or imap-username
                       (read-from-minibuffer
-                       (concat "IMAP username for " imap-server 
+                       (concat "IMAP username for " imap-server
                                " (using stream `" (symbol-name imap-stream)
                                "'): ")
                        (or user imap-default-user))))
@@ -848,7 +848,7 @@ Returns t if login was successful, nil otherwise."
   t)
 
 (defun imap-anonymous-auth (buffer)
-  (message "imap: Loging in anonymously...")
+  (message "imap: Logging in anonymously...")
   (with-current-buffer buffer
     (imap-ok-p (imap-send-command-wait
                (concat "LOGIN anonymous \"" (concat (user-login-name) "@"
@@ -948,15 +948,15 @@ necessery.  If nil, the buffer name is generated."
                    (set-buffer-multibyte nil)
                    (buffer-disable-undo)
                    (setq imap-server (or server imap-server))
-                   (setq imap-port imap-port)
-                   (setq imap-auth imap-auth)
+                   (setq imap-port (or port imap-port))
+                   (setq imap-auth (or auth imap-auth))
                    (message "imap: Reconnecting with stream `%s'..." stream)
                    (if (null (let ((imap-stream stream))
                                (imap-open-1 (current-buffer))))
                        (progn
                          (kill-buffer (current-buffer))
-                         (message 
-                          "imap: Reconnecting with stream `%s'...failed" 
+                         (message
+                          "imap: Reconnecting with stream `%s'...failed"
                           stream))
                      ;; We're done, kill the first connection
                      (imap-close buffer)
@@ -974,7 +974,7 @@ necessery.  If nil, the buffer name is generated."
                (setq streams nil))))))
       (when (imap-opened buffer)
        (setq imap-mailbox-data (make-vector imap-mailbox-prime 0)))
-      (when imap-stream 
+      (when imap-stream
        buffer))))
 
 (defun imap-opened (&optional buffer)
@@ -1003,7 +1003,7 @@ password is remembered in the buffer."
       (if user (setq imap-username user))
       (if passwd (setq imap-password passwd))
       (if imap-auth
-         (and (funcall (nth 2 (assq imap-auth 
+         (and (funcall (nth 2 (assq imap-auth
                                     imap-authenticator-alist)) buffer)
               (setq imap-state 'auth))
        ;; Choose authenticator.
@@ -1309,6 +1309,20 @@ returned, if ITEMS is a symbol only it's value is returned."
                  items)
        (imap-mailbox-get items mailbox)))))
 
+(defun imap-mailbox-status-asynch (mailbox items &optional buffer)
+  "Send status item request ITEM on MAILBOX to server in BUFFER.
+ITEMS can be a symbol or a list of symbols, valid symbols are one of
+the STATUS data items -- ie 'messages, 'recent, 'uidnext, 'uidvalidity
+or 'unseen.  The IMAP command tag is returned."
+  (with-current-buffer (or buffer (current-buffer))
+    (imap-send-command (list "STATUS \""
+                            (imap-utf7-encode mailbox)
+                            "\" "
+                            (format "%s"
+                                    (if (listp items)
+                                        items
+                                      (list items)))))))
+
 (defun imap-mailbox-acl-get (&optional mailbox buffer)
   "Get ACL on mailbox from server in BUFFER."
   (let ((mailbox (imap-utf7-encode mailbox)))
@@ -2102,8 +2116,8 @@ Return nil if no complete line has arrived."
     (imap-forward)
     (cond ((search-forward "PERMANENTFLAGS " nil t)
           (imap-mailbox-put 'permanentflags (imap-parse-flag-list)))
-         ((search-forward "UIDNEXT " nil t)
-          (imap-mailbox-put 'uidnext (read (current-buffer))))
+         ((search-forward "UIDNEXT \\([0-9]+\\)" nil t)
+          (imap-mailbox-put 'uidnext (match-string 1)))
          ((search-forward "UNSEEN " nil t)
           (imap-mailbox-put 'unseen (read (current-buffer))))
          ((looking-at "UIDVALIDITY \\([0-9]+\\)")
@@ -2276,7 +2290,9 @@ Return nil if no complete line has arrived."
                ((eq token 'RECENT)
                 (imap-mailbox-put 'recent (read (current-buffer)) mailbox))
                ((eq token 'UIDNEXT)
-                (imap-mailbox-put 'uidnext (read (current-buffer)) mailbox))
+                (and (looking-at " \\([0-9]+\\)")
+                     (imap-mailbox-put 'uidnext (match-string 1) mailbox)
+                     (goto-char (match-end 1))))
                ((eq token 'UIDVALIDITY)
                 (and (looking-at " \\([0-9]+\\)")
                      (imap-mailbox-put 'uidvalidity (match-string 1) mailbox)
index 604739d..018179d 100644 (file)
 (maybe-fbind '(babel-fetch
               babel-wash create-image decode-coding-string display-graphic-p
               replace-regexp-in-string
-              bbdb-complete-name
               display-time-event-handler
               find-image font-create-object gnus-mule-get-coding-system
               font-lock-set-defaults
               find-coding-systems-string
               image-size image-type-available-p insert-image
               image-type-from-file-header
+              make-symbolic-link
               make-temp-file message-xmas-redefine
+              mail-abbrev-in-expansion-header-p
               mail-aliases-setup mm-copy-tree
               mule-write-region-no-coding-system put-image
               ring-elements
               frames-on-display-list
               make-mode-line-mouse-map
               rmail-select-summary rmail-summary-exists rmail-update-summary
-              rmail-toggle-header
+              rmail-msg-is-pruned rmail-msg-restore-non-pruned-header
               sc-cite-regexp set-font-family set-font-size temp-directory
               string-as-multibyte
               tool-bar-add-item tool-bar-add-item-from-menu
+              unix-sync
               url-view-url vcard-pretty-print
               url-insert-file-contents
               w3-coding-system-for-mime-charset w3-prepare-buffer w3-region
+              w3m-charset-to-coding-system w3m-region
               widget-make-intangible x-defined-colors))
 
 (maybe-bind '(adaptive-fill-first-line-regexp
@@ -47,6 +50,7 @@
              display-time-mail-function imap-password mail-mode-hook
              filladapt-mode
              mc-pgp-always-sign
+             gnus-message-group-art
              gpg-unabbrev-trust-alist
              nnoo-definition-alist
              url-current-callback-func url-be-asynchronous
              url-current-mime-headers w3-meta-charset-content-type-regexp
              rmail-enable-mime-composing
              rmail-insert-mime-forwarded-message-function
-             w3-meta-content-type-charset-regexp))
+             w3-meta-content-type-charset-regexp
+             w3m-cid-retrieve-function-alist w3m-current-buffer
+             w3m-meta-content-type-charset-regexp w3m-mode-map
+             url-package-version url-package-name))
 
 (if (featurep 'xemacs)
     (progn
@@ -80,7 +87,8 @@
                     url-retrieve w3-form-encode-xwfu window-at
                     window-edges x-color-values x-popup-menu browse-url
                     frame-char-height frame-char-width
-                    url-generic-parse-url xml-parse-region))
+                    url-generic-parse-url xml-parse-region
+                    make-network-process))
       (maybe-bind '(buffer-display-table
                    buffer-file-coding-system font-lock-defaults
                    global-face-data gnus-article-x-face-too-ugly
                 specifier-instance url-generic-parse-url
                 valid-image-instantiator-format-p w3-do-setup
                 window-pixel-height window-pixel-width
-                xml-parse-region)))
+                xml-parse-region make-network-process)))
 
 ;; T-gnus.
-(let ((functions-variables
+(let ((functions
        (cond
        ((featurep 'xemacs)
         nil)
        ((>= emacs-major-version 21)
-        '((function-max-args smiley-encode-buffer)))
+        '(function-max-args smiley-encode-buffer))
        ((boundp 'MULE)
-        '((coding-system-get
-           coding-system-to-mime-charset compose-mail file-name-extension
-           find-coding-systems-for-charsets find-coding-systems-region
-           function-max-args get-charset-property shell-command-to-string
-           smiley-encode-buffer)))
+        '(coding-system-get
+          coding-system-to-mime-charset compose-mail file-name-extension
+          find-coding-systems-for-charsets find-coding-systems-region
+          function-max-args get-charset-property smiley-encode-buffer))
        (t
-        '((function-max-args smiley-encode-buffer))))))
-  (maybe-fbind (car functions-variables))
-  (maybe-bind (car (cdr functions-variables))))
+        '(function-max-args smiley-encode-buffer))))
+      (common-fns
+       nil)
+      (variables
+       (cond
+       ((featurep 'xemacs)
+        nil)
+       ((>= emacs-major-version 21)
+        nil)
+       ((boundp 'MULE)
+        nil)
+       (t
+        nil)))
+      (common-vars
+       '(navi2ch-mona-font)))
+  (maybe-fbind functions)
+  (maybe-fbind common-fns)
+  (maybe-bind variables)
+  (maybe-bind common-vars))
 
 (defun nnkiboze-score-file (a)
   )
index 6cc9e78..5cf4016 100644 (file)
@@ -1,5 +1,5 @@
 ;;; mail-source.el --- functions for fetching mail
-;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news, mail
@@ -291,6 +291,9 @@ Common keywords should be listed here.")
        (:path (or (getenv "MAIL")
                  (expand-file-name (user-login-name) rmail-spool-directory))))
       (directory
+       (:prescript)
+       (:prescript-delay)
+       (:postscript)
        (:path)
        (:suffix ".spool")
        (:predicate identity))
@@ -380,7 +383,7 @@ the `mail-source-keyword-map' variable."
      ,@body))
 
 (put 'mail-source-bind 'lisp-indent-function 1)
-(put 'mail-source-bind 'edebug-form-spec '(form body))
+(put 'mail-source-bind 'edebug-form-spec '(sexp body))
 
 (defun mail-source-set-1 (source)
   (let* ((type (pop source))
@@ -423,7 +426,7 @@ See `mail-source-bind'."
      ,@body))
 
 (put 'mail-source-bind-common 'lisp-indent-function 1)
-(put 'mail-source-bind-common 'edebug-form-spec '(form body))
+(put 'mail-source-bind-common 'edebug-form-spec '(sexp body))
 
 (defun mail-source-value (value)
   "Return the value of VALUE."
@@ -463,17 +466,21 @@ Return the number of files that were found."
                     (funcall function source callback)
                   (error
                    (unless (yes-or-no-p
-                            (format "Mail source error (%s).  Continue? " err))
+                            (format "Mail source error (%s).  Continue? "
+                                    (cadr err)))
                      (error "Cannot get new mail"))
                    0)))))))))
 
-(defun mail-source-make-complex-temp-name (prefix)
-  (let ((newname (make-temp-name prefix))
-       (newprefix prefix))
-    (while (file-exists-p newname)
-      (setq newprefix (concat newprefix "x"))
-      (setq newname (make-temp-name newprefix)))
-    newname))
+(eval-and-compile
+  (if (fboundp 'make-temp-file)
+      (defalias 'mail-source-make-complex-temp-name 'make-temp-file)
+    (defun mail-source-make-complex-temp-name (prefix)
+      (let ((newname (make-temp-name prefix))
+           (newprefix prefix))
+       (while (file-exists-p newname)
+         (setq newprefix (concat newprefix "x"))
+         (setq newname (make-temp-name newprefix)))
+       newname))))
 
 (defun mail-source-callback (callback info)
   "Call CALLBACK on the mail file, and then remove the mail file.
@@ -632,6 +639,9 @@ If ARGS, PROMPT is used as an argument to `format'."
 (defun mail-source-fetch-directory (source callback)
   "Fetcher for directory sources."
   (mail-source-bind (directory source)
+    (mail-source-run-script
+     prescript (format-spec-make ?t path)
+     prescript-delay)
     (let ((found 0)
          (mail-source-string (format "directory:%s" path)))
       (dolist (file (directory-files
@@ -640,6 +650,8 @@ If ARGS, PROMPT is used as an argument to `format'."
                   (funcall predicate file)
                   (mail-source-movemail file mail-source-crash-box))
          (incf found (mail-source-callback callback file))))
+      (mail-source-run-script
+       postscript (format-spec-make ?t path))
       found)))
 
 (defun mail-source-fetch-pop (source callback)
diff --git a/lisp/message-utils.el b/lisp/message-utils.el
new file mode 100644 (file)
index 0000000..8b8d455
--- /dev/null
@@ -0,0 +1,375 @@
+;;; message-utils.el -- utils for message-mode
+
+;; Copyright (C) 2002 Free Software Foundation, Inc.
+
+;; Author: Holger Schauer <Holger.Schauer@gmx.de>
+;; Keywords: utils message
+
+;; This file is part of GNU Emacs.
+
+;; 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 of the License, 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.
+
+;;; Commentary:
+
+;; This file contains some small additions to message mode:
+;;    * inserting files in a message and explicit marking it
+;;      as something somebody else has created,
+;;    * change Subject: header and add (was: <old subject>)
+;;    * strip (was: <old subject>) from Subject: headers
+;;    * add a X-No-Archieve: Yes header and a note in the body
+;;    * a function for cross-post and followup-to messages
+;;    * replace To: header with contents of Cc: or Bcc: header.
+;;
+
+;; This file is adopt from the link below when the revision is 0.8.
+;;  http://www.coling.uni-freiburg.de/~schauer/resources/emacs/message-utils.el.gz
+
+;;; Installation: (TODO: merge into message.el)
+
+;; .. is easy as in most cases. Add
+;; (autoload 'message-mark-inserted-region "message-utils" nil t)
+;; (autoload 'message-mark-insert-file "message-utils" nil t)
+;; (autoload 'message-strip-subject-was "message-utils" nil t)
+;; (autoload 'message-change-subject "message-utils" nil t)
+;; (autoload 'message-xpost-fup2 "message-utils" nil t)
+;; (autoload 'message-add-archive-header "message-utils" nil t)
+;; (autoload 'message-reduce-to-to-cc "message-utils" nil t)
+;; as well as some keybindings like
+;; (define-key message-mode-map '[(control c) m] 'message-mark-inserted-region)
+;; (define-key message-mode-map '[(control c) f] 'message-mark-insert-file)
+;; (define-key message-mode-map '[(control c) x] 'message-xpost-fup2)
+;; (define-key message-mode-map '[(control c) s] 'message-change-subject)
+;; (define-key message-mode-map '[(control c) a] 'message-add-archive-header)
+;; (define-key message-mode-map '[(control c) t] 'message-reduce-to-to-cc)
+;; (add-hook 'message-header-setup-hook 'message-strip-subject-was)
+;; to your .gnus or to your .emacs.
+;; You might also want to add something along the following lines:
+;; (defun message-utils-setup ()
+;;  "Add menu-entries for message-utils."
+;;  (easy-menu-add-item nil '("Message")
+;;   ["Insert Region Marked" message-mark-inserted-region t] "Spellcheck")
+;;  (easy-menu-add-item nil '("Message")
+;;   ["Insert File Marked" message-mark-insert-file t] "Spellcheck")
+;;  (easy-menu-add-item nil '("Field")
+;;   ["Crosspost / Followup" message-xpost-fup2 t] "----")
+;;  (easy-menu-add-item nil '("Field")
+;;   ["New Subject" message-change-subject t] "----")
+;;  (easy-menu-add-item nil '("Field")
+;;   ["Reduce To: to Cc:" message-reduce-to-to-cc t] "----")
+;;  (easy-menu-add-item nil '("Field")
+;;   [ "X-No-Archive:" message-add-archive-header t ]))
+;; (add-hook 'message-mode-hook 'message-utils-setup)
+
+;;; Code:
+
+(require 'message)
+
+;;; **************
+;;; Inserting and marking ...
+
+; We try to hook the vars into the message customize group
+
+(defcustom message-begin-inserted-text-mark
+"--8<------------------------schnipp------------------------->8---\n"
+"How to mark the beginning of some inserted text."
+ :type 'string
+ :group 'message-various)
+
+(defcustom message-end-inserted-text-mark
+"--8<------------------------schnapp------------------------->8---\n"
+"How to mark the end of some inserted text."
+ :type 'string
+ :group 'message-various)
+
+;;;###autoload
+(defun message-mark-inserted-region (beg end)
+  "Mark some region in the current article with enclosing tags.
+See `message-begin-inserted-text-mark' and `message-end-inserted-text-mark'."
+  (interactive "r")
+  (save-excursion
+    ; add to the end of the region first, otherwise end would be invalid
+    (goto-char end)
+    (insert message-end-inserted-text-mark)
+    (goto-char beg)
+    (insert message-begin-inserted-text-mark)))
+
+;;;###autoload
+(defun message-mark-insert-file (file)
+  "Inserts FILE at point, marking it with enclosing tags.
+See `message-begin-inserted-text-mark' and `message-end-inserted-text-mark'."
+  (interactive "fFile to insert: ")
+    ;; reverse insertion to get correct result.
+  (let ((p (point)))
+    (insert message-end-inserted-text-mark)
+    (goto-char p)
+    (insert-file-contents file)
+    (goto-char p)
+    (insert message-begin-inserted-text-mark)))
+
+;;; **************
+;;; Subject mangling
+
+(defcustom message-subject-was-regexp
+  "[ \t]*\\((*[Ww][Aa][SsRr]:[ \t]*.*)\\)"
+  "*Regexp matching \"(was: <old subject>)\" in the subject line."
+  :group 'message-various
+  :type 'regexp)
+
+;;;###autoload
+(defun message-strip-subject-was ()
+  "Remove trailing \"(Was: <old subject>)\" from subject lines."
+  (message-narrow-to-head)
+  (let* ((subject (message-fetch-field "Subject"))
+        (pos))
+    (cond (subject
+          (setq pos (or (string-match message-subject-was-regexp subject) 0))
+          (cond ((> pos 0)
+                 (message-goto-subject)
+                 (message-delete-line)
+                 (insert (concat "Subject: "
+                                 (substring subject 0 pos) "\n")))))))
+    (widen))
+
+;;; Suggested by Jonas Steverud  @  www.dtek.chalmers.se/~d4jonas/
+;;;###autoload
+(defun message-change-subject (new-subject)
+  "Ask for new Subject: header, append (was: <Old Subject>)."
+  (interactive
+   (list
+    (read-from-minibuffer "New subject: ")))
+  (cond ((and (not (or (null new-subject) ; new subject not empty
+                      (zerop (string-width new-subject))
+                      (string-match "^[ \t]*$" new-subject))))
+        (save-excursion
+          (let ((old-subject (message-fetch-field "Subject")))
+            (cond ((not (string-match
+                         (concat "^[ \t]*"
+                                 (regexp-quote new-subject)
+                                 " \t]*$")
+                         old-subject))  ; yes, it really is a new subject
+                   ;; delete eventual Re: prefix
+                   (setq old-subject
+                         (message-strip-subject-re old-subject))
+                   (message-goto-subject)
+                   (message-delete-line)
+                   (insert (concat "Subject: "
+                                   new-subject
+                                   " (was: "
+                                   old-subject ")\n")))))))))
+
+
+;;; **************
+;;; X-Archive-Header: No
+
+(defcustom message-archive-header
+  "X-No-Archive: Yes\n"
+  "Header to insert when you don't want your article to be archived by deja.com."
+  :type 'string
+  :group 'message-various)
+
+(defcustom message-archive-note
+  "X-No-Archive: Yes - save http://deja.com/"
+  "Note to insert why you wouldn't want this posting archived."
+  :type 'string
+  :group 'message-various)
+
+(defun message-add-archive-header ()
+  "Insert \"X-No-Archive: Yes\" in the header and a note in the body.
+When called with a prefix argument, ask for a text to insert."
+  (interactive)
+  (if current-prefix-arg
+      (setq message-archive-note
+           (read-from-minibuffer "Reason for No-Archive: "
+                                 (cons message-archive-note 0))))
+  (save-excursion
+    (insert message-archive-note)
+    (newline)
+    (message-add-header message-archive-header)
+    (message-sort-headers)))
+
+;;; **************
+;;; Crossposts and Followups
+
+; inspired by JoH-followup-to by Jochem Huhman <joh  at gmx.de>
+; new suggestions by R. Weikusat <rw at another.de>
+
+(defvar message-xpost-old-target nil
+  "Old target for cross-posts or follow-ups.")
+(make-variable-buffer-local 'message-xpost-old-target)
+
+(defcustom message-xpost-default t
+  "When non-nil `mesage-xpost-fup2' will normally perform a crosspost.
+If nil, `message-xpost-fup2' will only do a followup. Note that you
+can explicitly override this setting by calling `message-xpost-fup2'
+with a prefix."
+  :type 'boolean
+  :group 'message-various)
+
+(defun message-xpost-fup2-header (target-group)
+  "Mangles FollowUp-To and Newsgroups header to point to TARGET-GROUP.
+With prefix-argument just set Follow-Up, don't cross-post."
+  (interactive
+   (list ; Completion based on Gnus
+    (completing-read "Follwup To: "
+                    (if (boundp 'gnus-newsrc-alist)
+                        gnus-newsrc-alist)
+                    nil nil '("poster" . 0)
+                    (if (boundp 'gnus-group-history)
+                        'gnus-group-history))))
+  (message-remove-header "Follow[Uu]p-[Tt]o" t)
+  (message-goto-newsgroups)
+  (beginning-of-line)
+  ;; if we already did a crosspost before, kill old target
+  (if (and message-xpost-old-target
+          (re-search-forward
+           (regexp-quote (concat "," message-xpost-old-target))
+           nil t))
+      (replace-match ""))
+  ;; unless (followup is to poster or user explicitly asked not
+  ;; to cross-post, or target-group is already in Newsgroups)
+  ;; add target-group to Newsgroups line.
+  (cond ((and (or (and message-xpost-default (not current-prefix-arg))  ; def: xpost, req:no
+                 (and (not message-xpost-default) current-prefix-arg)) ; def: no-xpost, req:yes
+             (not (string-match "poster" target-group))
+             (not (string-match (regexp-quote target-group)
+                                (message-fetch-field "Newsgroups"))))
+        (end-of-line)
+        (insert-string (concat "," target-group))))
+  (end-of-line) ; ensure Followup: comes after Newsgroups:
+  ;; unless new followup would be identical to Newsgroups line
+  ;; make a new Followup-To line
+  (if (not (string-match (concat "^[ \t]*"
+                                target-group
+                                "[ \t]*$")
+                        (message-fetch-field "Newsgroups")))
+      (insert (concat "\nFollowup-To: " target-group)))
+  (setq message-xpost-old-target target-group))
+
+
+(defcustom message-xpost-note
+  "Crosspost & Followup-To: "
+  "Note to insert before signature to notify of xpost and follow-up."
+ :type 'string
+ :group 'message-various)
+
+(defcustom message-fup2-note
+  "Followup-To: "
+  "Note to insert before signature to notify of follow-up only."
+ :type 'string
+ :group 'message-various)
+
+(defun message-xpost-insert-note (target-group xpost in-old old-groups)
+  "Insert a in message body note about a set Followup or Crosspost.
+If there have been previous notes, delete them. TARGET-GROUP specifies the
+group to Followup-To. When XPOST is t, insert note about
+crossposting. IN-OLD specifies whether TARGET-GROUP is a member of
+OLD-GROUPS. OLD-GROUPS lists the old-groups the posting would have
+been made to before the user asked for a Crosspost."
+  ;; start scanning body for previous uses
+  (message-goto-signature)
+  (let ((head (re-search-backward
+              (concat "^" mail-header-separator)
+              nil t))) ; just search in body
+    (message-goto-signature)
+    (while (re-search-backward
+           (concat "^" (regexp-quote message-xpost-note) ".*")
+           head t)
+      (message-delete-line))
+    (message-goto-signature)
+    (while (re-search-backward
+           (concat "^" (regexp-quote message-fup2-note) ".*")
+           head t)
+      (message-delete-line))
+  ;; insert new note
+  (message-goto-signature)
+  (previous-line 2)
+  (open-line 1)
+  (if (or in-old
+         (not xpost)
+         (string-match "^[ \t]*poster[ \t]*$" target-group))
+      (insert (concat message-fup2-note target-group "\n"))
+    (insert (concat message-xpost-note target-group "\n")))))
+
+(defcustom message-xpost-note-function
+  'message-xpost-insert-note
+  "Function to use to insert note about Crosspost or Followup-To.
+The function will be called with four arguments. The function should not
+only insert a note, but also ensure old notes are deleted. See the
+documentation for `message-xpost-insert-note'. "
+  :type 'function
+  :group 'message-various)
+
+;;;###autoload
+(defun message-xpost-fup2 (target-group)
+  "Crossposts message and sets Followup-To to TARGET-GROUP.
+With prefix-argument just set Follow-Up, don't cross-post."
+  (interactive
+   (list ; Completion based on Gnus
+    (completing-read "Follwup To: "
+                    (if (boundp 'gnus-newsrc-alist)
+                        gnus-newsrc-alist)
+                    nil nil '("poster" . 0)
+                    (if (boundp 'gnus-group-history)
+                        'gnus-group-history))))
+  (cond ((not (or (null target-group) ; new subject not empty
+                 (zerop (string-width target-group))
+                 (string-match "^[ \t]*$" target-group)))
+        (save-excursion
+          (let* ((old-groups (message-fetch-field "Newsgroups"))
+                 (in-old (string-match
+                          (regexp-quote target-group) old-groups)))
+            ;; check whether target exactly matches old Newsgroups
+            (cond ((or (not in-old)
+                       (not (string-match
+                             (concat "^[ \t]*"
+                                     (regexp-quote target-group)
+                                     "[ \t]*$")
+                             old-groups)))
+                   ;; yes, Newsgroups line must change
+                   (message-xpost-fup2-header target-group)
+                   ;; insert note whether we do xpost or fup2
+                   (funcall message-xpost-note-function
+                            target-group
+                            (if (or (and message-xpost-default (not current-prefix-arg))
+                                    (and (not message-xpost-default) current-prefix-arg))
+                                t)
+                            in-old old-groups))))))))
+
+
+;;; **************
+;;; Reduce To: to Cc: or Bcc: header
+
+(defun message-reduce-to-to-cc ()
+ "Replace contents of To: header with contents of Cc: or Bcc: header."
+ (interactive)
+ (let ((cc-content (message-fetch-field "cc"))
+       (bcc nil))
+   (if (and (not cc-content)
+           (setq cc-content (message-fetch-field "bcc")))
+       (setq bcc t))
+   (cond (cc-content
+         (save-excursion
+           (message-goto-to)
+           (message-delete-line)
+           (insert (concat "To: " cc-content "\n"))
+           (message-remove-header (if bcc
+                                      "bcc"
+                                    "cc")))))))
+
+;;; provide ourself
+(provide 'message-utils)
+
+;;; message-utils.el ends here
index e361768..f87e0a4 100644 (file)
     (require 'canlock)))
 (require 'mailheader)
 (require 'nnheader)
-;; This is apparently necessary even though things are autoloaded:
+;; This is apparently necessary even though things are autoloaded.
+;; Because we dynamically bind mail-abbrev-mode-regexp, we'd better
+;; require mailabbrev here.
 (if (featurep 'xemacs)
-    (require 'mail-abbrevs))
+    (require 'mail-abbrevs)
+  (require 'mailabbrev))
 (require 'mime-edit)
 (eval-when-compile (require 'static))
 
@@ -203,7 +206,14 @@ Otherwise, most addresses look like `angles', but they look like
                 (const default))
   :group 'message-headers)
 
-(defcustom message-syntax-checks nil
+(defcustom message-insert-canlock t
+  "Whether to insert a Cancel-Lock header in news postings."
+  :version "21.3"
+  :group 'message-headers
+  :type 'boolean)
+
+(defcustom message-syntax-checks 
+  (if message-insert-canlock '((sender . disabled)) nil)
   ;; Guess this one shouldn't be easy to customize...
   "*Controls what syntax checks should not be performed on outgoing posts.
 To disable checking of long signatures, for instance, add
@@ -275,7 +285,8 @@ any confusion."
   :group 'message-sending
   :type 'function)
 
-(defcustom message-subject-re-regexp "^[ \t]*\\([Rr][Ee]:[ \t]*\\)*[ \t]*"
+(defcustom message-subject-re-regexp
+  "^[ \t]*\\([Rr][Ee]\\(\\[[0-9]*\\]\\)*:[ \t]*\\)*[ \t]*"
   "*Regexp matching \"Re: \" in the subject line."
   :group 'message-various
   :type 'regexp)
@@ -476,7 +487,20 @@ The provided functions are:
   (if (string-match "[[:digit:]]" "1") ;; support POSIX?
       "\\([ \t]*[-_.[:word:]]+>+\\|[ \t]*[]>»|:}+]\\)+"
     ;; ?-, ?_ or ?. MUST NOT be in syntax entry w.
-    "\\([ \t]*\\(\\w\\|[-_.]\\)+>+\\|[ \t]*[]>»|:}+]\\)+")
+    (let ((old-table (syntax-table))
+         non-word-constituents)
+      (set-syntax-table text-mode-syntax-table)
+      (setq non-word-constituents
+           (concat
+            (if (string-match "\\w" "-")  "" "-")
+            (if (string-match "\\w" "_")  "" "_")
+            (if (string-match "\\w" ".")  "" ".")))
+      (set-syntax-table old-table)
+      (if (equal non-word-constituents "")
+         "\\([ \t]*\\(\\w\\)+>+\\|[ \t]*[]>»|:}+]\\)+"
+       (concat "\\([ \t]*\\(\\w\\|["
+               non-word-constituents
+               "]\\)+>+\\|[ \t]*[]>»|:}+]\\)+"))))
   "*Regexp matching the longest possible citation prefix on a line."
   :group 'message-insertion
   :type 'regexp)
@@ -644,13 +668,15 @@ Doing so would be even more evil than leaving it out."
 
 (defcustom message-qmail-inject-args nil
   "Arguments passed to qmail-inject programs.
-This should be a list of strings, one string for each argument.
+This should be a list of strings, one string for each argument.  It
+may also be a function.
 
 For e.g., if you wish to set the envelope sender address so that bounces
 go to the right place or to deal with listserv's usage of that address, you
 might set this variable to '(\"-f\" \"you@some.where\")."
   :group 'message-sending
-  :type '(repeat string))
+  :type '(choice (function)
+                (repeat string)))
 
 (defvar message-cater-to-broken-inn t
   "Non-nil means Gnus should not fold the `References' header.
@@ -822,8 +848,6 @@ point and mark around the citation text as modified."
   :type 'function
   :group 'message-insertion)
 
-(defvar message-abbrevs-loaded nil)
-
 ;;;###autoload
 (defcustom message-signature t
   "*String to be inserted at the end of the message buffer.
@@ -865,7 +889,10 @@ If stringp, use this; if non-nil, use no host name (user name only)."
                 (sexp :tag "none" :format "%t" t)))
 
 (defvar message-reply-buffer nil)
-(defvar message-reply-headers nil)
+(defvar message-reply-headers nil
+  "The headers of the current replied article.
+It is a vector of the following headers:
+\[number subject from date id references chars lines xref extra].")
 (defvar message-sent-message-via nil)
 (defvar message-checksum nil)
 (defvar message-send-actions nil
@@ -977,14 +1004,6 @@ If nil, Message won't auto-save."
   :group 'message-buffers
   :type '(choice directory (const :tag "Don't auto-save" nil)))
 
-(defcustom message-buffer-naming-style 'unique
-  "*The way new message buffers are named.
-Valid valued are `unique' and `unsent'."
-  :version "21.1"
-  :group 'message-buffers
-  :type '(choice (const :tag "unique" unique)
-                (const :tag "unsent" unsent)))
-
 (defcustom message-default-charset
   (and (featurep 'xemacs) (not (featurep 'mule)) 'iso-8859-1)
   "Default charset used in non-MULE XEmacsen."
@@ -1009,8 +1028,9 @@ feet of Good Net-Keeping Seal of Approval. The following are foot
 candidates:
 `empty-article'     Allow you to post an empty article;
 `quoted-text-only'  Allow you to post quoted text only;
-`multiple-copies'   Allow you to post multiple copies.")
-;; `cancel-messages'   Allow you to cancel or supersede others' messages.
+`multiple-copies'   Allow you to post multiple copies;
+`cancel-messages'   Allow you to cancel or supersede messages from 
+                    your other email addresses.")
 
 (defsubst message-gnksa-enable-p (feature)
   (or (not (listp message-shoot-gnksa-feet))
@@ -1228,15 +1248,7 @@ The cdr of ech entry is a function for applying the face to a region.")
                 (const :tag "ask" ask)))
 
 (defvar message-draft-coding-system
-  (cond
-   ((boundp 'MULE) '*junet*)
-   ((not (fboundp 'find-coding-system)) nil)
-   ((find-coding-system 'emacs-mule)
-    (if (memq system-type '(windows-nt ms-dos ms-windows))
-       'emacs-mule-dos 'emacs-mule))
-   ((find-coding-system 'escape-quoted) 'escape-quoted)
-   ((find-coding-system 'no-conversion) 'no-conversion)
-   (t nil))
+  nnheader-auto-save-coding-system
   "Coding system to compose mail.")
 
 (defcustom message-send-mail-partially-limit 1000000
@@ -1255,6 +1267,19 @@ The first matched address (not primary one) is used in the From field."
   :type '(choice (const :tag "Always use primary" nil)
                 regexp))
 
+(defcustom message-hierarchical-addresses nil
+  "A list of hierarchical mail address definitions.
+
+Inside each entry, the first address is the \"top\" address, and
+subsequent addresses are subaddresses; this is used to indicate that
+mail sent to the first address will automatically be delivered to the
+subaddresses.  So if the first address appears in the recipient list
+for a message, the subaddresses will be removed (if present) before
+the mail is sent.  All addresses in this structure should be
+downcased."
+  :group 'message-headers
+  :type '(repeat (repeat string)))
+
 (defcustom message-mail-user-agent nil
   "Like `mail-user-agent'.
 Except if it is nil, use Gnus native MUA; if it is t, use
@@ -1282,11 +1307,7 @@ If this variable is non-nil, pose the question \"Reply to all
 recipients?\" before a wide reply to multiple recipients.  If the user
 answers yes, reply to all recipients as usual.  If the user answers
 no, only reply back to the author."
-  :group 'message-headers
-  :type 'boolean)
-
-(defcustom message-insert-canlock t
-  "Whether to insert a Cancel-Lock header in news postings."
+  :version "21.3"
   :group 'message-headers
   :type 'boolean)
 
@@ -1406,7 +1427,6 @@ no, only reply back to the author."
   (autoload 'gnus-point-at-bol "gnus-util")
   (autoload 'gnus-output-to-rmail "gnus-util")
   (autoload 'gnus-output-to-mail "gnus-util")
-  (autoload 'mail-abbrev-in-expansion-header-p "mailabbrev")
   (autoload 'nndraft-request-associate-buffer "nndraft")
   (autoload 'nndraft-request-expire-articles "nndraft")
   (autoload 'gnus-open-server "gnus-int")
@@ -1773,12 +1793,14 @@ Point is left at the beginning of the narrowed-to region."
   (define-key message-mode-map "\C-c\C-f\C-k" 'message-goto-keywords)
   (define-key message-mode-map "\C-c\C-f\C-u" 'message-goto-summary)
   (define-key message-mode-map "\C-c\C-f\C-i" 'message-insert-or-toggle-importance)
+  (define-key message-mode-map "\C-c\C-f\C-a" 'message-gen-unsubscribed-mft)
   (define-key message-mode-map "\C-c\C-b" 'message-goto-body)
   (define-key message-mode-map "\C-c\C-i" 'message-goto-signature)
   (define-key message-mode-map "\C-c\C-fc" 'message-goto-mail-copies-to)
 
   (define-key message-mode-map "\C-c\C-t" 'message-insert-to)
   (define-key message-mode-map "\C-c\C-n" 'message-insert-newsgroups)
+  (define-key message-mode-map "\C-c\C-l" 'message-to-list-only)
 
   (define-key message-mode-map "\C-c\C-u" 'message-insert-or-toggle-importance)
   (define-key message-mode-map "\C-c\M-n" 'message-insert-disposition-notification-to)
@@ -1808,7 +1830,6 @@ Point is left at the beginning of the narrowed-to region."
   (define-key message-mode-map "\t" 'message-tab)
   (define-key message-mode-map "\M-;" 'comment-region)
 
-  (define-key message-mode-map "\C-x\C-s" 'message-save-drafts)
   (define-key message-mode-map "\C-xk" 'message-mimic-kill-buffer))
 
 (easy-menu-define
@@ -1953,11 +1974,13 @@ C-c C-f  move to a header field (and create it if there isn't):
         C-c C-f C-w  move to Fcc       C-c C-f C-r  move to Reply-To
         C-c C-f C-u  move to Summary   C-c C-f C-n  move to Newsgroups
         C-c C-f C-k  move to Keywords  C-c C-f C-d  move to Distribution
+         C-c C-f C-o  move to From (\"Originator\")
         C-c C-f C-f  move to Followup-To
         C-c C-f C-m  move to Mail-Followup-To
         C-c C-f C-i  cycle through Importance values
         C-c C-f c    move to Mail-Copies-To
 C-c C-t  `message-insert-to' (add a To header to a news followup)
+C-c C-l  `message-to-list-only' (removes all but list address in to/cc)
 C-c C-n  `message-insert-newsgroups' (add a Newsgroup header to a news reply)
 C-c C-b  `message-goto-body' (move to beginning of message text).
 C-c C-i  `message-goto-signature' (move to the beginning of the signature).
@@ -1971,6 +1994,7 @@ C-c C-r  `message-caesar-buffer-body' (rot13 the message body).
 C-c C-u  `message-insert-or-toggle-importance'  (insert or cycle importance).
 C-c M-n  `message-insert-disposition-notification-to'  (request receipt).
 M-RET    `message-newline-and-reformat' (break the line and reformat)."
+  (setq local-abbrev-table text-mode-abbrev-table)
   (set (make-local-variable 'message-reply-buffer) nil)
   (make-local-variable 'message-send-actions)
   (make-local-variable 'message-exit-actions)
@@ -2016,7 +2040,8 @@ M-RET    `message-newline-and-reformat' (break the line and reformat)."
     (if (fboundp 'mail-abbrevs-setup)
        (mail-abbrevs-setup)
       (mail-aliases-setup)))
-  (message-set-auto-save-file-name)
+  (unless buffer-file-name
+    (message-set-auto-save-file-name))
   (set (make-local-variable 'indent-tabs-mode) nil)) ;No tabs for indentation.
 
 (defun message-setup-fill-variables ()
@@ -2186,6 +2211,26 @@ return nil."
     (goto-char (point-max))
     nil))
 
+(defun message-gen-unsubscribed-mft (&optional include-cc)
+  "Insert a reasonable MFT header in a post to an unsubscribed list.
+When making original posts to a mailing list you are not subscribed to,
+you have to type in a MFT header by hand.  The contents, usually, are
+the addresses of the list and your own address.  This function inserts
+such a header automatically.  It fetches the contents of the To: header
+in the current mail buffer, and appends the current user-mail-address.
+
+If the optional argument `include-cc' is non-nil, the addresses in the
+Cc: header are also put into the MFT."
+
+  (interactive "P")
+  (message-remove-header "Mail-Followup-To")
+  (let* ((cc (and include-cc (message-fetch-field "Cc")))
+        (tos (if cc
+                 (concat (message-fetch-field "To") "," cc)
+               (message-fetch-field "To"))))
+    (message-goto-mail-followup-to)
+    (insert (concat tos ", " user-mail-address))))
+
 \f
 
 (defun message-insert-to (&optional force)
@@ -2895,9 +2940,11 @@ The text will also be indented the normal way."
       t)))
 
 (defun message-dont-send ()
-  "Don't send the message you have been editing."
+  "Don't send the message you have been editing.
+Instead, just auto-save the buffer and then bury it."
   (interactive)
-  (message-save-drafts)
+  (set-buffer-modified-p t)
+  (save-buffer)
   (let ((actions message-postpone-actions)
        (frame (selected-frame))
        (org-frame message-original-frame))
@@ -3012,7 +3059,7 @@ It should typically alter the sending method in some way or other."
        ;; ;; Avoid copying text props (except hard newlines).
        ;; T-gnus change: copy all text props from the editing buffer
        ;; into the encoding buffer.
-       (insert-buffer message-edit-buffer)
+       (insert-buffer-substring message-edit-buffer)
        (funcall message-encode-function)
        (while (and success
                    (setq elem (pop alist)))
@@ -3142,14 +3189,62 @@ used to distinguish whether the invisible text is a MIME part or not."
        (set-window-start (selected-window) (gnus-point-at-bol))
        (unless (yes-or-no-p
                 "Invisible text found and made visible; continue posting? ")
-         (error "Invisible text found and made visible"))))))
+         (error "Invisible text found and made visible")))))
+  (message-check 'illegible-text
+    (let ((mm-7bit-chars "\x20-\x7f\r\n\t\x7\x8\xb\xc\x1f\x1b")
+         found choice)
+      (message-goto-body)
+      (skip-chars-forward mm-7bit-chars)
+      (while (not (eobp))
+       (when (let ((char (char-after)))
+               (or (< (mm-char-int char) 128)
+                   (and (mm-multibyte-p)
+                        (memq (char-charset char)
+                              '(eight-bit-control eight-bit-graphic
+                                                  control-1)))))
+         (add-text-properties (point) (1+ (point)) '(highlight t))
+         (setq found t))
+       (forward-char)
+       (skip-chars-forward mm-7bit-chars))
+      (when found
+       (setq choice
+             (gnus-multiple-choice
+              "Illegible text found. Continue posting? "
+              '((?d "Remove and continue posting")
+                (?r "Replace with dots and continue posting")
+                (?i "Ignore and continue posting")
+                (?e "Continue editing"))))
+       (if (eq choice ?e)
+         (error "Illegible text found"))
+       (message-goto-body)
+       (skip-chars-forward mm-7bit-chars)
+       (while (not (eobp))
+         (when (let ((char (char-after)))
+                 (or (< (mm-char-int char) 128)
+                     (and (mm-multibyte-p)
+                          (memq (char-charset char)
+                                '(eight-bit-control eight-bit-graphic
+                                                    control-1)))))
+           (if (eq choice ?i)
+               (remove-text-properties (point) (1+ (point)) '(highlight t))
+             (delete-char 1)
+             (if (eq choice ?r)
+                 (insert "."))))
+         (forward-char)
+         (skip-chars-forward mm-7bit-chars))))))
 
 (defun message-add-action (action &rest types)
   "Add ACTION to be performed when doing an exit of type TYPES."
+  (while types
+    (add-to-list (intern (format "message-%s-actions" (pop types)))
+                action)))
+
+(defun message-delete-action (action &rest types)
+  "Delete ACTION from lists of actions performed when doing an exit of type TYPES."
   (let (var)
     (while types
       (set (setq var (intern (format "message-%s-actions" (pop types))))
-          (nconc (symbol-value var) (list action))))))
+          (delq action (symbol-value var))))))
 
 (defun message-do-actions (actions)
   "Perform all actions in ACTIONS."
@@ -3322,7 +3417,7 @@ This sub function is for exclusive use of `message-send-mail'."
            ;; ;; Avoid copying text props (except hard newlines).
            ;; T-gnus change: copy all text props from the editing buffer
            ;; into the encoding buffer.
-           (insert-buffer message-encoding-buffer)
+           (insert-buffer-substring message-encoding-buffer)
            ;; Remove some headers.
            (save-restriction
              (message-narrow-to-headers)
@@ -3454,7 +3549,9 @@ to find out how to use this."
        ;; free for -inject-arguments -- a big win for the user and for us
        ;; since we don't have to play that double-guessing game and the user
        ;; gets full control (no gestapo'ish -f's, for instance).  --sj
-       message-qmail-inject-args))
+       (if (functionp message-qmail-inject-args)
+           (funcall message-qmail-inject-args)
+         message-qmail-inject-args)))
     ;; qmail-inject doesn't say anything on it's stdout/stderr,
     ;; we have to look at the retval instead
     (0 nil)
@@ -3621,7 +3718,7 @@ Otherwise, generate and save a value for `canlock-password' first."
            (set-buffer tembuf)
            (buffer-disable-undo)
            (erase-buffer)
-           (insert-buffer message-encoding-buffer)
+           (insert-buffer-substring message-encoding-buffer)
            ;; Remove some headers.
            (save-restriction
              (message-narrow-to-headers)
@@ -3656,7 +3753,7 @@ Otherwise, generate and save a value for `canlock-password' first."
     (backward-char 1)
     (run-hooks 'message-send-news-hook)
     (gnus-open-server method)
-    (message "Sending news with %s..." (gnus-server-string method))
+    (message "Sending news via %s..." (gnus-server-string method))
     (gnus-request-post method)
     ))
 
@@ -4075,7 +4172,7 @@ Otherwise, generate and save a value for `canlock-password' first."
        (erase-buffer)
        (goto-char (point-min))
        (set-buffer-multibyte nil)
-       (insert-buffer message-encoding-buffer)
+       (insert-buffer-substring message-encoding-buffer)
        (goto-char (point-min))
        (if (re-search-forward "[^\x00-\x7f]" nil t)
            (y-or-n-p
@@ -4446,9 +4543,24 @@ give as trustworthy answer as possible."
   (or mail-host-address
       (message-make-fqdn)))
 
-(defun message-make-mft ()
-  "Return the Mail-Followup-To header."
-  (let* ((msg-recipients (message-options-get 'message-recipients))
+(defun message-to-list-only ()
+  (interactive)
+  (let ((listaddr (message-make-mft t)))
+    (when listaddr
+      (save-excursion
+       (message-remove-header "to")
+       (message-remove-header "cc")
+       (message-position-on-field "To" "X-Draft-From")
+       (insert listaddr)))))
+
+(defun message-make-mft (&optional only-show-subscribed)
+  "Return the Mail-Followup-To header. If passed the optional
+argument `only-show-subscribed' only return the subscribed address (and
+not the additional To and Cc header contents)."
+  (let* ((case-fold-search t)
+        (to (message-fetch-field "To"))
+        (cc (message-fetch-field "cc"))
+        (msg-recipients (concat to (and to cc ", ") cc))
         (recipients
          (mapcar 'mail-strip-quoted-names
                  (message-tokenize-header msg-recipients)))
@@ -4474,16 +4586,16 @@ give as trustworthy answer as possible."
                             (mapcar 'funcall
                                     message-subscribed-address-functions))))
     (save-match-data
-      (when (eval (apply 'append '(or)
-                        (mapcar
-                         (function (lambda (regexp)
-                                     (mapcar
-                                      (function (lambda (recipient)
-                                                  `(string-match ,regexp
-                                                                 ,recipient)))
-                                      recipients)))
-                         mft-regexps)))
-       msg-recipients))))
+      (let ((subscribed-lists nil)
+           (list
+            (loop for recipient in recipients
+              when (loop for regexp in mft-regexps
+                     when (string-match regexp recipient) return t)
+              return recipient)))
+       (when list
+         (if only-show-subscribed
+             list
+           msg-recipients))))))
 
 ;; Dummy to avoid byte-compile warning.
 (defvar mule-version)
@@ -4500,7 +4612,11 @@ string."
       (goto-char (point-min))
       (let ((case-fold-search t)
            user-agent start p end)
-       (if (re-search-forward "^User-Agent:[\t ]*" nil t)
+       (if (re-search-forward
+            (concat "^User-Agent:[\t ]*\\("
+                    (regexp-quote gnus-product-name)
+                    "/[0-9.]+\\([ \t\r\n]*([^)]+)\\)*\\)?[\t ]*")
+            nil t)
            (progn
              (setq start (match-beginning 0)
                    p (match-end 0)
@@ -5205,16 +5321,34 @@ responses here are directed to other addresses.")))
       ;; Perhaps "Mail-Copies-To: never" removed the only address?
       (if (string-equal recipients "")
          (setq recipients author))
-      ;; Convert string to a list of (("foo@bar" . "Name <foo@bar>") ...).
+      ;; Convert string to a list of (("foo@bar" . "Name <Foo@BAR>") ...).
       (setq recipients
            (mapcar
             (lambda (addr)
-              (cons (mail-strip-quoted-names addr) addr))
+              (cons (downcase (mail-strip-quoted-names addr)) addr))
             (message-tokenize-header recipients)))
       ;; Remove first duplicates.  (Why not all duplicates?  Is this a bug?)
       (let ((s recipients))
        (while s
          (setq recipients (delq (assoc (car (pop s)) s) recipients))))
+
+      ;; Remove hierarchical lists that are contained within each other,
+      ;; if message-hierarchical-addresses is defined.
+      (when message-hierarchical-addresses
+       (let ((plain-addrs (mapcar 'car recipients))
+             subaddrs recip)
+         (while plain-addrs
+           (setq subaddrs (assoc (car plain-addrs)
+                                 message-hierarchical-addresses)
+                 plain-addrs (cdr plain-addrs))
+           (when subaddrs
+             (setq subaddrs (cdr subaddrs))
+             (while subaddrs
+               (setq recip (assoc (car subaddrs) recipients)
+                     subaddrs (cdr subaddrs))
+               (if recip
+                   (setq recipients (delq recip recipients))))))))
+
       ;; Build the header alist.  Allow the user to be asked whether
       ;; or not to reply to all recipients in a wide reply.
       (setq follow-to (list (cons 'To (cdr (pop recipients)))))
@@ -5706,6 +5840,8 @@ Optional NEWS will use news to forward instead of mail."
 (defun message-forward-make-body (forward-buffer)
   ;; Put point where we want it before inserting the forwarded
   ;; message.
+  ;; Note that this function definition for T-gnus is totally different
+  ;; from the original Gnus."
   (if message-forward-before-signature
       (message-goto-body)
     (goto-char (point-max)))
@@ -5735,8 +5871,10 @@ Optional NEWS will use news to forward instead of mail."
 (defun message-forward-rmail-make-body (forward-buffer)
   (save-window-excursion
     (set-buffer forward-buffer)
-    (let (rmail-enable-mime)
-      (rmail-toggle-header 0)))
+    ;; Rmail doesn't have rmail-msg-restore-non-pruned-header in Emacs
+    ;; 20.  FIXIT, or we drop support for rmail in Emacs 20.
+    (if (rmail-msg-is-pruned)
+       (rmail-msg-restore-non-pruned-header)))
   (message-forward-make-body forward-buffer))
 
 ;;;###autoload
@@ -5957,35 +6095,37 @@ which specify the range to operate on."
 (defun message-tool-bar-map ()
   (or message-tool-bar-map
       (setq message-tool-bar-map
-           (and (fboundp 'tool-bar-add-item-from-menu)
-                tool-bar-mode
-                (let ((tool-bar-map (copy-keymap tool-bar-map))
-                      (load-path (mm-image-load-path)))
-                  ;; Zap some items which aren't so relevant and take
-                  ;; up space.
-                  (dolist (key '(print-buffer kill-buffer save-buffer
-                                              write-file dired open-file))
-                    (define-key tool-bar-map (vector key) nil))
-                  (tool-bar-add-item-from-menu
-                   'message-send-and-exit "mail_send" message-mode-map)
-                  (tool-bar-add-item-from-menu
-                   'message-kill-buffer "close" message-mode-map)
-                  (tool-bar-add-item-from-menu
-                   'message-dont-send "cancel" message-mode-map)
-                  (tool-bar-add-item-from-menu
-                   'mime-edit-insert-file "attach" message-mode-map)
-                  (tool-bar-add-item-from-menu
-                   'ispell-message "spell" message-mode-map)
-                  (tool-bar-add-item-from-menu
-                   'message-insert-importance-high "important"
-                   message-mode-map)
-                  (tool-bar-add-item-from-menu
-                   'message-insert-importance-low "unimportant"
-                   message-mode-map)
-                  (tool-bar-add-item-from-menu
-                   'message-insert-disposition-notification-to "receipt"
-                   message-mode-map)
-                  tool-bar-map)))))
+           (and
+            (condition-case nil (require 'tool-bar) (error nil))
+            (fboundp 'tool-bar-add-item-from-menu)
+            tool-bar-mode
+            (let ((tool-bar-map (copy-keymap tool-bar-map))
+                  (load-path (mm-image-load-path)))
+              ;; Zap some items which aren't so relevant and take
+              ;; up space.
+              (dolist (key '(print-buffer kill-buffer save-buffer
+                                          write-file dired open-file))
+                (define-key tool-bar-map (vector key) nil))
+              (tool-bar-add-item-from-menu
+               'message-send-and-exit "mail_send" message-mode-map)
+              (tool-bar-add-item-from-menu
+               'message-kill-buffer "close" message-mode-map)
+              (tool-bar-add-item-from-menu
+               'message-dont-send "cancel" message-mode-map)
+              (tool-bar-add-item-from-menu
+               'mime-edit-insert-file "attach" message-mode-map)
+              (tool-bar-add-item-from-menu
+               'ispell-message "spell" message-mode-map)
+              (tool-bar-add-item-from-menu
+               'message-insert-importance-high "important"
+               message-mode-map)
+              (tool-bar-add-item-from-menu
+               'message-insert-importance-low "unimportant"
+               message-mode-map)
+              (tool-bar-add-item-from-menu
+               'message-insert-disposition-notification-to "receipt"
+               message-mode-map)
+              tool-bar-map)))))
 
 ;;; Group name completion.
 
@@ -6002,6 +6142,16 @@ which specify the range to operate on."
   :group 'message
   :type '(alist :key-type regexp :value-type function))
 
+(defcustom message-expand-name-function
+  (if (fboundp 'bbdb-complete-name)
+      'bbdb-complete-name
+    (if (fboundp 'lsdb-complete-name)
+       'lsdb-complete-name
+      'expand-abbrev))
+  "*A function called to expand addresses in field body."
+  :group 'message
+  :type 'function)
+
 (defcustom message-tab-body-function nil
   "*Function to execute when `message-tab' (TAB) is executed in the body.
 If nil, the function bound in `text-mode-map' or `global-map' is executed."
@@ -6066,9 +6216,7 @@ those headers."
            (delete-region (point) (progn (forward-line 3) (point))))))))))
 
 (defun message-expand-name ()
-  (if (fboundp 'bbdb-complete-name)
-      (bbdb-complete-name)
-    (expand-abbrev)))
+  (funcall message-expand-name-function))
 
 ;;; Help stuff.
 
@@ -6300,22 +6448,6 @@ regexp varstr."
   (require 'messagexmas)
   (message-xmas-redefine))
 
-(defun message-save-drafts ()
-  "Postponing the message."
-  (interactive)
-  (message "Saving %s..." buffer-file-name)
-  (let ((reply-headers message-reply-headers)
-       (buffer (current-buffer)))
-    (with-temp-file buffer-file-name
-      (insert-buffer buffer)
-      (setq message-reply-headers reply-headers)
-      (message-generate-headers '((optional . In-Reply-To)))
-      (let ((mime-header-encode-method-alist
-            '((eword-encode-unstructured-field-body))))
-       (mime-edit-translate-buffer)))
-    (set-buffer-modified-p nil))
-  (message "Saving %s...done" buffer-file-name))
-
 (provide 'message)
 
 (run-hooks 'message-load-hook)
index 4b401e8..32ee6e6 100644 (file)
@@ -1,5 +1,5 @@
 ;;; mm-decode.el --- Functions for decoding MIME things
-;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;;     MORIOKA Tomohiko <morioka@jaist.ac.jp>
 
 ;;; Commentary:
 
-;; Jaap-Henk Hoepman (jhh@xs4all.nl):
-;;
-;; Added support for delayed destroy of external MIME viewers. All external
-;; viewers for mime types in mm-keep-viewer-alive-types will remain active
-;; after switching articles or groups, and will only be removed when exiting
-;; gnus.
-;;
-
 ;;; Code:
 
 (require 'mail-parse)
@@ -39,6 +31,7 @@
                   (require 'term))
 
 (eval-and-compile
+  (autoload 'executable-find "executable")
   (autoload 'mm-inline-partial "mm-partial")
   (autoload 'mm-inline-external-body "mm-extern")
   (autoload 'mm-insert-inline "mm-view"))
   `(list ,buffer ,type ,encoding ,undisplayer
         ,disposition ,description ,cache ,id))
 
+(defcustom mm-text-html-renderer
+  (cond ((locate-library "w3") 'w3)
+       ((locate-library "w3m") 'w3m)
+       ((executable-find "links") 'links)
+       ((executable-find "lynx") 'lynx)
+       (t 'html2text))
+  "Render of HTML contents.
+It is one of defined renderer types, or a rendering function.
+The defined renderer types are:
+`w3'   : using Emacs/W3;
+`w3m'  : using emacs-w3m;
+`links': using links;
+`lynx' : using lynx;
+`html2text' : using html2text;
+`nil'  : using external viewer."
+  :type '(choice (const w3)
+                (const w3m)
+                (const links)
+                (const lynx)
+                (const html2text)
+                (const nil)
+                (function))
+  :version "21.3"
+  :group 'mime-display)
+
+(defvar mm-inline-text-html-renderer nil
+  "Function used for rendering inline HTML contents.
+It is suggested to customize `mm-text-html-renderer' instead.")
+
+(defcustom mm-inline-text-html-with-images nil
+  "If non-nil, Gnus will allow retrieving images in the HTML contents
+with <img> tags.  It has no effect on Emacs/w3.  For emacs-w3m, the
+value of the option `w3m-display-inline-images' will be bound with
+this value.  In addition, the variable `w3m-safe-url-regexp' will be
+bound with the value nil if it is non-nil to make emacs-w3m show all
+images, however this behavior may be changed in the future."
+  :type 'boolean
+  :group 'mime-display)
+
+(defcustom mm-inline-text-html-with-w3m-keymap t
+  "If non-nil, use emacs-w3m command keys in the article buffer."
+  :type 'boolean
+  :group 'mime-display)
+
 (defcustom mm-inline-media-tests
   '(("image/jpeg"
      mm-inline-image
     ("application/emacs-lisp" mm-display-elisp-inline identity)
     ("application/x-emacs-lisp" mm-display-elisp-inline identity)
     ("text/html"
-     mm-inline-text
+     mm-inline-text-html
      (lambda (handle)
-       (locate-library "w3")))
+       (or mm-inline-text-html-renderer
+          mm-text-html-renderer)))
     ("text/x-vcard"
-     mm-inline-text
+     mm-inline-text-vcard
      (lambda (handle)
        (or (featurep 'vcard)
           (locate-library "vcard"))))
 (defcustom mm-inlined-types
   '("image/.*" "text/.*" "message/delivery-status" "message/rfc822"
     "message/partial" "message/external-body" "application/emacs-lisp"
+    "application/x-emacs-lisp"
     "application/pgp-signature" "application/x-pkcs7-signature"
     "application/pkcs7-signature" "application/x-pkcs7-mime"
     "application/pkcs7-mime")
@@ -218,7 +257,8 @@ when selecting a different article."
   '("text/plain" "text/enriched" "text/richtext" "text/html"
     "text/x-vcard" "image/.*" "message/delivery-status" "multipart/.*"
     "message/rfc822" "text/x-patch" "application/pgp-signature"
-    "application/emacs-lisp" "application/x-pkcs7-signature"
+    "application/emacs-lisp" "application/x-emacs-lisp"
+    "application/x-pkcs7-signature"
     "application/pkcs7-signature" "application/x-pkcs7-mime"
     "application/pkcs7-mime")
   "A list of MIME types to be displayed automatically."
@@ -421,13 +461,14 @@ for types in mm-keep-viewer-alive-types."
     (message "Destroying external MIME viewers")
     (mm-destroy-parts mm-postponed-undisplay-list)))
 
-(defun mm-dissect-buffer (&optional no-strict-mime)
+(defun mm-dissect-buffer (&optional no-strict-mime loose-mime)
   "Dissect the current buffer and return a list of MIME handles."
   (save-excursion
     (let (ct ctl type subtype cte cd description id result from)
       (save-restriction
        (mail-narrow-to-head)
        (when (or no-strict-mime
+                 loose-mime
                  (mail-fetch-field "mime-version"))
          (setq ct (mail-fetch-field "content-type")
                ctl (ignore-errors (mail-header-parse-content-type ct))
@@ -531,7 +572,9 @@ for types in mm-keep-viewer-alive-types."
          (save-restriction
            (narrow-to-region start (point))
            (setq parts (nconc (list (mm-dissect-buffer t)) parts)))))
-      (forward-line 2)
+      (end-of-line 2)
+      (or (looking-at boundary)
+         (forward-line 1))
       (setq start (point)))
     (when (and start (< start end))
       (save-excursion
@@ -626,8 +669,8 @@ external if displayed external."
                  (mm-handle-set-undisplayer handle mm)))))
        ;; The function is a string to be executed.
        (mm-insert-part handle)
-       (let* ((dir (make-temp-name
-                    (expand-file-name "emm." mm-tmp-directory)))
+       (let* ((dir (mm-make-temp-file
+                    (expand-file-name "emm." mm-tmp-directory) 'dir))
               (filename (or
                          (mail-content-type-get
                           (mm-handle-disposition handle) 'filename)
@@ -640,12 +683,13 @@ external if displayed external."
               (copiousoutput (assoc "copiousoutput" mime-info))
               file buffer)
          ;; We create a private sub-directory where we store our files.
-         (make-directory dir)
          (set-file-modes dir 448)
          (if filename
-             (setq file (expand-file-name (file-name-nondirectory filename)
-                                          dir))
-           (setq file (make-temp-name (expand-file-name "mm." dir))))
+             (setq file (expand-file-name 
+                         (gnus-map-function mm-file-name-rewrite-functions
+                                             (file-name-nondirectory filename))
+                         dir))
+           (setq file (mm-make-temp-file (expand-file-name "mm." dir))))
          (let ((coding-system-for-write mm-binary-coding-system))
            (write-region (point-min) (point-max) file nil 'nomesg))
          (message "Viewing with %s" method)
@@ -975,9 +1019,8 @@ like underscores."
                                        (file-name-nondirectory filename))))
     (setq file
          (read-file-name "Save MIME part to: "
-                         (expand-file-name
-                          (or filename name "")
-                          (or mm-default-directory default-directory))))
+                         (or mm-default-directory default-directory)
+                         nil nil (or filename name "")))
     (setq mm-default-directory (file-name-directory file))
     (and (or (not (file-exists-p file))
             (yes-or-no-p (format "File %s already exists; overwrite? "
@@ -1126,7 +1169,7 @@ be determined."
     ;; (without a ton of work) is to write them
     ;; out to a file, and then create a file
     ;; specifier.
-    (let ((file (make-temp-name
+    (let ((file (mm-make-temp-file
                 (expand-file-name "emm.xbm"
                                   mm-tmp-directory))))
       (unwind-protect
index 12fe97b..7a4cd0b 100644 (file)
@@ -1,5 +1,5 @@
 ;;; mm-partial.el --- showing message/partial
-;; Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: message partial
@@ -42,7 +42,8 @@
          (gnus-request-article-this-buffer (aref header 0)
                                            gnus-newsgroup-name)
          (when (search-forward id nil t)
-           (let ((nhandles (mm-dissect-buffer)) nid)
+           (let ((nhandles (mm-dissect-buffer
+                            nil gnus-article-loose-mime)) nid)
              (if (consp (car nhandles))
                  (mm-destroy-parts nhandles)
                (setq nid (cdr (assq 'id
index 2ab90f1..243e8c2 100644 (file)
@@ -1,5 +1,5 @@
 ;;; mm-url.el --- a wrapper of url functions/commands for Gnus
-;; Copyright (C) 2001 Free Software Foundation, Inc.
+;; Copyright (C) 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 
 (eval-when-compile (require 'cl))
 
 (require 'mm-util)
+(require 'gnus)
 
 (eval-and-compile
-  (autoload 'exec-installed-p "path-util")
-  (autoload 'url-insert-file-contents "url-handlers"))
+  (autoload 'exec-installed-p "path-util"))
 
 (defgroup mm-url nil
   "A wrapper of url package and external url command for Gnus."
@@ -43,7 +43,7 @@
 
 (defcustom mm-url-use-external (not
                                (condition-case nil
-                                   (require 'url-handlers)
+                                   (require 'url)
                                  (error nil)))
   "*If not-nil, use external grab program `mm-url-program'."
   :type 'boolean
 
 (defvar mm-url-predefined-programs
   '((wget "wget" "-q" "-O" "-")
+    (w3m  "w3m" "-dump_source")
     (lynx "lynx" "-source")
     (curl "curl")))
 
 (defcustom mm-url-program
   (cond
    ((exec-installed-p "wget") 'wget)
+   ((executable-find "w3m") 'w3m)
    ((exec-installed-p "lynx") 'lynx)
    ((exec-installed-p "curl") 'curl)
    (t "GET"))
   "The url grab program."
   :type '(choice
          (symbol :tag "wget" wget)
+         (symbol :tag "w3m" w3m)
          (symbol :tag "lynx" lynx)
          (symbol :tag "curl" curl)
          (string :tag "other"))
   :type '(repeat string)
   :group 'mm-url)
 
+\f
+;;; Internal variables
+
+(defvar mm-url-package-name
+  (gnus-replace-in-string
+   (gnus-replace-in-string gnus-version " v.*$" "")
+   " " "-"))
+
+(defvar        mm-url-package-version gnus-version-number)
+
 ;; Stolen from w3.
 (defvar mm-url-html-entities
   '(
   "A list of characters that are _NOT_ reserved in the URL spec.
 This is taken from RFC 2396.")
 
+(defun mm-url-load-url ()
+  "Load `url-insert-file-contents'."
+  (unless (condition-case ()
+             (require 'url-handlers)
+           (error nil))
+    ;; w3-4.0pre0.46 or earlier version.
+    (require 'w3-vars)
+    (require 'url)))
+
 (defun mm-url-insert-file-contents (url)
   (if mm-url-use-external
       (if (string-match "^file:/+" url)
          (insert-file-contents (substring url (1- (match-end 0))))
        (mm-url-insert-file-contents-external url))
-    (require 'url-handlers)
-    (let ((name buffer-file-name))
+    (mm-url-load-url)
+    (let ((name buffer-file-name)
+         (url-package-name (or mm-url-package-name
+                               url-package-name))
+         (url-package-version (or mm-url-package-version
+                                  url-package-version)))
       (prog1
          (url-insert-file-contents url)
+       (save-excursion
+         (goto-char (point-min))
+         (while (re-search-forward "\r 1000\r ?" nil t)
+           (replace-match "")))
        (setq buffer-file-name name)))))
 
 (defun mm-url-insert-file-contents-external (url)
@@ -344,7 +374,7 @@ spaces.  Die Die Die."
 
 (defun mm-url-fetch-form (url pairs)
   "Fetch a form from URL with PAIRS as the data using the POST method."
-  (require 'url-handlers)
+  (mm-url-load-url)
   (let ((url-request-data (mm-url-encode-www-form-urlencoded pairs))
        (url-request-method "POST")
        (url-request-extra-headers
@@ -354,7 +384,7 @@ spaces.  Die Die Die."
   t)
 
 (defun mm-url-fetch-simple (url content)
-  (require 'url-handlers)
+  (mm-url-load-url)
   (let ((url-request-data content)
        (url-request-method "POST")
        (url-request-extra-headers
index 7c98056..93a595c 100644 (file)
@@ -286,7 +286,10 @@ prefer iso-2022-jp to japanese-shift-jis:
 
 (defvar mm-use-find-coding-systems-region
   (fboundp 'find-coding-systems-region)
-  "Use `find-coding-systems-region' to find proper coding systems.")
+  "Use `find-coding-systems-region' to find proper coding systems.
+
+Setting it to nil is useful on Emacsen supporting Unicode if sending
+mail with multiple parts is preferred to sending a Unicode one.")
 
 ;;; Internal variables:
 
@@ -755,6 +758,45 @@ If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers."
     (let ((cs (mm-detect-coding-region start end)))
       cs)))
 
+(defun mm-guess-mime-charset ()
+  "Guess the default MIME charset from the language environment."
+  (let ((language-info
+        (and (boundp 'current-language-environment)
+             (assoc current-language-environment
+                    language-info-alist)))
+       item)
+    (cond
+     ((null language-info)
+      'iso-8859-1)
+     ((setq item
+           (cadr
+            (or (assq 'coding-priority language-info)
+                (assq 'coding-system language-info))))
+      (if (fboundp 'coding-system-get)
+         (or (coding-system-get item 'mime-charset)
+             item)
+       item))
+     ((setq item (car (last (assq 'charset language-info))))
+      (if (eq item 'ascii)
+         'iso-8859-1
+       (mm-mime-charset item)))
+     (t
+      'iso-8859-1))))
+
+;; It is not a MIME function, but some MIME functions use it.
+(defalias 'mm-make-temp-file
+  (if (fboundp 'make-temp-file)
+      'make-temp-file
+    (lambda (prefix &optional dir-flag)
+      (let ((file (expand-file-name
+                  (make-temp-name prefix)
+                  (if (fboundp 'temp-directory)
+                      (temp-directory)
+                    temporary-file-directory))))
+       (if dir-flag
+           (make-directory file))
+       file))))
+
 (provide 'mm-util)
 
 ;;; mm-util.el ends here
index 92964d0..96eaafb 100644 (file)
@@ -1,5 +1,5 @@
 ;;; mm-uu.el --- Return uu stuff as mm handles
-;; Copyright (c) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (c) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: postscript uudecode binhex shar forward gnatsweb pgp
@@ -80,7 +80,7 @@ This can be either \"inline\" or \"attachment\".")
      mm-uu-postscript-extract
      nil)
     (uu
-     "^begin[ \t]+[0-7][0-7][0-7][ \t]+"
+     "^begin[ \t]+0?[0-7][0-7][0-7][ \t]+"
      "^end[ \t]*$"
      mm-uu-uu-extract
      mm-uu-uu-filename)
index 192b94f..405b304 100644 (file)
@@ -25,7 +25,7 @@
 
 (eval-when-compile (require 'cl))
 (require 'mail-parse)
-(require 'mailcap)
+(require 'gnus-mailcap)
 (require 'mm-bodies)
 (require 'mm-decode)
 
   (autoload 'vcard-parse-string "vcard")
   (autoload 'vcard-format-string "vcard")
   (autoload 'fill-flowed "flow-fill")
+  (autoload 'html2text "html2text")
   (unless (fboundp 'diff-mode)
     (autoload 'diff-mode "diff-mode" "" t nil)))
 
+(defvar mm-text-html-renderer-alist
+  '((w3  . mm-inline-text-html-render-with-w3)
+    (w3m . mm-inline-text-html-render-with-w3m)
+    (links mm-inline-render-with-file
+          mm-links-remove-leading-blank
+          "links" "-dump" file)
+    (lynx  mm-inline-render-with-stdin nil
+          "lynx" "-dump" "-force_html" "-stdin")
+    (html2text  mm-inline-render-with-function html2text))
+  "The attributes of renderer types for text/html.")
+
+(defvar mm-text-html-washer-alist
+  '((w3  . gnus-article-wash-html-with-w3)
+    (w3m . gnus-article-wash-html-with-w3m)
+    (links mm-inline-wash-with-file
+          mm-links-remove-leading-blank
+          "links" "-dump" file)
+    (lynx  mm-inline-wash-with-stdin nil
+          "lynx" "-dump" "-force_html" "-stdin")
+    (html2text  html2text))
+  "The attributes of washer types for text/html.")
+
+;;; Internal variables.
+
 ;;;
 ;;; Functions for displaying various formats inline
 ;;;
     (require 'url-vars)
     (setq mm-w3-setup t)))
 
-(defun mm-inline-text (handle)
-  (let ((type (mm-handle-media-subtype handle))
-       text buffer-read-only)
-    (cond
-     ((equal type "html")
-      (mm-setup-w3)
-      (setq text (mm-get-part handle))
-      (let ((b (point))
-           (url-standalone-mode t)
-           (w3-honor-stylesheets nil)
-           (w3-delay-image-loads t)
-           (url-current-object
-            (url-generic-parse-url (format "cid:%s" (mm-handle-id handle))))
-           (width (window-width))
-           (charset (mail-content-type-get
-                     (mm-handle-type handle) 'charset)))
-       (save-excursion
-         (insert text)
+(defun mm-inline-text-html-render-with-w3 (handle)
+  (mm-setup-w3)
+  (let ((text (mm-get-part handle))
+       (b (point))
+       (url-standalone-mode t)
+       (url-gateway-unplugged t)
+       (w3-honor-stylesheets nil)
+       (url-current-object
+        (url-generic-parse-url (format "cid:%s" (mm-handle-id handle))))
+       (width (window-width))
+       (charset (mail-content-type-get
+                 (mm-handle-type handle) 'charset)))
+    (save-excursion
+      (insert text)
+      (save-restriction
+       (narrow-to-region b (point))
+       (goto-char (point-min))
+       (if (or (and (boundp 'w3-meta-content-type-charset-regexp)
+                    (re-search-forward
+                     w3-meta-content-type-charset-regexp nil t))
+               (and (boundp 'w3-meta-charset-content-type-regexp)
+                    (re-search-forward
+                     w3-meta-charset-content-type-regexp nil t)))
+           (setq charset
+                 (or (let ((bsubstr (buffer-substring-no-properties
+                                     (match-beginning 2)
+                                     (match-end 2))))
+                       (if (fboundp 'w3-coding-system-for-mime-charset)
+                           (w3-coding-system-for-mime-charset bsubstr)
+                         (mm-charset-to-coding-system bsubstr)))
+                     charset)))
+       (delete-region (point-min) (point-max))
+       (insert (mm-decode-string text charset))
+       (save-window-excursion
          (save-restriction
-           (narrow-to-region b (point))
-           (goto-char (point-min))
-           (if (or (and (boundp 'w3-meta-content-type-charset-regexp)
-                        (re-search-forward
-                         w3-meta-content-type-charset-regexp nil t))
-                   (and (boundp 'w3-meta-charset-content-type-regexp)
-                        (re-search-forward
-                         w3-meta-charset-content-type-regexp nil t)))
-               (setq charset
-                     (or (let ((bsubstr (buffer-substring-no-properties
-                                         (match-beginning 2)
-                                         (match-end 2))))
-                           (if (fboundp 'w3-coding-system-for-mime-charset)
-                               (w3-coding-system-for-mime-charset bsubstr)
-                             (mm-charset-to-coding-system bsubstr)))
-                         charset)))
-           (delete-region (point-min) (point-max))
-           (insert (mm-decode-string text charset))
-           (save-window-excursion
-             (save-restriction
-               (let ((w3-strict-width width)
-                     ;; Don't let w3 set the global version of
-                     ;; this variable.
-                     (fill-column fill-column)
-                     (w3-honor-stylesheets nil)
-                     (w3-delay-image-loads t)
-                     (url-standalone-mode t))
-                 (condition-case var
-                     (w3-region (point-min) (point-max))
-                   (error
-                    (delete-region (point-min) (point-max))
-                    (let ((b (point))
-                          (charset (mail-content-type-get
-                                    (mm-handle-type handle) 'charset)))
-                      (if (or (eq charset 'gnus-decoded)
-                              (eq mail-parse-charset 'gnus-decoded))
-                          (save-restriction
-                            (narrow-to-region (point) (point))
-                            (mm-insert-part handle)
-                            (goto-char (point-max)))
-                        (insert (mm-decode-string (mm-get-part handle)
-                                                  charset))))
-                    (message
-                     "Error while rendering html; showing as text/plain"))))))
-           (mm-handle-set-undisplayer
-            handle
-            `(lambda ()
-               (let (buffer-read-only)
-                 (if (functionp 'remove-specifier)
-                     (mapcar (lambda (prop)
-                               (remove-specifier
-                                (face-property 'default prop)
-                                (current-buffer)))
-                             '(background background-pixmap foreground)))
-                 (delete-region ,(point-min-marker)
-                                ,(point-max-marker)))))))))
-     ((equal type "x-vcard")
-      (mm-insert-inline
+           (let ((w3-strict-width width)
+                 ;; Don't let w3 set the global version of
+                 ;; this variable.
+                 (fill-column fill-column))
+             (if (or debug-on-error debug-on-quit)
+                 (w3-region (point-min) (point-max))
+               (condition-case ()
+                   (w3-region (point-min) (point-max))
+                 (error
+                  (delete-region (point-min) (point-max))
+                  (let ((b (point))
+                        (charset (mail-content-type-get
+                                  (mm-handle-type handle) 'charset)))
+                    (if (or (eq charset 'gnus-decoded)
+                            (eq mail-parse-charset 'gnus-decoded))
+                      (save-restriction
+                        (narrow-to-region (point) (point))
+                        (mm-insert-part handle)
+                        (goto-char (point-max)))
+                      (insert (mm-decode-string (mm-get-part handle)
+                                                charset))))
+                  (message
+                   "Error while rendering html; showing as text/plain")))))))
+       (mm-handle-set-undisplayer
+        handle
+        `(lambda ()
+           (let (buffer-read-only)
+             (if (functionp 'remove-specifier)
+                 (mapcar (lambda (prop)
+                           (remove-specifier
+                            (face-property 'default prop)
+                            (current-buffer)))
+                         '(background background-pixmap foreground)))
+             (delete-region ,(point-min-marker)
+                            ,(point-max-marker)))))))))
+
+(defvar mm-w3m-mode-map nil
+  "Local keymap for inlined text/html part rendered by emacs-w3m.  It will
+be different from `w3m-mode-map' to use in the article buffer.")
+
+(defvar mm-w3m-mode-command-alist
+  '((backward-char)
+    (describe-mode)
+    (forward-char)
+    (goto-line)
+    (next-line)
+    (previous-line)
+    (w3m-antenna)
+    (w3m-antenna-add-current-url)
+    (w3m-bookmark-add-current-url)
+    (w3m-bookmark-add-this-url)
+    (w3m-bookmark-view)
+    (w3m-close-window)
+    (w3m-copy-buffer)
+    (w3m-delete-buffer)
+    (w3m-dtree)
+    (w3m-edit-current-url)
+    (w3m-edit-this-url)
+    (w3m-gohome)
+    (w3m-goto-url)
+    (w3m-goto-url-new-session)
+    (w3m-history)
+    (w3m-history-restore-position)
+    (w3m-history-store-position)
+    (w3m-namazu)
+    (w3m-next-buffer)
+    (w3m-previous-buffer)
+    (w3m-quit)
+    (w3m-redisplay-with-charset)
+    (w3m-reload-this-page)
+    (w3m-scroll-down-or-previous-url)
+    (w3m-scroll-up-or-next-url)
+    (w3m-search)
+    (w3m-select-buffer)
+    (w3m-switch-buffer)
+    (w3m-view-header)
+    (w3m-view-parent-page)
+    (w3m-view-previous-page)
+    (w3m-view-source)
+    (w3m-weather))
+  "Alist of commands to use for emacs-w3m in the article buffer.  Each
+element looks like (FROM-COMMAND . TO-COMMAND); FROM-COMMAND should be
+registered in `w3m-mode-map' which will be substituted by TO-COMMAND
+in `mm-w3m-mode-map'.  If TO-COMMAND is nil, an article command key
+will not be substituted.")
+
+(defvar mm-w3m-mode-dont-bind-keys (list [up] [right] [left] [down])
+  "List of keys which should not be bound for the emacs-w3m commands.")
+
+(defvar mm-w3m-setup nil
+  "Whether gnus-article-mode has been setup to use emacs-w3m.")
+
+(defun mm-setup-w3m ()
+  "Setup gnus-article-mode to use emacs-w3m."
+  (unless mm-w3m-setup
+    (require 'w3m)
+    (unless mm-w3m-mode-map
+      (setq mm-w3m-mode-map (copy-keymap w3m-mode-map))
+      (dolist (def mm-w3m-mode-command-alist)
+       (condition-case nil
+           (substitute-key-definition (car def) (cdr def) mm-w3m-mode-map)
+         (error)))
+      (dolist (key mm-w3m-mode-dont-bind-keys)
+       (condition-case nil
+           (define-key mm-w3m-mode-map key nil)
+         (error))))
+    (unless (assq 'gnus-article-mode w3m-cid-retrieve-function-alist)
+      (push (cons 'gnus-article-mode 'mm-w3m-cid-retrieve)
+           w3m-cid-retrieve-function-alist))
+    (setq mm-w3m-setup t)))
+
+(defun mm-w3m-cid-retrieve (url &rest args)
+  "Insert a content pointed by URL if it has the cid: scheme."
+  (when (string-match "\\`cid:" url)
+    (setq url (concat "<" (substring url (match-end 0)) ">"))
+    (catch 'found-handle
+      (dolist (handle (with-current-buffer w3m-current-buffer
+                       gnus-article-mime-handles))
+       (when (and (listp handle)
+                  (equal url (mm-handle-id handle)))
+         (mm-insert-part handle)
+         (throw 'found-handle (mm-handle-media-type handle)))))))
+
+(defun mm-inline-text-html-render-with-w3m (handle)
+  "Render a text/html part using emacs-w3m."
+  (mm-setup-w3m)
+  (let ((text (mm-get-part handle))
+       (b (point))
+       (charset (mail-content-type-get (mm-handle-type handle) 'charset)))
+    (save-excursion
+      (insert text)
+      (save-restriction
+       (narrow-to-region b (point))
+       (goto-char (point-min))
+       (when (re-search-forward w3m-meta-content-type-charset-regexp nil t)
+         (setq charset (or (w3m-charset-to-coding-system (match-string 2))
+                           charset)))
+       (when charset
+         (delete-region (point-min) (point-max))
+         (insert (mm-decode-string text charset)))
+       (let ((w3m-safe-url-regexp (if mm-inline-text-html-with-images
+                                      nil
+                                    "\\`cid:"))
+             (w3m-display-inline-images mm-inline-text-html-with-images)
+             w3m-force-redisplay)
+         (w3m-region (point-min) (point-max)))
+       (when mm-inline-text-html-with-w3m-keymap
+         (add-text-properties
+          (point-min) (point-max)
+          (append '(mm-inline-text-html-with-w3m t)
+                  (gnus-local-map-property mm-w3m-mode-map)))))
+      (mm-handle-set-undisplayer
        handle
-       (concat "\n-- \n"
-              (ignore-errors
-                (if (fboundp 'vcard-pretty-print)
-                    (vcard-pretty-print (mm-get-part handle))
-                  (vcard-format-string
-                   (vcard-parse-string (mm-get-part handle)
-                                       'vcard-standard-filter)))))))
+       `(lambda ()
+         (let (buffer-read-only)
+           (if (functionp 'remove-specifier)
+               (mapcar (lambda (prop)
+                         (remove-specifier
+                          (face-property 'default prop)
+                          (current-buffer)))
+                       '(background background-pixmap foreground)))
+           (delete-region ,(point-min-marker)
+                          ,(point-max-marker))))))))
+
+(defun mm-links-remove-leading-blank ()
+  ;; Delete the annoying three spaces preceding each line of links
+  ;; output.
+  (goto-char (point-min))
+  (while (re-search-forward "^   " nil t)
+    (delete-region (match-beginning 0) (match-end 0))))
+
+(defun mm-inline-wash-with-file (post-func cmd &rest args)
+  (let ((file (mm-make-temp-file
+              (expand-file-name "mm" mm-tmp-directory))))
+    (let ((coding-system-for-write 'binary))
+      (write-region (point-min) (point-max) file nil 'silent))
+    (delete-region (point-min) (point-max))
+    (unwind-protect
+       (apply 'call-process cmd nil t nil (mapcar 'eval args))
+      (delete-file file))
+    (and post-func (funcall post-func))))
+
+(defun mm-inline-wash-with-stdin (post-func cmd &rest args)
+  (let ((coding-system-for-write 'binary))
+    (apply 'call-process-region (point-min) (point-max)
+          cmd t t nil args))
+  (and post-func (funcall post-func)))
+
+(defun mm-inline-render-with-file (handle post-func cmd &rest args)
+  (let ((source (mm-get-part handle)))
+    (mm-insert-inline
+     handle
+     (mm-with-unibyte-buffer
+       (insert source)
+       (apply 'mm-inline-wash-with-file post-func cmd args)
+       (buffer-string)))))
+
+(defun mm-inline-render-with-stdin (handle post-func cmd &rest args)
+  (let ((source (mm-get-part handle)))
+    (mm-insert-inline
+     handle
+     (mm-with-unibyte-buffer
+       (insert source)
+       (apply 'mm-inline-wash-with-stdin post-func cmd args)
+       (buffer-string)))))
+
+(defun mm-inline-render-with-function (handle func &rest args)
+  (let ((source (mm-get-part handle)))
+    (mm-insert-inline
+     handle
+     (mm-with-unibyte-buffer
+       (insert source)
+       (apply func args)
+       (buffer-string)))))
+
+(defun mm-inline-text-html (handle)
+  (let* ((func (or mm-inline-text-html-renderer mm-text-html-renderer))
+        (entry (assq func mm-text-html-renderer-alist))
+        buffer-read-only)
+    (if entry
+       (setq func (cdr entry)))
+    (cond
+     ((gnus-functionp func)
+      (funcall func handle))
      (t
-      (let ((b (point))
-           (charset (mail-content-type-get
-                     (mm-handle-type handle) 'charset)))
-       (if (or (eq charset 'gnus-decoded)
-               ;; This is probably not entirely correct, but
-               ;; makes rfc822 parts with embedded multiparts work.
-               (eq mail-parse-charset 'gnus-decoded))
-           (save-restriction
-             (narrow-to-region (point) (point))
-             (mm-insert-part handle)
-             (goto-char (point-max)))
-         (insert (mm-decode-string (mm-get-part handle) charset)))
-       (when (and (equal type "plain")
-                  (equal (cdr (assoc 'format (mm-handle-type handle)))
-                         "flowed"))
-         (save-restriction
-           (narrow-to-region b (point))
-           (goto-char b)
-           (fill-flowed)
-           (goto-char (point-max))))
+      (apply (car func) handle (cdr func))))))
+
+(defun mm-inline-text-vcard (handle)
+  (let (buffer-read-only)
+    (mm-insert-inline
+     handle
+     (concat "\n-- \n"
+            (ignore-errors
+              (if (fboundp 'vcard-pretty-print)
+                  (vcard-pretty-print (mm-get-part handle))
+                (vcard-format-string
+                 (vcard-parse-string (mm-get-part handle)
+                                     'vcard-standard-filter))))))))
+
+(defun mm-inline-text (handle)
+  (let ((b (point))
+       (type (mm-handle-media-subtype handle))
+       (charset (mail-content-type-get
+                 (mm-handle-type handle) 'charset))
+       buffer-read-only)
+    (if (or (eq charset 'gnus-decoded)
+           ;; This is probably not entirely correct, but
+           ;; makes rfc822 parts with embedded multiparts work.
+           (eq mail-parse-charset 'gnus-decoded))
        (save-restriction
-         (narrow-to-region b (point))
-         (set-text-properties (point-min) (point-max) nil)
-         (when (or (equal type "enriched")
-                   (equal type "richtext"))
-           (enriched-decode (point-min) (point-max)))
-         (mm-handle-set-undisplayer
-          handle
-          `(lambda ()
-             (let (buffer-read-only)
-               (delete-region ,(point-min-marker)
-                              ,(point-max-marker)))))))))))
+         (narrow-to-region (point) (point))
+         (mm-insert-part handle)
+         (goto-char (point-max)))
+      (insert (mm-decode-string (mm-get-part handle) charset)))
+    (when (and (equal type "plain")
+              (equal (cdr (assoc 'format (mm-handle-type handle)))
+                     "flowed"))
+      (save-restriction
+       (narrow-to-region b (point))
+       (goto-char b)
+       (fill-flowed)
+       (goto-char (point-max))))
+    (save-restriction
+      (narrow-to-region b (point))
+      (set-text-properties (point-min) (point-max) nil)
+      (when (or (equal type "enriched")
+               (equal type "richtext"))
+       (enriched-decode (point-min) (point-max)))
+      (mm-handle-set-undisplayer
+       handle
+       `(lambda ()
+         (let (buffer-read-only)
+           (delete-region ,(point-min-marker)
+                          ,(point-max-marker))))))))
 
 (defun mm-insert-inline (handle text)
   "Insert TEXT inline from HANDLE."
 (defun mm-w3-prepare-buffer ()
   (require 'w3)
   (let ((url-standalone-mode t)
-       (w3-honor-stylesheets nil)
-       (w3-delay-image-loads t))
+       (url-gateway-unplugged t)
+       (w3-honor-stylesheets nil))
     (w3-prepare-buffer)))
 
 (defun mm-view-message ()
 (defun mm-view-pkcs7 (handle)
   (case (mm-view-pkcs7-get-type handle)
     (enveloped (mm-view-pkcs7-decrypt handle))
+    (signed (mm-view-pkcs7-verify handle))
     (otherwise (error "Unknown or unimplemented PKCS#7 type"))))
 
+(defun mm-view-pkcs7-verify (handle)
+  ;; A bogus implementation of PKCS#7. FIXME::
+  (mm-insert-part handle)
+  (goto-char (point-min))
+  (if (search-forward "Content-Type: " nil t)
+      (delete-region (point-min) (match-beginning 0)))
+  (goto-char (point-max))
+  (if (re-search-backward "--\r?\n?" nil t)
+      (delete-region (match-end 0) (point-max)))
+  (goto-char (point-min))
+  (while (search-forward "\r\n" nil t)
+    (replace-match "\n"))
+  (message "Verify signed PKCS#7 message is unimplemented.")
+  (sit-for 1)
+  t)
+
 (defun mm-view-pkcs7-decrypt (handle)
   (insert-buffer (mm-handle-buffer handle))
   (goto-char (point-min))
    (if (= (length smime-keys) 1)
        (cadar smime-keys)
      (smime-get-key-by-email
-      (completing-read "Decrypt this part with which key? "
-                      smime-keys nil nil
-                      (and (listp (car-safe smime-keys))
-                           (caar smime-keys)))))))
+      (completing-read
+       (concat "Decipher using which key? "
+              (if smime-keys (concat "(default " (caar smime-keys) ") ")
+                ""))
+       smime-keys nil nil nil nil (car-safe (car-safe smime-keys))))))
+  (goto-char (point-min))
+  (while (search-forward "\r\n" nil t)
+    (replace-match "\n"))
+  (goto-char (point-min)))
 
 (provide 'mm-view)
 
index 3d30602..09fec43 100644 (file)
@@ -1,5 +1,5 @@
 ;;; mml-sec.el --- A package with security functions for MML documents
-;; Copyright (C) 2000 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Simon Josefsson <simon@josefsson.org>
 ;; This file is not part of GNU Emacs, but the same permissions apply.
   (interactive)
   (mml-secure-part "smime"))
 
+;; defuns that add the proper <#secure ...> tag to the top of the message body
+(defun mml-secure-message (method &optional modesym)
+  (let ((mode (prin1-to-string modesym))
+       insert-loc)
+    (mml-unsecure-message)
+    (save-excursion
+      (goto-char (point-min))
+      (cond ((re-search-forward
+             (concat "^" (regexp-quote mail-header-separator) "\n") nil t)
+            (goto-char (setq insert-loc (match-end 0)))
+            (unless (looking-at "<#secure")
+              (mml-insert-tag
+               'secure 'method method 'mode mode)))
+           (t (error
+               "The message is corrupted. No mail header separator"))))
+    (when (eql insert-loc (point))
+      (forward-line 1))))
+
+(defun mml-unsecure-message ()
+  "Remove security related MML tags from message."
+  (interactive)
+  (save-excursion
+    (goto-char (point-max))
+    (when (re-search-backward "^<#secure.*>\n" nil t)
+      (kill-region (match-beginning 0) (match-end 0)))))
+
+(defun mml-secure-message-sign-smime ()
+  "Add MML tag to encrypt/sign the entire message."
+  (interactive)
+  (mml-secure-message "smime" 'sign))
+
+(defun mml-secure-message-sign-pgp ()
+  "Add MML tag to encrypt/sign the entire message."
+  (interactive)
+  (mml-secure-message "pgp" 'sign))
+
+(defun mml-secure-message-sign-pgpmime ()
+  "Add MML tag to encrypt/sign the entire message."
+  (interactive)
+  (mml-secure-message "pgpmime" 'sign))
+
+(defun mml-secure-message-encrypt-smime (&optional dontsign)
+  "Add MML tag to encrypt and sign the entire message.
+If called with a prefix argument, only encrypt (do NOT sign)."
+  (interactive "P")
+  (mml-secure-message "smime" (if dontsign 'encrypt 'signencrypt)))
+
+;;; NOTE: this should be switched to use signencrypt
+;;; once it does something sensible
+(defun mml-secure-message-encrypt-pgp (&optional dontsign)
+  "Add MML tag to encrypt and sign the entire message.
+If called with a prefix argument, only encrypt (do NOT sign)."
+  (interactive "P")
+  (mml-secure-message "pgp" (if dontsign 'encrypt 'encrypt)))
+
+;;; NOTE: this should be switched to use signencrypt
+;;; once it does something sensible
+(defun mml-secure-message-encrypt-pgpmime (&optional dontsign)
+  "Add MML tag to encrypt and sign the entire message.
+If called with a prefix argument, only encrypt (do NOT sign)."
+  (interactive "P")
+  (mml-secure-message "pgpmime" (if dontsign 'encrypt 'encrypt)))
+
 (provide 'mml-sec)
 
 ;;; mml-sec.el ends here
index d5baf3f..2eec919 100644 (file)
@@ -45,7 +45,8 @@
       (if (not (and (not (file-exists-p tmp))
                    (get-buffer tmp)))
          (push tmp certfiles)
-       (setq file (make-temp-name mm-tmp-directory))
+       (setq file (mm-make-temp-file (expand-file-name "mml." 
+                                                       mm-tmp-directory)))
        (with-current-buffer tmp
          (write-region (point-min) (point-max) file))
        (push file certfiles)
index 1a94898..4eb71c2 100644 (file)
@@ -143,6 +143,40 @@ one charsets.")
     (while (and (not (eobp))
                (not (looking-at "<#/multipart")))
       (cond
+       ((looking-at "<#secure")
+       ;; The secure part is essentially a meta-meta tag, which
+       ;; expands to either a part tag if there are no other parts in
+       ;; the document or a multipart tag if there are other parts
+       ;; included in the message
+       (let* (secure-mode
+              (taginfo (mml-read-tag))
+              (recipients (cdr (assq 'recipients taginfo)))
+              (location (cdr (assq 'tag-location taginfo)))
+              (mode (cdr (assq 'mode taginfo)))
+              (method (cdr (assq 'method taginfo)))
+              tags)
+         (save-excursion
+           (if
+               (re-search-forward
+                "<#\\(/\\)?\\(multipart\\|part\\|external\\|mml\\)." nil t)
+               (setq secure-mode "multipart")
+             (setq secure-mode "part")))
+         (save-excursion
+           (goto-char location)
+           (re-search-forward "<#secure[^\n]*>\n"))
+         (delete-region (match-beginning 0) (match-end 0))
+         (cond ((string= mode "sign")
+                (setq tags (list "sign" method)))
+               ((string= mode "encrypt")
+                (setq tags (list "encrypt" method)))
+               ((string= mode "signencrypt")
+                (setq tags (list "sign" method "encrypt" method))))
+         (eval `(mml-insert-tag ,secure-mode
+                                ,@tags
+                                ,(if recipients 'recipients)
+                                ,recipients))
+         ;; restart the parse
+         (goto-char location)))
        ((looking-at "<#multipart")
        (push (nconc (mml-read-tag) (mml-parse-1)) struct))
        ((looking-at "<#external")
@@ -407,7 +441,8 @@ If MML is non-nil, return the buffer up till the correspondent mml tag."
                  (let (use-hard-newlines)
                    (when (and (string= type "text/plain")
                               (or (null (assq 'format cont))
-                                  (string= (assq 'format cont) "flowed"))
+                                  (string= (cdr (assq 'format cont))
+                                           "flowed"))
                               (setq use-hard-newlines
                                     (text-property-any
                                      (point-min) (point-max) 'hard 't)))
@@ -750,12 +785,13 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
        (encrypt (make-sparse-keymap))
        (map (make-sparse-keymap))
        (main (make-sparse-keymap)))
-    (define-key sign "p" 'mml-secure-sign-pgpmime)
-    (define-key sign "o" 'mml-secure-sign-pgp)
-    (define-key sign "s" 'mml-secure-sign-smime)
-    (define-key encrypt "p" 'mml-secure-encrypt-pgpmime)
-    (define-key encrypt "o" 'mml-secure-encrypt-pgp)
-    (define-key encrypt "s" 'mml-secure-encrypt-smime)
+    (define-key sign "p" 'mml-secure-message-sign-pgpmime)
+    (define-key sign "o" 'mml-secure-message-sign-pgp)
+    (define-key sign "s" 'mml-secure-message-sign-smime)
+    (define-key encrypt "p" 'mml-secure-message-encrypt-pgpmime)
+    (define-key encrypt "o" 'mml-secure-message-encrypt-pgp)
+    (define-key encrypt "s" 'mml-secure-message-encrypt-smime)
+    (define-key map "\C-n" 'mml-unsecure-message)
     (define-key map "f" 'mml-attach-file)
     (define-key map "b" 'mml-attach-buffer)
     (define-key map "e" 'mml-attach-external)
@@ -782,12 +818,13 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
    ["Attach External" mml-attach-external t]
    ["Insert Part" mml-insert-part t]
    ["Insert Multipart" mml-insert-multipart t]
-   ["PGP/MIME Sign" mml-secure-sign-pgpmime t]
-   ["PGP/MIME Encrypt" mml-secure-encrypt-pgpmime t]
-   ["PGP Sign" mml-secure-sign-pgp t]
-   ["PGP Encrypt" mml-secure-encrypt-pgp t]
-   ["S/MIME Sign" mml-secure-sign-smime t]
-   ["S/MIME Encrypt" mml-secure-encrypt-smime t]
+   ["PGP/MIME Sign" mml-secure-message-sign-pgpmime t]
+   ["PGP/MIME Encrypt" mml-secure-message-encrypt-pgpmime t]
+   ["PGP Sign" mml-secure-message-sign-pgp t]
+   ["PGP Encrypt" mml-secure-message-encrypt-pgp t]
+   ["S/MIME Sign" mml-secure-message-sign-smime t]
+   ["S/MIME Encrypt" mml-secure-message-encrypt-smime t]
+   ["Encrypt/Sign off" mml-unsecure-message t]
    ;;["Narrow" mml-narrow-to-part t]
    ["Quote MML" mml-quote-region t]
    ["Validate MML" mml-validate t]
@@ -947,42 +984,43 @@ TYPE is the MIME type to use."
   "Display current buffer with Gnus, in a new buffer.
 If RAW, don't highlight the article."
   (interactive "P")
-  (let* ((buf (current-buffer))
-        (message-options message-options)
-        (message-this-is-news (message-news-p))
-        (message-posting-charset (or (gnus-setup-posting-charset
-                                      (save-restriction
-                                        (message-narrow-to-headers-or-head)
-                                        (message-fetch-field "Newsgroups")))
-                                     message-posting-charset)))
-    (message-options-set-recipient)
-    (switch-to-buffer (generate-new-buffer
-                      (concat (if raw "*Raw MIME preview of "
-                                "*MIME preview of ") (buffer-name))))
-    (erase-buffer)
-    (insert-buffer buf)
-    (if (re-search-forward
-        (concat "^" (regexp-quote mail-header-separator) "\n") nil t)
-       (replace-match "\n"))
-    (let ((mail-header-separator "")) ;; mail-header-separator is removed.
-      (mml-to-mime))
-    (if raw
-       (when (fboundp 'set-buffer-multibyte)
-         (let ((s (buffer-string)))
-           ;; Insert the content into unibyte buffer.
-           (erase-buffer)
-           (mm-disable-multibyte)
-           (insert s)))
-      (let ((gnus-newsgroup-charset (car message-posting-charset))
-           gnus-article-prepare-hook gnus-original-article-buffer)
-       (run-hooks 'gnus-article-decode-hook)
-       (let ((gnus-newsgroup-name "dummy"))
-         (gnus-article-prepare-display))))
-    ;; Disable article-mode-map.
-    (use-local-map nil)
-    (setq buffer-read-only t)
-    (local-set-key "q" (lambda () (interactive) (kill-buffer nil)))
-    (goto-char (point-min))))
+  (save-excursion
+    (let* ((buf (current-buffer))
+          (message-options message-options)
+          (message-this-is-news (message-news-p))
+          (message-posting-charset (or (gnus-setup-posting-charset
+                                        (save-restriction
+                                          (message-narrow-to-headers-or-head)
+                                          (message-fetch-field "Newsgroups")))
+                                       message-posting-charset)))
+      (message-options-set-recipient)
+      (switch-to-buffer (generate-new-buffer
+                        (concat (if raw "*Raw MIME preview of "
+                                  "*MIME preview of ") (buffer-name))))
+      (erase-buffer)
+      (insert-buffer buf)
+      (if (re-search-forward
+          (concat "^" (regexp-quote mail-header-separator) "\n") nil t)
+         (replace-match "\n"))
+      (let ((mail-header-separator ""));; mail-header-separator is removed.
+       (mml-to-mime))
+      (if raw
+         (when (fboundp 'set-buffer-multibyte)
+           (let ((s (buffer-string)))
+             ;; Insert the content into unibyte buffer.
+             (erase-buffer)
+             (mm-disable-multibyte)
+             (insert s)))
+       (let ((gnus-newsgroup-charset (car message-posting-charset))
+             gnus-article-prepare-hook gnus-original-article-buffer)
+         (run-hooks 'gnus-article-decode-hook)
+         (let ((gnus-newsgroup-name "dummy"))
+           (gnus-article-prepare-display))))
+      ;; Disable article-mode-map.
+      (use-local-map nil)
+      (setq buffer-read-only t)
+      (local-set-key "q" (lambda () (interactive) (kill-buffer nil)))
+      (goto-char (point-min)))))
 
 (defun mml-validate ()
   "Validate the current MML document."
index b86a2e1..75af79c 100644 (file)
@@ -1,5 +1,5 @@
 ;;; mml2015.el --- MIME Security with Pretty Good Privacy (PGP)
-;; Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: PGP MIME MML
@@ -127,7 +127,11 @@ by you.")
        (setq handles (mm-dissect-buffer t)))
       (mm-destroy-parts handle)
       (mm-set-handle-multipart-parameter
-       mm-security-handle 'gnus-info "OK")
+       mm-security-handle 'gnus-info
+       (concat "OK"
+              (let ((sig (with-current-buffer mml2015-result-buffer
+                           (mml2015-gpg-extract-signature-details))))
+                (concat ", Signer: " sig))))
       (if (listp (car handles))
          handles
        (list handles)))))
diff --git a/lisp/netrc.el b/lisp/netrc.el
new file mode 100644 (file)
index 0000000..3bfc76d
--- /dev/null
@@ -0,0 +1,128 @@
+;;; netrc.el --- .netrc parsing functionality
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
+;;        Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Modularizer: Ted Zlatanov <tzz@lifelogs.com>
+;; Keywords: news
+
+;; This file is part of GNU Emacs.
+
+;; 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.
+
+;;; Commentary:
+
+;; Just the .netrc parsing functionality, abstracted so other packages
+;; besides Gnus can use it.
+
+;;; Code:
+
+;;;
+;;; .netrc and .authinforc parsing
+;;;
+
+(eval-and-compile
+  (defalias 'netrc-point-at-eol
+    (if (fboundp 'point-at-eol)
+       'point-at-eol
+      'line-end-position)))
+
+(defun netrc-parse (file)
+  "Parse FILE and return an list of all entries in the file."
+  (when (file-exists-p file)
+    (with-temp-buffer
+      (let ((tokens '("machine" "default" "login"
+                     "password" "account" "macdef" "force"
+                     "port"))
+           alist elem result pair)
+       (insert-file-contents file)
+       (goto-char (point-min))
+       ;; Go through the file, line by line.
+       (while (not (eobp))
+         (narrow-to-region (point) (netrc-point-at-eol))
+         ;; For each line, get the tokens and values.
+         (while (not (eobp))
+           (skip-chars-forward "\t ")
+           ;; Skip lines that begin with a "#".
+           (if (eq (char-after) ?#)
+               (goto-char (point-max))
+             (unless (eobp)
+               (setq elem
+                     (if (= (following-char) ?\")
+                         (read (current-buffer))
+                       (buffer-substring
+                        (point) (progn (skip-chars-forward "^\t ")
+                                       (point)))))
+               (cond
+                ((equal elem "macdef")
+                 ;; We skip past the macro definition.
+                 (widen)
+                 (while (and (zerop (forward-line 1))
+                             (looking-at "$")))
+                 (narrow-to-region (point) (point)))
+                ((member elem tokens)
+                 ;; Tokens that don't have a following value are ignored,
+                 ;; except "default".
+                 (when (and pair (or (cdr pair)
+                                     (equal (car pair) "default")))
+                   (push pair alist))
+                 (setq pair (list elem)))
+                (t
+                 ;; Values that haven't got a preceding token are ignored.
+                 (when pair
+                   (setcdr pair elem)
+                   (push pair alist)
+                   (setq pair nil)))))))
+         (when alist
+           (push (nreverse alist) result))
+         (setq alist nil
+               pair nil)
+         (widen)
+         (forward-line 1))
+       (nreverse result)))))
+
+(defun netrc-machine (list machine &optional port defaultport)
+  "Return the netrc values from LIST for MACHINE or for the default entry.
+If PORT specified, only return entries with matching port tokens.
+Entries without port tokens default to DEFAULTPORT."
+  (let ((rest list)
+       result)
+    (while list
+      (when (equal (cdr (assoc "machine" (car list))) machine)
+       (push (car list) result))
+      (pop list))
+    (unless result
+      ;; No machine name matches, so we look for default entries.
+      (while rest
+       (when (assoc "default" (car rest))
+         (push (car rest) result))
+       (pop rest)))
+    (when result
+      (setq result (nreverse result))
+      (while (and result
+                 (not (equal (or port defaultport "nntp")
+                             (or (netrc-get (car result) "port")
+                                 defaultport "nntp"))))
+       (pop result))
+      (car result))))
+
+(defun netrc-get (alist type)
+  "Return the value of token TYPE from ALIST."
+  (cdr (assoc type alist)))
+
+(provide 'netrc)
+
+;;; netrc.el ends here
index c77b91f..21b9f97 100644 (file)
 
 (deffoo nnagent-retrieve-headers (articles &optional group server fetch-old)
   (let ((file (gnus-agent-article-name ".overview" group))
-       arts n)
+       arts n first)
     (save-excursion
       (gnus-agent-load-alist group)
-      (setq arts (gnus-set-difference articles 
-                                     (mapcar 'car gnus-agent-article-alist)))
+      (setq arts (gnus-sorted-difference
+                 articles (mapcar 'car gnus-agent-article-alist)))
+      ;; Assume that articles with smaller numbers than the first one
+      ;; Agent knows are gone.
+      (setq first (caar gnus-agent-article-alist))
+      (when first 
+       (while (and arts (< (car arts) first))
+         (pop arts)))
       (set-buffer nntp-server-buffer)
       (erase-buffer)
-      (nnheader-insert-file-contents file)
-      (goto-char (point-min)) 
-      (while (and arts (not (eobp)))
-       (cond 
-        ((looking-at "[0-9]")
+      (nnheader-insert-nov-file file (car articles))
+      (goto-char (point-min))
+      (gnus-parse-without-error
+       (while (and arts (not (eobp)))
          (setq n (read (current-buffer)))
-         (if (> n (car arts))
-             (beginning-of-line))
+         (when (> n (car arts))
+           (beginning-of-line))
          (while (and arts (> n (car arts)))
-           (insert (format 
+           (insert (format
                     "%d\t[Undownloaded article %d]\tGnus Agent\t\t\t\n"
                     (car arts) (car arts)))
            (pop arts))
-         (if (and arts (= n (car arts)))
-           (pop arts))))
-       (forward-line 1))
-      (while (and arts)
+         (when (and arts (= n (car arts)))
+           (pop arts))
+         (forward-line 1)))
+      (while arts
        (insert (format
                 "%d\t[Undownloaded article %d]\tGnus Agent\t\t\t\n"
                 (car arts) (car arts)))
        t)
       'nov)))
 
+(deffoo nnagent-request-expire-articles (articles group &optional server force)
+  articles)
+
 (deffoo nnagent-request-group (group &optional server dont-check)
   (nnoo-parent-function 'nnagent 'nnml-request-group
                        (list group (nnagent-server server) dont-check)))
   (nnoo-parent-function 'nnagent 'nnml-request-delete-group
                        (list group force (nnagent-server server))))
 
-(deffoo nnagent-request-expire-articles (articles group &optional server force)
-  (nnoo-parent-function 'nnagent 'nnml-request-expire-articles
-                       (list articles group (nnagent-server server) force)))
-
 (deffoo nnagent-request-list (&optional server)
   (nnoo-parent-function 'nnagent 'nnml-request-list
                        (list (nnagent-server server))))
index a4a639f..143b05e 100644 (file)
@@ -1,5 +1,5 @@
 ;;; nndoc.el --- single file access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -44,7 +44,7 @@
 One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward',
 `rfc934', `rfc822-forward', `mime-parts', `standard-digest',
 `slack-digest', `clari-briefs', `nsmail', `outlook', `oe-dbx',
-`mailman' or `guess'.")
+`mailman', `exim-bounce', or `guess'.")
 
 (defvoo nndoc-post-type 'mail
   "*Whether the nndoc group is `mail' or `post'.")
@@ -58,6 +58,9 @@ from the document.")
   `((mmdf
      (article-begin .  "^\^A\^A\^A\^A\n")
      (body-end .  "^\^A\^A\^A\^A\n"))
+    (exim-bounce
+     (article-begin . "^------ This is a copy of the message, including all the headers. ------\n\n")
+     (body-end-function . nndoc-exim-bounce-body-end-function))
     (nsmail
      (article-begin .  "^From - "))
     (news
@@ -120,8 +123,8 @@ from the document.")
      (head-begin . "^Paper.*:")
      (head-end   . "\\(^\\\\\\\\.*\n\\|-----------------\\)")
      (body-begin . "")
-     (body-end   . "-------------------------------------------------")
-     (file-end   . "^Title: Recent Seminal")
+     (body-end   . "\\(-------------------------------------------------\\|%-%-%-%-%-%-%-%-%-%-%-%-%-%-\\|%%--%%--%%--%%--%%--%%--%%--%%--\\|%%%---%%%---%%%---%%%---\\)")
+     (file-end   . "\\(^Title: Recent Seminal\\|%%%---%%%---%%%---%%%---\\)")
      (generate-head-function . nndoc-generate-lanl-gov-head)
      (article-transform-function . nndoc-transform-lanl-gov-announce)
      (subtype preprints guess))
@@ -139,6 +142,8 @@ from the document.")
      (article-begin . "^-+ \\(Start of \\)?forwarded message.*\n+")
      (body-end . "^-+ End \\(of \\)?forwarded message.*$")
      (prepare-body-function . nndoc-unquote-dashes))
+    (mail-in-mail ;; Wild guess on mailer daemon's messages or others
+     (article-begin-function . nndoc-mail-in-mail-article-begin))
     (guess
      (guess . t)
      (subtype nil))
@@ -547,6 +552,13 @@ from the document.")
     (insert "From: " "clari@clari.net (" (or from "unknown") ")"
            "\nSubject: " (or subject "(no subject)") "\n")))
 
+(defun nndoc-exim-bounce-type-p ()
+  (and (re-search-forward "^------ This is a copy of the message, including all the headers. ------" nil t)
+       t))
+
+(defun nndoc-exim-bounce-body-end-function ()
+  (goto-char (point-max)))
+
 
 (defun nndoc-mime-digest-type-p ()
   (let ((case-fold-search t)
@@ -585,35 +597,54 @@ from the document.")
 
 (defun nndoc-lanl-gov-announce-type-p ()
   (when (let ((case-fold-search nil))
-         (re-search-forward "^\\\\\\\\\nPaper: [a-z-]+/[0-9]+" nil t))
+         (re-search-forward "^\\\\\\\\\nPaper\\( (\\*cross-listing\\*)\\)?: [a-zA-Z-\\.]+/[0-9]+" nil t))
     t))
 
 (defun nndoc-transform-lanl-gov-announce (article)
   (goto-char (point-max))
-  (when (re-search-backward "^\\\\\\\\ +(\\([^ ]*\\) , *\\([^ ]*\\))" nil t)
-    (replace-match "\n\nGet it at \\1 (\\2)" t nil)))
+  (when (re-search-backward "^\\\\\\\\ +( *\\([^ ]*\\) , *\\([^ ]*\\))" nil t)
+    (replace-match "\n\nGet it at \\1 (\\2)" t nil))
+  (goto-char (point-min))
+  (while (re-search-forward "^\\\\\\\\$" nil t)
+    (replace-match "" t nil))
+  (goto-char (point-min))
+  (when (re-search-forward "^replaced with revised version +\\(.*[^ ]\\) +" nil t)
+    (replace-match "Date: \\1 (revised) " t nil))
+  (goto-char (point-min))
+  (unless (re-search-forward "^From" nil t)
+    (goto-char (point-min))
+    (when (re-search-forward "^Authors?: \\(.*\\)" nil t)
+      (goto-char (point-min))
+      (insert "From: " (match-string 1) "\n"))))
 
 (defun nndoc-generate-lanl-gov-head (article)
   (let ((entry (cdr (assq article nndoc-dissection-alist)))
-       (e-mail "no address given")
-       subject from)
+       (from "<no address given>")
+       subject date)
     (save-excursion
       (set-buffer nndoc-current-buffer)
       (save-restriction
        (narrow-to-region (car entry) (nth 1 entry))
        (goto-char (point-min))
-       (when (looking-at "^Paper.*: \\([a-z-]+/[0-9]+\\)")
+       (when (looking-at "^Paper.*: \\([a-zA-Z-\\.]+/[0-9]+\\)")
          (setq subject (concat " (" (match-string 1) ")"))
-         (when (re-search-forward "^From: \\([^ ]+\\)" nil t)
-           (setq e-mail (match-string 1)))
+         (when (re-search-forward "^From: \\(.*\\)" nil t)
+           (setq from (concat "<"
+                              (cadr (funcall gnus-extract-address-components 
+                                             (match-string 1))) ">")))
+         (if (re-search-forward "^Date: +\\([^(]*\\)" nil t)
+             (setq date (match-string 1))
+           (when (re-search-forward "^replaced with revised version +\\([^(]*\\)" nil t)
+             (setq date (match-string 1))))
          (when (re-search-forward "^Title: \\([^\f]*\\)\nAuthors?: \\(.*\\)"
                                   nil t)
            (setq subject (concat (match-string 1) subject))
-           (setq from (concat (match-string 2) " <" e-mail ">"))))))
+           (setq from (concat (match-string 2) " " from))))))
     (while (and from (string-match "(\[^)\]*)" from))
       (setq from (replace-match "" t t from)))
     (insert "From: "  (or from "unknown")
-           "\nSubject: " (or subject "(no subject)") "\n")))
+           "\nSubject: " (or subject "(no subject)") "\n")
+    (if date (insert "Date: " date))))
 
 (defun nndoc-nsmail-type-p ()
   (when (looking-at "From - ")
@@ -693,6 +724,37 @@ from the document.")
 (defun nndoc-oe-dbx-generate-head (article)
   (nndoc-oe-dbx-generate-article article 'head))
 
+(defun nndoc-mail-in-mail-type-p ()
+  (let (found)
+    (save-excursion
+      (catch 'done
+       (while (re-search-forward "\n\n[-A-Za-z0-9]+:" nil t)
+         (setq found 0)
+         (forward-line)
+         (while (looking-at "[ \t]\\|[-A-Za-z0-9]+:")
+           (if (looking-at "[-A-Za-z0-9]+:")
+               (setq found (1+ found)))
+           (forward-line))
+         (if (and (> found 0) (looking-at "\n"))
+             (throw 'done 9999)))
+       nil))))
+
+(defun nndoc-mail-in-mail-article-begin ()
+  (let (point found)
+    (if (catch 'done
+         (while (re-search-forward "\n\n\\([-A-Za-z0-9]+:\\)" nil t)
+           (setq found 0)
+           (setq point (match-beginning 1))
+           (forward-line)
+           (while (looking-at "[ \t]\\|[-A-Za-z0-9]+:")
+             (if (looking-at "[-A-Za-z0-9]+:")
+                 (setq found (1+ found)))
+             (forward-line))
+           (if (and (> found 0) (looking-at "\n"))
+               (throw 'done t)))
+         nil)
+       (goto-char point))))
+
 (deffoo nndoc-request-accept-article (group &optional server last)
   nil)
 
@@ -830,6 +892,10 @@ PARENT is the message-ID of the parent summary line, or nil for none."
     (unless article-insert
       (setq article-insert (buffer-substring (point-min) (point-max))
            head-end head-begin))
+    ;; Fix MIME-Version
+    (unless (string-match "MIME-Version:" article-insert)
+      (setq article-insert
+           (concat article-insert "MIME-Version: 1.0\n")))
     (setq summary-insert article-insert)
     ;; - summary Subject.
     (setq summary-insert
index b2ad87f..57397fb 100644 (file)
           (newest (if (file-newer-than-file-p file auto) file auto))
           (nntp-server-buffer (or buffer nntp-server-buffer)))
       (when (and (file-exists-p newest)
-                (let ((nnmail-file-coding-system nnheader-text-coding-system))
+                (let ((nnmail-file-coding-system
+                       (if (file-newer-than-file-p file auto)
+                           (if (equal group "drafts")
+                               message-draft-coding-system
+                             nnheader-text-coding-system)
+                         nnheader-auto-save-coding-system)))
                   (nnmail-find-file newest)))
        (save-excursion
          (set-buffer nntp-server-buffer)
index 9901397..420d7f9 100644 (file)
@@ -64,7 +64,6 @@ included.")
 
 (defvoo nneething-status-string "")
 
-(defvoo nneething-message-id-number 0)
 (defvoo nneething-work-buffer " *nneething work*")
 
 (defvoo nneething-group nil)
@@ -388,7 +387,7 @@ This variable is used as the alternative of `mailcap-mime-extensions'.")
   (let ((pos 0) buf)
     (setq file (mm-encode-coding-string
                file (or coding-system nnmail-pathname-coding-system)))
-    (while (string-match "[^-a-zA-Z_:/.]" file pos)
+    (while (string-match "[^-0-9a-zA-Z_:/.]" file pos)
       (setq buf (cons (format "%%%02x" (aref file (match-beginning 0)))
                      (cons (substring file pos (match-beginning 0)) buf))
            pos (match-end 0)))
@@ -409,7 +408,7 @@ This variable is used as the alternative of `mailcap-mime-extensions'.")
 
 (defun nneething-get-file-name (id)
   "Extract the file name from the message ID string."
-  (when (string-match "\\`<nneething\\-[0-9]+\\-\\([^@]+\\)@.*>\\'" id)
+  (when (string-match "\\`<nneething-\\([^@]+\\)@.*>\\'" id)
     (nneething-decode-file-name (match-string 1 id))))
 
 (defun nneething-make-head (file &optional buffer extra-msg
@@ -418,9 +417,7 @@ This variable is used as the alternative of `mailcap-mime-extensions'.")
   (let ((atts (file-attributes file)))
     (insert
      "Subject: " (file-name-nondirectory file) (or extra-msg "") "\n"
-     "Message-ID: <nneething-"
-     (int-to-string (incf nneething-message-id-number))
-     "-" (nneething-encode-file-name file)
+     "Message-ID: <nneething-" (nneething-encode-file-name file)
      "@" (system-name) ">\n"
      (if (equal '(0 0) (nth 5 atts)) ""
        (concat "Date: " (current-time-string (nth 5 atts)) "\n"))
@@ -524,7 +521,7 @@ This variable is used as the alternative of `mailcap-mime-extensions'.")
     (if (numberp article)
        (if (setq fname (cadr (assq article nneething-map)))
            (expand-file-name fname dir)
-         (make-temp-name (expand-file-name "nneething" dir)))
+         (mm-make-temp-file (expand-file-name "nneething" dir)))
       (expand-file-name article dir))))
 
 (provide 'nneething)
index 97e6a1b..591a0bd 100644 (file)
@@ -1,5 +1,5 @@
 ;;; nnfolder.el --- mail folder access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Simon Josefsson <simon@josefsson.org> (adding MARKS)
@@ -430,7 +430,7 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
       (nnfolder-save-buffer)
       (nnfolder-adjust-min-active newsgroup)
       (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)
-      (gnus-sorted-complement articles (nreverse deleted-articles)))))
+      (gnus-sorted-difference articles (nreverse deleted-articles)))))
 
 (deffoo nnfolder-request-move-article (article group server
                                               accept-form &optional last)
@@ -475,6 +475,8 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
          result art-group)
       (goto-char (point-min))
       (when (looking-at "X-From-Line: ")
+       (save-match-data
+         (mail-header-unfold-field))
        (replace-match "From "))
       (with-temp-buffer
        (let ((nnmail-file-coding-system nnfolder-active-file-coding-system)
@@ -515,15 +517,13 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
   (save-excursion
     (set-buffer buffer)
     (goto-char (point-min))
-    (let (xfrom)
-      (while (re-search-forward "^X-From-Line: \\(.*\\)$" nil t)
-       (setq xfrom (match-string 1))
-       (gnus-delete-line))
-      (goto-char (point-min))
-      (if xfrom
-         (insert "From " xfrom "\n")
-       (unless (looking-at "From ")
-         (insert "From nobody " (current-time-string) "\n"))))
+    (if (not (looking-at "X-From-Line: "))
+       (insert "From nobody " (current-time-string) "\n")
+      (replace-match "From ")
+      (forward-line 1)
+      (while (looking-at "[ \t]")
+       (delete-char -1)
+       (forward-line 1)))
     (nnfolder-normalize-buffer)
     (set-buffer nnfolder-current-buffer)
     (goto-char (point-min))
@@ -549,12 +549,12 @@ the group.  Then the marks file will be regenerated properly by Gnus.")
   (if (not force)
       ()                               ; Don't delete the articles.
     ;; Delete the file that holds the group.
-    (ignore-errors
-      (delete-file (nnfolder-group-pathname group))
-      (when (file-exists-p (nnfolder-group-nov-pathname group))
-       (delete-file (nnfolder-group-nov-pathname group)))
-      (when (file-exists-p (nnfolder-group-marks-pathname group))
-       (delete-file (nnfolder-group-marks-pathname group)))))
+    (let ((data (nnfolder-group-pathname group))
+         (nov (nnfolder-group-nov-pathname group))
+         (mrk (nnfolder-group-marks-pathname group)))
+      (ignore-errors (delete-file data))
+      (ignore-errors (delete-file nov))
+      (ignore-errors (delete-file mrk))))
   ;; Remove the group from all structures.
   (setq nnfolder-group-alist
        (delq (assoc group nnfolder-group-alist) nnfolder-group-alist)
@@ -714,7 +714,8 @@ deleted.  Point is left where the deleted region was."
                (let ((nnmail-file-coding-system
                       (or nnfolder-file-coding-system-for-write
                           nnfolder-file-coding-system-for-write)))
-                 (nnmail-write-region 1 1 file t 'nomesg)))
+                 (nnmail-write-region (point-min) (point-min)
+                                      file t 'nomesg)))
              (when (setq nnfolder-current-buffer (nnfolder-read-folder group))
                (set-buffer nnfolder-current-buffer)
                (push (list group nnfolder-current-buffer)
@@ -1235,7 +1236,8 @@ This command does not work if you use short group names."
        (push (cons 'read (gnus-info-read info)) nnfolder-marks)
        (dolist (el gnus-article-unpropagated-mark-lists)
          (setq nnfolder-marks (gnus-remassoc el nnfolder-marks)))
-       (nnfolder-save-marks group server)))))
+       (nnfolder-save-marks group server)
+       (nnheader-message 7 "Bootstrapping marks for %s...done" group)))))
 
 (provide 'nnfolder)
 
index 140ab7b..b6ca95c 100644 (file)
@@ -1,7 +1,7 @@
 ;;; nnheader.el --- header access macros for Semi-gnus and its backends
 
 ;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996,
-;;        1997, 1998, 2000, 2001
+;;        1997, 1998, 2000, 2001, 2002
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
@@ -49,7 +49,8 @@
 (eval-and-compile
   (autoload 'gnus-sorted-intersection "gnus-range")
   (autoload 'gnus-intersection "gnus-range")
-  (autoload 'gnus-sorted-complement "gnus-range"))
+  (autoload 'gnus-sorted-complement "gnus-range")
+  (autoload 'gnus-sorted-difference "gnus-range"))
 
 (defcustom gnus-verbose-backends 7
   "Integer that says how verbose the Gnus backends should be.
@@ -96,6 +97,18 @@ This variable is a substitute for `mm-text-coding-system'.")
   "Text coding system for write.
 This variable is a substitute for `mm-text-coding-system-for-write'.")
 
+(defvar nnheader-auto-save-coding-system
+  (cond
+   ((boundp 'MULE) '*junet*)
+   ((not (fboundp 'find-coding-system)) nil)
+   ((find-coding-system 'emacs-mule)
+    (if (memq system-type '(windows-nt ms-dos ms-windows))
+       'emacs-mule-dos 'emacs-mule))
+   ((find-coding-system 'escape-quoted) 'escape-quoted)
+   ((find-coding-system 'no-conversion) 'no-conversion)
+   (t nil))
+  "Coding system of auto save file.")
+
 (eval-and-compile
   (autoload 'nnmail-message-id "nnmail")
   (autoload 'mail-position-on-field "sendmail")
@@ -103,6 +116,348 @@ This variable is a substitute for `mm-text-coding-system-for-write'.")
   (autoload 'gnus-point-at-eol "gnus-util")
   (autoload 'gnus-buffer-live-p "gnus-util"))
 
+;; mm-util stuff.
+(unless (featurep 'mm-util)
+  ;; Should keep track of `mm-image-load-path' in mm-util.el.
+  (defun nnheader-image-load-path (&optional package)
+    (let (dir result)
+      (dolist (path load-path (nreverse result))
+       (if (file-directory-p
+            (setq dir (concat (file-name-directory
+                               (directory-file-name path))
+                              "etc/" (or package "gnus/"))))
+           (push dir result))
+       (push path result))))
+  (defalias 'mm-image-load-path 'nnheader-image-load-path)
+
+  ;; Should keep track of `mm-read-coding-system' in mm-util.el.
+  (defalias 'mm-read-coding-system
+    (if (or (and (featurep 'xemacs)
+                (<= (string-to-number emacs-version) 21.1))
+           (boundp 'MULE))
+       (lambda (prompt &optional default-coding-system)
+         (read-coding-system prompt))
+      'read-coding-system))
+
+  ;; Should keep track of `mm-%s' in mm-util.el.
+  (defalias 'mm-multibyte-string-p
+    (if (fboundp 'multibyte-string-p)
+       'multibyte-string-p
+      'ignore))
+  (defalias 'mm-encode-coding-string 'encode-coding-string)
+  (defalias 'mm-decode-coding-string 'decode-coding-string)
+
+  ;; Should keep track of `mm-detect-coding-region' in mm-util.el.
+  (defun nnheader-detect-coding-region (start end)
+    "Like 'detect-coding-region' except returning the best one."
+    (let ((coding-systems
+          (static-if (boundp 'MULE)
+              (code-detect-region (point) (point-max))
+            (detect-coding-region (point) (point-max)))))
+      (or (car-safe coding-systems)
+         coding-systems)))
+  (defalias 'mm-detect-coding-region 'nnheader-detect-coding-region)
+
+  ;; Should keep track of `mm-detect-mime-charset-region' in mm-util.el.
+  (defun nnheader-detect-mime-charset-region (start end)
+    "Detect MIME charset of the text in the region between START and END."
+    (coding-system-to-mime-charset
+     (nnheader-detect-coding-region start end)))
+  (defalias 'mm-detect-mime-charset-region
+    'nnheader-detect-mime-charset-region)
+
+  ;; Should keep track of `mm-with-unibyte-buffer' in mm-util.el.
+  (defmacro nnheader-with-unibyte-buffer (&rest forms)
+  "Create a temporary buffer, and evaluate FORMS there like `progn'.
+Use unibyte mode for this."
+  `(let (default-enable-multibyte-characters default-mc-flag)
+     (with-temp-buffer ,@forms)))
+  (put 'nnheader-with-unibyte-buffer 'lisp-indent-function 0)
+  (put 'nnheader-with-unibyte-buffer 'edebug-form-spec '(body))
+  (put 'mm-with-unibyte-buffer 'lisp-indent-function 0)
+  (put 'mm-with-unibyte-buffer 'edebug-form-spec '(body))
+  (defalias 'mm-with-unibyte-buffer 'nnheader-with-unibyte-buffer)
+
+  ;; Should keep track of `mm-with-unibyte-current-buffer' in mm-util.el.
+  (defmacro nnheader-with-unibyte-current-buffer (&rest forms)
+    "Evaluate FORMS with current current buffer temporarily made unibyte.
+Also bind `default-enable-multibyte-characters' to nil.
+Equivalent to `progn' in XEmacs"
+    (let ((multibyte (make-symbol "multibyte"))
+         (buffer (make-symbol "buffer")))
+      (cond ((featurep 'xemacs)
+            `(let (default-enable-multibyte-characters)
+               ,@forms))
+           ((boundp 'MULE)
+            `(let ((,multibyte mc-flag)
+                   (,buffer (current-buffer)))
+               (unwind-protect
+                   (let (default-enable-multibyte-characters default-mc-flag)
+                     (setq mc-flag nil)
+                     ,@forms)
+                 (set-buffer ,buffer)
+                 (setq mc-flag ,multibyte))))
+           (t
+            `(let ((,multibyte enable-multibyte-characters)
+                   (,buffer (current-buffer)))
+               (unwind-protect
+                   (let (default-enable-multibyte-characters)
+                     (set-buffer-multibyte nil)
+                     ,@forms)
+                 (set-buffer ,buffer)
+                 (set-buffer-multibyte ,multibyte)))))))
+  (put 'nnheader-with-unibyte-current-buffer 'lisp-indent-function 0)
+  (put 'nnheader-with-unibyte-current-buffer 'edebug-form-spec '(body))
+  (put 'mm-with-unibyte-current-buffer 'lisp-indent-function 0)
+  (put 'mm-with-unibyte-current-buffer 'edebug-form-spec '(body))
+  (defalias 'mm-with-unibyte-current-buffer
+    'nnheader-with-unibyte-current-buffer)
+
+  ;; Should keep track of `mm-with-unibyte' in mm-util.el.
+  (defmacro nnheader-with-unibyte (&rest forms)
+    "Eval the FORMS with the default value of `enable-multibyte-characters'
+nil, ."
+    `(let (default-enable-multibyte-characters)
+       ,@forms))
+  (put 'nnheader-with-unibyte 'lisp-indent-function 0)
+  (put 'nnheader-with-unibyte 'edebug-form-spec '(body))
+  (put 'mm-with-unibyte 'lisp-indent-function 0)
+  (put 'mm-with-unibyte 'edebug-form-spec '(body))
+  (defalias 'mm-with-unibyte 'nnheader-with-unibyte)
+
+  ;; Should keep track of `mm-guess-mime-charset' in mm-util.el.
+  (defun nnheader-guess-mime-charset ()
+  "Guess the default MIME charset from the language environment."
+  (let ((language-info
+        (and (boundp 'current-language-environment)
+             (assoc current-language-environment
+                    language-info-alist)))
+       item)
+    (cond
+     ((null language-info)
+      'iso-8859-1)
+     ((setq item
+           (cadr
+            (or (assq 'coding-priority language-info)
+                (assq 'coding-system language-info))))
+      (if (fboundp 'coding-system-get)
+         (or (coding-system-get item 'mime-charset)
+             item)
+       item))
+     ((setq item (car (last (assq 'charset language-info))))
+      (if (eq item 'ascii)
+         'iso-8859-1
+        (charsets-to-mime-charset (list item))))
+     (t
+      'iso-8859-1))))
+  (defalias 'mm-guess-mime-charset 'nnheader-guess-mime-charset)
+
+  (defalias 'mm-char-int 'char-int)
+
+  ;; Should keep track of the same alias in mm-util.el.
+  (defalias 'mm-multibyte-p
+    (static-cond ((and (featurep 'xemacs) (featurep 'mule))
+                 (lambda nil t))
+                ((featurep 'xemacs)
+                 (lambda nil nil))
+                ((boundp 'MULE)
+                 (lambda nil mc-flag))
+                (t
+                 (lambda nil enable-multibyte-characters))))
+
+  ;; Should keep track of the same alias in mm-util.el.
+  (defalias 'mm-make-temp-file
+    (if (fboundp 'make-temp-file)
+       'make-temp-file
+      (lambda (prefix &optional dir-flag)
+       (let ((file (expand-file-name
+                    (make-temp-name prefix)
+                    (if (fboundp 'temp-directory)
+                        (temp-directory)
+                      temporary-file-directory))))
+         (if dir-flag
+             (make-directory file))
+         file)))))
+
+;; mail-parse stuff.
+(unless (featurep 'mail-parse)
+  ;; Should keep track of `rfc2047-narrow-to-field' in rfc2047.el.
+  (defun-maybe std11-narrow-to-field ()
+    "Narrow the buffer to the header on the current line."
+    (forward-line 0)
+    (narrow-to-region (point)
+                     (progn
+                       (std11-field-end)
+                       (when (eolp) (forward-line 1))
+                       (point)))
+    (goto-char (point-min)))
+  (defalias 'mail-header-narrow-to-field 'std11-narrow-to-field)
+
+  ;; Should keep track of `ietf-drums-narrow-to-header' in ietf-drums.el.
+  (defun mail-narrow-to-head ()
+    "Narrow to the header section in the current buffer."
+    (narrow-to-region
+     (goto-char (point-min))
+     (if (re-search-forward "^\r?$" nil 1)
+        (match-beginning 0)
+       (point-max)))
+    (goto-char (point-min)))
+
+  ;; Should keep track of `rfc2047-fold-region' in rfc2047.el.
+  (defun-maybe std11-fold-region (b e)
+    "Fold long lines in region B to E."
+    (save-restriction
+      (narrow-to-region b e)
+      (goto-char (point-min))
+      (let ((break nil)
+           (qword-break nil)
+           (first t)
+           (bol (save-restriction
+                  (widen)
+                  (gnus-point-at-bol))))
+       (while (not (eobp))
+         (when (and (or break qword-break)
+                    (> (- (point) bol) 76))
+           (goto-char (or break qword-break))
+           (setq break nil
+                 qword-break nil)
+           (if (looking-at "[ \t]")
+               (insert "\n")
+             (insert "\n "))
+           (setq bol (1- (point)))
+           ;; Don't break before the first non-LWSP characters.
+           (skip-chars-forward " \t")
+           (unless (eobp)
+             (forward-char 1)))
+         (cond
+          ((eq (char-after) ?\n)
+           (forward-char 1)
+           (setq bol (point)
+                 break nil
+                 qword-break nil)
+           (skip-chars-forward " \t")
+           (unless (or (eobp) (eq (char-after) ?\n))
+             (forward-char 1)))
+          ((eq (char-after) ?\r)
+           (forward-char 1))
+          ((memq (char-after) '(?  ?\t))
+           (skip-chars-forward " \t")
+           (if first
+               ;; Don't break just after the header name.
+               (setq first nil)
+             (setq break (1- (point)))))
+          ((not break)
+           (if (not (looking-at "=\\?[^=]"))
+               (if (eq (char-after) ?=)
+                   (forward-char 1)
+                 (skip-chars-forward "^ \t\n\r="))
+             (setq qword-break (point))
+             (skip-chars-forward "^ \t\n\r")))
+          (t
+           (skip-chars-forward "^ \t\n\r"))))
+       (when (and (or break qword-break)
+                  (> (- (point) bol) 76))
+         (goto-char (or break qword-break))
+         (setq break nil
+               qword-break nil)
+         (if (looking-at "[ \t]")
+             (insert "\n")
+           (insert "\n "))
+         (setq bol (1- (point)))
+         ;; Don't break before the first non-LWSP characters.
+         (skip-chars-forward " \t")
+         (unless (eobp)
+           (forward-char 1))))))
+
+  ;; Should keep track of `rfc2047-fold-field' in rfc2047.el.
+  (defun-maybe std11-fold-field ()
+    "Fold the current line."
+    (save-excursion
+      (save-restriction
+       (std11-narrow-to-field)
+       (std11-fold-region (point-min) (point-max)))))
+
+  (defalias 'mail-header-fold-field 'std11-fold-field)
+
+  ;; Should keep track of `rfc2047-unfold-region' in rfc2047.el.
+  (defun-maybe std11-unfold-region (b e)
+    "Unfold lines in region B to E."
+    (save-restriction
+      (narrow-to-region b e)
+      (goto-char (point-min))
+      (let ((bol (save-restriction
+                  (widen)
+                  (gnus-point-at-bol)))
+           (eol (gnus-point-at-eol)))
+       (forward-line 1)
+       (while (not (eobp))
+         (if (and (looking-at "[ \t]")
+                  (< (- (gnus-point-at-eol) bol) 76))
+             (delete-region eol (progn
+                                  (goto-char eol)
+                                  (skip-chars-forward "\r\n")
+                                  (point)))
+           (setq bol (gnus-point-at-bol)))
+         (setq eol (gnus-point-at-eol))
+         (forward-line 1)))))
+
+  ;; Should keep track of `rfc2047-unfold-field' in rfc2047.el.
+  (defun-maybe std11-unfold-field ()
+    "Fold the current line."
+    (save-excursion
+      (save-restriction
+       (std11-narrow-to-field)
+       (std11-unfold-region (point-min) (point-max)))))
+
+  (defalias 'mail-header-unfold-field 'std11-unfold-field)
+
+  ;; This is the original function in T-gnus.
+  (defun-maybe std11-extract-addresses-components (string)
+    "Extract a list of full name and canonical address from STRING.  Each
+element looks like a list of the form (FULL-NAME CANONICAL-ADDRESS).
+If no name can be extracted, FULL-NAME will be nil."
+    (when string
+      (let (addresses)
+       (dolist (structure (std11-parse-addresses-string
+                           (std11-unfold-string string))
+                          addresses)
+         (push (list (std11-full-name-string structure)
+                     (std11-address-string structure))
+               addresses))
+       (nreverse addresses))))
+
+  ;; Should keep track of `ietf-drums-parse-addresses' in ietf-drums.el.
+  (defun mail-header-parse-addresses (string)
+    "Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs."
+    (mapcar (function
+            (lambda (components)
+              (cons (nth 1 components) (car components))))
+           (std11-extract-addresses-components string)))
+
+  ;; Should keep track of `rfc2047-field-value' in rfc2047.el.
+  (defun std11-field-value (&optional dont-include-last-newline)
+    "Return the value of the field at point.  If the optional argument is
+given, the return value will not contain the last newline."
+    (let ((begin (point))
+         (inhibit-point-motion-hooks t)
+         start value)
+      (beginning-of-line)
+      (unless (eobp)
+       (while (and (memq (char-after) '(?\t ?\ ))
+                   (zerop (forward-line -1))))
+       (when (looking-at "[^\t\n ]+:[\t\n ]+")
+         (goto-char (setq start (match-end 0)))
+         (forward-line 1)
+         (while (and (memq (char-after) '(?\t ?\ ))
+                     (zerop (forward-line 1))))
+         (when dont-include-last-newline
+           (skip-chars-backward "\t\n " start))
+         (setq value (buffer-substring start (point)))))
+      (goto-char begin)
+      value))
+
+  (defalias 'mail-header-field-value 'std11-field-value))
+
 ;;; Header access macros.
 
 ;; These macros may look very much like the ones in GNUS 4.1.  They
@@ -424,6 +779,22 @@ This variable is a substitute for `mm-text-coding-system-for-write'.")
       (delete-char 1))
     (forward-line 1)))
 
+(defun nnheader-parse-overview-file (file)
+  "Parse FILE and return a list of headers."
+  (mm-with-unibyte-buffer
+    (nnheader-insert-file-contents file)
+    (goto-char (point-min))
+    (let (headers)
+      (while (not (eobp))
+       (push (nnheader-parse-nov) headers)
+       (forward-line 1))
+      (nreverse headers))))
+
+(defun nnheader-write-overview-file (file headers)
+  "Write HEADERS to FILE."
+  (with-temp-file file
+    (mapcar 'nnheader-insert-nov headers)))
+
 (defun nnheader-insert-header (header)
   (insert
    "Subject: " (or (mail-header-subject header) "(none)") "\n"
@@ -1088,6 +1459,25 @@ find-file-hooks, etc.
     (insert-file-contents-as-coding-system
      nnheader-file-coding-system filename visit beg end replace)))
 
+(defun nnheader-insert-nov-file (file first)
+  (let ((size (nth 7 (file-attributes file)))
+       (cutoff (* 32 1024)))
+    (if (< size cutoff)
+       ;; If the file is small, we just load it.
+       (nnheader-insert-file-contents file)
+      ;; We start on the assumption that FIRST is pretty recent.  If
+      ;; not, we just insert the rest of the file as well.
+      (let (current)
+       (nnheader-insert-file-contents file nil (- size cutoff) size)
+       (goto-char (point-min))
+       (delete-region (point) (or (search-forward "\n" nil 'move) (point)))
+       (setq current (ignore-errors (read (current-buffer))))
+       (if (and (numberp current)
+                (< current first))
+           t
+         (delete-region (point-min) (point-max))
+         (nnheader-insert-file-contents file))))))
+
 (defun nnheader-find-file-noselect (&rest args)
   (let ((format-alist nil)
        (auto-mode-alist (nnheader-auto-mode-alist))
@@ -1183,197 +1573,12 @@ find-file-hooks, etc.
       (message "%s(Y/n) Yes" prompt)
       t)))
 
-;; mm- stuff.
-(unless (featurep 'mm-util)
-  (defun nnheader-image-load-path (&optional package)
-    (let (dir result)
-      (dolist (path load-path (nreverse result))
-       (if (file-directory-p
-            (setq dir (concat (file-name-directory
-                               (directory-file-name path))
-                              "etc/" (or package "gnus/"))))
-           (push dir result))
-       (push path result))))
-  (defalias 'mm-image-load-path 'nnheader-image-load-path)
-
-  (defalias 'mm-read-coding-system
-    (if (or (and (featurep 'xemacs)
-                (<= (string-to-number emacs-version) 21.1))
-           (boundp 'MULE))
-       (lambda (prompt &optional default-coding-system)
-         (read-coding-system prompt))
-      'read-coding-system))
-
-  (defalias 'mm-multibyte-string-p
-    (if (fboundp 'multibyte-string-p)
-       'multibyte-string-p
-      'ignore))
-
-  (defun nnheader-detect-coding-region (start end)
-    "Like 'detect-coding-region' except returning the best one."
-    (let ((coding-systems
-          (static-if (boundp 'MULE)
-              (code-detect-region (point) (point-max))
-            (detect-coding-region (point) (point-max)))))
-      (or (car-safe coding-systems)
-         coding-systems)))
-  (defalias 'mm-detect-coding-region 'nnheader-detect-coding-region)
-
-  (defun nnheader-detect-mime-charset-region (start end)
-    "Detect MIME charset of the text in the region between START and END."
-    (coding-system-to-mime-charset
-     (nnheader-detect-coding-region start end)))
-  (defalias 'mm-detect-mime-charset-region
-    'nnheader-detect-mime-charset-region)
-
-  (defmacro nnheader-with-unibyte-buffer (&rest forms)
-  "Create a temporary buffer, and evaluate FORMS there like `progn'.
-Use unibyte mode for this."
-  `(let (default-enable-multibyte-characters mc-flag)
-     (with-temp-buffer ,@forms)))
-  (put 'nnheader-with-unibyte-buffer 'lisp-indent-function 0)
-  (put 'nnheader-with-unibyte-buffer 'edebug-form-spec '(body))
-  (put 'mm-with-unibyte-buffer 'lisp-indent-function 0)
-  (put 'mm-with-unibyte-buffer 'edebug-form-spec '(body))
-  (defalias 'mm-with-unibyte-buffer 'nnheader-with-unibyte-buffer))
-
-;; mail-parse stuff.
-(unless (featurep 'mail-parse)
-  (defun-maybe std11-narrow-to-field ()
-    "Narrow the buffer to the header on the current line."
-    (forward-line 0)
-    (narrow-to-region (point)
-                     (progn
-                       (std11-field-end)
-                       (when (eolp) (forward-line 1))
-                       (point)))
-    (goto-char (point-min)))
-
-  (defalias 'mail-header-narrow-to-field 'std11-narrow-to-field)
-
-  (defun mail-narrow-to-head ()
-    "Narrow to the header section in the current buffer."
-    (narrow-to-region
-     (goto-char (point-min))
-     (if (re-search-forward "^\r?$" nil 1)
-        (match-beginning 0)
-       (point-max)))
-    (goto-char (point-min)))
-
-  (defun-maybe std11-fold-region (b e)
-    "Fold long lines in region B to E."
-    (save-restriction
-      (narrow-to-region b e)
-      (goto-char (point-min))
-      (let ((break nil)
-           (qword-break nil)
-           (first t)
-           (bol (save-restriction
-                  (widen)
-                  (gnus-point-at-bol))))
-       (while (not (eobp))
-         (when (and (or break qword-break)
-                    (> (- (point) bol) 76))
-           (goto-char (or break qword-break))
-           (setq break nil
-                 qword-break nil)
-           (if (looking-at "[ \t]")
-               (insert "\n")
-             (insert "\n "))
-           (setq bol (1- (point)))
-           ;; Don't break before the first non-LWSP characters.
-           (skip-chars-forward " \t")
-           (unless (eobp)
-             (forward-char 1)))
-         (cond
-          ((eq (char-after) ?\n)
-           (forward-char 1)
-           (setq bol (point)
-                 break nil
-                 qword-break nil)
-           (skip-chars-forward " \t")
-           (unless (or (eobp) (eq (char-after) ?\n))
-             (forward-char 1)))
-          ((eq (char-after) ?\r)
-           (forward-char 1))
-          ((memq (char-after) '(?  ?\t))
-           (skip-chars-forward " \t")
-           (if first
-               ;; Don't break just after the header name.
-               (setq first nil)
-             (setq break (1- (point)))))
-          ((not break)
-           (if (not (looking-at "=\\?[^=]"))
-               (if (eq (char-after) ?=)
-                   (forward-char 1)
-                 (skip-chars-forward "^ \t\n\r="))
-             (setq qword-break (point))
-             (skip-chars-forward "^ \t\n\r")))
-          (t
-           (skip-chars-forward "^ \t\n\r"))))
-       (when (and (or break qword-break)
-                  (> (- (point) bol) 76))
-         (goto-char (or break qword-break))
-         (setq break nil
-               qword-break nil)
-         (if (looking-at "[ \t]")
-             (insert "\n")
-           (insert "\n "))
-         (setq bol (1- (point)))
-         ;; Don't break before the first non-LWSP characters.
-         (skip-chars-forward " \t")
-         (unless (eobp)
-           (forward-char 1))))))
-
-  (defun-maybe std11-fold-field ()
-    "Fold the current line."
-    (save-excursion
-      (save-restriction
-       (std11-narrow-to-field)
-       (std11-fold-region (point-min) (point-max)))))
-
-  (defalias 'mail-header-fold-field 'std11-fold-field)
-
-  (defun-maybe std11-extract-addresses-components (string)
-    "Extract a list of full name and canonical address from STRING.  Each
-element looks like a list of the form (FULL-NAME CANONICAL-ADDRESS).
-If no name can be extracted, FULL-NAME will be nil."
-    (when string
-      (mapcar (function
-              (lambda (structure)
-                (list (std11-full-name-string structure)
-                      (std11-address-string structure))))
-             (std11-parse-addresses-string (std11-unfold-string string)))))
-
-  (defun mail-header-parse-addresses (string)
-    "Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs."
-    (mapcar (function
-            (lambda (components)
-              (cons (nth 1 components) (car components))))
-           (std11-extract-addresses-components string)))
-
-  (defun-maybe std11-field-value (&optional dont-include-last-newline)
-    "Return the value of the field at point.  If the optional argument is
-given, the return value will not contain the last newline."
-    (let ((begin (point))
-         (inhibit-point-motion-hooks t)
-         start value)
-      (beginning-of-line)
-      (unless (eobp)
-       (while (and (memq (char-after) '(?\t ?\ ))
-                   (zerop (forward-line -1))))
-       (when (looking-at "[^\t\n ]+:[\t\n ]+")
-         (goto-char (setq start (match-end 0)))
-         (forward-line 1)
-         (while (and (memq (char-after) '(?\t ?\ ))
-                     (zerop (forward-line 1))))
-         (when dont-include-last-newline
-           (skip-chars-backward "\t\n " start))
-         (setq value (buffer-substring start (point)))))
-      (goto-char begin)
-      value))
-
-  (defalias 'mail-header-field-value 'std11-field-value))
+(defun-maybe shell-command-to-string (command)
+  "Execute shell command COMMAND and return its output as a string."
+  (with-output-to-string
+    (with-current-buffer
+       standard-output
+      (call-process shell-file-name nil t nil shell-command-switch command))))
 
 (when (featurep 'xemacs)
   (require 'nnheaderxm))
index be9f8cc..3f39bb1 100644 (file)
@@ -192,7 +192,7 @@ RFC2060 section 6.4.4."
   :type 'string)
 
 (defcustom nnimap-split-fancy nil
-  "Like `nnmail-split-fancy', which see."
+  "Like the variable `nnmail-split-fancy', which see."
   :group 'nnimap
   :type 'sexp)
 
@@ -214,6 +214,18 @@ the same mailbox will be faster though."
   :type 'boolean
   :group 'nnimap)
 
+(defcustom nnimap-retrieve-groups-asynchronous t
+  "Send asynchronous STATUS commands for each mailbox before checking mail.
+If you have mailboxes that rarely receives mail, this speeds up new
+mail checking.  It works by first sending STATUS commands for each
+mailbox, and then only checking groups which has a modified UIDNEXT
+more carefully for new mail.
+
+In summary, the default is O((1-p)*k+p*n) and changing it to nil makes
+it O(n).  If p is small, then the default is probably faster."
+  :type 'boolean
+  :group 'nnimap)
+
 (defvoo nnimap-need-unselect-to-notice-new-mail nil
   "Unselect mailboxes before looking for new mail in them.
 Some servers seem to need this under some circumstances.")
@@ -367,6 +379,7 @@ restrict visible folders.")
 
 ;; Internal variables:
 
+(defvoo nnimap-mailbox-info (gnus-make-hashtable 997))
 (defvar nnimap-debug nil
   "Name of buffer to record debugging info.
 For example: (setq nnimap-debug \"*nnimap-debug*\")")
@@ -671,8 +684,8 @@ If EXAMINE is non-nil the group is selected read-only."
               (cons low high) group server))
            (when (buffer-modified-p)
              (nnmail-write-region
-              1 (point-max) (nnimap-group-overview-filename group server)
-              nil 'nomesg))
+              (point-min) (point-max)
+              (nnimap-group-overview-filename group server) nil 'nomesg))
            (nnheader-nov-delete-outside-range low high))))
       'nov)))
 
@@ -928,24 +941,74 @@ function is generally only called when Gnus is shutting down."
 
 ;; Optional backend functions
 
+(defun nnimap-string-lessp-numerical (s1 s2)
+  "Return t if first arg string is less than second in numerical order."
+  (cond ((string= s1 s2)
+        nil)
+       ((> (length s1) (length s2))
+        nil)
+       ((< (length s1) (length s2))
+        t)
+       ((< (string-to-number (substring s1 0 1))
+           (string-to-number (substring s2 0 1)))
+        t)
+       ((> (string-to-number (substring s1 0 1))
+           (string-to-number (substring s2 0 1)))
+        nil)
+       (t
+        (nnimap-string-lessp-numerical (substring s1 1) (substring s2 1)))))
+
 (deffoo nnimap-retrieve-groups (groups &optional server)
   (when (nnimap-possibly-change-server server)
     (gnus-message 5 "nnimap: Checking mailboxes...")
     (with-current-buffer nntp-server-buffer
       (erase-buffer)
       (nnimap-before-find-minmax-bugworkaround)
-      (dolist (group groups)
-       (gnus-message 7 "nnimap: Checking mailbox %s" group)
-       (or (member "\\NoSelect"
-                   (imap-mailbox-get 'list-flags group nnimap-server-buffer))
-           (let ((info (nnimap-find-minmax-uid group 'examine)))
-             (when (> (or (imap-mailbox-get 'recent group
-                                            nnimap-server-buffer) 0)
-                      0)
-               (push (list (cons group 0)) nnmail-split-history))
-             (insert (format "\"%s\" %d %d y\n" group
-                             (or (nth 2 info) 0)
-                             (max 1 (or (nth 1 info) 1))))))))
+      (let (asyncgroups slowgroups)
+       (if (null nnimap-retrieve-groups-asynchronous)
+           (setq slowgroups groups)
+         (dolist (group groups)
+           (gnus-message 7 "nnimap: Checking mailbox %s" group)
+           (add-to-list (if (gnus-gethash-safe group nnimap-mailbox-info)
+                            'asyncgroups
+                          'slowgroups)
+                        (list group (imap-mailbox-status-asynch
+                                     group 'uidnext nnimap-server-buffer))))
+         (dolist (asyncgroup asyncgroups)
+           (let ((group (nth 0 asyncgroup))
+                 (tag   (nth 1 asyncgroup))
+                 new old)
+             (when (imap-ok-p (imap-wait-for-tag tag nnimap-server-buffer))
+               (if (nnimap-string-lessp-numerical
+                    (car (gnus-gethash group nnimap-mailbox-info))
+                    (imap-mailbox-get 'uidnext group nnimap-server-buffer))
+                   (push (list group) slowgroups)
+                 (insert (cdr (gnus-gethash group nnimap-mailbox-info))))))))
+       (dolist (group slowgroups)
+         (if nnimap-retrieve-groups-asynchronous
+             (setq group (car group)))
+         (gnus-message 7 "nnimap: Rechecking mailbox %s" group)
+         (imap-mailbox-put 'uidnext nil group nnimap-server-buffer)
+         (or (member "\\NoSelect" (imap-mailbox-get 'list-flags group
+                                                    nnimap-server-buffer))
+             (let* ((info (nnimap-find-minmax-uid group 'examine))
+                    (str (format "\"%s\" %d %d y\n" group
+                                 (or (nth 2 info) 0)
+                                 (max 1 (or (nth 1 info) 1)))))
+               (when (> (or (imap-mailbox-get 'recent group
+                                              nnimap-server-buffer) 0)
+                        0)
+                 (push (list (cons group 0)) nnmail-split-history))
+               (insert str)
+               (when nnimap-retrieve-groups-asynchronous
+                 (gnus-sethash
+                  group
+                  (cons (or (imap-mailbox-get
+                             'uidnext group nnimap-server-buffer)
+                            (imap-mailbox-status
+                             group 'uidnext nnimap-server-buffer))
+                        str)
+                  nnimap-mailbox-info)))))))
     (gnus-message 5 "nnimap: Checking mailboxes...done")
     'active))
 
@@ -1065,7 +1128,7 @@ function is generally only called when Gnus is shutting down."
   nil)
 
 (defun nnimap-split-fancy ()
-  "Like nnmail-split-fancy, but uses nnimap-split-fancy."
+  "Like the function `nnmail-split-fancy', but uses `nnimap-split-fancy'."
   (let ((nnmail-split-fancy nnimap-split-fancy))
     (nnmail-split-fancy)))
 
@@ -1144,6 +1207,10 @@ function is generally only called when Gnus is shutting down."
                         (message "IMAP split moved %s:%s:%d to %s" server
                                  inbox article to-group)
                         (setq removeorig t)
+                        (when nnmail-cache-accepted-message-ids
+                          (with-current-buffer nntp-server-buffer
+                            (nnmail-cache-insert (nnmail-fetch-field
+                                                  "message-id") to-group)))
                         ;; Add the group-art list to the history list.
                         (push (list (cons to-group 0)) nnmail-split-history))
                        (t
@@ -1157,6 +1224,8 @@ function is generally only called when Gnus is shutting down."
            ;; todo: UID EXPUNGE (if available) to remove splitted articles
            (imap-mailbox-expunge)
            (imap-mailbox-close)))
+       (when nnmail-cache-accepted-message-ids
+         (nnmail-cache-close))
        t))))
 
 (deffoo nnimap-request-scan (&optional group server)
@@ -1217,7 +1286,6 @@ function is generally only called when Gnus is shutting down."
   (gnus-message 5 "nnimap: Marking article %d for deletion..."
                imap-current-message))
 
-
 (defun nnimap-expiry-target (arts group server)
   (unless (eq nnmail-expiry-target 'delete)
     (with-temp-buffer
@@ -1311,7 +1379,11 @@ function is generally only called when Gnus is shutting down."
                      (kill-region (point) (progn (forward-line) (point))))
                    ;; turn into rfc822 format (\r\n eol's)
                    (while (search-forward "\n" nil t)
-                     (replace-match "\r\n")))
+                     (replace-match "\r\n"))
+                   (when nnmail-cache-accepted-message-ids
+                     (nnmail-cache-insert (nnmail-fetch-field "message-id"))))
+                 (when (and last nnmail-cache-accepted-message-ids)
+                   (nnmail-cache-close))
                  ;; this 'or' is for Cyrus server bug
                  (or (null (imap-current-mailbox nnimap-server-buffer))
                      (imap-mailbox-unselect nnimap-server-buffer))
index 6d347d5..7006fe7 100644 (file)
@@ -461,6 +461,11 @@ that it is for EWS, not Glimpse."
   :type '(regexp)
   :group 'nnir)
 
+(defcustom nnir-imap-default-charset nil
+  "*Name of the charset of the strings that appear in the search criteria."
+  :type '(choice (const nil) symbol)
+  :group 'nnir)
+
 ;; Swish++.  Next three variables Copyright (C) 2000, 2001 Christoph
 ;; Conrad <christoph.conrad@gmx.de>.
 ;; Swish++ home page: http://homepage.mac.com/pauljlucas/software/swish/
@@ -968,6 +973,7 @@ pairs (also vectors, actually)."
 (defun nnir-run-imap (query &optional group)
   (require 'imap)
   (require 'nnimap)
+  (require 'mm-util)
   (unless group
     (error "Must specify groups for IMAP searching."))
   (save-excursion
@@ -981,13 +987,30 @@ pairs (also vectors, actually)."
            (setq buf nnimap-server-buffer) ;; xxx
            (message "Searching %s..." group)
             (let ((arts 0)
-                  (mbx (gnus-group-real-name group)))
+                  (mbx (gnus-group-real-name group))
+                 (multibyte-p (mm-multibyte-p))
+                 charset coding-system)
               (when (imap-mailbox-select mbx nil buf)
+               (with-temp-buffer
+                 (if multibyte-p
+                     (mm-enable-multibyte))
+                 (insert qstring)
+                 (setq charset (car (mm-find-mime-charset-region
+                                     (point-min)(point-max)))))
+               (unless charset
+                 (setq charset nnir-imap-default-charset))
                 (mapcar
                  (lambda (artnum)
                    (push (vector mbx artnum 1) artlist)
                    (setq arts (1+ arts)))
-                 (imap-search (concat "TEXT \"" qstring "\"") buf))
+                (if (and (not (eq charset 'us-ascii))
+                         (setq coding-system (mm-charset-to-coding-system
+                                              charset)))
+                    (imap-search
+                     (concat "CHARSET " (symbol-name charset) " TEXT \""
+                             (mm-encode-coding-string qstring coding-system)
+                             "\"") buf)
+                  (imap-search (concat "TEXT \"" qstring "\"") buf)))
                 (message "Searching %s... %d matches" mbx arts)))
             (message "Searching %s...done" group))
         (quit nil))
@@ -1219,11 +1242,7 @@ Tested with Namazu 2.0.6 on a GNU/Linux system."
              (exitstatus
              (let ((process-environment (copy-sequence process-environment)))
                ;; Disable locale.
-               (dolist (env process-environment)
-                 (when (string-match "\
-\\`\\(L\\(ANG\\|C_\\(ALL\\|CTYPE\\|COLLATE\\|TIME\\|NUMERIC\\|MONETARY\\|MESSAGES\\)\\)\\)=" env)
-                   (setenv (match-string 1 env) nil)))
-               (setenv "LANG" "C")
+               (setenv "LC_ALL" "C")
                 (message "%s args: %s" nnir-namazu-program
                          (mapconcat 'identity (cddddr cp-list) " "))
                (apply 'call-process cp-list))))
index b610abe..eb524c7 100644 (file)
@@ -1,6 +1,6 @@
 ;;; nnkiboze.el --- select virtual news access for Gnus
 
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002
 ;;     Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
          (gnus-request-article num group buffer)))))
 
 (deffoo nnkiboze-request-scan (&optional group server)
+  (nnkiboze-possibly-change-group group)
   (nnkiboze-generate-group (concat "nnkiboze:" group)))
 
 (deffoo nnkiboze-request-group (group &optional server dont-check)
@@ -251,109 +252,111 @@ Finds out what articles are to be part of the nnkiboze groups."
     (unless info
       (error "No such group: %s" group))
     ;; Load the kiboze newsrc file for this group.
-    (when (file-exists-p newsrc-file)
-      (load newsrc-file))
-    (let ((coding-system-for-write nnkiboze-file-coding-system)
-         (output-coding-system nnkiboze-file-coding-system))
-      (gnus-make-directory (file-name-directory nov-file))
-      (with-temp-file nov-file
-       (when (file-exists-p nov-file)
-         (nnheader-insert-file-contents nov-file))
-       (setq nov-buffer (current-buffer))
-       ;; Go through the active hashtb and add new all groups that match the
-       ;; kiboze regexp.
-       (mapatoms
-        (lambda (group)
-          (and (string-match nnkiboze-regexp
-                             (setq gname (symbol-name group))) ; Match
-               (not (assoc gname nnkiboze-newsrc)) ; It isn't registered
-               (numberp (car (symbol-value group))) ; It is active
-               (or (> nnkiboze-level 7)
-                   (and (setq glevel (nth 1 (nth 2 (gnus-gethash
-                                                    gname gnus-newsrc-hashtb))))
-                        (>= nnkiboze-level glevel)))
-               (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes
-               (push (cons gname (1- (car (symbol-value group))))
-                     nnkiboze-newsrc)))
-        gnus-active-hashtb)
-       ;; `newsrc' is set to the list of groups that possibly are
-       ;; component groups to this kiboze group.  This list has elements
-       ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest
-       ;; number that has been kibozed in GROUP in this kiboze group.
-       (setq newsrc nnkiboze-newsrc)
-       (while newsrc
-         (if (not (setq active (gnus-gethash
-                                (caar newsrc) gnus-active-hashtb)))
-             ;; This group isn't active after all, so we remove it from
-             ;; the list of component groups.
-             (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc))
-           (setq lowest (cdar newsrc))
-           ;; Ok, we have a valid component group, so we jump to it.
-           (switch-to-buffer gnus-group-buffer)
-           (gnus-group-jump-to-group (caar newsrc))
-           (gnus-message 3 "nnkiboze: Checking %s..." (caar newsrc))
-           (setq ginfo (gnus-get-info (gnus-group-group-name))
-                 orig-info (gnus-copy-sequence ginfo)
-                 num-unread (car (gnus-gethash (caar newsrc)
-                                               gnus-newsrc-hashtb)))
-           (unwind-protect
-               (progn
-                 ;; We set all list of article marks to nil.  Since we operate
-                 ;; on copies of the real lists, we can destroy anything we
-                 ;; want here.
-                 (when (nth 3 ginfo)
-                   (setcar (nthcdr 3 ginfo) nil))
-                 ;; We set the list of read articles to be what we expect for
-                 ;; this kiboze group -- either nil or `(1 . LOWEST)'.
-                 (when ginfo
-                   (setcar (nthcdr 2 ginfo)
-                           (and (not (= lowest 1)) (cons 1 lowest))))
-                 (when (and (or (not ginfo)
-                                (> (length (gnus-list-of-unread-articles
-                                            (car ginfo)))
-                                   0))
-                            (progn
-                              (ignore-errors
-                                (gnus-group-select-group nil))
-                              (eq major-mode 'gnus-summary-mode)))
-                   ;; We are now in the group where we want to be.
-                   (setq method (gnus-find-method-for-group
-                                 gnus-newsgroup-name))
-                   (when (eq method gnus-select-method)
-                     (setq method nil))
-                   ;; We go through the list of scored articles.
-                   (while gnus-newsgroup-scored
-                     (when (> (caar gnus-newsgroup-scored) lowest)
-                       ;; If it has a good score, then we enter this article
-                       ;; into the kiboze group.
-                       (nnkiboze-enter-nov
-                        nov-buffer
-                        (gnus-summary-article-header
-                         (caar gnus-newsgroup-scored))
-                        gnus-newsgroup-name))
-                     (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored)))
-                   ;; That's it.  We exit this group.
-                   (when (eq major-mode 'gnus-summary-mode)
-                     (kill-buffer (current-buffer)))))
-             ;; Restore the proper info.
-             (when ginfo
-               (setcdr ginfo (cdr orig-info)))
-             (setcar (gnus-gethash (caar newsrc) gnus-newsrc-hashtb)
-                     num-unread)))
-         (setcdr (car newsrc) (car active))
-         (gnus-message 3 "nnkiboze: Checking %s...done" (caar newsrc))
-         (setq newsrc (cdr newsrc)))))
-    ;; We save the kiboze newsrc for this group.
-    (gnus-make-directory (file-name-directory newsrc-file))
-    (with-temp-file newsrc-file
-      (insert "(setq nnkiboze-newsrc '")
-      (gnus-prin1 nnkiboze-newsrc)
-      (insert ")\n")))
-  (unless inhibit-list-groups
-    (save-excursion
-      (set-buffer gnus-group-buffer)
-      (gnus-group-list-groups)))
-  t)
+    (mm-with-unibyte
+     (when (file-exists-p newsrc-file)
+       (load newsrc-file))
+     (let ((coding-system-for-write nnkiboze-file-coding-system)
+          (output-coding-system nnkiboze-file-coding-system))
+       (gnus-make-directory (file-name-directory nov-file))
+       (with-temp-file nov-file
+        (when (file-exists-p nov-file)
+          (nnheader-insert-file-contents nov-file))
+        (setq nov-buffer (current-buffer))
+        ;; Go through the active hashtb and add new all groups that match the
+        ;; kiboze regexp.
+        (mapatoms
+         (lambda (group)
+           (and (string-match nnkiboze-regexp
+                              (setq gname (symbol-name group))) ; Match
+                (not (assoc gname nnkiboze-newsrc)) ; It isn't registered
+                (numberp (car (symbol-value group))) ; It is active
+                (or (> nnkiboze-level 7)
+                    (and (setq glevel
+                               (nth 1 (nth 2 (gnus-gethash
+                                              gname gnus-newsrc-hashtb))))
+                         (>= nnkiboze-level glevel)))
+                (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes
+                (push (cons gname (1- (car (symbol-value group))))
+                      nnkiboze-newsrc)))
+         gnus-active-hashtb)
+        ;; `newsrc' is set to the list of groups that possibly are
+        ;; component groups to this kiboze group.  This list has elements
+        ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest
+        ;; number that has been kibozed in GROUP in this kiboze group.
+        (setq newsrc nnkiboze-newsrc)
+        (while newsrc
+          (if (not (setq active (gnus-gethash
+                                 (caar newsrc) gnus-active-hashtb)))
+              ;; This group isn't active after all, so we remove it from
+              ;; the list of component groups.
+              (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc))
+            (setq lowest (cdar newsrc))
+            ;; Ok, we have a valid component group, so we jump to it.
+            (switch-to-buffer gnus-group-buffer)
+            (gnus-group-jump-to-group (caar newsrc))
+            (gnus-message 3 "nnkiboze: Checking %s..." (caar newsrc))
+            (setq ginfo (gnus-get-info (gnus-group-group-name))
+                  orig-info (gnus-copy-sequence ginfo)
+                  num-unread (car (gnus-gethash (caar newsrc)
+                                                gnus-newsrc-hashtb)))
+            (unwind-protect
+                (progn
+                  ;; We set all list of article marks to nil.  Since we operate
+                  ;; on copies of the real lists, we can destroy anything we
+                  ;; want here.
+                  (when (nth 3 ginfo)
+                    (setcar (nthcdr 3 ginfo) nil))
+                  ;; We set the list of read articles to be what we expect for
+                  ;; this kiboze group -- either nil or `(1 . LOWEST)'.
+                  (when ginfo
+                    (setcar (nthcdr 2 ginfo)
+                            (and (not (= lowest 1)) (cons 1 lowest))))
+                  (when (and (or (not ginfo)
+                                 (> (length (gnus-list-of-unread-articles
+                                             (car ginfo)))
+                                    0))
+                             (progn
+                               (ignore-errors
+                                 (gnus-group-select-group nil))
+                               (eq major-mode 'gnus-summary-mode)))
+                    ;; We are now in the group where we want to be.
+                    (setq method (gnus-find-method-for-group
+                                  gnus-newsgroup-name))
+                    (when (eq method gnus-select-method)
+                      (setq method nil))
+                    ;; We go through the list of scored articles.
+                    (while gnus-newsgroup-scored
+                      (when (> (caar gnus-newsgroup-scored) lowest)
+                        ;; If it has a good score, then we enter this article
+                        ;; into the kiboze group.
+                        (nnkiboze-enter-nov
+                         nov-buffer
+                         (gnus-summary-article-header
+                          (caar gnus-newsgroup-scored))
+                         gnus-newsgroup-name))
+                      (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored)))
+                    ;; That's it.  We exit this group.
+                    (when (eq major-mode 'gnus-summary-mode)
+                      (kill-buffer (current-buffer)))))
+              ;; Restore the proper info.
+              (when ginfo
+                (setcdr ginfo (cdr orig-info)))
+              (setcar (gnus-gethash (caar newsrc) gnus-newsrc-hashtb)
+                      num-unread)))
+          (setcdr (car newsrc) (cdr active))
+          (gnus-message 3 "nnkiboze: Checking %s...done" (caar newsrc))
+          (setq newsrc (cdr newsrc)))))
+     ;; We save the kiboze newsrc for this group.
+     (gnus-make-directory (file-name-directory newsrc-file))
+     (with-temp-file newsrc-file
+       (insert "(setq nnkiboze-newsrc '")
+       (gnus-prin1 nnkiboze-newsrc)
+       (insert ")\n")))
+    (unless inhibit-list-groups
+      (save-excursion
+       (set-buffer gnus-group-buffer)
+       (gnus-group-list-groups)))
+    t))
 
 (defun nnkiboze-enter-nov (buffer header group)
   (save-excursion
index 52c993c..a98a187 100644 (file)
@@ -341,11 +341,12 @@ discarded after running the split process."
   :type 'hook)
 
 (defcustom nnmail-large-newsgroup 50
-  "*The number of the articles which indicates a large newsgroup.
+  "*The number of the articles which indicates a large newsgroup or nil.
 If the number of the articles is greater than the value, verbose
 messages will be shown to indicate the current status."
   :group 'nnmail-various
-  :type 'integer)
+  :type '(choice (const :tag "infinite" nil)
+                 (number :tag "count")))
 
 (defcustom nnmail-split-fancy "mail.misc"
   "Incoming mail can be split according to this fancy variable.
@@ -380,8 +381,8 @@ GROUP: Mail will be stored in GROUP (a string).
 junk: Mail will be deleted.  Use with care!  Do not submerge in water!
   Example:
   (setq nnmail-split-fancy
-        '(| (\"Subject\" \"MAKE MONEY FAST\" junk)
-            ...other.rules.omitted...))
+       '(| (\"Subject\" \"MAKE MONEY FAST\" junk)
+           ...other.rules.omitted...))
 
 FIELD must match a complete field name.  VALUE must match a complete
 word according to the `nnmail-split-fancy-syntax-table' syntax table.
@@ -477,6 +478,11 @@ parameter.  It should return nil, `warn' or `delete'."
   :group 'nnmail
   :type 'integer)
 
+(defcustom nnmail-mail-splitting-charset nil
+  "Default charset to be used when splitting incoming mail."
+  :group 'nnmail
+  :type 'symbol)
+
 ;;; Internal variables.
 
 (defvar nnmail-article-buffer " *nnmail incoming*"
@@ -994,6 +1000,9 @@ FUNC will be called with the group name to determine the article number."
        (erase-buffer)
        ;; Copy the headers into the work buffer.
        (insert-buffer-substring obuf beg end)
+       ;; Decode MIME headers and charsets.
+       (mime-decode-header-in-region (point-min) (point-max)
+                                     nnmail-mail-splitting-charset)
        ;; Fold continuation lines.
        (goto-char (point-min))
        (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t)
@@ -1023,8 +1032,8 @@ FUNC will be called with the group name to determine the article number."
                       (or (funcall nnmail-split-methods)
                           '("bogus"))
                     (error
-                     (nnheader-message 5
-                                       "Error in `nnmail-split-methods'; using `bogus' mail group")
+                     (nnheader-message
+                      5 "Error in `nnmail-split-methods'; using `bogus' mail group")
                      (sit-for 1)
                      '("bogus")))))
              (setq split (gnus-remove-duplicates split))
@@ -1076,7 +1085,8 @@ FUNC will be called with the group name to determine the article number."
            (nnheader-set-temp-buffer "*Split Trace*")
            (gnus-add-buffer)
            (dolist (trace (nreverse nnmail-split-trace))
-             (insert trace "\n"))
+             (prin1 trace (current-buffer))
+             (insert "\n"))
            (goto-char (point-min))
            (gnus-configure-windows 'split-trace)
            (set-buffer restore)))
@@ -1223,7 +1233,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
      ;; A group name.  Do the \& and \N subs into the string.
      ((stringp split)
       (when nnmail-split-tracing
-       (push (format "\"%s\"" split) nnmail-split-trace))
+       (push split nnmail-split-trace))
       (list (nnmail-expand-newtext split)))
 
      ;; Junk the message.
@@ -1262,7 +1272,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
        (while (and (goto-char end-point)
                    (re-search-backward (cdr cached-pair) nil t))
          (when nnmail-split-tracing
-           (push (cdr cached-pair) nnmail-split-trace))
+           (push split nnmail-split-trace))
          (let ((split-rest (cddr split))
                (end (match-end 0))
                ;; The searched regexp is \(\(FIELD\).*\)\(VALUE\).  So,
@@ -1447,7 +1457,7 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
 (defvar group)
 (defvar group-art-list)
 (defvar group-art)
-(defun nnmail-cache-insert (id)
+(defun nnmail-cache-insert (id &optional grp)
   (when nnmail-treat-duplicates
     ;; Store some information about the group this message is written
     ;; to.  This function might have been called from various places.
@@ -1458,7 +1468,9 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
     ;; the car of a pair is a group name.  Should we check that the
     ;; length of the list is equal to 1? -- kai
     (let ((g nil))
-      (cond ((and (boundp 'group) group)
+      (cond (grp
+            (setq g grp))
+           ((and (boundp 'group) group)
             (setq g group))
            ((and (boundp 'group-art-list) group-art-list
                  (listp group-art-list))
index 9525854..2c01d2b 100644 (file)
@@ -1,6 +1,5 @@
 ;;; nnmaildir.el --- maildir backend for Gnus
-;; Copyright (c) 2001, 2002 Free Software Foundation, Inc.
-;; Copyright (c) 2000, 2001 Paul Jarc <prj@po.cwru.edu>
+;; Public domain.
 
 ;; Author: Paul Jarc <prj@po.cwru.edu>
 
 ;;; Commentary:
 
 ;; Maildir format is documented in the maildir(5) man page from qmail
-;; and at <URL:http://cr.yp.to/proto/maildir.html>.  nnmaildir also
-;; stores extra information in the .nnmaildir/ directory within a
-;; maildir.
+;; (available at <URL:http://multivac.cwru.edu./prj/maildir.5>) and at
+;; <URL:http://cr.yp.to/proto/maildir.html>.  nnmaildir also stores
+;; extra information in the .nnmaildir/ directory within a maildir.
 ;;
 ;; Some goals of nnmaildir:
 ;; * Everything Just Works, and correctly.  E.g., stale NOV data is
 ;;   ignored; no need for -generate-nov-databases.
 ;; * Perfect reliability: [C-g] will never corrupt its data in memory,
 ;;   and SIGKILL will never corrupt its data in the filesystem.
-;; * We make it easy to manipulate marks, etc., from outside Gnus.
+;; * We use the filesystem as a database, so that, e.g., it's easy to
+;;   manipulate marks from outside Gnus.
 ;; * All information about a group is stored in the maildir, for easy
 ;;   backup, copying, restoring, etc.
-;; * We use the filesystem as a database.
 ;;
 ;; Todo:
 ;; * Don't force article renumbering, so nnmaildir can be used with
 ;;   the cache and agent.  Alternatively, completely rewrite the Gnus
-;;   backend interface, which would have other advantages.
+;;   backend interface, which would have other advantages as well.
 ;;
 ;; See also <URL:http://multivac.cwru.edu./nnmaildir/> until that
 ;; information is added to the Gnus manual.
@@ -77,529 +76,501 @@ by nnmaildir-request-article.")
 ;; An obarry containing symbols whose names are server names and whose values
 ;; are servers:
 (defvar nnmaildir--servers (make-vector 3 0))
-;; A server which has not necessarily been added to nnmaildir--servers, or nil:
-(defvar nnmaildir--tmp-server nil)
 ;; The current server:
 (defvar nnmaildir--cur-server nil)
 
-;; A server is a vector:
-["server-name"
- select-method
- "/expanded/path/to/directory/containing/symlinks/to/maildirs/"
- directory-files-function
- group-name-transformation-function
- ;; An obarray containing symbols whose names are group names and whose values
- ;; are groups:
- group-hash
- ;; A group which has not necessarily been added to the group hash, or nil:
- tmp-group
- current-group ;; or nil
- "Last error message, or nil"
- directory-modtime
- get-new-mail-p ;; Should we split mail from mail-sources?
- "new/group/creation/directory"]
-
-;; A group is a vector:
-["group.name"
- "prefixed:group.name"
- ;; Modification times of the "new", and "cur" directories:
- new-modtime
- cur-modtime
- ;; A vector containing lists of articles:
- [;; A list of articles, with article numbers in descending order, ending with
-  ;; article 1:
-  article-list
-  ;; An obarray containing symbols whose names are filename prefixes and whose
-  ;; values are articles:
-  file-hash
-  ;; Same as above, but keyed on Message-ID:
-  msgid-hash
-  ;; An article which has not necessarily been added to the file and msgid
-  ;; hashes, or nil:
-  tmp-article]
- ;; A vector containing nil, or articles with NOV data:
- nov-cache
- ;; The index of the next nov-cache entry to be replaced:
- nov-cache-index
- ;; An obarray containing symbols whose names are mark names and whose values
- ;; are modtimes of mark directories:
- mark-modtime-hash]
-
-;; An article is a vector:
-["file.name.prefix"
- ":2,suffix" ;; or 'expire if expired
- number
- "msgid"
- ;; A NOV data vector, or nil:
- ["subject\tfrom\tdate"
-  "references\tchars\lines"
-  "extra"
-  article-file-modtime
-  ;; The value of nnmail-extra-headers when this NOV data was parsed:
-  (to in-reply-to)]]
-
-(defmacro nnmaildir--srv-new () '(make-vector 11 nil))
-(defmacro nnmaildir--srv-get-name       (server) `(aref ,server  0))
-(defmacro nnmaildir--srv-get-method     (server) `(aref ,server  1))
-(defmacro nnmaildir--srv-get-dir        (server) `(aref ,server  2))
-(defmacro nnmaildir--srv-get-ls         (server) `(aref ,server  3))
-(defmacro nnmaildir--srv-get-groups     (server) `(aref ,server  4))
-(defmacro nnmaildir--srv-get-tmpgrp     (server) `(aref ,server  5))
-(defmacro nnmaildir--srv-get-curgrp     (server) `(aref ,server  6))
-(defmacro nnmaildir--srv-get-error      (server) `(aref ,server  7))
-(defmacro nnmaildir--srv-get-mtime      (server) `(aref ,server  8))
-(defmacro nnmaildir--srv-get-gnm        (server) `(aref ,server  9))
-(defmacro nnmaildir--srv-get-create-dir (server) `(aref ,server 10))
-(defmacro nnmaildir--srv-set-name       (server val) `(aset ,server  0 ,val))
-(defmacro nnmaildir--srv-set-method     (server val) `(aset ,server  1 ,val))
-(defmacro nnmaildir--srv-set-dir        (server val) `(aset ,server  2 ,val))
-(defmacro nnmaildir--srv-set-ls         (server val) `(aset ,server  3 ,val))
-(defmacro nnmaildir--srv-set-groups     (server val) `(aset ,server  4 ,val))
-(defmacro nnmaildir--srv-set-tmpgrp     (server val) `(aset ,server  5 ,val))
-(defmacro nnmaildir--srv-set-curgrp     (server val) `(aset ,server  6 ,val))
-(defmacro nnmaildir--srv-set-error      (server val) `(aset ,server  7 ,val))
-(defmacro nnmaildir--srv-set-mtime      (server val) `(aset ,server  8 ,val))
-(defmacro nnmaildir--srv-set-gnm        (server val) `(aset ,server  9 ,val))
-(defmacro nnmaildir--srv-set-create-dir (server val) `(aset ,server 10 ,val))
-
-(defmacro nnmaildir--grp-new () '(make-vector 8 nil))
-(defmacro nnmaildir--grp-get-name   (group) `(aref ,group 0))
-(defmacro nnmaildir--grp-get-pname  (group) `(aref ,group 1))
-(defmacro nnmaildir--grp-get-new    (group) `(aref ,group 2))
-(defmacro nnmaildir--grp-get-cur    (group) `(aref ,group 3))
-(defmacro nnmaildir--grp-get-lists  (group) `(aref ,group 4))
-(defmacro nnmaildir--grp-get-cache  (group) `(aref ,group 5))
-(defmacro nnmaildir--grp-get-index  (group) `(aref ,group 6))
-(defmacro nnmaildir--grp-get-mmth   (group) `(aref ,group 7))
-(defmacro nnmaildir--grp-set-name   (group val) `(aset ,group 0 ,val))
-(defmacro nnmaildir--grp-set-pname  (group val) `(aset ,group 1 ,val))
-(defmacro nnmaildir--grp-set-new    (group val) `(aset ,group 2 ,val))
-(defmacro nnmaildir--grp-set-cur    (group val) `(aset ,group 3 ,val))
-(defmacro nnmaildir--grp-set-lists  (group val) `(aset ,group 4 ,val))
-(defmacro nnmaildir--grp-set-cache  (group val) `(aset ,group 5 ,val))
-(defmacro nnmaildir--grp-set-index  (group val) `(aset ,group 6 ,val))
-(defmacro nnmaildir--grp-set-mmth   (group val) `(aset ,group 7 ,val))
-
-(defmacro nnmaildir--lists-new () '(make-vector 4 nil))
-(defmacro nnmaildir--lists-get-nlist  (lists) `(aref ,lists 0))
-(defmacro nnmaildir--lists-get-flist  (lists) `(aref ,lists 1))
-(defmacro nnmaildir--lists-get-mlist  (lists) `(aref ,lists 2))
-(defmacro nnmaildir--lists-get-tmpart (lists) `(aref ,lists 3))
-(defmacro nnmaildir--lists-set-nlist  (lists val) `(aset ,lists 0 ,val))
-(defmacro nnmaildir--lists-set-flist  (lists val) `(aset ,lists 1 ,val))
-(defmacro nnmaildir--lists-set-mlist  (lists val) `(aset ,lists 2 ,val))
-(defmacro nnmaildir--lists-set-tmpart (lists val) `(aset ,lists 3 ,val))
-
-(defmacro nnmaildir--nlist-last-num (list)
-  `(if ,list (nnmaildir--art-get-num (car ,list)) 0))
-(defmacro nnmaildir--nlist-art (list num)
-  `(and ,list
-        (>= (nnmaildir--art-get-num (car ,list)) ,num)
-        (nth (- (nnmaildir--art-get-num (car ,list)) ,num) ,list)))
+;; A copy of nnmail-extra-headers
+(defvar nnmaildir--extra nil)
+
+;; A disk NOV structure (must be prin1-able, so no defstruct) looks like this:
+["subject\tfrom\tdate"
+ "references\tchars\lines"
+ "To: you\tIn-Reply-To: <your.mess@ge>"
+ (12345 67890)     ;; modtime of the corresponding article file
+ (to in-reply-to)] ;; contemporary value of nnmail-extra-headers
+(defconst nnmaildir--novlen 5)
+(defmacro nnmaildir--nov-new (beg mid end mtime extra)
+  `(vector ,beg ,mid ,end ,mtime ,extra))
+(defmacro nnmaildir--nov-get-beg   (nov) `(aref ,nov 0))
+(defmacro nnmaildir--nov-get-mid   (nov) `(aref ,nov 1))
+(defmacro nnmaildir--nov-get-end   (nov) `(aref ,nov 2))
+(defmacro nnmaildir--nov-get-mtime (nov) `(aref ,nov 3))
+(defmacro nnmaildir--nov-get-extra (nov) `(aref ,nov 4))
+(defmacro nnmaildir--nov-set-beg   (nov value) `(aset ,nov 0 ,value))
+(defmacro nnmaildir--nov-set-mid   (nov value) `(aset ,nov 1 ,value))
+(defmacro nnmaildir--nov-set-end   (nov value) `(aset ,nov 2 ,value))
+(defmacro nnmaildir--nov-set-mtime (nov value) `(aset ,nov 3 ,value))
+(defmacro nnmaildir--nov-set-extra (nov value) `(aset ,nov 4 ,value))
+
+(defstruct nnmaildir--art
+  (prefix nil :type string)  ;; "time.pid.host"
+  (suffix nil :type string)  ;; ":2,flags"
+  (num    nil :type natnum)  ;; article number
+  (msgid  nil :type string)  ;; "<mess.age@id>"
+  (nov    nil :type vector)) ;; cached nov structure, or nil
+
+(defstruct nnmaildir--lists
+  (nlist nil :type list)    ;; list of articles, ordered descending by number
+  (flist nil :type vector)  ;; obarray mapping filename prefix->article
+  (mlist nil :type vector)) ;; obarray mapping message-id->article
+
+(defstruct nnmaildir--grp
+  (name  nil :type string)                  ;; "group.name"
+  (new   nil :type list)                    ;; new/ modtime
+  (cur   nil :type list)                    ;; cur/ modtime
+  (lists nil :type nnmaildir--lists) ;; lists of articles in this group
+  (cache nil :type vector)           ;; nov cache
+  (index nil :type natnum)           ;; index of next cache entry to replace
+  (mmth  nil :type vector))          ;; obarray mapping mark name->dir modtime
+
+(defstruct nnmaildir--srv
+  (address    nil :type string)         ;; server address string
+  (method     nil :type list)           ;; (nnmaildir "address" ...)
+  (prefix     nil :type string)         ;; "nnmaildir+address:"
+  (dir        nil :type string)         ;; "/expanded/path/to/server/dir/"
+  (ls         nil :type function)       ;; directory-files function
+  (groups     nil :type vector)         ;; obarray mapping group names->groups
+  (curgrp     nil :type nnmaildir--grp) ;; current group, or nil
+  (error      nil :type string)         ;; last error message, or nil
+  (mtime      nil :type list)           ;; modtime of dir
+  (gnm        nil)                      ;; flag: split from mail-sources?
+  (create-dir nil :type string))        ;; group creation directory
+
+(defmacro nnmaildir--nlist-last-num (nlist)
+  `(let ((nlist ,nlist))
+     (if nlist (nnmaildir--art-num (car nlist)) 0)))
+(defmacro nnmaildir--nlist-art (nlist num) ;;;; evals args multiple times
+  `(and ,nlist
+       (>= (nnmaildir--art-num (car ,nlist)) ,num)
+       (nth (- (nnmaildir--art-num (car ,nlist)) ,num) ,nlist)))
 (defmacro nnmaildir--flist-art (list file)
   `(symbol-value (intern-soft ,file ,list)))
 (defmacro nnmaildir--mlist-art (list msgid)
   `(symbol-value (intern-soft ,msgid ,list)))
 
-(defmacro nnmaildir--art-new () '(make-vector 5 nil))
-(defmacro nnmaildir--art-get-prefix (article) `(aref ,article 0))
-(defmacro nnmaildir--art-get-suffix (article) `(aref ,article 1))
-(defmacro nnmaildir--art-get-num    (article) `(aref ,article 2))
-(defmacro nnmaildir--art-get-msgid  (article) `(aref ,article 3))
-(defmacro nnmaildir--art-get-nov    (article) `(aref ,article 4))
-(defmacro nnmaildir--art-set-prefix (article val) `(aset ,article 0 ,val))
-(defmacro nnmaildir--art-set-suffix (article val) `(aset ,article 1 ,val))
-(defmacro nnmaildir--art-set-num    (article val) `(aset ,article 2 ,val))
-(defmacro nnmaildir--art-set-msgid  (article val) `(aset ,article 3 ,val))
-(defmacro nnmaildir--art-set-nov    (article val) `(aset ,article 4 ,val))
-
-(defmacro nnmaildir--nov-new () '(make-vector 5 nil))
-(defmacro nnmaildir--nov-get-beg   (nov) `(aref ,nov 0))
-(defmacro nnmaildir--nov-get-mid   (nov) `(aref ,nov 1))
-(defmacro nnmaildir--nov-get-end   (nov) `(aref ,nov 2))
-(defmacro nnmaildir--nov-get-mtime (nov) `(aref ,nov 3))
-(defmacro nnmaildir--nov-get-neh   (nov) `(aref ,nov 4))
-(defmacro nnmaildir--nov-set-beg   (nov val) `(aset ,nov 0 ,val))
-(defmacro nnmaildir--nov-set-mid   (nov val) `(aset ,nov 1 ,val))
-(defmacro nnmaildir--nov-set-end   (nov val) `(aset ,nov 2 ,val))
-(defmacro nnmaildir--nov-set-mtime (nov val) `(aset ,nov 3 ,val))
-(defmacro nnmaildir--nov-set-neh   (nov val) `(aset ,nov 4 ,val))
-
-(defmacro nnmaildir--srv-grp-dir (srv-dir gname)
-  `(file-name-as-directory (concat ,srv-dir ,gname)))
-
-(defun nnmaildir--param (prefixed-group-name param)
-  (setq param
-        (gnus-group-find-parameter prefixed-group-name param 'allow-list)
-        param (if (vectorp param) (aref param 0) param))
+(defun nnmaildir--pgname (server gname)
+  (let ((prefix (nnmaildir--srv-prefix server)))
+    (if prefix (concat prefix gname)
+      (setq gname (gnus-group-prefixed-name gname
+                                           (nnmaildir--srv-method server)))
+      (setf (nnmaildir--srv-prefix server) (gnus-group-real-prefix gname))
+      gname)))
+
+(defun nnmaildir--param (pgname param)
+  (setq param (gnus-group-find-parameter pgname param 'allow-list)
+       param (if (vectorp param) (aref param 0) param))
   (eval param))
 
-(defmacro nnmaildir--unlink (file)
-  `(if (file-attributes ,file) (delete-file ,file)))
-
-(defmacro nnmaildir--tmp (dir) `(file-name-as-directory (concat ,dir "tmp")))
-(defmacro nnmaildir--new (dir) `(file-name-as-directory (concat ,dir "new")))
-(defmacro nnmaildir--cur (dir) `(file-name-as-directory (concat ,dir "cur")))
-(defmacro nnmaildir--nndir (dir)
-  `(file-name-as-directory (concat ,dir ".nnmaildir")))
-
-(defun nnmaildir--lists-fix (lists)
-  (let ((tmp (nnmaildir--lists-get-tmpart lists)))
-    (when tmp
-      (set (intern (nnmaildir--art-get-prefix tmp)
-                   (nnmaildir--lists-get-flist lists))
-           tmp)
-      (set (intern (nnmaildir--art-get-msgid tmp)
-                   (nnmaildir--lists-get-mlist lists))
-           tmp)
-      (nnmaildir--lists-set-tmpart lists nil))))
+(defmacro nnmaildir--with-nntp-buffer (&rest body)
+  `(save-excursion
+     (set-buffer nntp-server-buffer)
+     ,@body))
+(defmacro nnmaildir--with-work-buffer (&rest body)
+  `(save-excursion
+     (set-buffer (get-buffer-create " *nnmaildir work*"))
+     ,@body))
+(defmacro nnmaildir--with-nov-buffer (&rest body)
+  `(save-excursion
+     (set-buffer (get-buffer-create " *nnmaildir nov*"))
+     ,@body))
+(defmacro nnmaildir--with-move-buffer (&rest body)
+  `(save-excursion
+     (set-buffer (get-buffer-create " *nnmaildir move*"))
+     ,@body))
+
+(defmacro nnmaildir--subdir (dir subdir)
+  `(file-name-as-directory (concat ,dir ,subdir)))
+(defmacro nnmaildir--srvgrp-dir (srv-dir gname)
+  `(nnmaildir--subdir ,srv-dir ,gname))
+(defmacro nnmaildir--tmp       (dir) `(nnmaildir--subdir ,dir "tmp"))
+(defmacro nnmaildir--new       (dir) `(nnmaildir--subdir ,dir "new"))
+(defmacro nnmaildir--cur       (dir) `(nnmaildir--subdir ,dir "cur"))
+(defmacro nnmaildir--nndir     (dir) `(nnmaildir--subdir ,dir ".nnmaildir"))
+(defmacro nnmaildir--nov-dir   (dir) `(nnmaildir--subdir ,dir "nov"))
+(defmacro nnmaildir--marks-dir (dir) `(nnmaildir--subdir ,dir "marks"))
+
+(defmacro nnmaildir--unlink (file-arg)
+  `(let ((file ,file-arg))
+     (if (file-attributes file) (delete-file file))))
+(defun nnmaildir--mkdir (dir)
+  (or (file-exists-p (file-name-as-directory dir))
+      (make-directory-internal (directory-file-name dir))))
 
 (defun nnmaildir--prepare (server group)
   (let (x groups)
     (catch 'return
-      (setq x nnmaildir--tmp-server)
-      (when x
-        (set (intern (nnmaildir--srv-get-name x) nnmaildir--servers) x)
-        (setq nnmaildir--tmp-server nil))
       (if (null server)
-          (or (setq server nnmaildir--cur-server)
-              (throw 'return nil))
-        (or (setq server (intern-soft server nnmaildir--servers))
-            (throw 'return nil))
-        (setq server (symbol-value server)
-              nnmaildir--cur-server server))
-      (setq groups (nnmaildir--srv-get-groups server))
-      (if groups nil (throw 'return nil))
-      (if (nnmaildir--srv-get-method server) nil
-        (setq x (concat "nnmaildir:" (nnmaildir--srv-get-name server))
-              x (gnus-server-to-method x))
-        (if x nil (throw 'return nil))
-        (nnmaildir--srv-set-method server x))
-      (setq x (nnmaildir--srv-get-tmpgrp server))
-      (when x
-        (set (intern (nnmaildir--grp-get-name x) groups) x)
-        (nnmaildir--srv-set-tmpgrp server nil))
+         (or (setq server nnmaildir--cur-server)
+             (throw 'return nil))
+       (or (setq server (intern-soft server nnmaildir--servers))
+           (throw 'return nil))
+       (setq server (symbol-value server)
+             nnmaildir--cur-server server))
+      (or (setq groups (nnmaildir--srv-groups server))
+          (throw 'return nil))
+      (if (nnmaildir--srv-method server) nil
+       (setq x (concat "nnmaildir:" (nnmaildir--srv-address server))
+             x (gnus-server-to-method x))
+       (or x (throw 'return nil))
+       (setf (nnmaildir--srv-method server) x))
       (if (null group)
-          (or (setq group (nnmaildir--srv-get-curgrp server))
-              (throw 'return nil))
-        (setq group (intern-soft group groups))
-        (if group nil (throw 'return nil))
-        (setq group (symbol-value group)))
-      (nnmaildir--lists-fix (nnmaildir--grp-get-lists group))
+         (or (setq group (nnmaildir--srv-curgrp server))
+             (throw 'return nil))
+       (or (setq group (intern-soft group groups))
+            (throw 'return nil))
+       (setq group (symbol-value group)))
       group)))
 
-(defun nnmaildir--update-nov (srv-dir group article)
+(defun nnmaildir--update-nov (server group article)
   (let ((nnheader-file-coding-system 'binary)
-        dir gname pgname msgdir prefix suffix file attr mtime novdir novfile
-        nov msgid nov-beg nov-mid nov-end field pos extra val old-neh new-neh
-        deactivate-mark)
+       (srv-dir (nnmaildir--srv-dir server))
+       dir gname pgname msgdir prefix suffix file attr mtime novdir novfile
+       nov msgid nov-beg nov-mid nov-end field pos extra val old-extra
+       new-extra deactivate-mark)
     (catch 'return
-      (setq suffix (nnmaildir--art-get-suffix article))
+      (setq suffix (nnmaildir--art-suffix article))
       (if (stringp suffix) nil
-        (nnmaildir--art-set-nov article nil)
-        (throw 'return nil))
-      (setq gname (nnmaildir--grp-get-name group)
-            pgname (nnmaildir--grp-get-pname group)
-            dir (nnmaildir--srv-grp-dir srv-dir gname)
-            msgdir (if (nnmaildir--param pgname 'read-only)
-                       (nnmaildir--new dir) (nnmaildir--cur dir))
-            prefix (nnmaildir--art-get-prefix article)
-            file (concat msgdir prefix suffix)
-            attr (file-attributes file))
+       (setf (nnmaildir--art-nov article) nil)
+       (throw 'return nil))
+      (setq gname (nnmaildir--grp-name group)
+           pgname (nnmaildir--pgname server gname)
+           dir (nnmaildir--srvgrp-dir srv-dir gname)
+           msgdir (if (nnmaildir--param pgname 'read-only)
+                      (nnmaildir--new dir) (nnmaildir--cur dir))
+           prefix (nnmaildir--art-prefix article)
+           file (concat msgdir prefix suffix)
+           attr (file-attributes file))
       (if attr nil
-        (nnmaildir--art-set-suffix article 'expire)
-        (nnmaildir--art-set-nov article nil)
-        (throw 'return nil))
+       (setf (nnmaildir--art-suffix article) 'expire)
+       (setf (nnmaildir--art-nov    article) nil)
+       (throw 'return nil))
       (setq mtime (nth 5 attr)
-            attr (nth 7 attr)
-            nov (nnmaildir--art-get-nov article)
-            novdir (concat (nnmaildir--nndir dir) "nov")
-            novdir (file-name-as-directory novdir)
-            novfile (concat novdir prefix))
-      (save-excursion
-        (set-buffer (get-buffer-create " *nnmaildir nov*"))
-        (when (file-exists-p novfile) ;; If not, force reparsing the message.
-          (if nov nil ;; It's already in memory.
-            ;; Else read the data from the NOV file.
-            (erase-buffer)
-            (nnheader-insert-file-contents novfile)
-            (setq nov (read (current-buffer)))
-            (nnmaildir--art-set-msgid article (car nov))
-            (setq nov (cadr nov)))
-          ;; If the NOV's modtime matches the file's current modtime,
-          ;; and it has the right length (i.e., it wasn't produced by
-          ;; a too-much older version of nnmaildir), then we may use
-          ;; this NOV data rather than parsing the message file,
-          ;; unless nnmail-extra-headers has been augmented since this
-          ;; data was last parsed.
-          (when (and (equal mtime (nnmaildir--nov-get-mtime nov))
-                     (= (length nov) (length (nnmaildir--nov-new))))
-            ;; This NOV data is potentially up-to-date.
-            (setq old-neh (nnmaildir--nov-get-neh nov)
-                  new-neh nnmail-extra-headers)
-            (if (equal new-neh old-neh) (throw 'return nov)) ;; Common case.
-            ;; They're not equal, but maybe the new is a subset of the old...
-            (if (null new-neh) (throw 'return nov))
-            (while new-neh
-              (if (memq (car new-neh) old-neh)
-                  (progn
-                    (setq new-neh (cdr new-neh))
-                    (if new-neh nil (throw 'return nov)))
-                (setq new-neh nil)))))
-        ;; Parse the NOV data out of the message.
-        (erase-buffer)
-        (nnheader-insert-file-contents file)
-        (insert "\n")
-        (goto-char (point-min))
-        (save-restriction
-          (if (search-forward "\n\n" nil 'noerror)
-              (progn
-                (setq nov-mid (count-lines (point) (point-max)))
-                (narrow-to-region (point-min) (1- (point))))
-            (setq nov-mid 0))
-          (goto-char (point-min))
-          (delete-char 1)
-          (nnheader-fold-continuation-lines)
-          (setq nov (nnheader-parse-head 'naked)
-                field (or (mail-header-lines nov) 0)))
-        (if (or (zerop field) (nnmaildir--param pgname 'distrust-Lines:)) nil
-          (setq nov-mid field))
-        (setq nov-mid (number-to-string nov-mid)
-              nov-mid (concat (number-to-string attr) "\t" nov-mid)
-              field (or (mail-header-references nov) "")
-              pos 0)
-        (save-match-data
-          (while (string-match "\t" field pos)
-            (aset field (match-beginning 0) ? )
-            (setq pos (match-end 0)))
-          (setq nov-mid (concat field "\t" nov-mid)
-                extra (mail-header-extra nov)
-                nov-end "")
-          (while extra
-            (setq field (car extra) extra (cdr extra)
-                  val (cdr field) field (symbol-name (car field))
-                  pos 0)
-            (while (string-match "\t" field pos)
-              (aset field (match-beginning 0) ? )
-              (setq pos (match-end 0)))
-            (setq pos 0)
-            (while (string-match "\t" val pos)
-              (aset val (match-beginning 0) ? )
-              (setq pos (match-end 0)))
-            (setq nov-end (concat nov-end "\t" field ": " val)))
-          (setq nov-end (if (zerop (length nov-end)) "" (substring nov-end 1))
-                field (or (mail-header-subject nov) "")
-                pos 0)
-          (while (string-match "\t" field pos)
-            (aset field (match-beginning 0) ? )
-            (setq pos (match-end 0)))
-          (setq nov-beg field
-                field (or (mail-header-from nov) "")
-                pos 0)
-          (while (string-match "\t" field pos)
-            (aset field (match-beginning 0) ? )
-            (setq pos (match-end 0)))
-          (setq nov-beg (concat nov-beg "\t" field)
-                field (or (mail-header-date nov) "")
-                pos 0)
-          (while (string-match "\t" field pos)
-            (aset field (match-beginning 0) ? )
-            (setq pos (match-end 0)))
-          (setq nov-beg (concat nov-beg "\t" field)
-                field (mail-header-id nov)
-                pos 0)
-          (while (string-match "\t" field pos)
-            (aset field (match-beginning 0) ? )
-            (setq pos (match-end 0)))
-          (setq msgid field))
-        (if (or (null msgid) (nnheader-fake-message-id-p msgid))
-            (setq msgid (concat "<" prefix "@nnmaildir>")))
-        (erase-buffer)
-        (setq nov (nnmaildir--nov-new))
-        (nnmaildir--nov-set-beg nov nov-beg)
-        (nnmaildir--nov-set-mid nov nov-mid)
-        (nnmaildir--nov-set-end nov nov-end)
-        (nnmaildir--nov-set-mtime nov mtime)
-        (nnmaildir--nov-set-neh nov (copy-sequence nnmail-extra-headers))
-        (prin1 (list msgid nov) (current-buffer))
-        (setq file (concat novfile ":"))
-        (nnmaildir--unlink file)
-        (write-region (point-min) (point-max) file nil 'no-message))
+           attr (nth 7 attr)
+           nov (nnmaildir--art-nov article)
+           novdir (nnmaildir--nov-dir (nnmaildir--nndir dir))
+           novfile (concat novdir prefix))
+      (or (equal nnmaildir--extra nnmail-extra-headers)
+         (setq nnmaildir--extra (copy-sequence nnmail-extra-headers)))
+      (nnmaildir--with-nov-buffer
+       (when (file-exists-p novfile) ;; If not, force reparsing the message.
+         (if nov nil ;; It's already in memory.
+           ;; Else read the data from the NOV file.
+           (erase-buffer)
+           (nnheader-insert-file-contents novfile)
+           (setq nov (read (current-buffer)))
+           (setf (nnmaildir--art-msgid article) (car nov))
+           (setq nov (cadr nov)))
+         ;; If the NOV's modtime matches the file's current modtime, and it
+         ;; has the right structure (i.e., it wasn't produced by a too-much
+         ;; older version of nnmaildir), then we may use this NOV data
+         ;; rather than parsing the message file, unless
+         ;; nnmail-extra-headers has been augmented since this data was last
+         ;; parsed.
+         (when (and (equal mtime (nnmaildir--nov-get-mtime nov))
+                    (= (length nov) nnmaildir--novlen)
+                    (stringp (nnmaildir--nov-get-beg   nov))
+                    (stringp (nnmaildir--nov-get-mid   nov))
+                    (stringp (nnmaildir--nov-get-end   nov))
+                    (listp   (nnmaildir--nov-get-mtime nov))
+                    (listp   (nnmaildir--nov-get-extra nov)))
+           ;; this NOV data is potentially up-to-date; now check extra headers
+           (setq old-extra (nnmaildir--nov-get-extra nov))
+           (when (equal nnmaildir--extra old-extra) ;; common case
+             (nnmaildir--nov-set-extra nov nnmaildir--extra) ;; save memory
+             (throw 'return nov))
+           ;; They're not equal, but maybe the new is a subset of the old...
+           (if (null nnmaildir--extra) (throw 'return nov))
+           (setq new-extra nnmaildir--extra)
+           (while new-extra
+             (if (memq (car new-extra) old-extra)
+                 (progn
+                   (setq new-extra (cdr new-extra))
+                   (if new-extra nil (throw 'return nov)))
+               (setq new-extra nil))))) ;;found one not in old-extra;quit loop
+       ;; Parse the NOV data out of the message.
+       (erase-buffer)
+       (nnheader-insert-file-contents file)
+       (insert "\n")
+       (goto-char (point-min))
+       (save-restriction
+         (if (search-forward "\n\n" nil 'noerror)
+             (progn
+               (setq nov-mid (count-lines (point) (point-max)))
+               (narrow-to-region (point-min) (1- (point))))
+           (setq nov-mid 0))
+         (goto-char (point-min))
+         (delete-char 1)
+         (nnheader-fold-continuation-lines)
+         (setq nov (nnheader-parse-head 'naked)
+               field (or (mail-header-lines nov) 0)))
+       (if (or (zerop field) (nnmaildir--param pgname 'distrust-Lines:)) nil
+         (setq nov-mid field))
+       (setq nov-mid (number-to-string nov-mid)
+             nov-mid (concat (number-to-string attr) "\t" nov-mid)
+             field (or (mail-header-references nov) "")
+             pos 0)
+       (save-match-data
+         (while (string-match "\t" field pos)
+           (aset field (match-beginning 0) ? )
+           (setq pos (match-end 0)))
+         (setq nov-mid (concat field "\t" nov-mid)
+               extra (mail-header-extra nov)
+               nov-end "")
+         (while extra
+           (setq field (car extra) extra (cdr extra)
+                 val (cdr field) field (symbol-name (car field))
+                 pos 0)
+           (while (string-match "\t" field pos)
+             (aset field (match-beginning 0) ? )
+             (setq pos (match-end 0)))
+           (setq pos 0)
+           (while (string-match "\t" val pos)
+             (aset val (match-beginning 0) ? )
+             (setq pos (match-end 0)))
+           (setq nov-end (concat nov-end "\t" field ": " val)))
+         (setq nov-end (if (zerop (length nov-end)) "" (substring nov-end 1))
+               field (or (mail-header-subject nov) "")
+               pos 0)
+         (while (string-match "\t" field pos)
+           (aset field (match-beginning 0) ? )
+           (setq pos (match-end 0)))
+         (setq nov-beg field
+               field (or (mail-header-from nov) "")
+               pos 0)
+         (while (string-match "\t" field pos)
+           (aset field (match-beginning 0) ? )
+           (setq pos (match-end 0)))
+         (setq nov-beg (concat nov-beg "\t" field)
+               field (or (mail-header-date nov) "")
+               pos 0)
+         (while (string-match "\t" field pos)
+           (aset field (match-beginning 0) ? )
+           (setq pos (match-end 0)))
+         (setq nov-beg (concat nov-beg "\t" field)
+               field (mail-header-id nov)
+               pos 0)
+         (while (string-match "\t" field pos)
+           (aset field (match-beginning 0) ? )
+           (setq pos (match-end 0)))
+         (setq msgid field))
+       (if (or (null msgid) (nnheader-fake-message-id-p msgid))
+           (setq msgid (concat "<" prefix "@nnmaildir>")))
+       (setq nov (nnmaildir--nov-new nov-beg nov-mid nov-end mtime
+                                     nnmaildir--extra))
+       (erase-buffer)
+       (prin1 (list msgid nov) (current-buffer))
+       (setq file (concat novfile ":"))
+       (nnmaildir--unlink file)
+       (write-region (point-min) (point-max) file nil 'no-message))
       (rename-file file novfile 'replace)
-      (nnmaildir--art-set-msgid article msgid)
+      (setf (nnmaildir--art-msgid article) msgid)
       nov)))
 
 (defun nnmaildir--cache-nov (group article nov)
-  (let ((cache (nnmaildir--grp-get-cache group))
-        (index (nnmaildir--grp-get-index group))
-        goner)
-    (if (nnmaildir--art-get-nov article) nil
+  (let ((cache (nnmaildir--grp-cache group))
+       (index (nnmaildir--grp-index group))
+       goner)
+    (if (nnmaildir--art-nov article) nil
       (setq goner (aref cache index))
-      (if goner (nnmaildir--art-set-nov goner nil))
+      (if goner (setf (nnmaildir--art-nov goner) nil))
       (aset cache index article)
-      (nnmaildir--grp-set-index group (% (1+ index) (length cache))))
-    (nnmaildir--art-set-nov article nov)))
+      (setf (nnmaildir--grp-index group) (% (1+ index) (length cache))))
+    (setf (nnmaildir--art-nov article) nov)))
 
-(defun nnmaildir--grp-add-art (srv-dir group article)
-  (let ((nov (nnmaildir--update-nov srv-dir group article))
-        old-lists new-lists)
+(defun nnmaildir--grp-add-art (server group article)
+  (let ((nov (nnmaildir--update-nov server group article))
+       old-lists new-lists)
     (when nov
-      (setq old-lists (nnmaildir--grp-get-lists group)
-            new-lists (nnmaildir--lists-new))
-      (nnmaildir--lists-set-nlist
-        new-lists (cons article (nnmaildir--lists-get-nlist old-lists)))
-      (nnmaildir--lists-set-flist new-lists
-                                  (nnmaildir--lists-get-flist old-lists))
-      (nnmaildir--lists-set-mlist new-lists
-                                  (nnmaildir--lists-get-mlist old-lists))
-      (nnmaildir--lists-set-tmpart new-lists article)
-      (nnmaildir--grp-set-lists group new-lists)
-      (nnmaildir--lists-fix new-lists)
+      (setq old-lists (nnmaildir--grp-lists group)
+           new-lists (copy-nnmaildir--lists old-lists))
+      (setf (nnmaildir--lists-nlist new-lists)
+           (cons article (nnmaildir--lists-nlist new-lists)))
+      (let ((inhibit-quit t))
+        (setf (nnmaildir--grp-lists group) new-lists)
+        (set (intern (nnmaildir--art-prefix article)
+                     (nnmaildir--lists-flist new-lists))
+             article)
+        (set (intern (nnmaildir--art-msgid article)
+                     (nnmaildir--lists-mlist new-lists))
+             article))
       (nnmaildir--cache-nov group article nov)
       t)))
 
-(defun nnmaildir--mkdir (dir)
-  (or (file-exists-p (file-name-as-directory dir))
-      (make-directory-internal (directory-file-name dir))))
+(defun nnmaildir--group-ls (server pgname)
+  (or (nnmaildir--param pgname 'directory-files)
+      (nnmaildir--srv-ls server)))
 
 (defun nnmaildir--article-count (group)
   (let ((ct 0)
-        (min 0))
-    (setq group (nnmaildir--grp-get-lists group)
-          group (nnmaildir--lists-get-nlist group))
+       (min 1))
+    (setq group (nnmaildir--grp-lists group)
+         group (nnmaildir--lists-nlist group))
     (while group
-      (if (stringp (nnmaildir--art-get-suffix (car group)))
-          (setq ct (1+ ct)
-                min (nnmaildir--art-get-num (car group))))
+      (if (stringp (nnmaildir--art-suffix (car group)))
+         (setq ct (1+ ct)
+               min (nnmaildir--art-num (car group))))
       (setq group (cdr group)))
     (cons ct min)))
 
 (defun nnmaildir-article-number-to-file-name
-       (number group-name server-address-string)
+  (number group-name server-address-string)
   (let ((group (nnmaildir--prepare server-address-string group-name))
-        list article suffix dir filename)
+       list article suffix dir filename pgname)
     (catch 'return
       (if (null group)
-          ;; The given group or server does not exist.
-          (throw 'return nil))
-      (setq list (nnmaildir--grp-get-lists group)
-            list (nnmaildir--lists-get-nlist list)
-            article (nnmaildir--nlist-art list number))
+         ;; The given group or server does not exist.
+         (throw 'return nil))
+      (setq list (nnmaildir--grp-lists group)
+           list (nnmaildir--lists-nlist list)
+           article (nnmaildir--nlist-art list number))
       (if (null article)
-          ;; The given article number does not exist in this group.
-          (throw 'return nil))
-      (setq suffix (nnmaildir--art-get-suffix article))
+         ;; The given article number does not exist in this group.
+         (throw 'return nil))
+      (setq suffix (nnmaildir--art-suffix article))
       (if (not (stringp suffix))
-          ;; The article has expired.
-          (throw 'return nil))
-      (setq dir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            dir (nnmaildir--srv-grp-dir dir group-name)
-            group (if (nnmaildir--param (nnmaildir--grp-get-pname group)
-                                        'read-only)
-                      (nnmaildir--new dir) (nnmaildir--cur dir))
-            filename (concat group (nnmaildir--art-get-prefix article) suffix))
+         ;; The article has expired.
+         (throw 'return nil))
+      (setq dir (nnmaildir--srv-dir nnmaildir--cur-server)
+           dir (nnmaildir--srvgrp-dir dir group-name)
+           pgname (nnmaildir--pgname nnmaildir--cur-server group-name)
+           group (if (nnmaildir--param pgname 'read-only)
+                     (nnmaildir--new dir) (nnmaildir--cur dir))
+           filename (concat group (nnmaildir--art-prefix article) suffix))
       (if (file-exists-p filename)
-          filename
-        ;; The article disappeared out from under us.
-        (nnmaildir--art-set-suffix article 'expire)
-        (nnmaildir--art-set-nov article nil)
-        nil))))
+         filename
+       ;; The article disappeared out from under us.
+       (setf (nnmaildir--art-suffix article) 'expire)
+       (setf (nnmaildir--art-nov    article) nil)
+       nil))))
+
+(defun nnmaildir-article-number-to-base-name
+  (number group-name server-address-string)
+  (let ((group (nnmaildir--prepare server-address-string group-name))
+       list article suffix dir filename)
+    (catch 'return
+      (if (null group)
+         ;; The given group or server does not exist.
+         (throw 'return nil))
+      (setq list (nnmaildir--grp-lists group)
+           list (nnmaildir--lists-nlist list)
+           article (nnmaildir--nlist-art list number))
+      (if (null article)
+         ;; The given article number does not exist in this group.
+         (throw 'return nil))
+      (setq suffix (nnmaildir--art-suffix article))
+      (if (not (stringp suffix))
+         ;; The article has expired.
+         (throw 'return nil))
+      (cons (nnmaildir--art-prefix article) suffix))))
+
+(defun nnmaildir-base-name-to-article-number
+  (base-name group-name server-address-string)
+  (let ((group (nnmaildir--prepare server-address-string group-name))
+       list article suffix dir filename)
+    (catch 'return
+      (if (null group)
+         ;; The given group or server does not exist.
+         (throw 'return nil))
+      (setq list (nnmaildir--grp-lists group)
+           list (nnmaildir--lists-flist list)
+           article (nnmaildir--flist-art list base-name))
+      (if (null article)
+         ;; The given article number does not exist in this group.
+         (throw 'return nil))
+      (nnmaildir--art-num article))))
 
 (defun nnmaildir-request-type (group &optional article)
   'mail)
 
 (defun nnmaildir-status-message (&optional server)
   (nnmaildir--prepare server nil)
-  (nnmaildir--srv-get-error nnmaildir--cur-server))
+  (nnmaildir--srv-error nnmaildir--cur-server))
 
 (defun nnmaildir-server-opened (&optional server)
   (and nnmaildir--cur-server
        (if server
-           (string-equal server
-                         (nnmaildir--srv-get-name nnmaildir--cur-server))
-         t)
-       (nnmaildir--srv-get-groups nnmaildir--cur-server)
+          (string-equal server (nnmaildir--srv-address nnmaildir--cur-server))
+        t)
+       (nnmaildir--srv-groups nnmaildir--cur-server)
        t))
 
 (defun nnmaildir-open-server (server &optional defs)
   (let ((x server)
-        dir size)
+       dir size)
     (catch 'return
       (setq server (intern-soft x nnmaildir--servers))
       (if server
-          (and (setq server (symbol-value server))
-               (nnmaildir--srv-get-groups server)
-               (setq nnmaildir--cur-server server)
-               (throw 'return t))
-        (setq server (nnmaildir--srv-new))
-        (nnmaildir--srv-set-name server x)
-        (setq nnmaildir--tmp-server server)
-        (set (intern x nnmaildir--servers) server)
-        (setq nnmaildir--tmp-server nil))
+         (and (setq server (symbol-value server))
+              (nnmaildir--srv-groups server)
+              (setq nnmaildir--cur-server server)
+              (throw 'return t))
+       (setq server (make-nnmaildir--srv :address x))
+        (let ((inhibit-quit t))
+          (set (intern x nnmaildir--servers) server)))
       (setq dir (assq 'directory defs))
       (if dir nil
-        (nnmaildir--srv-set-error
-          server "You must set \"directory\" in the select method")
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error server)
+             "You must set \"directory\" in the select method")
+       (throw 'return nil))
       (setq dir (cadr dir)
-            dir (eval dir)
-            dir (expand-file-name dir)
-            dir (file-name-as-directory dir))
+           dir (eval dir)
+           dir (expand-file-name dir)
+           dir (file-name-as-directory dir))
       (if (file-exists-p dir) nil
-        (nnmaildir--srv-set-error server (concat "No such directory: " dir))
-        (throw 'return nil))
-      (nnmaildir--srv-set-dir server dir)
+       (setf (nnmaildir--srv-error server) (concat "No such directory: " dir))
+       (throw 'return nil))
+      (setf (nnmaildir--srv-dir server) dir)
       (setq x (assq 'directory-files defs))
       (if (null x)
-          (setq x (symbol-function (if nnheader-directory-files-is-safe
-                                       'directory-files
-                                     'nnheader-directory-files-safe)))
-        (setq x (cadr x))
-        (if (functionp x) nil
-          (nnmaildir--srv-set-error
-            server (concat "Not a function: " (prin1-to-string x)))
-          (throw 'return nil)))
-      (nnmaildir--srv-set-ls server x)
+         (setq x (symbol-function (if nnheader-directory-files-is-safe
+                                      'directory-files
+                                    'nnheader-directory-files-safe)))
+       (setq x (cadr x))
+       (if (functionp x) nil
+         (setf (nnmaildir--srv-error server)
+               (concat "Not a function: " (prin1-to-string x)))
+         (throw 'return nil)))
+      (setf (nnmaildir--srv-ls server) x)
       (setq x (funcall x dir nil "\\`[^.]" 'nosort)
-            x (length x)
-            size 1)
+           x (length x)
+           size 1)
       (while (<= size x) (setq size (* 2 size)))
       (if (/= size 1) (setq size (1- size)))
       (and (setq x (assq 'get-new-mail defs))
-           (setq x (cdr x))
-           (car x)
-           (nnmaildir--srv-set-gnm server t)
-           (require 'nnmail))
+          (setq x (cdr x))
+          (car x)
+          (setf (nnmaildir--srv-gnm server) t)
+          (require 'nnmail))
       (setq x (assq 'create-directory defs))
       (when x
-        (setq x (cadr x)
-              x (eval x))
-        (nnmaildir--srv-set-create-dir server x))
-      (nnmaildir--srv-set-groups server (make-vector size 0))
+       (setq x (cadr x)
+             x (eval x))
+       (setf (nnmaildir--srv-create-dir server) x))
+      (setf (nnmaildir--srv-groups server) (make-vector size 0))
       (setq nnmaildir--cur-server server)
       t)))
 
 (defun nnmaildir--parse-filename (file)
   (let ((prefix (car file))
-        timestamp len)
+       timestamp len)
     (if (string-match
-          "\\`\\([0-9]+\\)\\.\\([0-9]+\\)\\(_\\([0-9]+\\)\\)?\\(\\..*\\)\\'"
-          prefix)
-        (progn
-          (setq timestamp (concat "0000" (match-string 1 prefix))
-                len (- (length timestamp) 4))
-          (vector (string-to-number (substring timestamp 0 len))
-                  (string-to-number (substring timestamp len))
-                  (string-to-number (match-string 2 prefix))
-                  (string-to-number (or (match-string 4 prefix) "-1"))
-                  (match-string 5 prefix)
-                  file))
+        "\\`\\([0-9]+\\)\\.\\([0-9]+\\)\\(_\\([0-9]+\\)\\)?\\(\\..*\\)\\'"
+        prefix)
+       (progn
+         (setq timestamp (concat "0000" (match-string 1 prefix))
+               len (- (length timestamp) 4))
+         (vector (string-to-number (substring timestamp 0 len))
+                 (string-to-number (substring timestamp len))
+                 (string-to-number (match-string 2 prefix))
+                 (string-to-number (or (match-string 4 prefix) "-1"))
+                 (match-string 5 prefix)
+                 file))
       file)))
 
 (defun nnmaildir--sort-files (a b)
   (catch 'return
     (if (consp a)
-        (throw 'return (and (consp b) (string-lessp (car a) (car b)))))
+       (throw 'return (and (consp b) (string-lessp (car a) (car b)))))
     (if (consp b) (throw 'return t))
     (if (< (aref a 0) (aref b 0)) (throw 'return t))
     (if (> (aref a 0) (aref b 0)) (throw 'return nil))
@@ -614,201 +585,195 @@ by nnmaildir-request-article.")
 (defun nnmaildir--scan (gname scan-msgs groups method srv-dir srv-ls)
   (catch 'return
     (let ((36h-ago (- (car (current-time)) 2))
-          absdir nndir tdir ndir cdir nattr cattr isnew pgname read-only ls
-          files file num dir flist group x)
-      (setq absdir (file-name-as-directory (concat srv-dir gname))
-            nndir (nnmaildir--nndir absdir))
-      (if (file-attributes absdir) nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "No such directory: " absdir))
-        (throw 'return nil))
+         absdir nndir tdir ndir cdir nattr cattr isnew pgname read-only ls
+         files file num dir flist group x)
+      (setq absdir (nnmaildir--srvgrp-dir srv-dir gname)
+           nndir (nnmaildir--nndir absdir))
+      (if (file-exists-p absdir) nil
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "No such directory: " absdir))
+       (throw 'return nil))
       (setq tdir (nnmaildir--tmp absdir)
-            ndir (nnmaildir--new absdir)
-            cdir (nnmaildir--cur absdir)
-            nattr (file-attributes ndir)
-            cattr (file-attributes cdir))
+           ndir (nnmaildir--new absdir)
+           cdir (nnmaildir--cur absdir)
+           nattr (file-attributes ndir)
+           cattr (file-attributes cdir))
       (if (and (file-exists-p tdir) nattr cattr) nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "Not a maildir: " absdir))
-        (throw 'return nil))
-      (setq group (nnmaildir--prepare nil gname))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "Not a maildir: " absdir))
+       (throw 'return nil))
+      (setq group (nnmaildir--prepare nil gname)
+           pgname (nnmaildir--pgname nnmaildir--cur-server gname))
       (if group
-          (setq isnew nil
-                pgname (nnmaildir--grp-get-pname group))
-        (setq isnew t
-              group (nnmaildir--grp-new)
-              pgname (gnus-group-prefixed-name gname method))
-        (nnmaildir--grp-set-name group gname)
-        (nnmaildir--grp-set-pname group pgname)
-        (nnmaildir--grp-set-lists group (nnmaildir--lists-new))
-        (nnmaildir--grp-set-index group 0)
-        (nnmaildir--mkdir nndir)
-        (nnmaildir--mkdir (concat nndir "nov"))
-        (nnmaildir--mkdir (concat nndir "marks"))
-        (write-region "" nil (concat nndir "markfile") nil 'no-message))
+         (setq isnew nil)
+       (setq isnew t
+             group (make-nnmaildir--grp :name gname :index 0
+                                        :lists (make-nnmaildir--lists)))
+       (nnmaildir--mkdir nndir)
+       (nnmaildir--mkdir (nnmaildir--nov-dir   nndir))
+       (nnmaildir--mkdir (nnmaildir--marks-dir nndir))
+       (write-region "" nil (concat nndir "markfile") nil 'no-message))
       (setq read-only (nnmaildir--param pgname 'read-only)
-            ls (or (nnmaildir--param pgname 'directory-files) srv-ls))
+           ls (or (nnmaildir--param pgname 'directory-files) srv-ls))
       (if read-only nil
-        (setq x (nth 11 (file-attributes tdir)))
-        (if (and (= x (nth 11 nattr)) (= x (nth 11 cattr))) nil
-          (nnmaildir--srv-set-error nnmaildir--cur-server
-                                    (concat "Maildir spans filesystems: "
-                                            absdir))
-          (throw 'return nil))
-        (setq files (funcall ls tdir 'full "\\`[^.]" 'nosort))
-        (while files
-          (setq file (car files) files (cdr files)
-                x (file-attributes file))
-          (if (or (< 1 (cadr x)) (> 36h-ago (car (nth 4 x))))
-              (delete-file file))))
+       (setq x (nth 11 (file-attributes tdir)))
+       (if (and (= x (nth 11 nattr)) (= x (nth 11 cattr))) nil
+         (setf (nnmaildir--srv-error nnmaildir--cur-server)
+               (concat "Maildir spans filesystems: " absdir))
+         (throw 'return nil))
+       (setq files (funcall ls tdir 'full "\\`[^.]" 'nosort))
+       (while files
+         (setq file (car files) files (cdr files)
+               x (file-attributes file))
+         (if (or (< 1 (cadr x)) (> 36h-ago (car (nth 4 x))))
+             (delete-file file))))
       (or scan-msgs
-          isnew
-          (throw 'return t))
+         isnew
+         (throw 'return t))
       (setq nattr (nth 5 nattr))
-      (if (equal nattr (nnmaildir--grp-get-new group))
-          (setq nattr nil))
+      (if (equal nattr (nnmaildir--grp-new group))
+         (setq nattr nil))
       (if read-only (setq dir (and (or isnew nattr) ndir))
-        (when (or isnew nattr)
-          (setq files (funcall ls ndir nil "\\`[^.]" 'nosort))
-          (while files
-            (setq file (car files) files (cdr files))
-            (rename-file (concat ndir file) (concat cdir file ":2,")))
-          (nnmaildir--grp-set-new group nattr))
-        (setq cattr (file-attributes cdir)
-              cattr (nth 5 cattr))
-        (if (equal cattr (nnmaildir--grp-get-cur group))
-            (setq cattr nil))
-        (setq dir (and (or isnew cattr) cdir)))
+       (when (or isnew nattr)
+         (setq files (funcall ls ndir nil "\\`[^.]" 'nosort))
+         (while files
+           (setq file (car files) files (cdr files))
+           (rename-file (concat ndir file) (concat cdir file ":2,")))
+         (setf (nnmaildir--grp-new group) nattr))
+       (setq cattr (nth 5 (file-attributes cdir)))
+       (if (equal cattr (nnmaildir--grp-cur group))
+           (setq cattr nil))
+       (setq dir (and (or isnew cattr) cdir)))
       (if dir nil (throw 'return t))
       (setq files (funcall ls dir nil "\\`[^.]" 'nosort))
       (when isnew
-        (setq x (length files)
-              num 1)
-        (while (<= num x) (setq num (* 2 num)))
-        (if (/= num 1) (setq num (1- num)))
-        (setq x (nnmaildir--grp-get-lists group))
-        (nnmaildir--lists-set-flist x (make-vector num 0))
-        (nnmaildir--lists-set-mlist x (make-vector num 0))
-        (nnmaildir--grp-set-mmth group (make-vector 1 0))
-        (setq num (nnmaildir--param pgname 'nov-cache-size))
-        (if (numberp num) (if (< num 1) (setq num 1))
-          (setq x files
-                num 16
-                cdir (file-name-as-directory (concat nndir "marks"))
-                ndir (file-name-as-directory (concat cdir "tick"))
-                cdir (file-name-as-directory (concat cdir "read")))
-          (while x
-            (setq file (car x) x (cdr x))
-            (string-match "\\`\\([^:]*\\)\\(\\(:.*\\)?\\)\\'" file)
-            (setq file (match-string 1 file))
-            (if (or (not (file-exists-p (concat cdir file)))
-                    (file-exists-p (concat ndir file)))
-                (setq num (1+ num)))))
-        (nnmaildir--grp-set-cache group (make-vector num nil))
-        (nnmaildir--srv-set-tmpgrp nnmaildir--cur-server group)
-        (set (intern gname groups) group)
-        (nnmaildir--srv-set-tmpgrp nnmaildir--cur-server nil)
-        (or scan-msgs (throw 'return t)))
-      (setq flist (nnmaildir--grp-get-lists group)
-            num (nnmaildir--lists-get-nlist flist)
-            flist (nnmaildir--lists-get-flist flist)
-            num (nnmaildir--nlist-last-num num)
-            x files
-            files nil)
+       (setq x (length files)
+             num 1)
+       (while (<= num x) (setq num (* 2 num)))
+       (if (/= num 1) (setq num (1- num)))
+       (setq x (nnmaildir--grp-lists group))
+       (setf (nnmaildir--lists-flist x) (make-vector num 0))
+       (setf (nnmaildir--lists-mlist x) (make-vector num 0))
+       (setf (nnmaildir--grp-mmth group) (make-vector 1 0))
+       (setq num (nnmaildir--param pgname 'nov-cache-size))
+       (if (numberp num) (if (< num 1) (setq num 1))
+         (setq x files
+               num 16
+               cdir (nnmaildir--marks-dir nndir)
+               ndir (nnmaildir--subdir cdir "tick")
+               cdir (nnmaildir--subdir cdir "read"))
+         (while x
+           (setq file (car x) x (cdr x))
+           (string-match "\\`\\([^:]*\\)\\(\\(:.*\\)?\\)\\'" file)
+           (setq file (match-string 1 file))
+           (if (or (not (file-exists-p (concat cdir file)))
+                   (file-exists-p (concat ndir file)))
+               (setq num (1+ num)))))
+       (setf (nnmaildir--grp-cache group) (make-vector num nil))
+        (let ((inhibit-quit t))
+          (set (intern gname groups) group))
+       (or scan-msgs (throw 'return t)))
+      (setq flist (nnmaildir--grp-lists group)
+           num (nnmaildir--lists-nlist flist)
+           flist (nnmaildir--lists-flist flist)
+           num (nnmaildir--nlist-last-num num)
+           x files
+           files nil)
       (while x
-        (setq file (car x) x (cdr x))
-        (string-match "\\`\\([^:]*\\)\\(\\(:.*\\)?\\)\\'" file)
-        (setq file (cons (match-string 1 file) (match-string 2 file)))
-        (if (nnmaildir--flist-art flist (car file)) nil
-          (setq files (cons file files))))
+       (setq file (car x) x (cdr x))
+       (string-match "\\`\\([^:]*\\)\\(\\(:.*\\)?\\)\\'" file)
+       (setq file (cons (match-string 1 file) (match-string 2 file)))
+       (if (nnmaildir--flist-art flist (car file)) nil
+         (setq files (cons file files))))
       (setq files (mapcar 'nnmaildir--parse-filename files)
-            files (sort files 'nnmaildir--sort-files))
+           files (sort files 'nnmaildir--sort-files))
       (while files
-        (setq file (car files) files (cdr files)
-              file (if (consp file) file (aref file 5))
-              x (nnmaildir--art-new))
-        (nnmaildir--art-set-prefix x (car file))
-        (nnmaildir--art-set-suffix x (cdr file))
-        (nnmaildir--art-set-num x (1+ num))
-        (if (nnmaildir--grp-add-art srv-dir group x)
-            (setq num (1+ num))))
-      (if read-only (nnmaildir--grp-set-new group nattr)
-        (nnmaildir--grp-set-cur group cattr)))
+       (setq file (car files) files (cdr files)
+             file (if (consp file) file (aref file 5))
+             x (make-nnmaildir--art :prefix (car file) :suffix(cdr file)
+                                    :num (1+ num)))
+       (if (nnmaildir--grp-add-art nnmaildir--cur-server group x)
+           (setq num (1+ num))))
+      (if read-only (setf (nnmaildir--grp-new group) nattr)
+       (setf (nnmaildir--grp-cur group) cattr)))
     t))
 
 (defun nnmaildir-request-scan (&optional scan-group server)
   (let ((coding-system-for-write nnheader-file-coding-system)
-        (buffer-file-coding-system nil)
-        (file-coding-system-alist nil)
-        (nnmaildir-get-new-mail t)
-        (nnmaildir-group-alist nil)
-        (nnmaildir-active-file nil)
-        x srv-ls srv-dir method groups group dirs grp-dir seen deactivate-mark)
+       (buffer-file-coding-system nil)
+       (file-coding-system-alist nil)
+       (nnmaildir-get-new-mail t)
+       (nnmaildir-group-alist nil)
+       (nnmaildir-active-file nil)
+       x srv-ls srv-dir method groups group dirs grp-dir seen deactivate-mark)
     (nnmaildir--prepare server nil)
-    (setq srv-ls (nnmaildir--srv-get-ls nnmaildir--cur-server)
-          srv-dir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-          method (nnmaildir--srv-get-method nnmaildir--cur-server)
-          groups (nnmaildir--srv-get-groups nnmaildir--cur-server))
-    (save-excursion
-      (set-buffer (get-buffer-create " *nnmaildir work*"))
+    (setq srv-ls (nnmaildir--srv-ls nnmaildir--cur-server)
+         srv-dir (nnmaildir--srv-dir nnmaildir--cur-server)
+         method (nnmaildir--srv-method nnmaildir--cur-server)
+         groups (nnmaildir--srv-groups nnmaildir--cur-server))
+    (nnmaildir--with-work-buffer
       (save-match-data
-        (if (stringp scan-group)
-            (if (nnmaildir--scan scan-group t groups method srv-dir srv-ls)
-                (if (nnmaildir--srv-get-gnm nnmaildir--cur-server)
-                    (nnmail-get-new-mail 'nnmaildir nil nil scan-group))
-              (unintern scan-group groups))
-          (setq x (nth 5 (file-attributes srv-dir)))
-          (if (equal x (nnmaildir--srv-get-mtime nnmaildir--cur-server))
-              (if scan-group nil
-                (mapatoms (lambda (sym)
-                            (nnmaildir--scan (symbol-name sym) t groups
-                                             method srv-dir srv-ls))
-                          groups))
-            (setq dirs (funcall srv-ls srv-dir nil "\\`[^.]" 'nosort)
-                  x (length dirs)
-                  seen 1)
-            (while (<= seen x) (setq seen (* 2 seen)))
-            (if (/= seen 1) (setq seen (1- seen)))
-            (setq seen (make-vector seen 0)
-                  scan-group (null scan-group))
-            (while dirs
-              (setq grp-dir (car dirs) dirs (cdr dirs))
-              (if (nnmaildir--scan grp-dir scan-group groups method srv-dir
-                                   srv-ls)
-                  (intern grp-dir seen)))
-            (setq x nil)
-            (mapatoms (lambda (group)
-                        (setq group (symbol-name group))
-                        (if (intern-soft group seen) nil
-                          (setq x (cons group x))))
-                      groups)
-            (while x
-              (unintern (car x) groups)
-              (setq x (cdr x)))
-            (nnmaildir--srv-set-mtime nnmaildir--cur-server
-                                      (nth 5 (file-attributes srv-dir))))
-          (if (nnmaildir--srv-get-gnm nnmaildir--cur-server)
-              (nnmail-get-new-mail 'nnmaildir nil nil))))))
+       (if (stringp scan-group)
+           (if (nnmaildir--scan scan-group t groups method srv-dir srv-ls)
+               (if (nnmaildir--srv-gnm nnmaildir--cur-server)
+                   (nnmail-get-new-mail 'nnmaildir nil nil scan-group))
+             (unintern scan-group groups))
+         (setq x (nth 5 (file-attributes srv-dir))
+               scan-group (null scan-group))
+         (if (equal x (nnmaildir--srv-mtime nnmaildir--cur-server))
+             (if scan-group
+                 (mapatoms (lambda (sym)
+                             (nnmaildir--scan (symbol-name sym) t groups
+                                              method srv-dir srv-ls))
+                           groups))
+           (setq dirs (funcall srv-ls srv-dir nil "\\`[^.]" 'nosort)
+                 x (length dirs)
+                 seen 1)
+           (while (<= seen x) (setq seen (* 2 seen)))
+           (if (/= seen 1) (setq seen (1- seen)))
+           (setq seen (make-vector seen 0))
+           (while dirs
+             (setq grp-dir (car dirs) dirs (cdr dirs))
+             (if (nnmaildir--scan grp-dir scan-group groups method srv-dir
+                                  srv-ls)
+                 (intern grp-dir seen)))
+           (setq x nil)
+           (mapatoms (lambda (group)
+                       (setq group (symbol-name group))
+                       (if (intern-soft group seen) nil
+                         (setq x (cons group x))))
+                     groups)
+           (while x
+             (unintern (car x) groups)
+             (setq x (cdr x)))
+           (setf (nnmaildir--srv-mtime nnmaildir--cur-server)
+                 (nth 5 (file-attributes srv-dir))))
+         (and scan-group
+              (nnmaildir--srv-gnm nnmaildir--cur-server)
+              (nnmail-get-new-mail 'nnmaildir nil nil))))))
   t)
 
 (defun nnmaildir-request-list (&optional server)
   (nnmaildir-request-scan 'find-new-groups server)
   (let (pgname ro ct-min deactivate-mark)
     (nnmaildir--prepare server nil)
-    (save-excursion
-      (set-buffer nntp-server-buffer)
+    (nnmaildir--with-nntp-buffer
       (erase-buffer)
       (mapatoms (lambda (group)
-                  (setq group (symbol-value group)
-                        ro (nnmaildir--param (nnmaildir--grp-get-pname group)
-                                             'read-only)
-                        ct-min (nnmaildir--article-count group))
-                  (insert (nnmaildir--grp-get-name group) " ")
-                  (princ (car ct-min) nntp-server-buffer)
-                  (insert " ")
-                  (princ (cdr ct-min) nntp-server-buffer)
-                  (insert " " (if ro "n" "y") "\n"))
-                (nnmaildir--srv-get-groups nnmaildir--cur-server))))
+                 (setq pgname (symbol-name group)
+                       pgname (nnmaildir--pgname nnmaildir--cur-server pgname)
+                       group (symbol-value group)
+                       ro (nnmaildir--param pgname 'read-only)
+                       ct-min (nnmaildir--article-count group))
+                 (insert (nnmaildir--grp-name group) " ")
+                  (princ (nnmaildir--nlist-last-num
+                           (nnmaildir--lists-nlist
+                             (nnmaildir--grp-lists group)))
+                         nntp-server-buffer)
+                 (insert " ")
+                 (princ (cdr ct-min) nntp-server-buffer)
+                 (insert " " (if ro "n" "y") "\n"))
+               (nnmaildir--srv-groups nnmaildir--cur-server))))
   t)
 
 (defun nnmaildir-request-newgroups (date &optional server)
@@ -817,430 +782,416 @@ by nnmaildir-request-article.")
 (defun nnmaildir-retrieve-groups (groups &optional server)
   (let (gname group ct-min deactivate-mark)
     (nnmaildir--prepare server nil)
-    (save-excursion
-      (set-buffer nntp-server-buffer)
+    (nnmaildir--with-nntp-buffer
       (erase-buffer)
       (while groups
-        (setq gname (car groups) groups (cdr groups))
-        (nnmaildir-request-scan gname server)
-        (setq group (nnmaildir--prepare nil gname))
-        (if (null group) (insert "411 no such news group\n")
-          (setq ct-min (nnmaildir--article-count group))
-          (insert "211 ")
-          (princ (car ct-min) nntp-server-buffer)
-          (insert " ")
-          (princ (cdr ct-min) nntp-server-buffer)
-          (insert " ")
-          (princ (nnmaildir--nlist-last-num
-                   (nnmaildir--lists-get-nlist
-                     (nnmaildir--grp-get-lists group)))
-                 nntp-server-buffer)
-          (insert " " gname "\n")))))
+       (setq gname (car groups) groups (cdr groups))
+       (setq group (nnmaildir--prepare nil gname))
+       (if (null group) (insert "411 no such news group\n")
+         (setq ct-min (nnmaildir--article-count group))
+         (insert "211 ")
+         (princ (car ct-min) nntp-server-buffer)
+         (insert " ")
+         (princ (cdr ct-min) nntp-server-buffer)
+         (insert " ")
+         (princ (nnmaildir--nlist-last-num
+                  (nnmaildir--lists-nlist
+                    (nnmaildir--grp-lists group)))
+                nntp-server-buffer)
+         (insert " " gname "\n")))))
   'group)
 
 (defun nnmaildir-request-update-info (gname info &optional server)
-  (nnmaildir-request-scan gname server)
   (let ((group (nnmaildir--prepare server gname))
-        srv-ls pgname nlist flist last always-marks never-marks old-marks
-        dotfile num dir markdirs marks mark ranges articles article read end
-        new-marks ls old-mmth new-mmth mtime mark-sym deactivate-mark)
+       pgname nlist flist last always-marks never-marks old-marks dotfile num
+        dir markdirs marks mark ranges articles article read end new-marks ls
+        old-mmth new-mmth mtime mark-sym deactivate-mark)
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "No such group: " gname))
-        (throw 'return nil))
-      (setq srv-ls (nnmaildir--srv-get-ls nnmaildir--cur-server)
-            gname (nnmaildir--grp-get-name group)
-            pgname (nnmaildir--grp-get-pname group)
-            nlist (nnmaildir--grp-get-lists group)
-            flist (nnmaildir--lists-get-flist nlist)
-            nlist (nnmaildir--lists-get-nlist nlist))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "No such group: " gname))
+       (throw 'return nil))
+      (setq gname (nnmaildir--grp-name group)
+           pgname (nnmaildir--pgname nnmaildir--cur-server gname)
+           nlist (nnmaildir--grp-lists group)
+           flist (nnmaildir--lists-flist nlist)
+           nlist (nnmaildir--lists-nlist nlist))
       (if nlist nil
-        (gnus-info-set-read info nil)
-        (gnus-info-set-marks info nil 'extend)
-        (throw 'return info))
+       (gnus-info-set-read info nil)
+       (gnus-info-set-marks info nil 'extend)
+       (throw 'return info))
       (setq old-marks (cons 'read (gnus-info-read info))
-            old-marks (cons old-marks (gnus-info-marks info))
-            last (nnmaildir--nlist-last-num nlist)
-            always-marks (nnmaildir--param pgname 'always-marks)
-            never-marks (nnmaildir--param pgname 'never-marks)
-            dir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            dir (nnmaildir--srv-grp-dir dir gname)
-            dir (nnmaildir--nndir dir)
-            dir (concat dir "marks")
-            dir (file-name-as-directory dir)
-            ls (nnmaildir--param pgname 'directory-files)
-            ls (or ls srv-ls)
-            markdirs (funcall ls dir nil "\\`[^.]" 'nosort)
-            num (length markdirs)
-            new-mmth 1)
+           old-marks (cons old-marks (gnus-info-marks info))
+           last (nnmaildir--nlist-last-num nlist)
+           always-marks (nnmaildir--param pgname 'always-marks)
+           never-marks (nnmaildir--param pgname 'never-marks)
+           dir (nnmaildir--srv-dir nnmaildir--cur-server)
+           dir (nnmaildir--srvgrp-dir dir gname)
+           dir (nnmaildir--nndir dir)
+           dir (nnmaildir--marks-dir dir)
+            ls (nnmaildir--group-ls nnmaildir--cur-server pgname)
+           markdirs (funcall ls dir nil "\\`[^.]" 'nosort)
+           num (length markdirs)
+           new-mmth 1)
       (while (<= new-mmth num) (setq new-mmth (* 2 new-mmth)))
       (if (/= new-mmth 1) (setq new-mmth (1- new-mmth)))
       (setq new-mmth (make-vector new-mmth 0)
-            old-mmth (nnmaildir--grp-get-mmth group))
+           old-mmth (nnmaildir--grp-mmth group))
       (while markdirs
-        (setq mark (car markdirs) markdirs (cdr markdirs)
-              articles (concat dir mark)
-              articles (file-name-as-directory articles)
-              mark-sym (intern mark)
-              ranges nil)
-        (catch 'got-ranges
-          (if (memq mark-sym never-marks) (throw 'got-ranges nil))
-          (when (memq mark-sym always-marks)
-            (setq ranges (list (cons 1 last)))
-            (throw 'got-ranges nil))
-          (setq mtime (file-attributes articles)
-                mtime (nth 5 mtime))
-          (set (intern mark new-mmth) mtime)
-          (when (equal mtime (symbol-value (intern-soft mark old-mmth)))
-            (setq ranges (assq mark-sym old-marks))
-            (if ranges (setq ranges (cdr ranges)))
-            (throw 'got-ranges nil))
-          (setq articles (funcall ls articles nil "\\`[^.]" 'nosort))
-          (while articles
-            (setq article (car articles) articles (cdr articles)
-                  article (nnmaildir--flist-art flist article))
-            (if article
-                (setq num (nnmaildir--art-get-num article)
-                      ranges (gnus-add-to-range ranges (list num))))))
-        (if (eq mark-sym 'read) (setq read ranges)
-          (if ranges (setq marks (cons (cons mark-sym ranges) marks)))))
+       (setq mark (car markdirs) markdirs (cdr markdirs)
+             articles (nnmaildir--subdir dir mark)
+             mark-sym (intern mark)
+             ranges nil)
+       (catch 'got-ranges
+         (if (memq mark-sym never-marks) (throw 'got-ranges nil))
+         (when (memq mark-sym always-marks)
+           (setq ranges (list (cons 1 last)))
+           (throw 'got-ranges nil))
+         (setq mtime (nth 5 (file-attributes articles)))
+         (set (intern mark new-mmth) mtime)
+         (when (equal mtime (symbol-value (intern-soft mark old-mmth)))
+           (setq ranges (assq mark-sym old-marks))
+           (if ranges (setq ranges (cdr ranges)))
+           (throw 'got-ranges nil))
+         (setq articles (funcall ls articles nil "\\`[^.]" 'nosort))
+         (while articles
+           (setq article (car articles) articles (cdr articles)
+                 article (nnmaildir--flist-art flist article))
+           (if article
+               (setq num (nnmaildir--art-num article)
+                     ranges (gnus-add-to-range ranges (list num))))))
+       (if (eq mark-sym 'read) (setq read ranges)
+         (if ranges (setq marks (cons (cons mark-sym ranges) marks)))))
       (gnus-info-set-read info read)
       (gnus-info-set-marks info marks 'extend)
-      (nnmaildir--grp-set-mmth group new-mmth)
+      (setf (nnmaildir--grp-mmth group) new-mmth)
       info)))
 
 (defun nnmaildir-request-group (gname &optional server fast)
-  (nnmaildir-request-scan gname server)
   (let ((group (nnmaildir--prepare server gname))
-        ct-min deactivate-mark)
-    (save-excursion
-      (set-buffer nntp-server-buffer)
+       ct-min deactivate-mark)
+    (nnmaildir--with-nntp-buffer
       (erase-buffer)
       (catch 'return
-        (if group nil
-          (insert "411 no such news group\n")
-          (nnmaildir--srv-set-error nnmaildir--cur-server
-                                    (concat "No such group: " gname))
-          (throw 'return nil))
-        (nnmaildir--srv-set-curgrp nnmaildir--cur-server group)
-        (if fast (throw 'return t))
-        (setq ct-min (nnmaildir--article-count group))
-        (insert "211 ")
-        (princ (car ct-min) nntp-server-buffer)
-        (insert " ")
-        (princ (cdr ct-min) nntp-server-buffer)
-        (insert " ")
-        (princ (nnmaildir--nlist-last-num
-                 (nnmaildir--lists-get-nlist
-                  (nnmaildir--grp-get-lists group)))
-               nntp-server-buffer)
-        (insert " " gname "\n")
-        t))))
+       (if group nil
+         (insert "411 no such news group\n")
+         (setf (nnmaildir--srv-error nnmaildir--cur-server)
+               (concat "No such group: " gname))
+         (throw 'return nil))
+       (setf (nnmaildir--srv-curgrp nnmaildir--cur-server) group)
+       (if fast (throw 'return t))
+       (setq ct-min (nnmaildir--article-count group))
+       (insert "211 ")
+       (princ (car ct-min) nntp-server-buffer)
+       (insert " ")
+       (princ (cdr ct-min) nntp-server-buffer)
+       (insert " ")
+       (princ (nnmaildir--nlist-last-num
+               (nnmaildir--lists-nlist
+                (nnmaildir--grp-lists group)))
+              nntp-server-buffer)
+       (insert " " gname "\n")
+       t))))
 
 (defun nnmaildir-request-create-group (gname &optional server args)
   (nnmaildir--prepare server nil)
   (catch 'return
-    (let ((create-dir (nnmaildir--srv-get-create-dir nnmaildir--cur-server))
-          srv-dir dir groups)
+    (let ((create-dir (nnmaildir--srv-create-dir nnmaildir--cur-server))
+         srv-dir dir groups)
       (when (zerop (length gname))
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  "Invalid (empty) group name")
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             "Invalid (empty) group name")
+       (throw 'return nil))
       (when (eq (aref "." 0) (aref gname 0))
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  "Group names may not start with \".\"")
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             "Group names may not start with \".\"")
+       (throw 'return nil))
       (when (save-match-data (string-match "[\0/\t]" gname))
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-          (concat "Illegal characters (null, tab, or /) in group name: "
-                  gname))
-        (throw 'return nil))
-      (setq groups (nnmaildir--srv-get-groups nnmaildir--cur-server))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "Illegal characters (null, tab, or /) in group name: "
+                     gname))
+       (throw 'return nil))
+      (setq groups (nnmaildir--srv-groups nnmaildir--cur-server))
       (when (intern-soft gname groups)
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "Group already exists: " gname))
-        (throw 'return nil))
-      (setq srv-dir (nnmaildir--srv-get-dir nnmaildir--cur-server))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "Group already exists: " gname))
+       (throw 'return nil))
+      (setq srv-dir (nnmaildir--srv-dir nnmaildir--cur-server))
       (if (file-name-absolute-p create-dir)
-          (setq dir (expand-file-name create-dir))
-        (setq dir srv-dir
-              dir (file-truename dir)
-              dir (concat dir create-dir)))
-      (setq dir (file-name-as-directory dir)
-            dir (concat dir gname))
+         (setq dir (expand-file-name create-dir))
+       (setq dir srv-dir
+             dir (file-truename dir)
+             dir (concat dir create-dir)))
+      (setq dir (nnmaildir--subdir (file-name-as-directory dir) gname))
       (nnmaildir--mkdir dir)
-      (setq dir (file-name-as-directory dir))
-      (nnmaildir--mkdir (concat dir "tmp"))
-      (nnmaildir--mkdir (concat dir "new"))
-      (nnmaildir--mkdir (concat dir "cur"))
+      (nnmaildir--mkdir (nnmaildir--tmp dir))
+      (nnmaildir--mkdir (nnmaildir--new dir))
+      (nnmaildir--mkdir (nnmaildir--cur dir))
       (setq create-dir (file-name-as-directory create-dir))
       (make-symbolic-link (concat create-dir gname) (concat srv-dir gname))
       (nnmaildir-request-scan 'find-new-groups))))
 
 (defun nnmaildir-request-rename-group (gname new-name &optional server)
   (let ((group (nnmaildir--prepare server gname))
-        (coding-system-for-write nnheader-file-coding-system)
-        (buffer-file-coding-system nil)
-        (file-coding-system-alist nil)
-        srv-dir x groups)
+       (coding-system-for-write nnheader-file-coding-system)
+       (buffer-file-coding-system nil)
+       (file-coding-system-alist nil)
+       srv-dir x groups)
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "No such group: " gname))
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "No such group: " gname))
+       (throw 'return nil))
       (when (zerop (length new-name))
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  "Invalid (empty) group name")
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             "Invalid (empty) group name")
+       (throw 'return nil))
       (when (eq (aref "." 0) (aref new-name 0))
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  "Group names may not start with \".\"")
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             "Group names may not start with \".\"")
+       (throw 'return nil))
       (when (save-match-data (string-match "[\0/\t]" new-name))
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-          (concat "Illegal characters (null, tab, or /) in group name: "
-                  new-name))
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "Illegal characters (null, tab, or /) in group name: "
+                     new-name))
+       (throw 'return nil))
       (if (string-equal gname new-name) (throw 'return t))
       (when (intern-soft new-name
-                         (nnmaildir--srv-get-groups nnmaildir--cur-server))
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "Group already exists: " new-name))
-        (throw 'return nil))
-      (setq srv-dir (nnmaildir--srv-get-dir nnmaildir--cur-server))
+                        (nnmaildir--srv-groups nnmaildir--cur-server))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "Group already exists: " new-name))
+       (throw 'return nil))
+      (setq srv-dir (nnmaildir--srv-dir nnmaildir--cur-server))
       (condition-case err
-          (rename-file (concat srv-dir gname)
-                       (concat srv-dir new-name))
-        (error
-         (nnmaildir--srv-set-error nnmaildir--cur-server
-                                   (concat "Error renaming link: "
-                                           (prin1-to-string err)))
-         (throw 'return nil)))
-      (setq x (nnmaildir--srv-get-groups nnmaildir--cur-server)
-            groups (make-vector (length x) 0))
+         (rename-file (concat srv-dir gname)
+                      (concat srv-dir new-name))
+       (error
+        (setf (nnmaildir--srv-error nnmaildir--cur-server)
+              (concat "Error renaming link: " (prin1-to-string err)))
+        (throw 'return nil)))
+      (setq x (nnmaildir--srv-groups nnmaildir--cur-server)
+           groups (make-vector (length x) 0))
       (mapatoms (lambda (sym)
-                  (if (eq (symbol-value sym) group) nil
-                    (set (intern (symbol-name sym) groups)
-                         (symbol-value sym))))
-                x)
+                 (if (eq (symbol-value sym) group) nil
+                   (set (intern (symbol-name sym) groups)
+                        (symbol-value sym))))
+               x)
       (setq group (copy-sequence group))
-      (nnmaildir--grp-set-name group new-name)
+      (setf (nnmaildir--grp-name group) new-name)
       (set (intern new-name groups) group)
-      (nnmaildir--srv-set-groups nnmaildir--cur-server groups)
+      (setf (nnmaildir--srv-groups nnmaildir--cur-server) groups)
       t)))
 
 (defun nnmaildir-request-delete-group (gname force &optional server)
   (let ((group (nnmaildir--prepare server gname))
-        pgname grp-dir dir dirs files ls deactivate-mark)
+       pgname grp-dir dir dirs files ls deactivate-mark)
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "No such group: " gname))
-        (throw 'return nil))
-      (if (eq group (nnmaildir--srv-get-curgrp nnmaildir--cur-server))
-          (nnmaildir--srv-set-curgrp nnmaildir--cur-server nil))
-      (setq gname (nnmaildir--grp-get-name group)
-            pgname (nnmaildir--grp-get-pname group))
-      (unintern gname (nnmaildir--srv-get-groups nnmaildir--cur-server))
-      (setq grp-dir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            grp-dir (nnmaildir--srv-grp-dir grp-dir gname))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "No such group: " gname))
+       (throw 'return nil))
+      (if (eq group (nnmaildir--srv-curgrp nnmaildir--cur-server))
+         (setf (nnmaildir--srv-curgrp nnmaildir--cur-server) nil))
+      (setq gname (nnmaildir--grp-name group)
+           pgname (nnmaildir--pgname nnmaildir--cur-server gname))
+      (unintern gname (nnmaildir--srv-groups nnmaildir--cur-server))
+      (setq grp-dir (nnmaildir--srv-dir nnmaildir--cur-server)
+           grp-dir (nnmaildir--srvgrp-dir grp-dir gname))
       (if (not force) (setq grp-dir (directory-file-name grp-dir))
-        (if (nnmaildir--param pgname 'read-only)
-            (progn (delete-directory  (nnmaildir--tmp grp-dir))
-                   (nnmaildir--unlink (nnmaildir--new grp-dir))
-                   (delete-directory  (nnmaildir--cur grp-dir)))
-          (save-excursion
-            (set-buffer (get-buffer-create " *nnmaildir work*"))
-            (erase-buffer)
-            (setq ls (or (nnmaildir--param pgname 'directory-files)
-                         (nnmaildir--srv-get-ls nnmaildir--cur-server))
-                  files (funcall ls (nnmaildir--tmp grp-dir) 'full "\\`[^.]"
-                                 'nosort))
-            (while files
-              (delete-file (car files))
-              (setq files (cdr files)))
-            (delete-directory (concat grp-dir "tmp"))
-            (setq files (funcall ls (nnmaildir--new grp-dir) 'full "\\`[^.]"
-                                 'nosort))
-            (while files
-              (delete-file (car files))
-              (setq files (cdr files)))
-            (delete-directory (concat grp-dir "new"))
-            (setq files (funcall ls (nnmaildir--cur grp-dir) 'full "\\`[^.]"
-                                 'nosort))
-            (while files
-              (delete-file (car files))
-              (setq files (cdr files)))
-            (delete-directory (concat grp-dir "cur"))))
-        (setq dir (nnmaildir--nndir grp-dir)
-              dirs (cons (concat dir "nov")
-                         (funcall ls (concat dir "marks") 'full "\\`[^.]"
-                                  'nosort)))
-        (while dirs
-          (setq dir (car dirs) dirs (cdr dirs)
-                files (funcall ls dir 'full "\\`[^.]" 'nosort))
-          (while files
-            (delete-file (car files))
-            (setq files (cdr files)))
-          (delete-directory dir))
-        (setq dir (nnmaildir--nndir grp-dir)
-              files (concat dir "markfile"))
-        (nnmaildir--unlink files)
-        (delete-directory (concat dir "marks"))
-        (delete-directory dir)
-        (setq grp-dir (directory-file-name grp-dir)
-              dir (car (file-attributes grp-dir)))
-        (if (eq (aref "/" 0) (aref dir 0)) nil
-          (setq dir (concat (file-truename
-                              (nnmaildir--srv-get-dir nnmaildir--cur-server))
-                            dir)))
-        (delete-directory dir))
+       (if (nnmaildir--param pgname 'read-only)
+           (progn (delete-directory  (nnmaildir--tmp grp-dir))
+                  (nnmaildir--unlink (nnmaildir--new grp-dir))
+                  (delete-directory  (nnmaildir--cur grp-dir)))
+         (nnmaildir--with-work-buffer
+           (erase-buffer)
+            (setq ls (nnmaildir--group-ls nnmaildir--cur-server pgname)
+                 files (funcall ls (nnmaildir--tmp grp-dir) 'full "\\`[^.]"
+                                'nosort))
+           (while files
+             (delete-file (car files))
+             (setq files (cdr files)))
+           (delete-directory (nnmaildir--tmp grp-dir))
+           (setq files (funcall ls (nnmaildir--new grp-dir) 'full "\\`[^.]"
+                                'nosort))
+           (while files
+             (delete-file (car files))
+             (setq files (cdr files)))
+           (delete-directory (nnmaildir--new grp-dir))
+           (setq files (funcall ls (nnmaildir--cur grp-dir) 'full "\\`[^.]"
+                                'nosort))
+           (while files
+             (delete-file (car files))
+             (setq files (cdr files)))
+           (delete-directory (nnmaildir--cur grp-dir))))
+       (setq dir (nnmaildir--nndir grp-dir)
+             dirs (cons (nnmaildir--nov-dir dir)
+                        (funcall ls (nnmaildir--marks-dir dir) 'full "\\`[^.]"
+                                 'nosort)))
+       (while dirs
+         (setq dir (car dirs) dirs (cdr dirs)
+               files (funcall ls dir 'full "\\`[^.]" 'nosort))
+         (while files
+           (delete-file (car files))
+           (setq files (cdr files)))
+         (delete-directory dir))
+       (setq dir (nnmaildir--nndir grp-dir))
+       (nnmaildir--unlink (concat dir "markfile"))
+       (nnmaildir--unlink (concat dir "markfile{new}"))
+       (delete-directory (nnmaildir--marks-dir dir))
+       (delete-directory dir)
+       (setq grp-dir (directory-file-name grp-dir)
+             dir (car (file-attributes grp-dir)))
+       (if (eq (aref "/" 0) (aref dir 0)) nil
+         (setq dir (concat (file-truename
+                            (nnmaildir--srv-dir nnmaildir--cur-server))
+                           dir)))
+       (delete-directory dir))
       (nnmaildir--unlink grp-dir)
       t)))
 
 (defun nnmaildir-retrieve-headers (articles &optional gname server fetch-old)
   (let ((group (nnmaildir--prepare server gname))
-        srv-dir dir nlist mlist article num stop nov nlist2 deactivate-mark)
+       srv-dir dir nlist mlist article num stop nov nlist2 deactivate-mark)
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (if gname (concat "No such group: " gname)
-                                    "No current group"))
-        (throw 'return nil))
-      (save-excursion
-        (set-buffer nntp-server-buffer)
-        (erase-buffer)
-        (setq nlist (nnmaildir--grp-get-lists group)
-              mlist (nnmaildir--lists-get-mlist nlist)
-              nlist (nnmaildir--lists-get-nlist nlist)
-              gname (nnmaildir--grp-get-name group)
-              srv-dir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-              dir (nnmaildir--srv-grp-dir srv-dir gname))
-        (cond
-         ((null nlist))
-         ((and fetch-old (not (numberp fetch-old)))
-          (while nlist
-            (setq article (car nlist) nlist (cdr nlist)
-                  nov (nnmaildir--update-nov srv-dir group article))
-            (when nov
-              (nnmaildir--cache-nov group article nov)
-              (setq num (nnmaildir--art-get-num article))
-              (princ num nntp-server-buffer)
-              (insert "\t" (nnmaildir--nov-get-beg nov) "\t"
-                      (nnmaildir--art-get-msgid article) "\t"
-                      (nnmaildir--nov-get-mid nov) "\tXref: nnmaildir " gname
-                      ":")
-              (princ num nntp-server-buffer)
-              (insert "\t" (nnmaildir--nov-get-end nov) "\n")
-              (goto-char (point-min)))))
-         ((null articles))
-         ((stringp (car articles))
-          (while articles
-            (setq article (car articles) articles (cdr articles)
-                  article (nnmaildir--mlist-art mlist article))
-            (when (and article
-                       (setq nov (nnmaildir--update-nov srv-dir group
-                                                        article)))
-              (nnmaildir--cache-nov group article nov)
-              (setq num (nnmaildir--art-get-num article))
-              (princ num nntp-server-buffer)
-              (insert "\t" (nnmaildir--nov-get-beg nov) "\t"
-                      (nnmaildir--art-get-msgid article) "\t"
-                      (nnmaildir--nov-get-mid nov) "\tXref: nnmaildir " gname
-                      ":")
-              (princ num nntp-server-buffer)
-              (insert "\t" (nnmaildir--nov-get-end nov) "\n"))))
-         (t
-          (if fetch-old
-              ;; Assume the article range is sorted ascending
-              (setq stop (car articles)
-                    num  (car (last articles))
-                    stop (if (numberp stop) stop (car stop))
-                    num  (if (numberp num)  num  (cdr num))
-                    stop (- stop fetch-old)
-                    stop (if (< stop 1) 1 stop)
-                    articles (list (cons stop num))))
-          (while articles
-            (setq stop (car articles) articles (cdr articles))
-            (while (eq stop (car articles))
-              (setq articles (cdr articles)))
-            (if (numberp stop) (setq num stop)
-              (setq num (cdr stop) stop (car stop)))
-            (setq nlist2 (nthcdr (- (nnmaildir--art-get-num (car nlist)) num)
-                                 nlist))
-            (while (and nlist2
-                        (setq article (car nlist2)
-                              num (nnmaildir--art-get-num article))
-                        (>= num stop))
-              (setq nlist2 (cdr nlist2)
-                    nov (nnmaildir--update-nov srv-dir group article))
-              (when nov
-                (nnmaildir--cache-nov group article nov)
-                (princ num nntp-server-buffer)
-                (insert "\t" (nnmaildir--nov-get-beg nov) "\t"
-                        (nnmaildir--art-get-msgid article) "\t"
-                        (nnmaildir--nov-get-mid nov) "\tXref: nnmaildir " gname
-                        ":")
-                (princ num nntp-server-buffer)
-                (insert "\t" (nnmaildir--nov-get-end nov) "\n")
-                (goto-char (point-min)))))))
-        (sort-numeric-fields 1 (point-min) (point-max))
-        'nov))))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (if gname (concat "No such group: " gname) "No current group"))
+       (throw 'return nil))
+      (nnmaildir--with-nntp-buffer
+       (erase-buffer)
+       (setq nlist (nnmaildir--grp-lists group)
+             mlist (nnmaildir--lists-mlist nlist)
+             nlist (nnmaildir--lists-nlist nlist)
+             gname (nnmaildir--grp-name group)
+             srv-dir (nnmaildir--srv-dir nnmaildir--cur-server)
+             dir (nnmaildir--srvgrp-dir srv-dir gname))
+       (cond
+        ((null nlist))
+        ((and fetch-old (not (numberp fetch-old)))
+         (while nlist
+           (setq article (car nlist) nlist (cdr nlist)
+                 nov (nnmaildir--update-nov nnmaildir--cur-server group
+                                            article))
+           (when nov
+             (nnmaildir--cache-nov group article nov)
+             (setq num (nnmaildir--art-num article))
+             (princ num nntp-server-buffer)
+             (insert "\t" (nnmaildir--nov-get-beg nov) "\t"
+                     (nnmaildir--art-msgid article) "\t"
+                     (nnmaildir--nov-get-mid nov) "\tXref: nnmaildir " gname
+                     ":")
+             (princ num nntp-server-buffer)
+             (insert "\t" (nnmaildir--nov-get-end nov) "\n")
+             (goto-char (point-min)))))
+        ((null articles))
+        ((stringp (car articles))
+         (while articles
+           (setq article (car articles) articles (cdr articles)
+                 article (nnmaildir--mlist-art mlist article))
+           (when (and article
+                      (setq nov (nnmaildir--update-nov nnmaildir--cur-server
+                                                       group article)))
+             (nnmaildir--cache-nov group article nov)
+             (setq num (nnmaildir--art-num article))
+             (princ num nntp-server-buffer)
+             (insert "\t" (nnmaildir--nov-get-beg nov) "\t"
+                     (nnmaildir--art-msgid article) "\t"
+                     (nnmaildir--nov-get-mid nov) "\tXref: nnmaildir " gname
+                     ":")
+             (princ num nntp-server-buffer)
+             (insert "\t" (nnmaildir--nov-get-end nov) "\n"))))
+        (t
+         (if fetch-old
+             ;; Assume the article range is sorted ascending
+             (setq stop (car articles)
+                   num  (car (last articles))
+                   stop (if (numberp stop) stop (car stop))
+                   num  (if (numberp num)  num  (cdr num))
+                   stop (- stop fetch-old)
+                   stop (if (< stop 1) 1 stop)
+                   articles (list (cons stop num))))
+         (while articles
+           (setq stop (car articles) articles (cdr articles))
+           (while (eq stop (car articles))
+             (setq articles (cdr articles)))
+           (if (numberp stop) (setq num stop)
+             (setq num (cdr stop) stop (car stop)))
+           (setq nlist2 (nthcdr (- (nnmaildir--art-num (car nlist)) num)
+                                nlist))
+           (while (and nlist2
+                       (setq article (car nlist2)
+                             num (nnmaildir--art-num article))
+                       (>= num stop))
+             (setq nlist2 (cdr nlist2)
+                   nov (nnmaildir--update-nov nnmaildir--cur-server group
+                                              article))
+             (when nov
+               (nnmaildir--cache-nov group article nov)
+               (princ num nntp-server-buffer)
+               (insert "\t" (nnmaildir--nov-get-beg nov) "\t"
+                       (nnmaildir--art-msgid article) "\t"
+                       (nnmaildir--nov-get-mid nov) "\tXref: nnmaildir " gname
+                       ":")
+               (princ num nntp-server-buffer)
+               (insert "\t" (nnmaildir--nov-get-end nov) "\n")
+               (goto-char (point-min)))))))
+       (sort-numeric-fields 1 (point-min) (point-max))
+       'nov))))
 
 (defun nnmaildir-request-article (num-msgid &optional gname server to-buffer)
   (let ((group (nnmaildir--prepare server gname))
-        (case-fold-search t)
-        list article suffix dir deactivate-mark)
+       (case-fold-search t)
+       list article suffix dir pgname deactivate-mark)
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (if gname (concat "No such group: " gname)
-                                    "No current group"))
-        (throw 'return nil))
-      (setq list (nnmaildir--grp-get-lists group))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (if gname (concat "No such group: " gname) "No current group"))
+       (throw 'return nil))
+      (setq list (nnmaildir--grp-lists group))
       (if (numberp num-msgid)
-          (setq list (nnmaildir--lists-get-nlist list)
-                article (nnmaildir--nlist-art list num-msgid))
-        (setq list (nnmaildir--lists-get-mlist list)
-              article (nnmaildir--mlist-art list num-msgid))
-        (if article (setq num-msgid (nnmaildir--art-get-num article))
-          (catch 'found
-            (mapatoms
+         (setq list (nnmaildir--lists-nlist list)
+               article (nnmaildir--nlist-art list num-msgid))
+       (setq list (nnmaildir--lists-mlist list)
+             article (nnmaildir--mlist-art list num-msgid))
+       (if article (setq num-msgid (nnmaildir--art-num article))
+         (catch 'found
+           (mapatoms
               (lambda (grp)
                 (setq group (symbol-value grp)
-                      list (nnmaildir--grp-get-lists group)
-                      list (nnmaildir--lists-get-mlist list)
+                      list (nnmaildir--grp-lists group)
+                      list (nnmaildir--lists-mlist list)
                       article (nnmaildir--mlist-art list num-msgid))
                 (when article
-                  (setq num-msgid (nnmaildir--art-get-num article))
+                  (setq num-msgid (nnmaildir--art-num article))
                   (throw 'found nil)))
-              (nnmaildir--srv-get-groups nnmaildir--cur-server)))))
+              (nnmaildir--srv-groups nnmaildir--cur-server)))))
       (if article nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server "No such article")
-        (throw 'return nil))
-      (if (stringp (setq suffix (nnmaildir--art-get-suffix article))) nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server "Article has expired")
-        (throw 'return nil))
-      (setq gname (nnmaildir--grp-get-name group)
-            dir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            dir (nnmaildir--srv-grp-dir dir gname)
-            group (if (nnmaildir--param (nnmaildir--grp-get-pname group)
-                                        'read-only)
-                      (nnmaildir--new dir) (nnmaildir--cur dir))
-            nnmaildir-article-file-name (concat group
-                                                (nnmaildir--art-get-prefix
-                                                  article)
-                                                suffix))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server) "No such article")
+       (throw 'return nil))
+      (if (stringp (setq suffix (nnmaildir--art-suffix article))) nil
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             "Article has expired")
+       (throw 'return nil))
+      (setq gname (nnmaildir--grp-name group)
+           pgname (nnmaildir--pgname nnmaildir--cur-server gname)
+           dir (nnmaildir--srv-dir nnmaildir--cur-server)
+           dir (nnmaildir--srvgrp-dir dir gname)
+           group (if (nnmaildir--param pgname 'read-only)
+                     (nnmaildir--new dir) (nnmaildir--cur dir))
+           nnmaildir-article-file-name (concat group
+                                               (nnmaildir--art-prefix
+                                                article)
+                                               suffix))
       (if (file-exists-p nnmaildir-article-file-name) nil
-        (nnmaildir--art-set-suffix article 'expire)
-        (nnmaildir--art-set-nov article nil)
-        (nnmaildir--srv-set-error nnmaildir--cur-server "Article has expired")
-        (throw 'return nil))
+       (setf (nnmaildir--art-suffix article) 'expire)
+       (setf (nnmaildir--art-nov    article) nil)
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             "Article has expired")
+       (throw 'return nil))
       (save-excursion
-        (set-buffer (or to-buffer nntp-server-buffer))
-        (erase-buffer)
-        (nnheader-insert-file-contents nnmaildir-article-file-name))
+       (set-buffer (or to-buffer nntp-server-buffer))
+       (erase-buffer)
+       (nnheader-insert-file-contents nnmaildir-article-file-name))
       (cons gname num-msgid))))
 
 (defun nnmaildir-request-post (&optional server)
@@ -1249,426 +1200,419 @@ by nnmaildir-request-article.")
 
 (defun nnmaildir-request-replace-article (article gname buffer)
   (let ((group (nnmaildir--prepare nil gname))
-        (coding-system-for-write nnheader-file-coding-system)
-        (buffer-file-coding-system nil)
-        (file-coding-system-alist nil)
-        file dir suffix tmpfile deactivate-mark)
+       (coding-system-for-write nnheader-file-coding-system)
+       (buffer-file-coding-system nil)
+       (file-coding-system-alist nil)
+       file dir suffix tmpfile deactivate-mark)
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "No such group: " gname))
-        (throw 'return nil))
-      (when (nnmaildir--param (nnmaildir--grp-get-pname group) 'read-only)
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "Read-only group: " group))
-        (throw 'return nil))
-      (setq dir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            dir (nnmaildir--srv-grp-dir dir gname)
-            file (nnmaildir--grp-get-lists group)
-            file (nnmaildir--lists-get-nlist file)
-            file (nnmaildir--nlist-art file article))
-      (if (and file (stringp (setq suffix (nnmaildir--art-get-suffix file))))
-          nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (format "No such article: %d" article))
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "No such group: " gname))
+       (throw 'return nil))
+      (when (nnmaildir--param (nnmaildir--pgname nnmaildir--cur-server gname)
+                             'read-only)
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "Read-only group: " group))
+       (throw 'return nil))
+      (setq dir (nnmaildir--srv-dir nnmaildir--cur-server)
+           dir (nnmaildir--srvgrp-dir dir gname)
+           file (nnmaildir--grp-lists group)
+           file (nnmaildir--lists-nlist file)
+           file (nnmaildir--nlist-art file article))
+      (if (and file (stringp (setq suffix (nnmaildir--art-suffix file))))
+         nil
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (format "No such article: %d" article))
+       (throw 'return nil))
       (save-excursion
-        (set-buffer buffer)
-        (setq article file
-              file (nnmaildir--art-get-prefix article)
-              tmpfile (concat (nnmaildir--tmp dir) file))
-        (when (file-exists-p tmpfile)
-          (nnmaildir--srv-set-error nnmaildir--cur-server
-                                    (concat "File exists: " tmpfile))
-          (throw 'return nil))
-        (write-region (point-min) (point-max) tmpfile nil 'no-message nil
-                      'confirm-overwrite)) ;; error would be preferred :(
+       (set-buffer buffer)
+       (setq article file
+             file (nnmaildir--art-prefix article)
+             tmpfile (concat (nnmaildir--tmp dir) file))
+       (when (file-exists-p tmpfile)
+         (setf (nnmaildir--srv-error nnmaildir--cur-server)
+               (concat "File exists: " tmpfile))
+         (throw 'return nil))
+       (write-region (point-min) (point-max) tmpfile nil 'no-message nil
+                     'confirm-overwrite)) ;; error would be preferred :(
       (unix-sync) ;; no fsync :(
       (rename-file tmpfile (concat (nnmaildir--cur dir) file suffix) 'replace)
       t)))
 
 (defun nnmaildir-request-move-article (article gname server accept-form
-                                       &optional last)
+                                              &optional last)
   (let ((group (nnmaildir--prepare server gname))
-        pgname list suffix result nnmaildir--file deactivate-mark)
+       pgname list suffix result nnmaildir--file deactivate-mark)
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "No such group: " gname))
-        (throw 'return nil))
-      (setq gname (nnmaildir--grp-get-name group)
-            pgname (nnmaildir--grp-get-pname group)
-            list (nnmaildir--grp-get-lists group)
-            list (nnmaildir--lists-get-nlist list)
-            article (nnmaildir--nlist-art list article))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "No such group: " gname))
+       (throw 'return nil))
+      (setq gname (nnmaildir--grp-name group)
+           pgname (nnmaildir--pgname nnmaildir--cur-server gname)
+           list (nnmaildir--grp-lists group)
+           list (nnmaildir--lists-nlist list)
+           article (nnmaildir--nlist-art list article))
       (if article nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server "No such article")
-        (throw 'return nil))
-      (if (stringp (setq suffix (nnmaildir--art-get-suffix article))) nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server "Article has expired")
-        (throw 'return nil))
-      (setq nnmaildir--file (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            nnmaildir--file (nnmaildir--srv-grp-dir nnmaildir--file gname)
-            nnmaildir--file (if (nnmaildir--param pgname 'read-only)
-                                (nnmaildir--new nnmaildir--file)
-                              (nnmaildir--cur nnmaildir--file))
-            nnmaildir--file (concat nnmaildir--file
-                                    (nnmaildir--art-get-prefix article)
-                                    suffix))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server) "No such article")
+       (throw 'return nil))
+      (if (stringp (setq suffix (nnmaildir--art-suffix article))) nil
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             "Article has expired")
+       (throw 'return nil))
+      (setq nnmaildir--file (nnmaildir--srv-dir nnmaildir--cur-server)
+           nnmaildir--file (nnmaildir--srvgrp-dir nnmaildir--file gname)
+           nnmaildir--file (if (nnmaildir--param pgname 'read-only)
+                               (nnmaildir--new nnmaildir--file)
+                             (nnmaildir--cur nnmaildir--file))
+           nnmaildir--file (concat nnmaildir--file
+                                   (nnmaildir--art-prefix article)
+                                   suffix))
       (if (file-exists-p nnmaildir--file) nil
-        (nnmaildir--art-set-suffix article 'expire)
-        (nnmaildir--art-set-nov article nil)
-        (nnmaildir--srv-set-error nnmaildir--cur-server "Article has expired")
-        (throw 'return nil))
-      (save-excursion
-        (set-buffer (get-buffer-create " *nnmaildir move*"))
-        (erase-buffer)
-        (nnheader-insert-file-contents nnmaildir--file)
-        (setq result (eval accept-form)))
+       (setf (nnmaildir--art-suffix article) 'expire)
+       (setf (nnmaildir--art-nov    article) nil)
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             "Article has expired")
+       (throw 'return nil))
+      (nnmaildir--with-move-buffer
+       (erase-buffer)
+       (nnheader-insert-file-contents nnmaildir--file)
+       (setq result (eval accept-form)))
       (if (or (null result) (nnmaildir--param pgname 'read-only)) nil
-        (nnmaildir--unlink nnmaildir--file)
-        (nnmaildir--art-set-suffix article 'expire)
-        (nnmaildir--art-set-nov article nil))
+       (nnmaildir--unlink nnmaildir--file)
+       (setf (nnmaildir--art-suffix article) 'expire)
+       (setf (nnmaildir--art-nov    article) nil))
       result)))
 
 (defun nnmaildir-request-accept-article (gname &optional server last)
   (let ((group (nnmaildir--prepare server gname))
-        (coding-system-for-write nnheader-file-coding-system)
-        (buffer-file-coding-system nil)
-        (file-coding-system-alist nil)
-        srv-dir dir file tmpfile curfile 24h num article)
+       (coding-system-for-write nnheader-file-coding-system)
+       (buffer-file-coding-system nil)
+       (file-coding-system-alist nil)
+       srv-dir dir file tmpfile curfile 24h num article)
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "No such group: " gname))
-        (throw 'return nil))
-      (setq gname (nnmaildir--grp-get-name group))
-      (when (nnmaildir--param (nnmaildir--grp-get-pname group) 'read-only)
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "Read-only group: " gname))
-        (throw 'return nil))
-      (setq srv-dir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            dir (nnmaildir--srv-grp-dir srv-dir gname)
-            file (format-time-string "%s" nil))
-      (if (string= nnmaildir--delivery-time file) nil
-        (setq nnmaildir--delivery-time file
-              nnmaildir--delivery-ct 0))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "No such group: " gname))
+       (throw 'return nil))
+      (setq gname (nnmaildir--grp-name group))
+      (when (nnmaildir--param (nnmaildir--pgname nnmaildir--cur-server gname)
+                             'read-only)
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "Read-only group: " gname))
+       (throw 'return nil))
+      (setq srv-dir (nnmaildir--srv-dir nnmaildir--cur-server)
+           dir (nnmaildir--srvgrp-dir srv-dir gname)
+           file (format-time-string "%s" nil))
+      (if (string-equal nnmaildir--delivery-time file) nil
+       (setq nnmaildir--delivery-time file
+             nnmaildir--delivery-ct 0))
       (setq file (concat file "." nnmaildir--delivery-pid))
       (if (zerop nnmaildir--delivery-ct) nil
-        (setq file (concat file "_"
-                           (number-to-string nnmaildir--delivery-ct))))
+       (setq file (concat file "_"
+                          (number-to-string nnmaildir--delivery-ct))))
       (setq file (concat file "." (system-name))
-            tmpfile (concat (nnmaildir--tmp dir) file)
-            curfile (concat (nnmaildir--cur dir) file ":2,"))
+           tmpfile (concat (nnmaildir--tmp dir) file)
+           curfile (concat (nnmaildir--cur dir) file ":2,"))
       (when (file-exists-p tmpfile)
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "File exists: " tmpfile))
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "File exists: " tmpfile))
+       (throw 'return nil))
       (when (file-exists-p curfile)
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "File exists: " curfile))
-        (throw 'return nil))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "File exists: " curfile))
+       (throw 'return nil))
       (setq nnmaildir--delivery-ct (1+ nnmaildir--delivery-ct)
-            24h (run-with-timer 86400 nil
-                                (lambda ()
-                                  (nnmaildir--unlink tmpfile)
-                                  (nnmaildir--srv-set-error
-                                    nnmaildir--cur-server
-                                    "24-hour timer expired")
-                                  (throw 'return nil))))
+           24h (run-with-timer 86400 nil
+                               (lambda ()
+                                 (nnmaildir--unlink tmpfile)
+                                 (setf (nnmaildir--srv-error
+                                         nnmaildir--cur-server)
+                                       "24-hour timer expired")
+                                 (throw 'return nil))))
       (condition-case nil
-          (add-name-to-file nnmaildir--file tmpfile)
-        (error
-         (write-region (point-min) (point-max) tmpfile nil 'no-message nil
-                       'confirm-overwrite) ;; error would be preferred :(
-         (unix-sync))) ;; no fsync :(
+         (add-name-to-file nnmaildir--file tmpfile)
+       (error
+        (write-region (point-min) (point-max) tmpfile nil 'no-message nil
+                      'confirm-overwrite) ;; error would be preferred :(
+        (unix-sync))) ;; no fsync :(
       (cancel-timer 24h)
       (condition-case err
-          (add-name-to-file tmpfile curfile)
-        (error
-         (nnmaildir--srv-set-error nnmaildir--cur-server
-                                   (concat "Error linking: "
-                                           (prin1-to-string err)))
-         (nnmaildir--unlink tmpfile)
-         (throw 'return nil)))
+         (add-name-to-file tmpfile curfile)
+       (error
+        (setf (nnmaildir--srv-error nnmaildir--cur-server)
+              (concat "Error linking: " (prin1-to-string err)))
+        (nnmaildir--unlink tmpfile)
+        (throw 'return nil)))
       (nnmaildir--unlink tmpfile)
-      (setq article (nnmaildir--art-new)
-            num (nnmaildir--grp-get-lists group)
-            num (nnmaildir--lists-get-nlist num)
-            num (1+ (nnmaildir--nlist-last-num num)))
-      (nnmaildir--art-set-prefix article file)
-      (nnmaildir--art-set-suffix article ":2,")
-      (nnmaildir--art-set-num article num)
-      (if (nnmaildir--grp-add-art srv-dir group article) (cons gname num)))))
+      (setq num (nnmaildir--grp-lists group)
+           num (nnmaildir--lists-nlist num)
+           num (1+ (nnmaildir--nlist-last-num num))
+           article (make-nnmaildir--art :prefix file :suffix ":2," :num num))
+      (if (nnmaildir--grp-add-art nnmaildir--cur-server group article)
+         (cons gname num)))))
 
 (defun nnmaildir-save-mail (group-art)
   (catch 'return
     (if group-art nil
       (throw 'return nil))
     (let ((ret group-art)
-          ga gname x groups nnmaildir--file deactivate-mark)
+         ga gname x groups nnmaildir--file deactivate-mark)
       (save-excursion
-        (goto-char (point-min))
-        (save-match-data
-          (while (looking-at "From ")
-            (replace-match "X-From-Line: ")
-            (forward-line 1))))
-      (setq groups (nnmaildir--srv-get-groups nnmaildir--cur-server)
-            ga (car group-art) group-art (cdr group-art)
-            gname (car ga))
+       (goto-char (point-min))
+       (save-match-data
+         (while (looking-at "From ")
+           (replace-match "X-From-Line: ")
+           (forward-line 1))))
+      (setq groups (nnmaildir--srv-groups nnmaildir--cur-server)
+           ga (car group-art) group-art (cdr group-art)
+           gname (car ga))
       (or (intern-soft gname groups)
-          (nnmaildir-request-create-group gname)
-          (throw 'return nil)) ;; not that nnmail bothers to check :(
+         (nnmaildir-request-create-group gname)
+         (throw 'return nil)) ;; not that nnmail bothers to check :(
       (if (nnmaildir-request-accept-article gname) nil
-        (throw 'return nil))
+       (throw 'return nil))
       (setq x (nnmaildir--prepare nil gname)
-            nnmaildir--file (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            nnmaildir--file (concat nnmaildir--file
-                                    (nnmaildir--grp-get-name x))
-            nnmaildir--file (file-name-as-directory nnmaildir--file)
-            x (nnmaildir--grp-get-lists x)
-            x (nnmaildir--lists-get-nlist x)
-            x (car x)
-            nnmaildir--file (concat nnmaildir--file
-                                    (nnmaildir--art-get-prefix x)
-                                    (nnmaildir--art-get-suffix x)))
+           nnmaildir--file (nnmaildir--srv-dir nnmaildir--cur-server)
+           nnmaildir--file (nnmaildir--subdir nnmaildir--file
+                                               (nnmaildir--grp-name x))
+           x (nnmaildir--grp-lists x)
+           x (nnmaildir--lists-nlist x)
+           x (car x)
+           nnmaildir--file (concat nnmaildir--file
+                                   (nnmaildir--art-prefix x)
+                                   (nnmaildir--art-suffix x)))
       (while group-art
-        (setq ga (car group-art) group-art (cdr group-art)
-              gname (car ga))
-        (if (and (or (intern-soft gname groups)
-                     (nnmaildir-request-create-group gname))
-                 (nnmaildir-request-accept-article gname)) nil
-          (setq ret (delq ga ret)))) ;; We'll still try the other groups
+       (setq ga (car group-art) group-art (cdr group-art)
+             gname (car ga))
+       (if (and (or (intern-soft gname groups)
+                    (nnmaildir-request-create-group gname))
+                (nnmaildir-request-accept-article gname)) nil
+         (setq ret (delq ga ret)))) ;; We'll still try the other groups
       ret)))
 
 (defun nnmaildir-active-number (group)
   (let ((x (nnmaildir--prepare nil group)))
     (catch 'return
       (if x nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "No such group: " group))
-        (throw 'return nil))
-      (setq x (nnmaildir--grp-get-lists x)
-            x (nnmaildir--lists-get-nlist x))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "No such group: " group))
+       (throw 'return nil))
+      (setq x (nnmaildir--grp-lists x)
+           x (nnmaildir--lists-nlist x))
       (if x
-          (setq x (car x)
-                x (nnmaildir--art-get-num x)
-                x (1+ x))
-        1))))
+         (setq x (car x)
+               x (nnmaildir--art-num x)
+               x (1+ x))
+       1))))
 
 (defun nnmaildir-request-expire-articles (ranges &optional gname server force)
   (let ((no-force (not force))
-        (group (nnmaildir--prepare server gname))
-        pgname time boundary time-iter bound-iter high low target dir nlist
-        stop number article didnt suffix nnmaildir--file
-        nnmaildir-article-file-name deactivate-mark)
+       (group (nnmaildir--prepare server gname))
+       pgname time boundary time-iter bound-iter high low target dir nlist
+       stop number article didnt suffix nnmaildir--file
+       nnmaildir-article-file-name deactivate-mark)
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (if gname (concat "No such group: " gname)
-                                    "No current group"))
-        (throw 'return (gnus-uncompress-range ranges)))
-      (setq gname (nnmaildir--grp-get-name group)
-            pgname (nnmaildir--grp-get-pname group))
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (if gname (concat "No such group: " gname) "No current group"))
+       (throw 'return (gnus-uncompress-range ranges)))
+      (setq gname (nnmaildir--grp-name group)
+           pgname (nnmaildir--pgname nnmaildir--cur-server gname))
       (if (nnmaildir--param pgname 'read-only)
-          (throw 'return (gnus-uncompress-range ranges)))
-      (setq time (or (nnmaildir--param pgname 'expire-age) 604800))
+         (throw 'return (gnus-uncompress-range ranges)))
+      (setq time (or (nnmaildir--param pgname 'expire-age)
+                    (* 86400 ;; seconds per day
+                       (or (and nnmail-expiry-wait-function
+                                (funcall nnmail-expiry-wait-function gname))
+                           nnmail-expiry-wait))))
       (if (or force (integerp time)) nil
-        (throw 'return (gnus-uncompress-range ranges)))
+       (throw 'return (gnus-uncompress-range ranges)))
       (setq boundary (current-time)
-            high (- (car boundary) (/ time 65536))
-            low (- (cadr boundary) (% time 65536)))
+           high (- (car boundary) (/ time 65536))
+           low (- (cadr boundary) (% time 65536)))
       (if (< low 0)
-          (setq low (+ low 65536)
-                high (1- high)))
+         (setq low (+ low 65536)
+               high (1- high)))
       (setcar (cdr boundary) low)
       (setcar boundary high)
-      (setq dir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            dir (nnmaildir--srv-grp-dir dir gname)
-            dir (nnmaildir--cur dir)
-            nlist (nnmaildir--grp-get-lists group)
-            nlist (nnmaildir--lists-get-nlist nlist)
-            ranges (reverse ranges))
-      (save-excursion
-        (set-buffer (get-buffer-create " *nnmaildir move*"))
-        (while ranges
-          (setq number (car ranges) ranges (cdr ranges))
-          (while (eq number (car ranges))
-            (setq ranges (cdr ranges)))
-          (if (numberp number) (setq stop number)
-            (setq stop (car number) number (cdr number)))
-          (setq nlist (nthcdr (- (nnmaildir--art-get-num (car nlist)) number)
-                              nlist))
-          (while (and nlist
-                      (setq article (car nlist)
-                            number (nnmaildir--art-get-num article))
-                      (>= number stop))
-            (setq nlist (cdr nlist)
-                  suffix (nnmaildir--art-get-suffix article))
-            (catch 'continue
-              (if (stringp suffix) nil
-                (nnmaildir--art-set-suffix article 'expire)
-                (nnmaildir--art-set-nov article nil)
-                (throw 'continue nil))
-              (setq nnmaildir--file (nnmaildir--art-get-prefix article)
-                    nnmaildir--file (concat dir nnmaildir--file suffix)
-                    time (file-attributes nnmaildir--file))
-              (if time nil
-                (nnmaildir--art-set-suffix article 'expire)
-                (nnmaildir--art-set-nov article nil)
-                (throw 'continue nil))
-              (setq time (nth 5 time)
-                    time-iter time
-                    bound-iter boundary)
-              (if (and no-force
-                       (progn
-                         (while (and bound-iter time-iter
-                                     (= (car bound-iter) (car time-iter)))
-                           (setq bound-iter (cdr bound-iter)
-                                 time-iter (cdr time-iter)))
-                         (and bound-iter time-iter
-                              (car-less-than-car bound-iter time-iter))))
-                  (setq didnt (cons number didnt))
-                (save-excursion
-                  (setq nnmaildir-article-file-name nnmaildir--file
-                        target (nnmaildir--param pgname 'expire-group)))
-                (when (and (stringp target)
-                           (not (string-equal target pgname))) ;; Move it.
-                  (erase-buffer)
-                  (nnheader-insert-file-contents nnmaildir--file)
-                  (gnus-request-accept-article target nil nil 'no-encode))
-                (if (equal target pgname)
-                    (setq didnt (cons number didnt)) ;; Leave it here.
-                  (nnmaildir--unlink nnmaildir--file)
-                  (nnmaildir--art-set-suffix article 'expire)
-                  (nnmaildir--art-set-nov article nil))))))
-        (erase-buffer))
+      (setq dir (nnmaildir--srv-dir nnmaildir--cur-server)
+           dir (nnmaildir--srvgrp-dir dir gname)
+           dir (nnmaildir--cur dir)
+           nlist (nnmaildir--grp-lists group)
+           nlist (nnmaildir--lists-nlist nlist)
+           ranges (reverse ranges))
+      (nnmaildir--with-move-buffer
+       (while ranges
+         (setq number (car ranges) ranges (cdr ranges))
+         (while (eq number (car ranges))
+           (setq ranges (cdr ranges)))
+         (if (numberp number) (setq stop number)
+           (setq stop (car number) number (cdr number)))
+         (setq nlist (nthcdr (- (nnmaildir--art-num (car nlist)) number)
+                             nlist))
+         (while (and nlist
+                     (setq article (car nlist)
+                           number (nnmaildir--art-num article))
+                     (>= number stop))
+           (setq nlist (cdr nlist)
+                 suffix (nnmaildir--art-suffix article))
+           (catch 'continue
+             (if (stringp suffix) nil
+               (setf (nnmaildir--art-suffix article) 'expire)
+               (setf (nnmaildir--art-nov    article) nil)
+               (throw 'continue nil))
+             (setq nnmaildir--file (nnmaildir--art-prefix article)
+                   nnmaildir--file (concat dir nnmaildir--file suffix)
+                   time (file-attributes nnmaildir--file))
+             (if time nil
+               (setf (nnmaildir--art-suffix article) 'expire)
+               (setf (nnmaildir--art-nov    article) nil)
+               (throw 'continue nil))
+             (setq time (nth 5 time)
+                   time-iter time
+                   bound-iter boundary)
+             (if (and no-force
+                      (progn
+                        (while (and bound-iter time-iter
+                                    (= (car bound-iter) (car time-iter)))
+                          (setq bound-iter (cdr bound-iter)
+                                time-iter (cdr time-iter)))
+                        (and bound-iter time-iter
+                             (car-less-than-car bound-iter time-iter))))
+                 (setq didnt (cons number didnt))
+               (save-excursion
+                 (setq nnmaildir-article-file-name nnmaildir--file
+                       target (nnmaildir--param pgname 'expire-group)))
+               (when (and (stringp target)
+                          (not (string-equal target pgname))) ;; Move it.
+                 (erase-buffer)
+                 (nnheader-insert-file-contents nnmaildir--file)
+                 (gnus-request-accept-article target nil nil 'no-encode))
+               (if (equal target pgname)
+                   (setq didnt (cons number didnt)) ;; Leave it here.
+                 (nnmaildir--unlink nnmaildir--file)
+                 (setf (nnmaildir--art-suffix article) 'expire)
+                 (setf (nnmaildir--art-nov    article) nil))))))
+       (erase-buffer))
       didnt)))
 
 (defun nnmaildir-request-set-mark (gname actions &optional server)
   (let ((group (nnmaildir--prepare server gname))
-        (coding-system-for-write nnheader-file-coding-system)
-        (buffer-file-coding-system nil)
-        (file-coding-system-alist nil)
-        del-mark add-marks marksdir markfile action group-nlist nlist ranges
-        begin end article all-marks todo-marks did-marks marks form mdir mfile
-        deactivate-mark)
+       (coding-system-for-write nnheader-file-coding-system)
+       (buffer-file-coding-system nil)
+       (file-coding-system-alist nil)
+       del-mark add-marks marksdir markfile action group-nlist nlist ranges
+       begin end article all-marks todo-marks did-marks marks form mdir mfile
+       pgname ls markfilenew deactivate-mark)
     (setq del-mark
-          (lambda ()
-            (setq mfile (car marks)
-                  mfile (symbol-name mfile)
-                  mfile (concat marksdir mfile)
-                  mfile (file-name-as-directory mfile)
-                  mfile (concat mfile (nnmaildir--art-get-prefix article)))
-            (nnmaildir--unlink mfile))
-          add-marks
-          (lambda ()
-            (while marks
-              (setq mdir (concat marksdir (symbol-name (car marks)))
-                    mfile (concat (file-name-as-directory mdir)
-                                  (nnmaildir--art-get-prefix article)))
-              (if (memq (car marks) did-marks) nil
-                (nnmaildir--mkdir mdir)
-                (setq did-marks (cons (car marks) did-marks)))
-              (if (file-exists-p mfile) nil
-                (condition-case nil
-                    (add-name-to-file markfile mfile)
-                  (file-error ;; too many links, probably
-                   (if (file-exists-p mfile) nil
-                     (nnmaildir--unlink markfile)
-                     (write-region "" nil markfile nil 'no-message)
-                     (add-name-to-file markfile mfile
-                                       'ok-if-already-exists)))))
-              (setq marks (cdr marks)))))
+         (lambda ()
+           (setq mfile (nnmaildir--subdir marksdir (symbol-name (car marks)))
+                 mfile (concat mfile (nnmaildir--art-prefix article)))
+           (nnmaildir--unlink mfile))
+         add-marks
+         (lambda ()
+           (while marks
+             (setq mdir (nnmaildir--subdir marksdir (symbol-name (car marks)))
+                   mfile (concat mdir (nnmaildir--art-prefix article)))
+             (if (memq (car marks) did-marks) nil
+               (nnmaildir--mkdir mdir)
+               (setq did-marks (cons (car marks) did-marks)))
+             (if (file-exists-p mfile) nil
+               (condition-case nil
+                   (add-name-to-file markfile mfile)
+                 (file-error
+                  (if (file-exists-p mfile) nil
+                     ;; too many links, maybe
+                    (write-region "" nil markfilenew nil 'no-message)
+                    (add-name-to-file markfilenew mfile 'ok-if-already-exists)
+                     (rename-file markfilenew markfile 'replace)))))
+             (setq marks (cdr marks)))))
     (catch 'return
       (if group nil
-        (nnmaildir--srv-set-error nnmaildir--cur-server
-                                  (concat "No such group: " gname))
-        (while actions
-          (setq ranges (gnus-range-add ranges (caar actions))
-                actions (cdr actions)))
-        (throw 'return ranges))
-      (setq group-nlist (nnmaildir--grp-get-lists group)
-            group-nlist (nnmaildir--lists-get-nlist group-nlist)
-            marksdir (nnmaildir--srv-get-dir nnmaildir--cur-server)
-            marksdir (nnmaildir--srv-grp-dir marksdir gname)
-            marksdir (nnmaildir--nndir marksdir)
-            markfile (concat marksdir "markfile")
-            marksdir (concat marksdir "marks")
-            marksdir (file-name-as-directory marksdir)
-            gname (nnmaildir--grp-get-name group)
-            all-marks (nnmaildir--grp-get-pname group)
-            all-marks (or (nnmaildir--param all-marks 'directory-files)
-                          (nnmaildir--srv-get-ls nnmaildir--cur-server))
-            all-marks (funcall all-marks marksdir nil "\\`[^.]" 'nosort)
-            marks all-marks)
+       (setf (nnmaildir--srv-error nnmaildir--cur-server)
+             (concat "No such group: " gname))
+       (while actions
+         (setq ranges (gnus-range-add ranges (caar actions))
+               actions (cdr actions)))
+       (throw 'return ranges))
+      (setq group-nlist (nnmaildir--grp-lists group)
+           group-nlist (nnmaildir--lists-nlist group-nlist)
+           marksdir (nnmaildir--srv-dir nnmaildir--cur-server)
+           marksdir (nnmaildir--srvgrp-dir marksdir gname)
+           marksdir (nnmaildir--nndir marksdir)
+           markfile (concat marksdir "markfile")
+           markfilenew (concat markfile "{new}")
+           marksdir (nnmaildir--marks-dir marksdir)
+           gname (nnmaildir--grp-name group)
+            pgname (nnmaildir--pgname nnmaildir--cur-server gname)
+            ls (nnmaildir--group-ls nnmaildir--cur-server pgname)
+           all-marks (funcall ls marksdir nil "\\`[^.]" 'nosort)
+           marks all-marks)
       (while marks
-        (setcar marks (intern (car marks)))
-        (setq marks (cdr marks)))
+       (setcar marks (intern (car marks)))
+       (setq marks (cdr marks)))
       (while actions
-        (setq action (car actions) actions (cdr actions)
-              nlist group-nlist
-              ranges (car action)
-              todo-marks (caddr action)
-              marks todo-marks)
-        (while marks
-          (if (memq (car marks) all-marks) nil
-            (setq all-marks (cons (car marks) all-marks)))
-          (setq marks (cdr marks)))
-        (setq form
-              (cond
-               ((eq 'del (cadr action))
-                '(while marks
-                   (funcall del-mark)
-                   (setq marks (cdr marks))))
-               ((eq 'add (cadr action)) '(funcall add-marks))
-               (t
-                '(progn
-                   (funcall add-marks)
-                   (setq marks all-marks)
-                   (while marks
-                     (if (memq (car marks) todo-marks) nil
-                       (funcall del-mark))
-                     (setq marks (cdr marks)))))))
-        (if (numberp (cdr ranges)) (setq ranges (list ranges))
-          (setq ranges (reverse ranges)))
-        (while ranges
-          (setq begin (car ranges) ranges (cdr ranges))
-          (while (eq begin (car ranges))
-            (setq ranges (cdr ranges)))
-          (if (numberp begin) (setq end begin)
-            (setq end (cdr begin) begin (car begin)))
-          (setq nlist (nthcdr (- (nnmaildir--art-get-num (car nlist)) end)
-                              nlist))
-          (while (and nlist
-                      (setq article (car nlist))
-                      (>= (nnmaildir--art-get-num article) begin))
-            (setq nlist (cdr nlist))
-            (when (stringp (nnmaildir--art-get-suffix article))
-              (setq marks todo-marks)
-              (eval form)))))
+       (setq action (car actions) actions (cdr actions)
+             nlist group-nlist
+             ranges (car action)
+             todo-marks (caddr action)
+             marks todo-marks)
+       (while marks
+         (if (memq (car marks) all-marks) nil
+           (setq all-marks (cons (car marks) all-marks)))
+         (setq marks (cdr marks)))
+       (setq form
+             (cond
+              ((eq 'del (cadr action))
+               '(while marks
+                  (funcall del-mark)
+                  (setq marks (cdr marks))))
+              ((eq 'add (cadr action)) '(funcall add-marks))
+              (t
+               '(progn
+                  (funcall add-marks)
+                  (setq marks all-marks)
+                  (while marks
+                    (if (memq (car marks) todo-marks) nil
+                      (funcall del-mark))
+                    (setq marks (cdr marks)))))))
+       (if (numberp (cdr ranges)) (setq ranges (list ranges))
+         (setq ranges (reverse ranges)))
+       (while ranges
+         (setq begin (car ranges) ranges (cdr ranges))
+         (while (eq begin (car ranges))
+           (setq ranges (cdr ranges)))
+         (if (numberp begin) (setq end begin)
+           (setq end (cdr begin) begin (car begin)))
+         (setq nlist (nthcdr (- (nnmaildir--art-num (car nlist)) end)
+                             nlist))
+         (while (and nlist
+                     (setq article (car nlist))
+                     (>= (nnmaildir--art-num article) begin))
+           (setq nlist (cdr nlist))
+           (when (stringp (nnmaildir--art-suffix article))
+             (setq marks todo-marks)
+             (eval form)))))
       nil)))
 
 (defun nnmaildir-close-group (group &optional server)
   t)
 
 (defun nnmaildir-close-server (&optional server)
-  (let (srv-ls flist ls dirs dir files file x)
+  (let (flist ls dirs dir files file x)
     (nnmaildir--prepare server nil)
     (setq server nnmaildir--cur-server)
     (when server
-      (setq nnmaildir--cur-server nil
-            srv-ls (nnmaildir--srv-get-ls server))
+      (setq nnmaildir--cur-server nil)
       (save-match-data
-        (mapatoms
+       (mapatoms
           (lambda (group)
-            (setq group (symbol-value group)
-                  x (nnmaildir--grp-get-pname group)
-                  ls (nnmaildir--param x 'directory-files)
-                  ls (or ls srv-ls)
-                  dir (nnmaildir--srv-get-dir server)
-                  dir (nnmaildir--srv-grp-dir
-                        dir (nnmaildir--grp-get-name group))
+            (setq x (nnmaildir--pgname server (symbol-name group))
+                  group (symbol-value group)
+                  ls (nnmaildir--group-ls server x)
+                  dir (nnmaildir--srv-dir server)
+                  dir (nnmaildir--srvgrp-dir dir (nnmaildir--grp-name group))
                   x (nnmaildir--param x 'read-only)
                   x (if x (nnmaildir--new dir) (nnmaildir--cur dir))
                   files (funcall ls x nil "\\`[^.]" 'nosort)
@@ -1682,9 +1626,9 @@ by nnmaildir-request-article.")
               (string-match "\\`\\([^:]*\\)\\(:.*\\)?\\'" file)
               (intern (match-string 1 file) flist))
             (setq dir (nnmaildir--nndir dir)
-                  dirs (cons (concat dir "nov")
-                             (funcall ls (concat dir "marks") 'full "\\`[^.]"
-                                      'nosort)))
+                  dirs (cons (nnmaildir--nov-dir dir)
+                             (funcall ls (nnmaildir--marks-dir dir) 'full
+                                      "\\`[^.]" 'nosort)))
             (while dirs
               (setq dir (car dirs) dirs (cdr dirs)
                     files (funcall ls dir nil "\\`[^.]" 'nosort)
@@ -1694,15 +1638,15 @@ by nnmaildir-request-article.")
                 (if (intern-soft file flist) nil
                   (setq file (concat dir file))
                   (delete-file file)))))
-          (nnmaildir--srv-get-groups server)))
-      (unintern (nnmaildir--srv-get-name server) nnmaildir--servers)))
+          (nnmaildir--srv-groups server)))
+      (unintern (nnmaildir--srv-address server) nnmaildir--servers)))
   t)
 
 (defun nnmaildir-request-close ()
   (let (servers buffer)
     (mapatoms (lambda (server)
-                (setq servers (cons (symbol-name server) servers)))
-              nnmaildir--servers)
+               (setq servers (cons (symbol-name server) servers)))
+             nnmaildir--servers)
     (while servers
       (nnmaildir-close-server (car servers))
       (setq servers (cdr servers)))
@@ -1714,6 +1658,28 @@ by nnmaildir-request-article.")
     (if buffer (kill-buffer buffer)))
   t)
 
+(defun nnmaildir--edit-prep ()
+  (let ((extras '(mapcar mapatoms))
+        name)
+    (mapatoms
+      (lambda (sym)
+        (when (or (memq sym extras)
+                 (and (fboundp sym)
+                      (setq name (symbol-name sym))
+                      (>= (length name) 10)
+                      (or (string-equal "nnmaildir-" (substring name 0 10))
+                          (and (>= (length name) 15)
+                               (string-equal "make-nnmaildir-"
+                                             (substring name 0 15))))))
+          (put sym 'lisp-indent-function 0))))
+    'done))
+
 (provide 'nnmaildir)
 
+;; Local Variables:
+;; indent-tabs-mode: t
+;; fill-column: 77
+;; eval: (progn (require 'nnmaildir) (nnmaildir--edit-prep))
+;; End:
+
 ;;; nnmaildir.el ends here
index ced6c4f..8157bec 100644 (file)
@@ -1,6 +1,6 @@
 ;;; nnmbox.el --- mail mbox access for Gnus
 
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
 ;;     Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
               nnmbox-file-coding-system))
          (dir (file-name-directory nnmbox-mbox-file)))
       (and dir (gnus-make-directory dir))
-      (nnmail-write-region 1 1 nnmbox-mbox-file t 'nomesg))))
+      (nnmail-write-region (point-min) (point-min)
+                          nnmbox-mbox-file t 'nomesg))))
 
 (defun nnmbox-read-mbox ()
   (nnmail-activate 'nnmbox)
index 7f411b0..d27213f 100644 (file)
@@ -77,17 +77,14 @@ corresponding marks file (usually named `.marks' in the nnml group
 directory, but see `nnml-marks-file-name') for the group.  Then the
 marks file will be regenerated properly by Gnus.")
 
-(defvoo nnml-filenames-are-evil t
-  "If non-nil, Gnus will not assume that the articles file name
-is the same as the article number listed in the nov database.  This
-variable should be set if any of the files are compressed.")
-
 (defvoo nnml-prepare-save-mail-hook nil
   "Hook run narrowed to an article before saving.")
 
 (defvoo nnml-inhibit-expiry nil
   "If non-nil, inhibit expiry.")
 
+(defvoo nnml-use-compressed-files nil
+  "If non-nil, allow using compressed message files.")
 
 \f
 
@@ -308,7 +305,8 @@ variable should be set if any of the files are compressed.")
     (setq articles (gnus-sorted-intersection articles active-articles))
 
     (while (and articles is-old)
-      (if (and (setq article (nnml-article-to-file (setq number (pop articles))))
+      (if (and (setq article (nnml-article-to-file
+                             (setq number (pop articles))))
               (setq mod-time (nth 5 (file-attributes article)))
               (nnml-deletable-article-p group number)
               (setq is-old (nnmail-expired-article-p group mod-time force
@@ -523,16 +521,19 @@ variable should be set if any of the files are compressed.")
 (defun nnml-article-to-file (article)
   (nnml-update-file-alist)
   (let (file)
-    (if (setq file (cdr (assq article nnml-article-file-alist)))
+    (if (setq file
+             (if nnml-use-compressed-files
+                 (cdr (assq article nnml-article-file-alist))
+               (number-to-string article)))
        (expand-file-name file nnml-current-directory)
-      (if (not nnheader-directory-files-is-safe)
-         ;; Just to make sure nothing went wrong when reading over NFS --
-         ;; check once more.
-         (when (file-exists-p
-                (setq file (expand-file-name (number-to-string article)
-                                             nnml-current-directory)))
-           (nnml-update-file-alist t)
-           file)))))
+      (when (not nnheader-directory-files-is-safe)
+       ;; Just to make sure nothing went wrong when reading over NFS --
+       ;; check once more.
+       (when (file-exists-p
+              (setq file (expand-file-name (number-to-string article)
+                                           nnml-current-directory)))
+         (nnml-update-file-alist t)
+         file)))))
 
 (defun nnml-deletable-article-p (group article)
   "Say whether ARTICLE in GROUP can be deleted."
@@ -746,8 +747,8 @@ variable should be set if any of the files are compressed.")
       (when (buffer-name (cdar nnml-nov-buffer-alist))
        (set-buffer (cdar nnml-nov-buffer-alist))
        (when (buffer-modified-p)
-         (nnmail-write-region 1 (point-max) nnml-nov-buffer-file-name
-                              nil 'nomesg))
+         (nnmail-write-region (point-min) (point-max)
+                              nnml-nov-buffer-file-name nil 'nomesg))
        (set-buffer-modified-p nil)
        (kill-buffer (current-buffer)))
       (setq nnml-nov-buffer-alist (cdr nnml-nov-buffer-alist)))))
@@ -836,7 +837,7 @@ variable should be set if any of the files are compressed.")
           (progn
             (re-search-forward "\n\r?\n" nil t)
             (setq chars (- (point-max) (point)))
-            (max 1 (1- (point)))))
+            (max (point-min) (1- (point)))))
          (unless (zerop (buffer-size))
            (goto-char (point-min))
            (setq headers (nnml-parse-head chars (caar files)))
@@ -848,7 +849,7 @@ variable should be set if any of the files are compressed.")
        (setq files (cdr files)))
       (save-excursion
        (set-buffer nov-buffer)
-       (nnmail-write-region 1 (point-max) nov nil 'nomesg)
+       (nnmail-write-region (point-min) (point-max) nov nil 'nomesg)
        (kill-buffer (current-buffer))))))
 
 (defun nnml-nov-delete-article (group article)
@@ -868,10 +869,11 @@ variable should be set if any of the files are compressed.")
     t))
 
 (defun nnml-update-file-alist (&optional force)
-  (when (or (not nnml-article-file-alist)
-           force)
-    (setq nnml-article-file-alist
-         (nnml-current-group-article-to-file-alist))))
+  (when nnml-use-compressed-files
+    (when (or (not nnml-article-file-alist)
+             force)
+      (setq nnml-article-file-alist
+           (nnml-current-group-article-to-file-alist)))))
 
 (defun nnml-directory-articles (dir)
   "Return a list of all article files in a directory.
@@ -900,7 +902,6 @@ Use the nov database for that directory if available."
 Use the nov database for the current group if available."
   (if (or gnus-nov-is-evil
          nnml-nov-is-evil
-         nnml-filenames-are-evil
          (not (file-exists-p
                (expand-file-name nnml-nov-file-name
                                  nnml-current-directory))))
@@ -908,8 +909,8 @@ Use the nov database for the current group if available."
     ;; build list from .overview if available
     (save-excursion
       (let ((alist nil)
-           art
-           (buffer (nnml-get-nov-buffer nnml-current-group)))
+           (buffer (nnml-get-nov-buffer nnml-current-group))
+           art)
        (set-buffer buffer)
        (goto-char (point-min))
        (while (not (eobp))
@@ -1017,7 +1018,8 @@ Use the nov database for the current group if available."
        (push (cons 'read (gnus-info-read info)) nnml-marks)
        (dolist (el gnus-article-unpropagated-mark-lists)
          (setq nnml-marks (gnus-remassoc el nnml-marks)))
-       (nnml-save-marks group server)))))
+       (nnml-save-marks group server)
+       (nnheader-message 7 "Bootstrapping marks for %s...done" group)))))
 
 (provide 'nnml)
 
diff --git a/lisp/nnnil.el b/lisp/nnnil.el
new file mode 100644 (file)
index 0000000..08a097d
--- /dev/null
@@ -0,0 +1,81 @@
+;;; nnnil.el --- empty backend for Gnus
+;; Public domain.
+
+;; Author: Paul Jarc <prj@po.cwru.edu>
+
+;; 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.
+
+;;; Commentary:
+
+;; nnnil is a Gnus backend that provides no groups or articles.  It's useful
+;; as a primary select method when you want all your real select methods to
+;; be secondary or foreign.
+
+;;; Code:
+
+(eval-and-compile
+  (require 'nnheader))
+
+(defvar nnnil-status-string "")
+
+(defun nnnil-retrieve-headers (articles &optional group server fetch-old)
+  (save-excursion
+    (set-buffer nntp-server-buffer)
+    (erase-buffer))
+  'nov)
+
+(defun nnnil-open-server (server &optional definitions)
+  t)
+
+(defun nnnil-close-server (&optional server)
+  t)
+
+(defun nnnil-request-close ()
+  t)
+
+(defun nnnil-server-opened (&optional server)
+  t)
+
+(defun nnnil-status-message (&optional server)
+  nnnil-status-string)
+
+(defun nnnil-request-article (article &optional group server to-buffer)
+  (setq nnnil-status-string "No such group")
+  nil)
+
+(defun nnnil-request-group (group &optional server fast)
+  (let (deactivate-mark)
+    (save-excursion
+      (set-buffer nntp-server-buffer)
+      (erase-buffer)
+      (insert "411 no such news group\n")))
+  (setq nnnil-status-string "No such group")
+  nil)
+
+(defun nnnil-close-group (group &optional server)
+  t)
+
+(defun nnnil-request-list (&optional server)
+  (save-excursion
+    (set-buffer nntp-server-buffer)
+    (erase-buffer))
+  t)
+
+(defun nnnil-request-post (&optional server)
+  (setq nnnil-status-string "Read-only server")
+  nil)
+
+(provide 'nnnil)
index 3196d54..fd9ea8a 100644 (file)
@@ -1,5 +1,5 @@
 ;;; nnrss.el --- interfacing with RSS
-;; Copyright (C) 2001  Free Software Foundation, Inc.
+;; Copyright (C) 2001, 2002  Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: RSS
@@ -39,7 +39,6 @@
 (eval-when-compile
   (ignore-errors
     (require 'xml)))
-;; Report failure to find w3 at load time if appropriate.
 (eval '(require 'xml))
 
 (nnoo-declare nnrss)
@@ -174,6 +173,12 @@ To use the description in headers, put this name into `nnmail-extra-headers'.")
   "Field name used for URL.
 To use the description in headers, put this name into `nnmail-extra-headers'.")
 
+(defvar nnrss-content-function nil
+  "A function which is called in `nnrss-request-article'.
+The arguments are (ENTRY GROUP ARTICLE).
+ENTRY is the record of the current headline. GROUP is the group name.
+ARTICLE is the article number of the current headline.")
+
 (nnoo-define-basics nnrss)
 
 ;;; Interface functions
@@ -265,7 +270,9 @@ To use the description in headers, put this name into `nnmail-extra-headers'.")
                (insert "\n\n")
                (fill-region point (point))))
          (if (nth 2 e)
-             (insert (nth 2 e) "\n")))))
+             (insert (nth 2 e) "\n"))
+         (if nnrss-content-function
+             (funcall nnrss-content-function e group article)))))
     (cond
      (err
       (nnheader-report 'nnrss err))
index 49e8403..5820103 100644 (file)
                           (point)
                           (progn
                             (re-search-forward
-                             "&lt;&nbsp;[ \t\r\n]*<A HREF=\"\\(\\(http:\\)?//slashdot\\.org\\)?/article")
+                             "<IFRAME\\|<SCRIPT LANGUAGE=\"JAVASCRIPT\">\\|<!-- no ad 6 -->\\|&lt;&nbsp;[ \t\r\n]*<A HREF=\"\\(\\(http:\\)?//slashdot\\.org\\)?/article")
                             (match-beginning 0)))))
                (setq cid (cdr (assq article
                                     (nth 4 (assoc group nnslashdot-groups)))))
index ba8c1ba..0836590 100644 (file)
@@ -1,6 +1,6 @@
 ;;; nnsoup.el --- SOUP access for Gnus
 
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
 ;;     Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -338,7 +338,7 @@ backend for the messages.")
                  (delete-file (nnsoup-file prefix t)))
                t)
          (setcdr (cdr total-infolist) (delq info (cddr total-infolist)))
-         (setq articles (gnus-sorted-complement articles range-list))))
+         (setq articles (gnus-sorted-difference articles range-list))))
       (when (not mod-time)
        (setcdr (cdr total-infolist) (delq info (cddr total-infolist)))))
     (if (cddr total-infolist)
index 583456e..8bbf408 100644 (file)
@@ -419,42 +419,52 @@ noticing asynchronous data.")
       (set-buffer nntp-server-buffer)
       (erase-buffer)))
   (let* ((command (mapconcat 'identity strings " "))
-        (buffer (process-buffer (nntp-find-connection nntp-server-buffer)))
-        (pos (with-current-buffer buffer (point))))
-    (prog1
-       (nntp-retrieve-data command
-                           nntp-address nntp-port-number nntp-server-buffer
-                           wait-for nnheader-callback-function)
-      ;; If nothing to wait for, still remove possibly echo'ed commands
-      (unless wait-for
-       (nntp-accept-response)
-       (save-excursion
-         (set-buffer buffer)
-         (goto-char pos)
-         (if (looking-at (regexp-quote command))
-             (delete-region pos (progn
-                                  (forward-line 1)
-                                  (gnus-point-at-bol)))))))))
+        (process (nntp-find-connection nntp-server-buffer))
+        (buffer (and process (process-buffer process)))
+        (pos (and buffer (with-current-buffer buffer (point)))))
+    (if process
+       (prog1
+           (nntp-retrieve-data command
+                               nntp-address nntp-port-number
+                               nntp-server-buffer
+                               wait-for nnheader-callback-function)
+         ;; If nothing to wait for, still remove possibly echo'ed commands
+         (unless wait-for
+           (nntp-accept-response)
+           (save-excursion
+             (set-buffer buffer)
+             (goto-char pos)
+             (if (looking-at (regexp-quote command))
+                 (delete-region pos (progn (forward-line 1)
+                                           (gnus-point-at-bol))))
+             )))
+      (nnheader-report 'nntp "Couldn't open connection to %s."
+                      nntp-address))))
 
 (defun nntp-send-command-nodelete (wait-for &rest strings)
   "Send STRINGS to server and wait until WAIT-FOR returns."
   (let* ((command (mapconcat 'identity strings " "))
-        (buffer (process-buffer (nntp-find-connection nntp-server-buffer)))
-        (pos (with-current-buffer buffer (point))))
-    (prog1
-       (nntp-retrieve-data command
-                           nntp-address nntp-port-number nntp-server-buffer
-                           wait-for nnheader-callback-function)
-      ;; If nothing to wait for, still remove possibly echo'ed commands
-      (unless wait-for
-       (nntp-accept-response)
-       (save-excursion
-         (set-buffer buffer)
-         (goto-char pos)
-         (if (looking-at (regexp-quote command))
-             (delete-region pos (progn
-                                  (forward-line 1)
-                                  (gnus-point-at-bol)))))))))
+        (process (nntp-find-connection nntp-server-buffer))
+        (buffer (and process (process-buffer process)))
+        (pos (and buffer (with-current-buffer buffer (point)))))
+    (if process
+       (prog1
+           (nntp-retrieve-data command
+                               nntp-address nntp-port-number
+                               nntp-server-buffer
+                               wait-for nnheader-callback-function)
+         ;; If nothing to wait for, still remove possibly echo'ed commands
+         (unless wait-for
+           (nntp-accept-response)
+           (save-excursion
+             (set-buffer buffer)
+             (goto-char pos)
+             (if (looking-at (regexp-quote command))
+                 (delete-region pos (progn (forward-line 1)
+                                           (gnus-point-at-bol))))
+             )))
+      (nnheader-report 'nntp "Couldn't open connection to %s."
+                      nntp-address))))
 
 (defun nntp-send-command-and-decode (wait-for &rest strings)
   "Send STRINGS to server and wait until WAIT-FOR returns."
@@ -464,22 +474,26 @@ noticing asynchronous data.")
       (set-buffer nntp-server-buffer)
       (erase-buffer)))
   (let* ((command (mapconcat 'identity strings " "))
-        (buffer (process-buffer (nntp-find-connection nntp-server-buffer)))
-        (pos (with-current-buffer buffer (point))))
-    (prog1
-       (nntp-retrieve-data command
-                           nntp-address nntp-port-number nntp-server-buffer
-                           wait-for nnheader-callback-function t)
-      ;; If nothing to wait for, still remove possibly echo'ed commands
-      (unless wait-for
-       (nntp-accept-response)
-       (save-excursion
+        (process (nntp-find-connection nntp-server-buffer))
+        (buffer (and process (process-buffer process)))
+        (pos (and buffer (with-current-buffer buffer (point)))))
+    (if process
+       (prog1
+           (nntp-retrieve-data command
+                               nntp-address nntp-port-number
+                               nntp-server-buffer
+                               wait-for nnheader-callback-function t)
+         ;; If nothing to wait for, still remove possibly echo'ed commands
+         (unless wait-for
+           (nntp-accept-response)
+           (save-excursion
          (set-buffer buffer)
          (goto-char pos)
          (if (looking-at (regexp-quote command))
-             (delete-region pos (progn
-                                  (forward-line 1)
-                                  (gnus-point-at-bol)))))))))
+             (delete-region pos (progn (forward-line 1) (gnus-point-at-bol))))
+         )))
+      (nnheader-report 'nntp "Couldn't open connection to %s."
+                      nntp-address))))
 
 (defun nntp-send-buffer (wait-for)
   "Send the current buffer to server and wait until WAIT-FOR returns."
@@ -612,6 +626,10 @@ noticing asynchronous data.")
              (command (if nntp-server-list-active-group
                           "LIST ACTIVE" "GROUP")))
          (while groups
+           ;; Timeout may have killed the buffer.
+           (unless (gnus-buffer-live-p buf)
+             (nnheader-report 'nntp "Connection to %s is closed." server)
+             (throw 'done nil))
            ;; Send the command to the server.
            (nntp-send-command nil command (pop groups))
            (incf count)
@@ -1663,7 +1681,8 @@ Please refer to the following variables to customize the connection:
     (push nntp-via-rlogin-command command)
     (and nntp-pre-command
         (push nntp-pre-command command))
-    (setq proc (apply 'start-process "nntpd" buffer command))
+    (setq proc (as-binary-process
+               (apply 'start-process "nntpd" buffer command)))
     (save-excursion
       (set-buffer buffer)
       (nntp-wait-for-string "^\r*20[01]")
index 23153ee..9730922 100644 (file)
                    datel nil))
            (pop datel))
          (when date
-           (setq date (delete "" (split-string
-                                  date "[-, \n\t\r Â Â Â ]")))
-           (if (or (member "AM" date)
-                   (member "PM" date))
-               (setq date (format
-                           "%s %s %s %s"
-                           (nth 1 date)
-                           (if (and (>= (length (nth 0 date)) 3)
-                                    (assoc (downcase
-                                            (substring (nth 0 date) 0 3))
-                                           parse-time-months))
-                               (substring (nth 0 date) 0 3)
-                             (car (rassq (string-to-number (nth 0 date))
-                                         parse-time-months)))
-                           (nth 2 date) (nth 3 date)))
-             (setq date (format "%s %s %s %s"
-                                (car (rassq (string-to-number (nth 1 date))
-                                            parse-time-months))
-                                (nth 0 date) (nth 2 date) (nth 3 date)))))
+           (setq date (delete "" (split-string date "[-, \n\t\r Â Â Â ]")))
+           (setq date
+                 (if (or (member "AM" date)
+                         (member "PM" date))
+                     (format
+                      "%s %s %s %s"
+                      (nth 1 date)
+                      (if (and (>= (length (nth 0 date)) 3)
+                               (assoc (downcase
+                                       (substring (nth 0 date) 0 3))
+                                      parse-time-months))
+                          (substring (nth 0 date) 0 3)
+                        (car (rassq (string-to-number (nth 0 date))
+                                    parse-time-months)))
+                      (nth 2 date) (nth 3 date))
+                   (format "%s %s %s %s"
+                           (car (rassq (string-to-number (nth 1 date))
+                                       parse-time-months))
+                           (nth 0 date) (nth 2 date) (nth 3 date)))))
          (push
           (cons
            article
index e2683d2..e780aa9 100644 (file)
   (let (p refs url mime e
          from subject date id
          done
-         (case-fold-serch t))
+         (case-fold-search t))
     (save-restriction
       (goto-char (point-min))
       (when (search-forward "X-Head-End" nil t)
index 3ce22fd..9ae4303 100644 (file)
@@ -1,5 +1,5 @@
 ;;; nnweb.el --- retrieving articles via web search engines
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -38,6 +38,9 @@
 (require 'nnmail)
 (require 'mm-util)
 (require 'mm-url)
+(eval-and-compile
+  (ignore-errors
+    (require 'url)))
 (autoload 'w3-parse-buffer "w3-parse")
 
 (nnoo-declare nnweb)
@@ -51,13 +54,9 @@ Valid types include `google', `dejanews', `dejanewsold', `reference',
 and `altavista'.")
 
 (defvar nnweb-type-definition
-  '(
-    (google
-     ;;(article . nnweb-google-wash-article)
-     ;;(id . "http://groups.google.com/groups?as_umsgid=%s")
+  '((google
      (article . ignore)
      (id . "http://groups.google.com/groups?selm=%s&output=gplain")
-     ;;(reference . nnweb-google-reference)
      (reference . identity)
      (map . nnweb-google-create-mapping)
      (search . nnweb-google-search)
@@ -74,19 +73,6 @@ and `altavista'.")
      (search . nnweb-google-search)
      (address . "http://groups.google.com/groups")
      (identifier . nnweb-google-identity))
-;;;     (dejanews
-;;;      (article . ignore)
-;;;      (id . "http://search.dejanews.com/msgid.xp?MID=%s&fmt=text")
-;;;      (map . nnweb-dejanews-create-mapping)
-;;;      (search . nnweb-dejanews-search)
-;;;      (address . "http://www.deja.com/=dnc/qs.xp")
-;;;      (identifier . nnweb-dejanews-identity))
-;;;     (dejanewsold
-;;;      (article . ignore)
-;;;      (map . nnweb-dejanews-create-mapping)
-;;;      (search . nnweb-dejanewsold-search)
-;;;      (address . "http://www.deja.com/dnquery.xp")
-;;;      (identifier . nnweb-dejanews-identity))
     (reference
      (article . nnweb-reference-wash-article)
      (map . nnweb-reference-create-mapping)
@@ -774,9 +760,11 @@ and `altavista'.")
        (widen)
        (skip-chars-forward "- \t"))
       (when (looking-at
-            "\\([0-9]+[/ ][A-Za-z]+[/ ][0-9]+\\)[ \t]*by[ \t]*\\([^<]*\\) - <a")
-       (setq From (match-string 2)
-             Date (match-string 1)))
+            "\\([0-9]+\\)[/ ]\\([A-Za-z]+\\)[/ ]\\([0-9]+\\)[ \t]*by[ \t]*\\([^<]*\\) - <a")
+       (setq From (match-string 4)
+             Date (format "%s %s 00:00:00 %s"
+                          (match-string 2) (match-string 1)
+                          (match-string 3))))
       (forward-line 1)
       (incf i)
       (unless (nnweb-get-hashtb url)
index 1bb33d7..2618211 100644 (file)
@@ -373,7 +373,9 @@ If NOW, use that time instead."
            ;; should be
            ;; Tue Jul 9 09:04:21 1996
            (setq date
-                 (cond ((string-match "[A-Z]" (nth 0 date))
+                 (cond ((not date)
+                        "Tue Jan 1 00:00:0 1900")
+                       ((string-match "[A-Z]" (nth 0 date))
                         (format "%s %s %s %s %s"
                                 (nth 0 date) (nth 2 date) (nth 1 date)
                                 (nth 4 date) (nth 3 date)))
index 75d6779..52f6999 100644 (file)
 (defun quoted-printable-decode-region (from to &optional coding-system)
   "Decode quoted-printable in the region between FROM and TO, per RFC 2045.
 If CODING-SYSTEM is non-nil, decode bytes into characters with that
-coding-system."
+coding-system.
+
+Interactively, you can supply the CODING-SYSTEM argument
+with \\[universal-coding-system-argument]."
   (interactive
    ;; Let the user determine the coding system with "C-x RET c".
    (list (region-beginning) (region-end) coding-system-for-read))
index 7814864..452be13 100644 (file)
@@ -433,18 +433,15 @@ The buffer may be narrowed."
     (let ((bol (save-restriction
                 (widen)
                 (gnus-point-at-bol)))
-         (eol (gnus-point-at-eol))
-         leading)
+         (eol (gnus-point-at-eol)))
       (forward-line 1)
       (while (not (eobp))
-       (looking-at "[ \t]*")
-       (setq leading (- (match-end 0) (match-beginning 0)))
-       (if (< (- (gnus-point-at-eol) bol leading) 76)
-           (progn
-             (goto-char eol)
-             (delete-region eol (progn
-                                  (skip-chars-forward " \t\n\r")
-                                  (1- (point)))))
+       (if (and (looking-at "[ \t]")
+                (< (- (gnus-point-at-eol) bol) 76))
+           (delete-region eol (progn
+                                (goto-char eol)
+                                (skip-chars-forward "\r\n")
+                                (point)))
          (setq bol (gnus-point-at-bol)))
        (setq eol (gnus-point-at-eol))
        (forward-line 1)))))
@@ -522,6 +519,7 @@ The buffer may be narrowed."
                     (delete-region (match-beginning 0) (match-end 0)))))
          (when (and (mm-multibyte-p)
                     mail-parse-charset
+                    (not (eq mail-parse-charset 'us-ascii))
                     (not (eq mail-parse-charset 'gnus-decoded)))
            (mm-decode-coding-region b e mail-parse-charset))
          (setq b (point)))
@@ -529,8 +527,7 @@ The buffer may be narrowed."
                   mail-parse-charset
                   (not (eq mail-parse-charset 'us-ascii))
                   (not (eq mail-parse-charset 'gnus-decoded)))
-         (mm-decode-coding-region b (point-max) mail-parse-charset))
-       (rfc2047-unfold-region (point-min) (point-max))))))
+         (mm-decode-coding-region b (point-max) mail-parse-charset))))))
 
 (defun rfc2047-decode-string (string)
   "Decode the quoted-printable-encoded STRING and return the results."
index 2fcf7e2..5d9b491 100644 (file)
@@ -1,6 +1,6 @@
 ;;; rfc2231.el --- Functions for decoding rfc2231 headers
 
-;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; This file is part of GNU Emacs.
@@ -115,10 +115,11 @@ The list will be on the form
              (setq value
                    (buffer-substring (1+ (point))
                                      (progn (forward-sexp 1) (1- (point))))))
-            ((and (memq c ttoken)
+            ((and (or (memq c ttoken)
+                      (> c ?\177)) ;; EXTENSION: Support non-ascii chars.
                   (not (memq c stoken)))
              (setq value (buffer-substring
-                          (point) (progn (forward-sexp 1) (point)))))
+                          (point) (progn (forward-sexp) (point)))))
             (t
              (error "Invalid header: %s" string)))
            (when encoded
index 737f7f0..c79a825 100644 (file)
@@ -1,10 +1,9 @@
 ;;; smiley.el --- displaying smiley faces
 
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
-;;        Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
 
-;; Author: Wes Hardaker <hardaker@ece.ucdavis.edu>
-;; Keywords: fun
+;; Author: Dave Love <fx@gnu.org>
+;; Keywords: news mail multimedia
 
 ;; This file is part of GNU Emacs.
 
 
 ;;; Commentary:
 
-;;
-;; comments go here.
-;;
+;; A re-written, simplified version of Wes Hardaker's XEmacs smiley.el
+;; which might be merged back to smiley.el if we get an assignment for
+;; that.  We don't have assignments for the images smiley.el uses, but
+;; I'm not sure we need that degree of rococoness and defaults like a
+;; yellow background.  Also, using PBM means we can display the images
+;; more generally.  -- fx
 
-;;; Test smileys:  :-] :-o :-) ;-) :-\ :-| :-d :-P 8-| :-(
-
-;; To use:
-;; (require 'smiley)
-;; (setq gnus-treat-display-smileys t)
-
-;; The smilies were drawn by Joe Reiss <jreiss@vt.edu>.
+;;; Test smileys:  :-) :-\ :-( :-/
 
 ;;; Code:
 
 (eval-when-compile (require 'cl))
-(require 'custom)
-
-(eval-and-compile
-  (when (featurep 'xemacs)
-    (require 'annotations)
-    (require 'messagexmas)))
+(require 'nnheader)
+(require 'gnus-art)
 
 (defgroup smiley nil
   "Turn :-)'s into real images."
   :group 'gnus-visual)
 
-;; FIXME: Where is the directory when using Emacs?
-(defcustom smiley-data-directory
-  (if (featurep 'xemacs)
-      (message-xmas-find-glyph-directory "smilies")
-    "/usr/local/lib/xemacs/xemacs-packages/etc/smilies")
+;; Maybe this should go.
+(defcustom smiley-data-directory (nnheader-find-etc-directory "smilies")
   "*Location of the smiley faces files."
   :type 'directory
   :group 'smiley)
 
-;; Notice the subtle differences in the regular expressions in the
-;; two alists below.
-
-(defcustom smiley-deformed-regexp-alist
-  '(("\\(\\^_\\^;;;\\)\\W" 1 "WideFaceAse3.xbm")
-    ("\\(\\^_\\^;;\\)\\W" 1 "WideFaceAse2.xbm")
-    ("\\(\\^_\\^;\\)\\W" 1 "WideFaceAse1.xbm")
-    ("\\(\\^_\\^\\)\\W" 1 "WideFaceSmile.xbm")
-    ("\\(;_;\\)\\W" 1 "WideFaceWeep.xbm")
-    ("\\(T_T\\)\\W" 1 "WideFaceWeep.xbm")
-    ("\\(:-*[<\e(I+\e(B]+\\)\\W" 1 "FaceAngry.xpm")
-    ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm")
-    ("\\(:-*D\\)\\W" 1 "FaceGrinning.xpm")
-    ("\\(:-*[)>}\e(I;\e(B]+\\)\\W" 1 "FaceHappy.xpm")
-    ("\\(=[)>\e(I;\e(B]+\\)\\W" 1 "FaceHappy.xpm")
-    ("\\(:-*[/\\\"]\\)[^/]\\W" 1 "FaceIronic.xpm")
-    ("[^.0-9]\\([8|]-*[|Oo%]\\)\\W" 1 "FaceKOed.xpm")
-    ("\\([:|]-*#+\\)\\W" 1 "FaceNyah.xpm")
-    ("\\(:-*[({]+\\)\\W" 1 "FaceSad.xpm")
-    ("\\(=[({]+\\)\\W" 1 "FaceSad.xpm")
-    ("\\(:-*[Oo\*]\\)\\W" 1 "FaceStartled.xpm")
-    ("\\(:-*|\\)\\W" 1 "FaceStraight.xpm")
-    ("\\(:-*p\\)\\W" 1 "FaceTalking.xpm")
-    ("\\(:-*d\\)\\W" 1 "FaceTasty.xpm")
-    ("[^^;_]\\(;-*[>)}\e(I;\e(B]+\\)\\W" 1 "FaceWinking.xpm")
-    ("\\(:-*[Vv\e(I5\e(B]\\)\\W" 1 "FaceWry.xpm")
-    ("\\([:|]-*P\\)\\W" 1 "FaceYukky.xpm"))
-  "*Normal and deformed faces for smilies."
-  :type '(repeat (list regexp
-                      (integer :tag "Match")
-                      (string :tag "Image")))
-  :group 'smiley)
-
-(defcustom smiley-nosey-regexp-alist
-  '(("\\(:-+[<\e(I+\e(B]+\\)\\W" 1 "FaceAngry.xpm")
-    ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm")
-    ("\\(:-+D\\)\\W" 1 "FaceGrinning.xpm")
-    ("\\(:-+[}\e(I;\e(B]+\\)\\W" 1 "FaceHappy.xpm")
-    ("\\(:-*)+\\)\\W" 1 "FaceHappy.xpm")
-    ("\\(=[)]+\\)\\W" 1 "FaceHappy.xpm")
-    ("\\(:-+[/\\\"]+\\)\\W" 1 "FaceIronic.xpm")
-    ("\\([8|]-+[|Oo%]\\)\\W" 1 "FaceKOed.xpm")
-    ("\\([:|]-+#+\\)\\W" 1 "FaceNyah.xpm")
-    ("\\(:-+[({]+\\)\\W" 1 "FaceSad.xpm")
-    ("\\(=[({]+\\)\\W" 1 "FaceSad.xpm")
-    ("\\(:-+[Oo\*]\\)\\W" 1 "FaceStartled.xpm")
-    ("\\(:-+|\\)\\W" 1 "FaceStraight.xpm")
-    ("\\(:-+p\\)\\W" 1 "FaceTalking.xpm")
-    ("\\(:-+d\\)\\W" 1 "FaceTasty.xpm")
-    ("\\(;-+[>)}\e(I;\e(B]+\\)\\W" 1 "FaceWinking.xpm")
-    ("\\(:-+[Vv\e(I5\e(B]\\)\\W" 1 "FaceWry.xpm")
-    ("\\(][:8B]-[)>]\\)\\W" 1 "FaceDevilish.xpm")
-    ("\\([:|]-+P\\)\\W" 1 "FaceYukky.xpm"))
-  "*Smileys with noses.  These get less false matches."
+;; The XEmacs version has a baroque, if not rococo, set of these.
+(defcustom smiley-regexp-alist
+  (if (file-exists-p (expand-file-name "WideFaceSmile.xbm"
+                                      smiley-data-directory))
+      ;; Use faces in ftp://ftp.gnus.org/pub/gnus/etc-0.27.tar.gz
+      '(;; ^_^ ^^
+       ("\\(\\^_?\\^\\)\\W" 1 "WideFaceSmile")
+       ;; ;-> ;-) ;-} ;> ;) :}
+       ("\\(;-?[>)}]+\\)\\W" 1 "FaceWinking")
+       ;; ^_^; ^^;
+       ("\\(\\^_?\\^;\\)\\W" 1 "WideFaceAse1")
+       ;; ^_^;; ^^;;
+       ("\\(\\^_?\\^;;\\)\\W" 1 "WideFaceAse2")
+       ;; ^_^;;; ^^;;;
+       ("\\(\\^_?\\^;;;\\)\\W" 1 "WideFaceAse3")
+       ;; ;_;
+       ("\\(;_;\\)\\W" 1 "WideFaceWeep")
+       ;; T_T
+       ("\\(T_T\\)\\W" 1 "WideFaceWeep")
+       ;; >_<
+       ("\\(>_<\\)\\W" 1 "WideFaceWeep")
+       ;; :-< :<
+       ("\\(:-?<\\)\\W" 1 "FaceAngry")
+       ;; :-] :]
+       ("\\(:-?\\]+\\)\\W" 1 "FaceGoofy")
+       ;; :-D :D
+       ("\\(:-?D\\)\\W" 1 "FaceGrinning")
+       ;; :-) :-> :-} :) :> :}
+       ("\\(:-?[)>}]+\\)\\W" 1 "FaceHappy")
+       ;; =)
+       ("\\(=)\\)\\W" 1 "FaceHappy")
+       ;; :-/ :-\ :/ :\  excludes urls etc.
+       ("\\(:-[/\\]\\)\\W" 1 "FaceIronic")
+       ("\\(:/\\)\\([\t\n ]\\|[^/]\\W\\)" 1 "FaceIronic")
+       ("\\(:\\\\\\)\\([\t\n ]\\|[^\\]\\W\\)" 1 "FaceIronic")
+       ;; 8-| 8-O 8-%
+       ;; excludes just numbers
+       ("[^.0-9]\\(8-[|O%]\\)\\W" 1 "FaceKOed")
+       ;; :-# :#
+       ("\\(:-?#\\)\\W" 1 "FaceNyah")
+       ;; :-( :-{ :( :{
+       ("\\(:-?[({]+\\)\\W" 1 "FaceSad")
+       ;; =( ={
+       ("\\(=[({]+\\)\\W" 1 "FaceSad")
+       ;; :-O :-o :O :o
+       ("\\(:-?[Oo]\\)\\W" 1 "FaceStartled")
+       ;; :-| :|
+       ("\\(:-?|\\)\\W" 1 "FaceStraight")
+       ;; :-p :p
+       ("\\(:-?p\\)\\W" 1 "FaceTalking")
+       ;; :-d
+       ("\\(:-d\\)\\W" 1 "FaceTasty")
+       ;; :-V :-v :V :v
+       ("\\(:-?[Vv]\\)\\W" 1 "FaceWry")
+       ;; :-P :P
+       ("\\(:-?P\\)\\W" 1 "FaceYukky")
+       ;; ]:-) ]:-> ]:-} ]8-) ]8-> ]8-} ]B-) ]B-> ]B-}
+       ;; ]:) ]:> ]:} ]8) ]8> ]8} ]B) ]B> ]B}
+       ("\\(\\][:8B]-?[)>}]\\)\\W" 1 "FaceDevilish"))
+    '(("\\(:-?)\\)\\W" 1 "smile")
+      ("\\(;-?)\\)\\W" 1 "blink")
+      ("\\(:-]\\)\\W" 1 "forced")
+      ("\\(8-)\\)\\W" 1 "braindamaged")
+      ("\\(:-|\\)\\W" 1 "indifferent")
+      ("\\(:-[/\\]\\)\\W" 1 "wry")
+      ("\\(:-(\\)\\W" 1 "sad")
+      ("\\(:-{\\)\\W" 1 "frown")))
+  "*A list of regexps to map smilies to images.
+The elements are (REGEXP MATCH FILE), where MATCH is the submatch in
+regexp to replace with IMAGE.  IMAGE is the name of a PBM file in
+`smiley-data-directory'."
   :type '(repeat (list regexp
-                      (integer :tag "Match")
-                      (string :tag "Image")))
-  :group 'smiley)
-
-(defcustom smiley-regexp-alist smiley-deformed-regexp-alist
-  "*A list of regexps to map smilies to real images.
-Defaults to the contents of `smiley-deformed-regexp-alist'.
-An alternative is `smiley-nosey-regexp-alist' that matches less
-aggressively.
-If this is a symbol, take its value."
-  :type '(radio (variable-item smiley-deformed-regexp-alist)
-               (variable-item smiley-nosey-regexp-alist)
-               symbol
-               (repeat (list regexp
-                             (integer :tag "Match")
-                             (string :tag "Image"))))
-  :group 'smiley)
-
-(defcustom smiley-flesh-color "yellow"
-  "*Flesh color."
-  :type 'string
-  :group 'smiley)
-
-(defcustom smiley-features-color "black"
-  "*Features color."
-  :type 'string
+                      (integer :tag "Regexp match number")
+                      (string :tag "Image name")))
+  :set (lambda (symbol value)
+        (set-default symbol value)
+        (smiley-update-cache))
+  :initialize 'custom-initialize-default
   :group 'smiley)
 
-(defcustom smiley-tongue-color "red"
-  "*Tongue color."
-  :type 'string
+(defcustom gnus-smiley-file-types
+  (let ((types (list "pbm")))
+    (when (gnus-image-type-available-p 'xpm)
+      (push "xpm" types))
+    (when (gnus-image-type-available-p 'xbm)
+      (push "xbm" types))
+    types)
+  "*List of suffixes on picon file names to try."
+  :type '(repeat string)
   :group 'smiley)
 
-(defcustom smiley-circle-color "black"
-  "*Circle color."
-  :type 'string
-  :group 'smiley)
-
-(defcustom smiley-mouse-face 'highlight
-  "*Face used for mouse highlighting in the smiley buffer.
-
-Smiley buttons will be displayed in this face when the cursor is
-above them."
-  :type 'face
-  :group 'smiley)
-
-(defvar smiley-glyph-cache nil)
-
-(defvar smiley-map (make-sparse-keymap "smiley-keys")
-  "Keymap to toggle smiley states.")
-
-(define-key smiley-map [(button2)] 'smiley-toggle-extent)
-(define-key smiley-map [(button3)] 'smiley-popup-menu)
-
-(defun smiley-popup-menu (e)
-  (interactive "e")
-  (popup-menu
-   `("Smilies"
-     ["Toggle This Smiley" (smiley-toggle-extent ,e) t]
-     ["Toggle All Smilies" (smiley-toggle-extents ,e) t])))
-
-(defun smiley-create-glyph (smiley pixmap)
-  (or
-   (cdr-safe (assoc pixmap smiley-glyph-cache))
-   (let* ((xpm-color-symbols
-          (and (featurep 'xpm)
-               (append `(("flesh" ,smiley-flesh-color)
-                         ("features" ,smiley-features-color)
-                         ("tongue" ,smiley-tongue-color))
-                       xpm-color-symbols)))
-         (glyph (make-glyph
-                 (list
-                  (cons (if (featurep 'gtk) 'gtk 'x)
-                        (expand-file-name pixmap smiley-data-directory))
-                  (cons 'mswindows
-                        (expand-file-name pixmap smiley-data-directory))
-                  (cons 'tty smiley)))))
-     (setq smiley-glyph-cache (cons (cons pixmap glyph) smiley-glyph-cache))
-     (set-glyph-face glyph 'default)
-     glyph)))
-
-(defun smiley-create-glyph-ems (smiley pixmap)
-  (condition-case e
-      (create-image (expand-file-name pixmap smiley-data-directory))
-    (error nil)))
-
+(defvar smiley-cached-regexp-alist nil)
+
+(defun smiley-update-cache ()
+  (dolist (elt (if (symbolp smiley-regexp-alist)
+                  (symbol-value smiley-regexp-alist)
+                smiley-regexp-alist))
+    (let ((types gnus-smiley-file-types)
+         file type)
+      (while (and (not file)
+                 (setq type (pop types)))
+       (unless (file-exists-p
+                (setq file (expand-file-name (concat (nth 2 elt) "." type)
+                                             smiley-data-directory)))
+         (setq file nil)))
+      (when type
+       (let ((image (gnus-create-image file (intern type) nil
+                                       :ascent 'center)))
+         (when image
+           (push (list (car elt) (cadr elt) image)
+                 smiley-cached-regexp-alist)))))))
+
+(defvar smiley-mouse-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [down-mouse-2] 'ignore) ; override widget
+    (define-key map [mouse-2]
+      'smiley-mouse-toggle-buffer)
+    map))
 
 ;;;###autoload
-(defun smiley-region (beg end)
-  "Smilify the region between point and mark."
+(defun smiley-region (start end)
+  "Replace in the region `smiley-regexp-alist' matches with corresponding images.
+A list of images is returned."
   (interactive "r")
-  (smiley-buffer (current-buffer) beg end))
-
-(defun smiley-toggle-extent (event)
-  "Toggle smiley at given point."
-  (interactive "e")
-  (let* ((ant (event-glyph-extent event))
-        (pt (event-closest-point event))
-        ext)
-    (if (annotationp ant)
-       (when (extentp (setq ext (extent-property ant 'smiley-extent)))
-         (set-extent-property ext 'invisible nil)
-         (hide-annotation ant))
-      (when pt
-       (while (setq ext (extent-at pt (event-buffer event) nil ext 'at))
-         (when (annotationp (setq ant
-                                  (extent-property ext 'smiley-annotation)))
-           (reveal-annotation ant)
-           (set-extent-property ext 'invisible t)))))))
-
-;; FIXME::
-(defun smiley-toggle-extent-ems (event)
-  "Toggle smiley at given point.
-Note -- this function hasn't been implemented yet."
-  (interactive "e")
-  (error "This function hasn't been implemented yet"))
-
-(defun smiley-toggle-extents (e)
-  (interactive "e")
-  (map-extents
-   (lambda (e void)
-     (let (ant)
-       (if (annotationp (setq ant (extent-property e 'smiley-annotation)))
-          (if (eq (extent-property e 'invisible) nil)
-              (progn
-                (reveal-annotation ant)
-                (set-extent-property e 'invisible t)
-                )
-            (hide-annotation ant)
-            (set-extent-property e 'invisible nil)))
-       nil))
-   (event-buffer e)))
-
-;; FIXME::
-(defun smiley-toggle-extents-ems (e)
-  (interactive "e")
-  (error "This function hasn't been implemented yet"))
-
-;;;###autoload
-(defun smiley-buffer (&optional buffer st nd)
-  (interactive)
-  (when (featurep '(or x gtk mswindows))
-    (save-excursion
-      (when buffer
-       (set-buffer buffer))
-      (let ((buffer-read-only nil)
-           (alist (if (symbolp smiley-regexp-alist)
-                      (symbol-value smiley-regexp-alist)
-                    smiley-regexp-alist))
-           (case-fold-search nil)
-           entry regexp beg group file)
-       (map-extents
-        (lambda (e void)
-          (when (or (extent-property e 'smiley-extent)
-                    (extent-property e 'smiley-annotation))
-            (delete-extent e)))
-        buffer st nd)
-       (goto-char (or st (point-min)))
-       (setq beg (point))
-       ;; loop through alist
-       (while (setq entry (pop alist))
-         (setq regexp (car entry)
-               group (cadr entry)
-               file (caddr entry))
-         (goto-char beg)
-         (while (re-search-forward regexp nd t)
-           (let* ((start (match-beginning group))
-                  (end (match-end group))
-                  (glyph (smiley-create-glyph (buffer-substring start end)
-                                              file)))
-             (when glyph
-               (mapcar 'delete-annotation (annotations-at end))
-               (let ((ext (make-extent start end))
-                     (ant (make-annotation glyph end 'text)))
-                 ;; set text extent params
-                 (set-extent-property ext 'end-open t)
-                 (set-extent-property ext 'start-open t)
-                 (set-extent-property ext 'invisible t)
-                 (set-extent-property ext 'keymap smiley-map)
-                 (set-extent-property ext 'mouse-face smiley-mouse-face)
-                 (set-extent-property ext 'intangible t)
-                 ;; set annotation params
-                 (set-extent-property ant 'mouse-face smiley-mouse-face)
-                 (set-extent-property ant 'keymap smiley-map)
-                 ;; remember each other
-                 (set-extent-property ant 'smiley-extent ext)
-                 (set-extent-property ext 'smiley-annotation ant)
-                 ;; Help
-                 (set-extent-property
-                  ext 'help-echo
-                  "button2 toggles smiley, button3 pops up menu")
-                 (set-extent-property
-                  ant 'help-echo
-                  "button2 toggles smiley, button3 pops up menu")
-                 (set-extent-property ext 'balloon-help
-                                      "Mouse button2 - toggle smiley
-Mouse button3 - menu")
-                 (set-extent-property ant 'balloon-help
-                                      "Mouse button2 - toggle smiley
-Mouse button3 - menu"))
-               (when (smiley-end-paren-p start end)
-                 (make-annotation ")" end 'text))
-               (goto-char end)))))))))
-
-;; FIXME: No popup menu, no customized color
-(defun smiley-buffer-ems (&optional buffer st nd)
-  (interactive)
-  (when window-system
+  (when (gnus-graphic-display-p)
+    (unless smiley-cached-regexp-alist
+      (smiley-update-cache))
     (save-excursion
-      (when buffer
-       (set-buffer buffer))
-      (let ((buffer-read-only nil)
-           (alist (if (symbolp smiley-regexp-alist)
-                      (symbol-value smiley-regexp-alist)
-                    smiley-regexp-alist))
-           (case-fold-search nil)
-           entry regexp beg group file)
-       (dolist (overlay (overlays-in (or st (point-min))
-                                     (or nd (point-max))))
-         (when (overlay-get overlay 'smiley)
-           (remove-text-properties (overlay-start overlay)
-                                   (overlay-end overlay) '(display))
-           (delete-overlay overlay)))
-       (goto-char (or st (point-min)))
-       (setq beg (point))
-       ;; loop through alist
-       (while (setq entry (pop alist))
-         (setq regexp (car entry)
-               group (cadr entry)
-               file (caddr entry))
+      (let ((beg (or start (point-min)))
+           group image images string)
+       (dolist (entry smiley-cached-regexp-alist)
+         (setq group (nth 1 entry)
+               image (nth 2 entry))
          (goto-char beg)
-         (while (re-search-forward regexp nd t)
-           (let* ((start (match-beginning group))
-                  (end (match-end group))
-                  (glyph (smiley-create-glyph nil file))
-                  (overlay (make-overlay start end)))
-             (when glyph
-               (add-text-properties start end
-                                    `(display ,glyph))
-               (overlay-put overlay 'smiley glyph)
-               (goto-char end)))))))))
-
-(defun smiley-end-paren-p (start end)
-  "Try to guess whether the current smiley is an end-paren smiley."
-  (save-excursion
-    (goto-char start)
-    (when (and (re-search-backward "[()]" nil t)
-              (eq (char-after) ?\()
-              (goto-char end)
-              (or (not (re-search-forward "[()]" nil t))
-                  (eq (char-after (1- (point))) ?\()))
-      t)))
-
-(defun smiley-toggle-buffer (&optional arg buffer st nd)
-  "Toggle displaying smiley faces.
+         (while (re-search-forward (car entry) end t)
+           (goto-char (match-end group))
+           (unless (text-property-any (match-beginning group) (point)
+                                      'smilified t)
+             (setq string (match-string group))
+             (delete-region (match-beginning group) (match-end group))
+             (when image
+               (push image images)
+               (gnus-add-wash-type 'smiley)
+               (gnus-add-image 'smiley image)
+               (put-text-property (point)
+                                  (progn
+                                    (gnus-put-image image string)
+                                    (point))
+                                  'smilified t)))))
+       (put-text-property beg (or end (point-max)) 'smilified nil)
+       images))))
+
+(defun smiley-toggle-buffer (&optional arg)
+  "Toggle displaying smiley faces in article buffer.
 With arg, turn displaying on if and only if arg is positive."
   (interactive "P")
-  (let (on off)
-    (map-extents
-     (lambda (e void)
-       (let (ant)
-        (if (annotationp (setq ant (extent-property e 'smiley-annotation)))
-            (if (eq (extent-property e 'invisible) nil)
-                (setq off (cons (cons ant e) off))
-              (setq on (cons (cons ant e) on)))))
-       nil)
-     buffer st nd)
-    (if (and (not (and (numberp arg) (< arg 0)))
-            (or (and (numberp arg) (> arg 0))
-                (null on)))
-       (if off
-           (while off
-             (reveal-annotation (caar off))
-             (set-extent-property (cdar off) 'invisible t)
-             (setq off (cdr off)))
-         (smiley-buffer))
-      (while on
-       (hide-annotation (caar on))
-       (set-extent-property (cdar on) 'invisible nil)
-       (setq on (cdr on))))))
-
-;; Simply removing all smiley if existing.
-;; FIXME: make it work as the one in XEmacs.
-(defun smiley-toggle-buffer-ems (&optional arg buffer st nd)
+  (gnus-with-article-buffer
+    (if (if (numberp arg)
+           (> arg 0)
+         (not (memq 'smiley gnus-article-wash-types)))
+       (smiley-region (point-min) (point-max))
+      (gnus-delete-images 'smiley))))
+
+(defun smiley-mouse-toggle-buffer (event)
   "Toggle displaying smiley faces.
 With arg, turn displaying on if and only if arg is positive."
-  (interactive "P")
-  (save-excursion
-    (when buffer
-      (set-buffer buffer))
-    (let (found)
-      (dolist (overlay (overlays-in (or st (point-min))
-                                   (or nd (point-max))))
-       (when (overlay-get overlay 'smiley)
-         (remove-text-properties (overlay-start overlay)
-                                 (overlay-end overlay) '(display))
-         (setq found t)))
-      (unless found
-       (smiley-buffer buffer st nd)))))
-
-(unless (featurep 'xemacs)
-  (defalias 'smiley-create-glyph 'smiley-create-glyph-ems)
-  (defalias 'smiley-toggle-extent 'smiley-toggle-extent-ems)
-  (defalias 'smiley-toggle-extents 'smiley-toggle-extents-ems)
-  (defalias 'smiley-buffer 'smiley-buffer-ems)
-  (defalias 'smiley-toggle-buffer 'smiley-toggle-buffer-ems))
-
-(defvar gnus-article-buffer)
-;;;###autoload
-(defun gnus-smiley-display (&optional arg)
-  "Display \"smileys\" as small graphical icons.
-With arg, turn displaying on if and only if arg is positive."
-  (interactive "P")
+  (interactive "e")
   (save-excursion
-    (article-goto-body)
-    (let (buffer-read-only)
-      (smiley-toggle-buffer arg (current-buffer) (point) (point-max)))))
+    (save-window-excursion
+      (mouse-set-point event)
+      (smiley-toggle-buffer))))
 
 (provide 'smiley)
 
-;; Local Variables:
-;; coding: iso-8859-1
-;; End:
-
 ;;; smiley.el ends here
index eb10aa7..364e3b7 100644 (file)
@@ -140,7 +140,7 @@ certificates to be sent with every message to each address."
 Directory should contain files (in PEM format) named to the X.509
 hash of the certificate.  This can be done using OpenSSL such as:
 
-$ ln -s ca.pem `openssl x509 -noout -hash -in ca.pem`
+$ ln -s ca.pem `openssl x509 -noout -hash -in ca.pem`.0
 
 where `ca.pem' is the file containing a PEM encoded X.509 CA
 certificate."
@@ -201,7 +201,9 @@ If nil, use system defaults."
       (lambda (prefix &optional dir-flag) ;; Simple implementation
        (expand-file-name
         (make-temp-name prefix)
-        temporary-file-directory)))))
+        (if (fboundp 'temp-directory)
+            (temp-directory)
+          temporary-file-directory))))))
 
 ;; Password dialog function
 
@@ -232,15 +234,17 @@ If nil, use system defaults."
 
 ;; Sign+encrypt region
 
-(defun smime-sign-region (b e keyfiles)
-  "Sign region with certified key in KEYFILES.
+(defun smime-sign-region (b e keyfile)
+  "Sign region with certified key in KEYFILE.
 If signing fails, the buffer is not modified.  Region is assumed to
-have proper MIME tags.  KEYFILES is expected to contain a PEM encoded
-private key and certificate as its car, and a list of additional certificates
-to include in its caar."
+have proper MIME tags.  KEYFILE is expected to contain a PEM encoded
+private key and certificate as its car, and a list of additional
+certificates to include in its caar.  If no additional certificates is
+included, KEYFILE may be the file containing the PEM encoded private
+key and certificate itself."
   (smime-new-details-buffer)
-  (let ((keyfile (car keyfiles))
-       (certfiles (and (cdr keyfiles) (cadr keyfiles)))
+  (let ((keyfile (or (car-safe keyfile) keyfile))
+       (certfiles (and (cdr-safe keyfile) (cadr keyfile)))
        (buffer (generate-new-buffer (generate-new-buffer-name " *smime*")))
        (passphrase (smime-ask-passphrase))
        (tmpfile (smime-make-temp-file "smime")))
@@ -307,11 +311,13 @@ KEYFILE should contain a PEM encoded key and certificate."
     (smime-sign-region
      (point-min) (point-max)
      (if keyfile
-        (list keyfile (smime-get-certfiles keyfile smime-keys))
+        keyfile
        (smime-get-key-by-email
-       (completing-read "Sign using which signature? " smime-keys nil nil
-                        (and (listp (car-safe smime-keys))
-                             (cdr smime-keys))))))))
+       (completing-read
+        (concat "Sign using which key? "
+                (if smime-keys (concat "(default " (caar smime-keys) ") ")
+                  ""))
+        smime-keys nil nil (car-safe (car-safe smime-keys))))))))
 
 (defun smime-encrypt-buffer (&optional certfiles buffer)
   "S/MIME encrypt BUFFER for recipients specified in CERTFILES.
@@ -428,9 +434,11 @@ in the buffer specified by `smime-details-buffer'."
      (expand-file-name
       (or keyfile
          (smime-get-key-by-email
-          (completing-read "Decrypt with which key? " smime-keys nil nil
-                           (and (listp (car-safe smime-keys))
-                                (caar smime-keys)))))))))
+          (completing-read
+           (concat "Decipher using which key? "
+                   (if smime-keys (concat "(default " (caar smime-keys) ") ")
+                     ""))
+           smime-keys nil nil (car-safe (car-safe smime-keys)))))))))
 
 ;; Various operations
 
diff --git a/lisp/spam.el b/lisp/spam.el
new file mode 100644 (file)
index 0000000..98a4151
--- /dev/null
@@ -0,0 +1,128 @@
+;;; spam.el --- Identifying spam
+;; Copyright (C) 2002 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: network
+
+;; This file is part of GNU Emacs.
+
+;; 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.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'dns)
+(require 'message)
+
+;;; Blackholes
+
+(defvar spam-blackhole-servers
+  '("bl.spamcop.net" "relays.ordb.org" "dev.null.dk"
+    "relays.visi.com" "rbl.maps.vix.com")
+  "List of blackhole servers.")
+
+(defun spam-check-blackholes ()
+  "Check the Recevieved headers for blackholed relays."
+  (let ((headers (message-fetch-field "received"))
+       ips matches)
+    (with-temp-buffer
+      (insert headers)
+      (goto-char (point-min))
+      (while (re-search-forward
+             "\\[\\([0-9]+.[0-9]+.[0-9]+.[0-9]+\\)\\]" nil t)
+       (push (mapconcat 'identity
+                        (nreverse (split-string (match-string 1) "\\."))
+                        ".")
+             ips)))
+    (dolist (server spam-blackhole-servers)
+      (dolist (ip ips)
+       (when (query-dns (concat ip "." server))
+         (push (list ip server (query-dns (concat ip "." server) 'TXT))
+               matches))))
+    matches))
+
+;;; Black- and white-lists
+
+(defvar spam-directory "~/News/spam/"
+  "When spam files are kept.")
+
+(defvar spam-whitelist (expand-file-name "whitelist" spam-directory)
+  "The location of the whitelist.
+The file format is one regular expression per line.
+The regular expression is matched against the address.")
+                                        
+(defvar spam-blacklist (expand-file-name "blacklist" spam-directory)
+  "The location of the blacklist.
+The file format is one regular expression per line.
+The regular expression is matched against the address.")
+
+(defvar spam-whitelist-cache nil)
+(defvar spam-blacklist-cache nil)
+
+(defun spam-enter-whitelist (address &optional blacklist)
+  "Enter ADDRESS into the whitelist.
+Optional arg BLACKLIST, if non-nil, means to enter in the blacklist instead."
+  (interactive "sAddress: ")
+  (let ((file (if blacklist spam-blacklist spam-whitelist)))
+    (unless (file-exists-p (file-name-directory file))
+      (make-directory (file-name-directory file) t))
+    (save-excursion
+      (set-buffer
+       (find-file-noselect file))
+      (goto-char (point-max))
+      (unless (bobp)
+       (insert "\n"))
+      (insert address "\n")
+      (save-buffer))))
+
+(defun spam-enter-blacklist (address)
+  "Enter ADDRESS into the blacklist."
+  (interactive "sAddress: ")
+  (spam-enter-whitelist address t))
+
+(defun spam-parse-whitelist (&optional blacklist)
+  (let ((file (if blacklist spam-blacklist spam-whitelist))
+       contents address)
+    (when (file-exists-p file)
+      (with-temp-buffer
+       (insert-file-contents file)
+       (while (not (eobp))
+         (setq address (buffer-substring (point) (point-at-eol)))
+         (forward-line 1)
+         (unless (zerop (length address))
+           (setq address (regexp-quote address))
+           (while (string-match "\\\\\\*" address)
+             (setq address (replace-match ".*" t t address)))
+           (push address contents))))
+      (nreverse contents))))
+
+(defun spam-refresh-list-cache ()
+  (setq spam-whitelist-cache (spam-parse-whitelist))
+  (setq spam-blacklist-cache (spam-parse-whitelist t)))
+
+(defun spam-address-whitelisted-p (address &optional blacklist)
+  (let ((cache (if blacklist spam-blacklist-cache spam-whitelist-cache))
+       found)
+    (while (and (not found)
+               cache)
+      (when (string-match (pop cache) address)
+       (setq found t)))
+    found))
+
+(provide 'spam)
+
+;;; spam.el ends here
index 771d3b5..9598f7d 100644 (file)
@@ -34,7 +34,7 @@
 
 ;;;###autoload
 (defun date-to-time (date)
-  "Convert DATE into time."
+  "Parse a string that represents a date-time and return a time value."
   (condition-case ()
       (apply 'encode-time
             (parse-time-string
     (error (error "Invalid date: %s" date))))
 
 (defun time-to-seconds (time)
-  "Convert TIME to a floating point number."
+  "Convert time value TIME to a floating point number.
+You can use `float-time' instead."
   (+ (* (car time) 65536.0)
      (cadr time)
      (/ (or (nth 2 time) 0) 1000000.0)))
 
+;;;###autoload
 (defun seconds-to-time (seconds)
-  "Convert SECONDS (a floating point number) to an Emacs time structure."
+  "Convert SECONDS (a floating point number) to a time value."
   (list (floor seconds 65536)
        (floor (mod seconds 65536))
        (floor (* (- seconds (ffloor seconds)) 1000000))))
 
+;;;###autoload
 (defun time-less-p (t1 t2)
-  "Say whether time T1 is less than time T2."
+  "Say whether time value T1 is less than time value T2."
   (or (< (car t1) (car t2))
       (and (= (car t1) (car t2))
           (< (nth 1 t1) (nth 1 t2)))))
 
+;;;###autoload
 (defun days-to-time (days)
-  "Convert DAYS into time."
+  "Convert DAYS into a time value."
   (let* ((seconds (* 1.0 days 60 60 24))
         (rest (expt 2 16))
         (ms (condition-case nil (floor (/ seconds rest))
     (list ms (condition-case nil (round (- seconds (* ms rest)))
               (range-error (expt 2 16))))))
 
+;;;###autoload
 (defun time-since (time)
-  "Return the time since TIME, which is either an internal time or a date."
+  "Return the time elapsed since TIME.
+TIME should be either a time value or a date-time string."
   (when (stringp time)
     ;; Convert date strings to internal time.
     (setq time (date-to-time time)))
     (list (- (+ (car current) (if rest -1 0)) (car time))
          (- (+ (or rest 0) (nth 1 current)) (nth 1 time)))))
 
-(defun subtract-time (t1 t2)
-  "Subtract two internal times."
+;;;###autoload
+(defalias 'subtract-time 'time-subtract)
+
+;;;###autoload
+(defun time-subtract (t1 t2)
+  "Subtract two time values.
+Return the difference in the format of a time value."
   (let ((borrow (< (cadr t1) (cadr t2))))
     (list (- (car t1) (car t2) (if borrow 1 0))
          (- (+ (if borrow 65536 0) (cadr t1)) (cadr t2)))))
 
+;;;###autoload
+(defun time-add (t1 t2)
+  "Add two time values.  One should represent a time difference."
+  (let ((high (car t1))
+       (low (if (consp (cdr t1)) (nth 1 t1) (cdr t1)))
+       (micro (if (numberp (car-safe (cdr-safe (cdr t1))))
+                  (nth 2 t1)
+                0))
+       (high2 (car t2))
+       (low2 (if (consp (cdr t2)) (nth 1 t2) (cdr t2)))
+       (micro2 (if (numberp (car-safe (cdr-safe (cdr t2))))
+                   (nth 2 t2)
+                 0)))
+    ;; Add
+    (setq micro (+ micro micro2))
+    (setq low (+ low low2))
+    (setq high (+ high high2))
+
+    ;; Normalize
+    ;; `/' rounds towards zero while `mod' returns a positive number,
+    ;; so we can't rely on (= a (+ (* 100 (/ a 100)) (mod a 100))).
+    (setq low (+ low (/ micro 1000000) (if (< micro 0) -1 0)))
+    (setq micro (mod micro 1000000))
+    (setq high (+ high (/ low 65536) (if (< low 0) -1 0)))
+    (setq low (logand low 65535))
+
+    (list high low micro)))
+
+;;;###autoload
 (defun date-to-day (date)
-  "Return the number of days between year 1 and DATE."
+  "Return the number of days between year 1 and DATE.
+DATE should be a date-time string."
   (time-to-days (date-to-time date)))
 
+;;;###autoload
 (defun days-between (date1 date2)
-  "Return the number of days between DATE1 and DATE2."
+  "Return the number of days between DATE1 and DATE2.
+DATE1 and DATE2 should be date-time strings."
   (- (date-to-day date1) (date-to-day date2)))
 
+;;;###autoload
 (defun date-leap-year-p (year)
   "Return t if YEAR is a leap year."
   (or (and (zerop (% year 4))
           (not (zerop (% year 100))))
       (zerop (% year 400))))
 
+;;;###autoload
 (defun time-to-day-in-year (time)
   "Return the day number within the year of the date month/day/year."
   (let* ((tim (decode-time time))
        (setq day-of-year (1+ day-of-year))))
     day-of-year))
 
+;;;###autoload
 (defun time-to-days (time)
   "The number of days between the Gregorian date 0001-12-31bce and TIME.
+TIME should be a time value.
 The Gregorian date Sunday, December 31, 1bce is imaginary."
   (let* ((tim (decode-time time))
         (month (nth 4 tim))
@@ -138,8 +185,8 @@ The number of days will be returned as a floating point number."
 
 ;;;###autoload
 (defun safe-date-to-time (date)
-  "Parse DATE and return a time structure.
-If DATE is malformed, a zero time will be returned."
+  "Parse a string that represents a date-time and return a time value.
+If DATE is malformed, return a time value of zeros."
   (condition-case ()
       (date-to-time date)
     (error '(0 0))))
index eb55f64..b30398c 100644 (file)
@@ -1,3 +1,310 @@
+2002-05-01  Lars Magne Ingebrigtsen  <larsi@quimbies.gnus.org>
+
+       * message.texi (Message Headers): Remove colon from index
+       entries. 
+
+2002-05-01  Simon Josefsson  <jas@extundo.com>
+
+       * gnus.texi (Group Mail Splitting): Fix example.
+       (Article Buttons): Document that REGEXP can be a variable as well.
+
+       * message.texi (Message Headers): Fix example.
+
+2002-04-26  Steve Youngs  <youngs@xemacs.org>
+
+       * Makefile.in (infodir): Set to '@info_dir@' so we can separate
+       defaults for XEmacs and Emacs.
+
+2002-04-27  Jesper Harder  <harder@ifa.au.dk>
+
+       * emacs-mime.texi (Customization): Update info on HTML renderers.
+
+       * gnus.texi (Article Washing): Update information on HTML washing.
+       Fix typos.
+
+2002-04-09  Paul Jarc  <prj@po.cwru.edu>
+
+       * .cvsignore: added message-[0-9]*
+
+2002-04-08  Paul Jarc  <prj@po.cwru.edu>
+
+       * gnus.texi (Group Parameters): Point to the message manual for a
+       full explanation of MFT.
+       * message.texi (Mailing Lists): Mention
+       message-gen-unsubscribed-mft.
+       From Karra <karra@cs.utah.edu>.
+
+2002-04-05  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+       * gnus.texi (Saving Articles): Add xref to Mail Group Commands
+       because people might be interested in `B c' for saving articles.
+       (Archived Messages): Ditto.
+
+2002-04-01  Jesper Harder  <harder@ifa.au.dk>
+
+       * gnus.texi (Sorting Groups): Add gnus-group-sort-selected-groups.
+       (Article Washing): Fix typo.
+
+       * message.texi (Various Commands): Index message-elide-ellipsis.
+       Add message-sort-headers.
+       (Mail Variables): Add message-qmail-inject-args,
+       message-mailer-swallows-blank-line, message-sendmail-f-is-evil,
+       message-qmail-inject-program.
+       (Various Message Variables): Add message-auto-save-directory,
+       message-strip-special-text-properties, message-cancel-hook.
+       (News Headers): Index message-user-organization etc.
+       (Forwarding): Add message-forward-before-signature.
+       (Mailing Lists): Index message-subscribed-address-file.
+       (Wide Reply): Add message-wide-reply-confirm-recipients.
+       (Canceling News): Add message-cancel-message.
+       (Sending Variables): Add message-interactive.
+
+2002-03-25  Simon Josefsson  <jas@extundo.com>
+
+       * gnus.texi (Mail Spool): Add cindex for marks.
+       (Mail Folders): Add cindex for marks.
+
+2002-03-24  Raymond Scholz <rscholz@zonix.de>
+
+       * gnus.texi (Summary Buffer Lines): Fix doc.
+
+2002-03-24  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * Makefile.in (booklet.dvi, booklet.pdf): Support booklet.
+
+2002-03-24  Felix Natter <fnatter@gmx.net>
+
+       * booklet.tex, bk-at.tex, bk-lt.tex, gnuslog-booklet.eps: New file.
+       * gnusref.tex, refcard.tex: Support booklet.
+
+2002-03-24  Jesper Harder  <harder@ifa.au.dk>
+
+       * gnusref.tex: Addition.
+
+       * gnus.texi: Don't use @sc in headings.
+       (Article Display): Fix.
+       (Signing and encrypting): Add mml-unsecure-message.
+       (IMAP): Remove @. to make texi2latex work.
+       (Thread Commands): Fix.
+       (Unavailable Servers): Add gnus-server-offline-server.
+       (Topic Sorting): Add gnus-topic-sort-groups.
+       (Limiting): Fix.
+       (Article Washing): Fix gnus-article-strip-headers-in-body, add
+       gnus-article-outlook-deuglify-article.
+       (Article Header):  Add gnus-article-remove-leading-whitespace.
+       (Customizing Articles): Add gnus-treat-leading-whitespace.
+       (Summary Score Commands): Add gnus-score-find-favourite-words.
+       (Mailing List): Index gnus-mailing-list-insinuate.
+       (Mail Group Commands): Add gnus-article-encrypt-body,
+       gnus-summary-create-article.  Don't use @var if not
+       metasyntactic. Index gnus-summary-edit-article-done.
+
+       * message.texi (Security): Add mml-unsecure-message.
+       (Mailing Lists): Index message-goto-mail-followup-to.
+
+2002-03-23  Jesper Harder <harder@ifa.au.dk>
+
+       * gnusref.tex, refcard.tex: Addition.
+
+2002-03-21  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.texi (Sending Variables): Fix typo.
+       Trivial change from Raymond Scholz <rscholz@zonix.de>
+
+2002-03-09  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Other Marks): Remove duplication.
+       Trivial change from David Aspinwall <aspinwall@timesten.com>
+
+2002-03-09  Paul Jarc  <prj@po.cwru.edu>
+
+       * gnus.texi: Mention nnmaildir where appropriate; fix some typos.
+
+2002-03-01  Paul Jarc  <prj@po.cwru.edu>
+
+       * message.texi (Mailing Lists): 'use is the default for
+       message-use-mail-followup-to, not nil; 'use is also not t.
+       Mention why an unsubscribed list poster might use MFT, and how to
+       disable MFT for a single message.
+
+2002-02-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Splitting Mail): Addition.
+
+2002-02-23  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnusref.tex (subsection*{Notes}): Addition.
+       Suggested by Felix Natter <fnatter@gmx.net>
+
+2002-02-22  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Splitting Mail): Addition.
+
+2002-02-20  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Slave Gnusae): Addition.
+       From  David S. Goldberg <david.goldberg6@verizon.net>
+
+2002-02-18  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * emacs-mime.texi (mailcap): Addition.
+
+       * gnus.texi (Using MIME): Rename functions. Addition.
+
+2002-02-16  Simon Josefsson  <jas@extundo.com>
+
+       * gnus.texi (Top): Change description of Posting Server node.
+       (Composing Messages): Ditto.
+       (Posting Server): Add some mail stuff.
+       (IMAP): Terminate @, from Emacs Gnus manual.
+       (Thwarting Email Spam): Use @sc.
+
+2002-02-16  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnusref.tex (subsection*{Notes}): Update.
+       From: Felix Natter <fnatter@gmx.net>
+
+2002-02-14  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Document Groups): Addition.
+
+2002-02-13  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * message.texi (Security): Fix @findex for the key `C-c C-m s p'.
+
+2002-02-13  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       Reinstate some changes to make latexpdf work.
+
+       * message.texi (Security): Don't use @key.
+       (Various Commands): Don't use @point.
+
+       * gnus.texi (Mail Source Specifiers): Use @uref.
+
+2002-02-13  Jesper Harder <harder@ifa.au.dk>
+
+       * message.texi, gnus.texi, emacs-mime.texi: Use small caps
+       consistently.  MIME, NOV, NNTP, HTML, IMAP are written with @sc
+       most places -- it looks better if it's the same *everywhere*.
+       @kbd instead of @code for key sequences. @file instead of @code
+       for files.
+
+       * message.texi (Various Commands): use the proper @point glyph.
+
+       * gnus.texi (Summary Mail Commands): \e,A_\e(B doesn't work.  A German
+       spelling reform changed the correct spelling to "muss" anyway (I
+       think).
+
+       * gnus.texi (Mail sources): \e,A'\e(B doesn't work. Use "section" instead.
+
+       * gnus.texi (Mail Source Specifiers): use @url.
+
+       * message.texi, emacs-mime.texi: update copyright year.
+
+2002-02-12  Paul Jarc  <prj@po.cwru.edu>
+
+       * gnus.texi (Required Back End Functions): specify the lowest and
+       highest article numbers for empty groups for nnchoke-request-list
+       and nnchoke-request-group.
+
+2002-02-12  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.texi (Sending Variables): Addition.
+
+       * gnus.texi (Group Parameters): Add unread, not read.
+       (Archived Messages): Addition.
+
+2002-02-09  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Group Parameters): Addition.
+       From: Steinar Bang <steinar@bang.priv.no>
+
+2002-02-08  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Article Washing): Addition.
+       From: Michael Cook <michael.cook@cisco.com>
+
+2002-02-06  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Gnus Unplugged): Use (setq gnus-agent t).
+       (Example Setup): Ditto.
+       (Category Syntax): Require gnus-agent.
+
+2002-02-06  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Posting Styles): Addition.
+
+2002-02-05  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.texi (Mailing Lists): Addition.
+       * gnus.texi (Group Parameters): Addition.
+       From Sriram Karra <karra@cs.utah.edu>.
+
+2002-02-03  Karl Kleinpaste  <karl@charcoal.com>
+
+       * gnus.texi (Summary Score Commands): Added detail on "extra"
+       header scoring.
+       (Score File Format): ditto
+
+2002-02-01  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (Customization): Addition.
+
+2002-01-31  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Posting Styles): Addition. Suggested by
+       Michael Cook <michael@waxrat.com>.
+
+2002-01-30  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (Customization): Move emacs-w3m stuff backward;
+       added documentation for `mm-inline-text-html-with-w3m-keymap'.
+
+2002-01-28  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Agent Expiry): Addition.
+
+2002-01-28  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (Customization): Added documentation for
+       `mm-inline-text-html-with-images'.
+
+       * gnus.texi (Article Washing): Replace w3m to emacs-w3m.
+
+2002-01-26  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Mail Spool): Addition.
+
+2002-01-24  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (Customization): Added documentation for
+       `mm-inline-text-html-renderer'.
+
+2002-01-23  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Article Washing): Add URL about w3m.
+
+2002-01-22  Josh Huber  <huber@alum.wpi.edu>
+
+       * emacs-mime.texi (MML Definition): Added a few words about the
+       recipients option.
+       * message.texi (Security): Changed documentation to reflect use of
+       the new secure tag.
+
+2002-01-21  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Article Washing): Addition.
+
+2002-01-20  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Document Groups): Added info on more doc types.
+       (More Threading): Move documentation here.
+
+2002-01-20  Simon Josefsson  <jas@extundo.com>
+
+       * message.texi (Mailing Lists): Fix.  From Love
+       <lha@stacken.kth.se>.
+
 2002-01-20  Patric Mueller  <bhaak@gmx.net>
 
        * gnus.texi (Group Timestamp): Typo fix.
@@ -9,7 +316,7 @@
 2002-01-19  Lars Magne Ingebrigtsen  <karra@cs.utah.edu>
 
        * gnus.texi (Mail Spool): Note that the .marks files can be
-       removed. 
+       removed.
 
 2002-01-17  Paul Jarc  <prj@po.cwru.edu>
 
 2002-01-11  ShengHuo ZHU  <zsh@cs.rochester.edu>
 
        * message.texi (Mailing Lists): Addition.
-       * gnus.texi (Group Parameters): Addition. 
+       * gnus.texi (Group Parameters): Addition.
        From Sriram Karra <karra@cs.utah.edu>.
 
 2002-01-10  Colin Marquardt  <c.marquardt@alcatel.de>
 2002-01-02  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * gnus.texi (Group Timestamp): Addition.  Example from Andras
-       BALI. 
+       BALI.
        (X-Face): Addition.
        (Advanced Formatting): Add example.
 
index 5c546cd..6d06e4e 100644 (file)
@@ -1,4 +1,4 @@
-infodir = @infodir@
+infodir = @info_dir@
 prefix = @prefix@
 srcdir = @srcdir@
 subdir = texi
@@ -96,6 +96,25 @@ refcard.pdf: refcard.tex gnuslogo-refcard.eps gnusref.tex
        epstopdf $(srcdir)/gnuslogo-refcard.eps --outfile=gnuslogo-refcard.pdf
        TEXINPUTS=$(srcdir):$$TEXINPUTS $(PDFLATEX) refcard.tex
 
+booklet.dvi: booklet.tex gnuslogo-refcard.eps gnusref.tex
+       if [ "$(PAPERTYPE)" == a4 ]; then \
+               TEXINPUTS=$(srcdir):$$TEXINPUTS $(LATEX) bk-a4.tex && \
+               mv bk-a4.dvi booklet.dvi ;\
+       else \
+               TEXINPUTS=$(srcdir):$$TEXINPUTS $(LATEX) bk-lt.tex && \
+               mv bk-lt.dvi booklet.dvi;\
+       fi
+
+booklet.pdf: booklet.tex gnuslogo-refcard.eps gnusref.tex
+       epstopdf $(srcdir)/gnuslogo-booklet.eps --outfile=gnuslogo-booklet.pdf
+       if [ "$(PAPERTYPE)" == a4 ]; then \
+               TEXINPUTS=$(srcdir):$$TEXINPUTS $(PDFLATEX) bk-a4.tex &&\
+               mv bk-a4.pdf booklet.pdf ;\
+       else \
+               TEXINPUTS=$(srcdir):$$TEXINPUTS $(PDFLATEX) bk-lt.tex &&\
+               mv bk-lt.pdf booklet.pdf ;\
+       fi
+
 clean:
        rm -f *.[cgk]idx *.aux *.cp *.cps *.dvi *.dvi-x *.fn *.ky       \
        *.kys *.latexi *.log *.orig *.pdf *.pdf-x *.pg *.rej            \
diff --git a/texi/bk-a4.tex b/texi/bk-a4.tex
new file mode 100644 (file)
index 0000000..20d13ab
--- /dev/null
@@ -0,0 +1,20 @@
+% Reference Booklet for (ding) Gnus, A4 format.
+% To be processed with latex 2e
+\documentclass{article}
+
+\usepackage{supertabular}
+
+\newlength{\logowidth} \setlength{\logowidth}{6.861in}
+\newlength{\logoheight} \setlength{\logoheight}{7.013in}
+
+\def\Guide{Card}\def\guide{card}
+\def\logoscale{0.25}
+
+\usepackage{epsfig}
+
+\textwidth 4.9in \textheight 7.35in \topmargin -1.0in
+\oddsidemargin -0.5in \evensidemargin -0.5in
+\begin{document}
+\small%\footnotesize
+\input{booklet}
+\end{document}
diff --git a/texi/bk-lt.tex b/texi/bk-lt.tex
new file mode 100644 (file)
index 0000000..0329059
--- /dev/null
@@ -0,0 +1,20 @@
+% Reference Booklet for (ding) Gnus, Letter format.
+% To be processed with latex 2e
+\documentclass{article}
+
+\usepackage{supertabular}
+
+\newlength{\logowidth} \setlength{\logowidth}{6.861in}
+\newlength{\logoheight} \setlength{\logoheight}{7.013in}
+
+\def\Guide{Card}\def\guide{card}
+\def\logoscale{0.25}
+
+\usepackage{epsfig}
+
+\textwidth 4.5in \textheight 7.5in \topmargin -1.0in
+\oddsidemargin -0.5in \evensidemargin -0.5in
+\begin{document}
+\small%\footnotesize
+\input{booklet}
+\end{document}
diff --git a/texi/booklet.tex b/texi/booklet.tex
new file mode 100644 (file)
index 0000000..5ae0821
--- /dev/null
@@ -0,0 +1,166 @@
+% include file for the Reference Booklet (16 pages).
+\def\Guide{Booklet}\def\guide{booklet}
+\def\logoscale{0.5}
+\def\sec{\section}
+\def\subsec{\subsection}
+\def\subsubsec{\subsubsection}
+\def\blankpage{\vspace*{\fill}\par
+%\centerline{(This page intentionally left blank.)}
+\par\vspace*{\fill}\pagebreak}
+
+\input{gnusref}
+
+\setcounter{page}{0}
+\thispagestyle{empty}
+\vspace*{\fill}
+\Title
+\vspace{0.4in}
+\Logo{booklet}
+\vspace*{\fill}
+\pagebreak
+
+% TODO: how does this work ?
+%\tableofcontents
+
+\Notes
+%
+\section*{Group-Mode}
+\GroupModeGeneral
+    \subsection*{Group Subscribedness-Levels}
+    \GroupLevels
+    \subsection*{List Groups}
+    \ListGroups
+    \subsection*{Create/Edit Foreign Groups}
+    \CreateEditGroups
+    \subsection*{Unsubscribe, Kill and Yank Groups}
+    \SubscribeKillYankGroups
+    \subsection*{Mark Groups}
+    \MarkGroups
+    \subsection*{Group-Unplugged}
+    \GroupUnplugged
+% topics in group-mode
+    \subsection*{Group Topics}
+    \GroupTopicsGeneral
+    \subsubsection*{Topic Sorting}
+    \TopicSorting
+%
+% summary-mode
+\section*{Summary-Mode}
+\SummaryModeGeneral
+    \subsection*{Select Articles}
+    \SelectArticles
+%
+    \subsection*{Threading}
+    \Threading
+%
+    \subsection*{Limiting}
+    \Limiting
+    \subsection*{Sort the Summary-Buffer}
+    \SortSummary
+    \subsection*{Score (Value) Commands}
+    \Scoring
+% 
+    \subsection*{MIME operations from the Summary-Buffer}
+    \MIMESummary
+    \subsection*{Extract Series (Uudecode etc)}
+    \ExtractSeries
+    \subsection*{Output Articles}
+    \OutputArticles
+%
+    \subsection*{Post, Followup, Reply, Forward, Cancel}
+    \PostReplyetc
+    \subsection*{Message-Composition}
+    \MsgCompositionGeneral
+        \subsubsection*{Jumping in message-buffer}
+        \MsgCompositionMovementArticle
+        \subsubsection*{Attachments/MML}
+        \MsgCompositionMML
+% marking articles
+    \subsection*{Mark Articles}
+    \MarkArticlesGeneral
+        \subsubsection*{Mark Based on Score}
+        \MarkByScore
+        \subsubsection*{The Process Mark}
+        \ProcessMark
+        \subsubsection*{Mark Indication-Characters}
+        \MarkCharacters
+%
+    \subsection*{Summary-Unplugged}
+    \SummaryUnplugged
+    \subsection*{Mail-Group Commands}
+    \MailGroups
+    \subsection*{Draft-Group Commands}
+    \DraftGroup
+% exiting
+    \subsection*{Exit the Summary-Buffer}
+    \ExitSummary
+%
+%
+\section*{Article Mode (reading)}
+\ArticleModeGeneral
+    \subsection*{Wash the Article-Buffer}
+    \WashArticle
+    \subsection*{Hide/Highlight Parts of the Article}
+    \HideHighlightArticle
+    \subsection*{MIME operations from the Article-Buffer (reading)}
+    \MIMEArticleMode
+%
+%
+\section*{Server Mode}
+\ServerMode
+    \subsection*{Unplugged-Server}
+    \ServerUnplugged
+%
+%
+\section*{Browse Server Mode}
+\BrowseServer
+
+%\pagebreak
+\vspace*{\fill}
+\Copyright
+
+%% \pagebreak
+%% \Notes
+%% \GroupLevels
+%% \Marks
+%% \General
+%% \ServerMode
+%% \BrowseServer
+%% \ArticleMode
+%% \pagebreak
+
+%% \GroupMode
+%% \ListGroups     
+%% \CreateGroups   
+%% \SortGroups     
+%% \SOUP           
+%% \MarkGroups     
+%% \Unsubscribe    
+%% \GroupTopics    
+%% \SummaryMode    
+%% \SortSummary    
+%% \Article        
+%% \MailGroup      
+%% \Limit          
+%% \GotoArticle    
+%% \MarkArticles   
+%% \MarkScore      
+%% \ProcessMark    
+%% \OutputArticles 
+%% \Send           
+%% \Exit           
+%% \Thread         
+%% \Score          
+%% \Wash           
+%% \Hide           
+%% \Highlight      
+%% \Extract        
+%% \PickAndRead    
+
+%% %\pagebreak
+%% %\sec{Personal Notes}
+%% %\blankpage
+
+%% \thispagestyle{empty}
+%% \vspace*{\fill}
+%% \CopyRight
index 12a4862..1283422 100644 (file)
@@ -47,7 +47,8 @@ license to the document, as described in section 6 of the license.
 @page
 
 @vskip 0pt plus 1filll
-Copyright @copyright{} 1998, 1999, 2000 Free Software Foundation, Inc.
+Copyright @copyright{} 1998, 1999, 2000, 2001, 2002 Free Software
+Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.1 or
@@ -92,7 +93,7 @@ read at least RFC2045 and RFC2047.
 * Interface Functions::   An abstraction over the basic functions.
 * Basic Functions::       Utility and basic parsing functions.
 * Decoding and Viewing::  A framework for decoding and viewing.
-* Composing::             MML; a language for describing MIME parts.
+* Composing::             MML; a language for describing @sc{mime} parts.
 * Standards::             A summary of RFCs and working documents used.
 * Index::                 Function and variable index.
 @end menu
@@ -119,16 +120,16 @@ both the old syntax as well as the new syntax, and if there is only one
 library, one must choose between the old version of the library and the
 new version of the library.
 
-The Emacs MIME library takes a different tack.  It defines a series of
-low-level libraries (@file{rfc2047.el}, @file{rfc2231.el} and so on)
-that parses strictly according to the corresponding standard.  However,
-normal programs would not use the functions provided by these libraries
-directly, but instead use the functions provided by the
-@code{mail-parse} library.  The functions in this library are just
-aliases to the corresponding functions in the latest low-level
-libraries.  Using this scheme, programs get a consistent interface they
-can use, and library developers are free to create write code that
-handles new standards.
+The Emacs @sc{mime} library takes a different tack.  It defines a
+series of low-level libraries (@file{rfc2047.el}, @file{rfc2231.el}
+and so on) that parses strictly according to the corresponding
+standard.  However, normal programs would not use the functions
+provided by these libraries directly, but instead use the functions
+provided by the @code{mail-parse} library.  The functions in this
+library are just aliases to the corresponding functions in the latest
+low-level libraries.  Using this scheme, programs get a consistent
+interface they can use, and library developers are free to create
+write code that handles new standards.
 
 The following functions are defined by this library:
 
@@ -241,7 +242,7 @@ at the beginning of the narrowed buffer.
 @item mail-header-narrow-to-field
 @findex mail-header-narrow-to-field
 Narrow the buffer to the header under point.  Understands continuation
-headers. 
+headers.
 
 @item mail-header-fold-field
 @findex mail-header-fold-field
@@ -647,7 +648,7 @@ Take a year number and say whether it's a leap year.
 
 @item time-to-day-in-year
 Take a time and return the day number within the year that the time is
-in. 
+in.
 
 @end table
 
@@ -795,10 +796,12 @@ Here's an example file:
 @example
 image/*; gimp -8 %s
 audio/wav; wavplayer %s
+application/msword; catdoc %s ; copiousoutput ; nametemplate=%s.doc
 @end example
 
-This says that all image files should be displayed with @code{gimp}, and
-that WAVE audio files should be played by @code{wavplayer}.
+This says that all image files should be displayed with @code{gimp},
+that WAVE audio files should be played by @code{wavplayer}, and that
+MS-WORD files should be inlined by @code{catdoc}.
 
 The @code{mailcap} library parses this file, and provides functions for
 matching types.
@@ -856,10 +859,10 @@ descend the message, following the structure, and return a tree of
 @node Non-MIME
 @section Non-MIME
 
-Gnus also understands some non-MIME attachments, such as postscript,
-uuencode, binhex, shar, forward, gnatsweb, pgp.  Each of these features
-can be disabled by add an item into @code{mm-uu-configure-list}.
-For example,
+Gnus also understands some non-@sc{mime} attachments, such as
+postscript, uuencode, binhex, shar, forward, gnatsweb, pgp.  Each of
+these features can be disabled by add an item into
+@code{mm-uu-configure-list}.  For example,
 
 @lisp
 (require 'mm-uu)
@@ -1003,7 +1006,7 @@ Prompt for a mailcap method to use to view the part.
 
 @item mm-inline-media-tests
 This is an alist where the key is a @sc{mime} type, the second element
-is a function to display the part @dfn{inline} (i.e., inside Emacs), and 
+is a function to display the part @dfn{inline} (i.e., inside Emacs), and
 the third element is a form to be @code{eval}ed to say whether the part
 can be displayed inline.
 
@@ -1023,7 +1026,7 @@ be displayed automatically.
 
 @item mm-attachment-override-types
 Some @sc{mime} agents create parts that have a content-disposition of
-@samp{attachment}.  This variable allows overriding that disposition and 
+@samp{attachment}.  This variable allows overriding that disposition and
 displaying the part inline.  (Note that the disposition is only
 overridden if we are able to, and want to, display the part inline.)
 
@@ -1062,6 +1065,29 @@ list containing that type.  For example assuming @code{mm-inlined-types}
 includes @samp{text/.*}, then including @samp{text/html} in this
 variable will cause @samp{text/html} parts to be treated as attachments.
 
+@item mm-inline-text-html-renderer
+This selects the function used to render @sc{html}.  The predefined
+renderers are selected by the symbols @code{w3},
+@code{w3m}@footnote{See @uref{http://emacs-w3m.namazu.org/} for more
+information about emacs-w3m}, @code{links}, @code{lynx} or
+@code{html2text}.  You can also specify a function, which will be
+called with a @sc{mime} handle as the argument.
+
+@item mm-inline-text-html-with-images
+Some @sc{html} mails might have the trick of spammers using
+@samp{<img>} tags.  It is likely to be intended to verify whether you
+have read the mail.  You can prevent your personal informations from
+leaking by setting this option to @code{nil} (which is the default).
+It is currently ignored by Emacs/w3.  For emacs-w3m, you may use the
+command @kbd{t} on the image anchor to show an image even if it is
+@code{nil}.@footnote{The command @kbd{T} will load all images.  If you
+have set the option @code{w3m-key-binding} to @code{info}, use @kbd{i}
+or @kbd{I} instead.}
+
+@item mm-inline-text-html-with-w3m-keymap
+You can use emacs-w3m command keys in the inlined text/html part by
+setting this option to non-@code{nil}.  The default value is @code{t}.
+
 @end table
 
 
@@ -1082,7 +1108,7 @@ Here's an example viewer for displaying @code{text/enriched} inline:
 @end lisp
 
 We see that the function takes a @sc{mime} handle as its parameter.  It
-then goes to a temporary buffer, inserts the text of the part, does some 
+then goes to a temporary buffer, inserts the text of the part, does some
 work on the text, stores the result, goes back to the buffer it was
 called from and inserts the result.
 
@@ -1114,7 +1140,7 @@ string containing the @sc{mime} message.
 * Simple MML Example::             An example MML document.
 * MML Definition::                 All valid MML elements.
 * Advanced MML Example::           Another example MML document.
-* Charset Translation::            How charsets are mapped from @sc{mule} to MIME.
+* Charset Translation::            How charsets are mapped from @sc{mule} to @sc{mime}.
 * Conversion::                     Going from @sc{mime} to MML and vice versa.
 * Flowed text::                    Soft and hard newlines.
 @end menu
@@ -1216,6 +1242,10 @@ RFC822 date when the part was modified (@code{Content-Disposition}).
 @item read-date
 RFC822 date when the part was read (@code{Content-Disposition}).
 
+@item recipients
+Who to encrypt/sign the part to.  This field is used to override any
+auto-detection based on the To/CC headers.
+
 @item size
 The size (in octets) of the part (@code{Content-Disposition}).
 
@@ -1377,7 +1407,7 @@ given by @code{mail-parse-charset} (a symbol) is used.  (Never set this
 variable directly, though.  If you want to change the default charset,
 please consult the documentation of the package which you use to process
 @sc{mime} messages.
-@xref{Various Message Variables, , Various Message Variables, message, 
+@xref{Various Message Variables, , Various Message Variables, message,
       Message Manual}, for example.)
 If there are only ASCII characters, the @sc{mime} charset US-ASCII is
 used, of course.
@@ -1482,7 +1512,7 @@ Registration Procedures
 Conformance Criteria and Examples
 
 @item RFC2231
-MIME Parameter Value and Encoded Word Extensions: Character Sets,
+@sc{mime} Parameter Value and Encoded Word Extensions: Character Sets,
 Languages, and Continuations
 
 @item RFC1843
@@ -1493,7 +1523,7 @@ ASCII characters
 Draft for the successor of RFC822
 
 @item RFC2112
-The MIME Multipart/Related Content-type
+The @sc{mime} Multipart/Related Content-type
 
 @item RFC1892
 The Multipart/Report Content Type for the Reporting of Mail System
index 7c8b4a9..03569e9 100644 (file)
@@ -435,8 +435,8 @@ Gnus \e$B$r;H$&$3$H$K$h$C$F\e(B Emacs \e$B$G%K%e!<%9\e(B (news) \e$B$r\e(B (\e$B$=$l$K%
 mbox \e$B%U%!%$%k$J$I$N$"$i$f$k6K0-$J<jCJ$r6n;H$7$F<j$KF~$l$k$3$H$,$G$-$^$9!#\e(B
 \e$B1?;n$7$r$7$F$_$h$&$H;W$&$J$i$P!"A4$F$rF1;~$KMQ$$$k$3$H$b$G$-$^$9!#\e(B
 
-T-gnus \e$B$O\e(B SEMI API \e$B$K4p$E$/\e(B MIME \e$B5!G=$rDs6!$7$^$9!#$=$&$$$&Lu$G!"\e(B
-T-gnus \e$B$O!"Bg$-$J3($,F~$C$F$$$?$j$5$^$6$^$J7A<0$rMQ$$$?$j$7$F$$$k$A$g$C\e(B
+T-gnus \e$B$O\e(B @sc{semi} API \e$B$K4p$E$/\e(B @sc{mime} \e$B5!G=$rDs6!$7$^$9!#$=$&$$$&Lu\e(B
+\e$B$G!"\e(BT-gnus \e$B$OBg$-$J3($,F~$C$F$$$?$j$5$^$6$^$J7A<0$rMQ$$$?$j$7$F$$$k$A$g$C\e(B
 \e$B$HJQ$o$C$?5-;v$rFI$`8"Mx$rMJ8n$7$^$9!#\e(BT-gnus \e$B$O\e(B MULE API \e$B$K4p$E$/9q:]2=!&\e(B
 \e$BCO0h2=!"$*$h$S!"B?;z2=5!G=$rDs6!$7$^$9!#$h$C$F!"\e(BT-gnus \e$B$O$5$^$6$^$J8@8l\e(B
 \e$B7w$r:9JL$7$^$;$s!#$"$"!"%/%j%s%4%s$NJ}$O\e(B Unicode Next Generation \e$B$r$*BT\e(B
@@ -712,7 +712,8 @@ Article Buffer
 Composing Messages
 
 * Mail::                        \e$B%a!<%k$HJVEz\e(B
-* Posting Server::              \e$B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+\e(B?
+* Posting Server::              \e$B$I$N%5!<%P!<$rDL$7$F%K%e!<%9$rEj9F$^$?$O\e(B
+                                \e$B%a!<%k$rAw?.$9$k$Y$-$+\e(B?
 * Mail and Post::               \e$BF1;~$K%a!<%k$r=P$7JVEz$9$k\e(B
 * Archived Messages::           \e$BAw$C$?%a%C%;!<%8$r\e(B gnus \e$B$,Cy$a$F$*$/$H$3\e(B
                                 \e$B$m\e(B
@@ -730,7 +731,7 @@ Select Methods
 * Getting Mail::                \e$B8D?ME*$J%a!<%k$r\e(B gnus \e$B$GFI$`\e(B
 * Browsing the Web::            \e$B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$r<hF@$9\e(B
                                 \e$B$k\e(B
-* IMAP::                        Gnus \e$B$r\e(B IMAP \e$B$N%/%i%$%"%s%H$H$7$F;H$&\e(B
+* IMAP::                        gnus \e$B$r\e(B @sc{imap} \e$B$N%/%i%$%"%s%H$H$7$F;H$&\e(B
 * Other Sources::               \e$B%G%#%l%/%H%j!<!"%U%!%$%k!"\e(BSOUP \e$B%Q%1%C%H\e(B
                                 \e$B$rFI$`\e(B
 * Combined Groups::             \e$BJ#?t$N%0%k!<%W$r0l$D$N%0%k!<%W$K7k9g$9$k\e(B
@@ -1260,6 +1261,12 @@ Gnus \e$B$O!"?.Mj$G$-$k%W%m%0%i%`$N0l$D$H$7$F!"%5!<%P!<$H@\B3$G$-$J$$$H$-$O\e(B
 \e$B$b$A$m$s!"%9%l!<%V%U%!%$%k$+$i$N>pJs$OIaDL$N\e(B (\e$B$9$J$o$A!"%^%9%?!<$N\e(B) \e$B%U%!\e(B
 \e$B%$%k$h$j$bM%@h$5$l$^$9!#\e(B
 
+\e$B%9%l!<%V$r5/F0$9$k$H$-$K$b$7%^%9%?!<$N\e(B @code{.newsrc*} \e$B%U%!%$%k72$,%;!<\e(B
+\e$B%V$5$l$F$$$J$+$C$?$i!"<+F0J]B8$5$l$?%U%!%$%k$rFI$`$+$I$&$+$r?R$M$i$l$k$+\e(B
+\e$B$b$7$l$^$;$s!#\e(B"yes" \e$B$HEz$($k$H!"%^%9%?!<$K%;!<%V$5$l$F$$$J$$JQ99$O%9%l!<\e(B
+\e$B%V$KH?1G$5$l$^$;$s!#\e(B"no" \e$B$HEz$($k$H!"%^%9%?!<$GFI$^$l$?$$$/$D$+$N5-;v$,!"\e(B
+\e$B%9%l!<%V$G$OL$FI$G$"$k$H8+$J$5$l$k$+$b$7$l$^$;$s!#\e(B
+
 @node Fetching a Group
 @section \e$B%0%k!<%W$r<hF@$9$k\e(B
 @cindex fetching a group
@@ -1442,9 +1449,10 @@ options -n !alt.all !rec.all sci.all
 \e$BM>J,$J$b$N$G$9!#$7$+$7!";d$O$3$NFs$D$,$"$C$?J}$,NI$$$H;W$$$^$7$?!#$b$&0l\e(B
 \e$BJ}$NJQ?t$O%f!<%6$,$$$8$/$k$N$K;H$o$l$k$N$KBP$7$F!"$3$NJQ?t$O$$$/$D$+$N4p\e(B
 \e$BK\E*$J5,B'$r@_Dj$9$k$?$a$N$b$N$G$9!#=i4|@_Dj$G$O$3$NJQ?t$O%a!<%k%P%C%/%(\e(B
-\e$B%s%I\e(B (@code{nnml}, @code{nnbabyl}, @code{nnfolder}, @code{nnmbox}@ \e$B$H\e(B
-@code{nnmh}) \e$B$+$i$G$-$kA4$F$N?7$7$$%0%k!<%W$r9XFI$9$k$h$&$K$J$C$F$$$^$9!#\e(B
-\e$B$=$l$,7y$G$"$l$P!"$3$NJQ?t$r\e(B @code{nil} \e$B$K@_Dj$7$F$/$@$5$$!#\e(B
+\e$B%s%I\e(B (@code{nnml}, @code{nnbabyl}, @code{nnfolder}, @code{nnmbox},
+@code{nnmh} \e$B$*$h$S\e(B @code{nnmaildir}) \e$B$+$i$G$-$kA4$F$N?7$7$$%0%k!<%W$r9X\e(B
+\e$BFI$9$k$h$&$K$J$C$F$$$^$9!#$=$l$,7y$G$"$l$P!"$3$NJQ?t$r\e(B @code{nil} \e$B$K@_Dj\e(B
+\e$B$7$F$/$@$5$$!#\e(B
 
 \e$B$3$N@55,I=8=$K9gCW$9$k?7$7$$%0%k!<%W\e(B
 \e$B$O\e(B @code{gnus-subscribe-options-newsgroup-method} \e$B$r;H$C$F9XFI$5$l$^$9!#\e(B
@@ -1889,7 +1897,7 @@ Gnus \e$B$N5/F0$K@.8y$7$?8e$K!"0lHV:G8e$K<B9T$5$l$k%U%C%/$G$9!#\e(B
 @item t
 \e$B?dDjA45-;v?t\e(B (\e$B$3$l$O<B:]$O\e(B @var{max-number} - @var{min-number} + 1)\e$B!#\e(B
 
-Gnus \e$B$,$3$N?dDj$r;H$&$N$O!"\e(BNNTP \e$B%W%m%H%3%k$OG=N($NNI\e(B
+gnus \e$B$,$3$N?dDj$r;H$&$N$O!"\e(B@sc{nntp} \e$B%W%m%H%3%k$OG=N($NNI\e(B
 \e$B$$\e(B @var{max-number} \e$B$H\e(B @var{min-number} \e$B$X$N%"%/%;%9$rDs6!$9$k$b$N$N!"K\\e(B
 \e$BEv$NL$FI5-;v$N?t$rF@$k$K$OI,$:$7$bG=N(E*$G$O$J$$$+$i$G$9!#%R%9%F%j%C%/$J\e(B
 \e$B%l!<%:%s\e(B (\e$BLuCm\e(B: \e$BNr;KE*$JM}M3$N%b%8$j$+\e(B?) \e$B$K$h$j!"%a!<%k%P%C%/%(%s%I$K$*\e(B
@@ -2784,13 +2792,15 @@ kiboze \e$B%0%k!<%W$r:n@.$7$^$9!#%W%m%s%W%H$GL>A0$H!"\e(Bkiboze \e$B%0%k!<%W$K!V4^$
 
 @code{gnus-parameter-to-list-alist} \e$B$b;2>H$7$F2<$5$$!#\e(B
 
+@anchor{subscribed}
 @item subscribed
 @cindex subscribed
 \e$B$b$7$3$N%Q%i%a!<%?$,\e(B @code{t} \e$B$K@_Dj$5$l$F$$$k$H!"\e(Bgnus \e$B$O$"$J$?$,$3$N%0\e(B
 \e$B%k!<%W$r\e(B to-address \e$B$H\e(B to-list \e$B%Q%i%a!<%?$N%"%I%l%9$G9XFI$7$F$$$k%a!<%j\e(B
 \e$B%s%0%j%9%H$G$"$k$H2r<a$7$^$9!#$3$N>pJs$r\e(B gnus \e$B$KM?$($k$3$H$O!"$"$J$?$,$=\e(B
-\e$B$l$i$N%a!<%j%s%0%j%9%H$KEj9F$9$k$H$-$K!"@5$7$$\e(B Mail-Followup-To \e$B%X%C%@!<\e(B
-\e$B$r@8@.$9$kLr$KN)$A$^$9!#\e(B
+\e$B$l$i$N%a!<%j%s%0%j%9%H$KEj9F$9$k$H$-$K@5$7$$\e(B Mail-Followup-To \e$B%X%C%@!<$r\e(B
+\e$B@8@.$9$k$?$a$N\e(B (\e$B$[$s$N\e(B) \e$BBh0lJb$G$9!#MxMQ$G$-$k\e(B MFT \e$BBP1~5!G=$r40A4$K07$&\e(B
+\e$B$K$O!"$3$3\e(B @pxref{(message)Mailing Lists} \e$B$r8+$F2<$5$$!#\e(B
 
 @code{gnus-find-subscribed-addresses} \e$B$b;2>H$7$F2<$5$$!#$3$N4X?t$O$3$N%0\e(B
 \e$B%k!<%W%Q%i%a!<%?$rD>@\$K;H$$$^$9!#\e(B
@@ -2827,7 +2837,9 @@ kiboze \e$B%0%k!<%W$r:n@.$7$^$9!#%W%m%s%W%H$GL>A0$H!"\e(Bkiboze \e$B%0%k!<%W$K!V4^$
 \e$B$7\e(B @code{(gcc-self . none)} \e$B$,$"$l$P!"\e(B@code{Gcc:} \e$BMs$O@8@.$5$l$:!"\e(B
 @code{(gcc-self . "string")} \e$B$,$"$l$P$3$NJ8;zNs$O$=$N$^$^\e(B @code{gcc} \e$BMs\e(B
 \e$B$KA^F~$5$l$^$9!#$3$N%Q%i%a!<%?$O0J2<$G@bL@$9$kA4$F$N\e(B @code{Gcc} \e$B$N=i4|5,\e(B
-\e$BB'$h$j$bM%@h$5$l$^$9\e(B (@pxref{Archived Messages})\e$B!#\e(B
+\e$BB'$h$j$bM%@h$5$l$^$9\e(B (@pxref{Archived Messages})\e$B!#7Y9p\e(B:: @code{nntp} \e$B%5!<\e(B
+\e$B%P!<$J$I$N%0%k!<%W$G\e(B @code{(gcc-self . t)} \e$B$r@_Dj$9$k$H%(%i!<$r0z$-5/$3\e(B
+\e$B$7$^$9!#$J$<$J$i\e(B @code{nntp} \e$B%5!<%P!<$O5-;v$r<u$1F~$l$^$;$s$+$i!#\e(B
 
 @item auto-expire
 @cindex auto-expire
@@ -2895,8 +2907,8 @@ kiboze \e$B%0%k!<%W$r:n@.$7$^$9!#%W%m%s%W%H$GL>A0$H!"\e(Bkiboze \e$B%0%k!<%W$K!V4^$
 \e$B$$$/$D$+Nc$r5s$2$^$9\e(B:
 
 @table @code
-@item [read]
-\e$B4{FI$N5-;v$@$1$rI=<($7$^$9!#\e(B
+@item [unread]
+\e$BL$FI$N5-;v$@$1$rI=<($7$^$9!#\e(B
 
 @item [not expire]
 \e$B4|8B@Z$l>C5n2DG=$J5-;v0J30$N$9$Y$F$rI=<($7$^$9!#\e(B
@@ -2905,10 +2917,11 @@ kiboze \e$B%0%k!<%W$r:n@.$7$^$9!#%W%m%s%W%H$GL>A0$H!"\e(Bkiboze \e$B%0%k!<%W$K!V4^$
 \e$B4|8B@Z$l>C5n2DG=$H$9$G$KJV?.$7$?5-;v0J30$N$9$Y$F$rI=<($7$^$9!#\e(B
 @end table
 
-\e$BMxMQ$G$-$k1i;;;R$O\e(B @code{not}\e$B!"\e(B@code{and} \e$B$*$h$S\e(B @code{or} \e$B$G$9!#=R8l\e(B
-\e$B$O\e(B @code{read}\e$B!"\e(B@code{dormant}\e$B!"\e(B@code{expire}\e$B!"\e(B@code{reply}\e$B!"\e(B
-@code{killed}\e$B!"\e(B@code{bookmark}\e$B!"\e(B@code{score}\e$B!"\e(B@code{save}\e$B!"\e(B@code{cache}\e$B!"\e(B
-@code{forward}\e$B!"\e(B@code{seen} \e$B$*$h$S\e(B @code{recent} \e$B$r4^$_$^$9!#\e(B
+\e$BMxMQ$G$-$k1i;;;R$O\e(B @code{not}, @code{and} \e$B$*$h$S\e(B @code{or} \e$B$G$9!#=R8l\e(B
+\e$B$O\e(B @code{tick}, @code{unsend}, @code{undownload}, @code{unread},
+@code{dormant}, @code{expire}, @code{reply}, @code{killed},
+@code{bookmark}, @code{score}, @code{save}, @code{cache}, @code{forward},
+@code{unseen} \e$B$*$h$S\e(B @code{recent} \e$B$r4^$_$^$9!#\e(B
 @end table
 
 @code{display} \e$B%Q%i%a!<%?$O!"35N,%P%C%U%!$r;XDj$7$?0lIt$NAH$@$1$K@)8B$9\e(B
@@ -2982,9 +2995,9 @@ Sieve \e$B$N\e(B @samp{IF} \e$B@)8f9=B$BN$,:n$i$l$^$9!#\e(B
 \e$B$k\e(B (@pxref{Sieve Commands}) \e$B$H$-$K!"0J2<$N\e(B Sieve \e$B%3!<%I$,:n$i$l$^$9\e(B:
 
 @example
-  if address \"sender\" \"sieve-admin@@extundo.com\" @{
-          fileinto \"INBOX.list.sieve\";
-  @}
+if address \"sender\" \"sieve-admin@@extundo.com\" @{
+        fileinto \"INBOX.list.sieve\";
+@}
 @end example
 
 Sieve \e$B8@8l$O\e(B RFC 3028 \e$B$G=R$Y$i$l$F$$$^$9!#\e(B@xref{Top, , Top, sieve, Emacs
@@ -2998,6 +3011,15 @@ Sieve}\e$B!#\e(B
 @code{gnus-show-threads} \e$B$O!"$=$N35N,%P%C%U%!$NCf$N%m!<%+%kJQ?t$K$J$j!"\e(B
 form \e$B$N\e(B @code{nil} \e$B$O$=$3$GI>2A$5$l$^$9!#\e(B
 
+@vindex gnus-list-identifiers
+\e$B$3$N5!G=$NMQES$N0l$D$O!"5-;v$NBjL>Ms$+$i%a!<%j%s%0%j%9%H$NI8<1%?%0$r$O$.\e(B
+\e$B<h$k$3$H$G$9!#$b$7%K%e!<%9%0%k!<\e(B
+\e$B%W\e(B @samp{nntp+news.gnus.org:gmane.text.docbook.apps} \e$B$,!"$9$Y$F$N5-;v$N\e(B
+\e$BBjL>$K\e(B @samp{DOC-BOOK-APPS:} \e$B$H$$$&%?%0$r;}$C$F$$$k$J$i$P!"$=$N%0%k!<%W\e(B
+\e$B$N%0%k!<%W%Q%i%a!<%?$K\e(B @code{(gnus-list-identifiers "DOCBOOK-APPS:")} \e$B$r\e(B
+\e$BF~$l$k$3$H$K$h$C$F!"$=$N%0%k!<%W$N35N,%P%C%U%!$KI=<($5$l$k5-;v$NBjL>$+$i\e(B
+\e$B%?%0$r$O$.<h$k$3$H$,$G$-$^$9!#\e(B
+
 \e$B$3$l$O$b$7I,MW$G$"$l$P!"%0%k!<%WKh$N%U%C%/4X?t$H$7$F$b;HMQ$G$-$^$9!#$b$7\e(B
 \e$B$"$k%0%k!<%W$KF~$C$?$H$-$K%S!<%W2;$rLD$i$7$?$1$l$P!"$=$N%0%k!<%W$N%Q%i%a!<\e(B
 \e$B%?$K\e(B @code{(dummy-variable (ding))} \e$B$_$?$$$J$b$N$r=q$$$F$*$/$3$H$b$G$-$^\e(B
@@ -3266,39 +3288,44 @@ kill \e$B$5$l$?%0%k!<%W$rA4$FI=<($7$^$9\e(B (@code{gnus-group-list-killed})\e$B!#@\
 @item G P a
 @kindex G P a (\e$B%0%k!<%W\e(B)
 @findex gnus-group-sort-selected-groups-by-alphabet
-\e$B%0%k!<%W$r!"%0%k!<%WL>$N%"%k%U%!%Y%C%H=g$GJB$YBX$($^\e(B
+\e$B%0%k!<%W$r%0%k!<%WL>$N%"%k%U%!%Y%C%H=g$GJB$YBX$($^\e(B
 \e$B$9\e(B (@code{gnus-group-sort-selected-groups-by-alphabet})\e$B!#\e(B
 
 @item G P u
 @kindex G P u (\e$B%0%k!<%W\e(B)
 @findex gnus-group-sort-selected-groups-by-unread
-\e$B%0%k!<%W$r!"L$FI5-;v$N?t$GJB$YBX$($^\e(B
+\e$B%0%k!<%W$rL$FI5-;v$N?t$GJB$YBX$($^\e(B
 \e$B$9\e(B (@code{gnus-group-sort-selected-groups-by-unread})\e$B!#\e(B
 
 @item G P l
 @kindex G P l (\e$B%0%k!<%W\e(B)
 @findex gnus-group-sort-selected-groups-by-level
-\e$B%0%k!<%W$r!"%0%k!<%W%l%Y%k$GJB$YBX$($^\e(B
+\e$B%0%k!<%W$r%0%k!<%W%l%Y%k$GJB$YBX$($^\e(B
 \e$B$9\e(B (@code{gnus-group-sort-selected-groups-by-level})\e$B!#\e(B
 
 @item G P v
 @kindex G P v (\e$B%0%k!<%W\e(B)
 @findex gnus-group-sort-selected-groups-by-score
-\e$B%0%k!<%W$r!"%0%k!<%W$N%9%3%"$GJB$YBX$($^\e(B
+\e$B%0%k!<%W$r%0%k!<%W$N%9%3%"$GJB$YBX$($^\e(B
 \e$B$9\e(B (@code{gnus-group-sort-selected-groups-by-score})\e$B!#\e(B
 @xref{Group Score}.
 
 @item G P r
 @kindex G P r (\e$B%0%k!<%W\e(B)
 @findex gnus-group-sort-selected-groups-by-rank
-\e$B%0%k!<%W$r!"%0%k!<%W$N%i%s%/$GJB$YBX$($^\e(B
+\e$B%0%k!<%W$r%0%k!<%W$N%i%s%/$GJB$YBX$($^\e(B
 \e$B$9\e(B (@code{gnus-group-sort-selected-groups-by-rank})\e$B!#\e(B@xref{Group Score}.
 
 @item G P m
 @kindex G P m (\e$B%0%k!<%W\e(B)
 @findex gnus-group-sort-selected-groups-by-method
-\e$B%0%k!<%W$r!"%P%C%/%(%s%I$NL>A0$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^\e(B
+\e$B%0%k!<%W$r%P%C%/%(%s%I$NL>A0$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^\e(B
 \e$B$9\e(B (@code{gnus-group-sort-selected-groups-by-method})\e$B!#\e(B
+
+@item G P s
+@kindex G P s (\e$B%0%k!<%W\e(B)
+@findex gnus-group-sort-selected-groups
+\e$B%0%k!<%W$r\e(B @code{gnus-group-sort-function} \e$B$K=>$C$FJB$YBX$($^$9!#\e(B
 @end table
 
 \e$B:G8e$K!"\e(B@kbd{C-k} \e$B$H\e(B @kbd{C-y} \e$B$r;H$C$F!"<jF0$G%0%k!<%W$r$"$A$3$A$K0\F0\e(B
@@ -3809,10 +3836,17 @@ Gnus \e$B$,CN$C$F$$$k%H%T%C%/2=$5$l$?%0%k!<%W$rA4$FI=<($7$^\e(B
 @findex gnus-topic-sort-groups-by-server
 \e$B8=:_$N%H%T%C%/$r%5!<%P!<$NL>A0$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^\e(B
 \e$B$9\e(B (@code{gnus-topic-sort-groups-by-server})\e$B!#\e(B
+
+@item T S s
+@kindex T S s (\e$B%H%T%C%/\e(B)
+@findex gnus-topic-sort-groups
+\e$B8=:_$N%H%T%C%/$r!"JQ?t\e(B @code{gnus-group-sort-function} \e$B$GM?$($i$l$k4X?t\e(B
+\e$B$K=>$C$FJB$YBX$($^$9\e(B (@code{gnus-topic-sort-groups})\e$B!#\e(B
 @end table
 
-\e$B%0%k!<%W$N%=!<%H$K$D$$$F$N$5$i$J$k>pJs$O\e(B @xref{Sorting Groups} \e$B$r;2>H$7\e(B
-\e$B$F$/$@$5$$!#\e(B
+\e$B@\F,0z?t$,M?$($i$l$?$i!"$3$l$i$9$Y$F$N%3%^%s%I$O5U=g$NJB$YBX$($r9T$J$$$^\e(B
+\e$B$9!#%0%k!<%W$N%=!<%H$K$D$$$F$N$5$i$J$k>pJs$O\e(B @xref{Sorting Groups} \e$B$r;2\e(B
+\e$B>H$7$F$/$@$5$$!#\e(B
 
 @node Topic Topology
 @subsection \e$B%H%T%C%/$N0LAj9=B$\e(B
@@ -4391,7 +4425,7 @@ Gnus \e$B$OJQ?t\e(B @code{gnus-extract-address-components} \e$B$NCM$r\e(B @code{From
 \e$B$^$8$-$3$H$G$9!#4X?t\e(B @code{gnus-goto-colon} \e$B$r!"$"$J$?$,9%$-$J%+!<%=%k$N\e(B
 \e$BF0$-$K$J$k$h$&$K!"?7$?$K=q$1$PNI$$$N$G$9!#\e(B) @xref{Positioning Point}\e$B!#\e(B
 
-\e$B=i4|CM$NJ8;zNs$O\e(B @samp{%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n} \e$B$G$9!#\e(B
+\e$B=i4|CM$NJ8;zNs$O\e(B @samp{%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n} \e$B$G$9!#\e(B
 
 \e$B0J2<$NMM<0;X<(J8;z$H3HD%MM<0;X<($r;H$&$3$H$,$G$-$^$9\e(B:
 
@@ -5098,7 +5132,7 @@ gnus \e$B$O$=$N%a!<%k$r<hF@$7$F!"$=$l$N%X%C%@!<$N@:L)D4::$,$G$-$k$h$&$K2hLL\e(B
 @code{\e$B%]%9%H%^%9%?!<\e(B} (postmaster) \e$B$G$b$"$j!"\e(B@code{\e$B%k!<%H\e(B} \e$B$K\e(B @code{\e$B%]%9\e(B
 \e$B%H%^%9%?!<\e(B} \e$B$X$N%a!<%k$r<u$1<h$C$?>l9g$O!"$=$l\e(B
 \e$B$r\e(B @code{\e$B%]%9%H%^%9%?!<\e(B} \e$B$K$b:FAw$7$?$$$H;W$&$G$7$g\e(B
-\e$B$&!#\e(BOrdnung mu\e,A_\e(B sein!)
+\e$B$&!#\e(BOrdnung muss sein!)
 
 \e$B$3$NL?Na$O%W%m%;%9\e(B/\e$B@\F,0z?t$N=,47$K=>$$$^$9\e(B (@pxref{Process/Prefix})\e$B!#\e(B
 
@@ -5532,6 +5566,7 @@ gnus \e$B<+BN$O2D;k5-;v$r4|8B@Z$l>C5n$7$^$;$s\e(B) \e$B$N$G!"1J1s$K5-;v$rJ]B8$7$F$*
 \e$BJVEz$r$7$?$+!"%U%)%m!<%"%C%W$r$7$?\e(B (\e$BNc$($P!"Ez$($?\e(B) \e$B5-;v$O$9$Y$FFs7eL\\e(B
 \e$B$K\e(B @samp{A} \e$B$N0u$,$D$-$^$9\e(B (@code{gnus-replied-mark})\e$B!#\e(B
 
+@item
 @vindex gnus-forwarded-mark
 \e$BE>Aw$7$?5-;v$O$9$Y$FFs7eL\$K\e(B @samp{F} \e$B$N0u$,$D$-$^\e(B
 \e$B$9\e(B (@code{gnus-forwarded-mark})\e$B!#\e(B
@@ -5549,7 +5584,7 @@ gnus \e$B<+BN$O2D;k5-;v$r4|8B@Z$l>C5n$7$^$;$s\e(B) \e$B$N$G!"1J1s$K5-;v$rJ]B8$7$F$*
 @vindex gnus-recent-mark
 \e$B$=$N%0%k!<%W$G\e(B ``\e$B:G6a\e(B'' (``recently'') \e$BFO$$$?5-;v$OFs7eL\$K\e(B @samp{N} \e$B$N\e(B
 \e$B$N0u$,$D$-$^$9\e(B (@code{gnus-recent-mark})\e$B!#$?$$$F$$$N%P%C%/%(%s%I$O$3$N0u\e(B
-\e$B$r%5%]!<%H$;$:!"$=$N>l9g$OI=<($5$l$^$;$s!#\e(B
+\e$B$r%5%]!<%H$;$:!"$=$N>l9g$OC1$KI=<($5$l$^$;$s!#\e(B
 
 @item
 @vindex gnus-unseen-mark
@@ -5945,9 +5980,9 @@ gnus \e$B<+BN$O2D;k5-;v$r4|8B@Z$l>C5n$7$^$;$s\e(B) \e$B$N$G!"1J1s$K5-;v$rJ]B8$7$F$*
 
 @item / p
 @kindex / p (\e$B35N,\e(B)
-@findex gnus-summary-limit-to-display-parameter
+@findex gnus-summary-limit-to-display-predicate
 \e$B35N,%P%C%U%!$r\e(B @code{display} \e$B%0%k!<%W%Q%i%a!<%?$N=R8l$rK~B-$5$;$k$h$&$K\e(B
-\e$B@)8B$7$^$9\e(B (@code{gnus-summary-limit-to-display-parameter})\e$B!#$3$N=R8l$K\e(B
+\e$B@)8B$7$^$9\e(B (@code{gnus-summary-limit-to-display-predicate})\e$B!#$3$N=R8l$K\e(B
 \e$B4X$9$k>\:Y$O\e(B @pxref{Group Parameters} \e$B$r;2>H$7$F2<$5$$!#\e(B
 
 @item / E
@@ -6259,9 +6294,9 @@ Gnus \e$B$O\e(B @code{Subject} \e$BMs$r8+$k$3$H$K$h$C$F%9%l%C%I$r=8$a$^$9!#$3$l$O!"
 \e$B$,$G$-$^$9!#$b$7?t;z$K@_Dj$7$?$H$-$O!"$=$l$h$jB?$$DI2C$N%X%C%@!<$O<hF@$5\e(B
 \e$B$l$^$;$s!#$I$A$i$N>l9g$G$b!"8E$$%X%C%@!<$N<hF@$,F0:n$9$k$N$O!";H$C$F$$$k\e(B
 \e$B%P%C%/%(%s%I\e(B(back end) \e$B$,\e(B overview \e$B%U%!%$%k$r;H$C$F$$$k$+$I$&$+$G$9!=!=\e(B
-\e$B$3$l$OIaDL$O\e(B @code{nntp}, @code{nnspool} \e$B$H\e(B @code{nnml} \e$B$G$9!#%9%l%C%I$N\e(B
-\e$B%k!<%H$,%5!<%P!<$K$h$C$F4|8B@Z$l:o=|$5$l$?$H$-$O!"\e(Bgnus \e$B$O$I$&$7$h$&$b$J\e(B
-\e$B$$$3$H$r3P$($F$*$$$F$/$@$5$$!#\e(B
+\e$B$3$l$OIaDL$O\e(B @code{nntp}, @code{nnspool}, @code{nnml} \e$B$*$h\e(B
+\e$B$S\e(B @code{nnmaildir}\e$B$G$9!#%9%l%C%I$N%k!<%H$,%5!<%P!<$K$h$C$F4|8B@Z$l:o=|\e(B
+\e$B$5$l$?$H$-$O!"\e(Bgnus \e$B$O$I$&$7$h$&$b$J$$$3$H$r3P$($F$*$$$F$/$@$5$$!#\e(B
 
 \e$B$3$NJQ?t$O\e(B @code{invisible} \e$B$K@_Dj$9$k$3$H$b$G$-$^$9!#$3$l$O;k3PE*$J8z2L\e(B
 \e$B$O2?$b$"$j$^$;$s$,!"L?Na\e(B @kbd{A T} \e$B$r$h$/;H$&$N$G$"$l$PLr$KN)$D$G$7$g\e(B
@@ -6307,6 +6342,21 @@ gnus \e$B$OA4$F$N5-;v$N40A4$J\e(B @code{References} \e$BMs$r8+$F!"F1$8%9%l%C%I$KB0$
 \e$B$3$l$,\e(B @code{nil} \e$B$G$J$$$H!"$9$Y$F$N%9%l%C%I$O35N,%P%C%U%!$,@8@.$5$l$?$H\e(B
 \e$B$-$K1#$l$^$9!#\e(B
 
+\e$B$3$l$O=R8l;X<(;R$G$"$k$3$H$b$G$-$^$9\e(B (@pxref{Predicate Specifiers})\e$B!#Mx\e(B
+\e$BMQ$G$-$k=R8l\e(B
+\e$B$O\e(B @code{gnus-article-unread-p} \e$B$H\e(B @code{gnus-article-unseen-p} \e$B$G$9!#\e(B
+
+\e$B$3$l$ONc$G$9\e(B:
+
+@lisp
+(setq gnus-thread-hide-subtree
+      '(or gnus-article-unread-p
+           gnus-article-unseen-p))
+@end lisp
+
+(\e$B$3$l$O$+$J$j$P$+$2$?Nc$G$9!#$J$<$J$i$9$Y$F$N$^$@FI$^$l$?$3$H$,L5$$5-;v\e(B
+\e$B$OL$FI$G$b$"$k$+$i$J$N$G$9$,!"<g;]$O5b$_<h$C$F2<$5$$!#\e(B)
+
 @item gnus-thread-expunge-below
 @vindex gnus-thread-expunge-below
 \e$B$3$N?t;z$h$j>/$J$$Am9gE*%9%3%"\e(B (@code{gnus-thread-score-function}) \e$B$r;}\e(B
@@ -6331,7 +6381,7 @@ gnus \e$B$OA4$F$N5-;v$N40A4$J\e(B @code{References} \e$BMs$r8+$F!"F1$8%9%l%C%I$KB0$
 
 @item gnus-sort-gathered-threads-function
 @vindex gnus-sort-gathered-threads-function
-\e$B$H$-$I$-!"FC$K%a!<%j%s%0%j%9%H$G!"<j85$K%a!<%k$,E~Ce$9$k=gHV$OI,$:$7%a!<\e(B
+\e$B$H$-$I$-!"FC$K%a!<%j%s%0%j%9%H$G!"<j85$K%a!<%k$,E~Ce$9$k=gHV$OI,$:$7$b%a!<\e(B
 \e$B%j%s%0%j%9%H$KE~Ce$7$?=gHV$HF1$8$G$OL5$$$3$H$,$"$j$^$9!#=>$C$F!"I{%9%l%C\e(B
 \e$B%I$r=i4|@_Dj$N\e(B @code{gnus-thread-sort-by-number} \e$B$GJB$S49$($k$H!"1~Ez$N\e(B
 \e$BJ}$,$=$l$,1~Ez$7$F$$$k5-;v$h$j@h$K8=$l$k$3$H$,$"$j$^$9!#%0%k!<%W%Q%i%a!<\e(B
@@ -6462,8 +6512,8 @@ gnus \e$B$OA4$F$N5-;v$N40A4$J\e(B @code{References} \e$BMs$r8+$F!"F1$8%9%l%C%I$KB0$
 @table @kbd
 @item T n
 @kindex T n (\e$B35N,\e(B)
-@itemx C-M-n
-@kindex C-M-n (\e$B35N,\e(B)
+@itemx C-M-f
+@kindex C-M-f (\e$B35N,\e(B)
 @itemx M-down
 @kindex M-down (\e$B35N,\e(B)
 @findex gnus-summary-next-thread
@@ -6471,8 +6521,8 @@ gnus \e$B$OA4$F$N5-;v$N40A4$J\e(B @code{References} \e$BMs$r8+$F!"F1$8%9%l%C%I$KB0$
 
 @item T p
 @kindex T p (\e$B35N,\e(B)
-@itemx C-M-p
-@kindex C-M-p (\e$B35N,\e(B)
+@itemx C-M-b
+@kindex C-M-b (\e$B35N,\e(B)
 @itemx M-up
 @kindex M-up (\e$B35N,\e(B)
 @findex gnus-summary-prev-thread
@@ -6521,10 +6571,10 @@ gnus \e$B$OA4$F$N5-;v$N40A4$J\e(B @code{References} \e$BMs$r8+$F!"F1$8%9%l%C%I$KB0$
 \e$B$H$,$G$-$^$9!#$=$l$O!"C1FH$N4X?t!"4X?t$N%j%9%H!"4X?t$H\e(B @code{(\e$B4X?t$G$J$$\e(B
 \e$B$b$N\e(B)} \e$B$NMWAG$G$"$k$3$H$,$G$-$^$9!#%G%#%U%)%k%H$G$O!"JB$SBX$($O5-;vHV9f\e(B
 \e$B$K$h$C$F$J$5$l$^$9!#4{$K:n$i$l$F$$$kJB$SBX$(=R8l4X?t\e(B
-\e$B$O\e(B @code{gnus-thread-sort-by-number}\e$B!"\e(B@code{gnus-thread-sort-by-author}\e$B!"\e(B
-@code{gnus-thread-sort-by-subject}\e$B!"\e(B@code{gnus-thread-sort-by-date}\e$B!"\e(B
-@code{gnus-thread-sort-by-score}\e$B!"\e(B
-@code{gnus-thread-sort-by-most-recent-number}\e$B!"\e(B
+\e$B$O\e(B @code{gnus-thread-sort-by-number}, @code{gnus-thread-sort-by-author},
+@code{gnus-thread-sort-by-subject}, @code{gnus-thread-sort-by-date},
+@code{gnus-thread-sort-by-score},
+@code{gnus-thread-sort-by-most-recent-number},
 @code{gnus-thread-sort-by-most-recent-date} \e$B$*$h$S\e(B
 @code{gnus-thread-sort-by-total-score} \e$B$G$9!#\e(B
 
@@ -6736,7 +6786,7 @@ Gnus \e$B$O$"$J$?$,FI$`$G$"$m$&5-;v$h$j$b$?$/$5$s$N5-;v$r<hF@$7$^$9!#$3$l$O\e(B
 \e$B$NL5$$;v$G$9!#$"$J$?$,FsG\$NMFNL$r;H$&;v$,NI$$$H46$8$J$$8B$j$O!#\e(B
 
 \e$B%-%c%C%7%e$r@)8B$9$k$?$a$K!"\e(B@code{gnus-cacheable-groups} \e$B$r\e(B \e$B$r%-%c%C%7%e\e(B
-\e$B$9$k%0%k!<%W$NO"A[%j%9%H!"Nc$($P\e(B @samp{^nntp}\e$B!"$H$9$k$+!"@55,I=\e(B
+\e$B$9$k%0%k!<%W$NO"A[%j%9%H!"Nc$($P\e(B @samp{^nntp} \e$B$H$9$k$+!"@55,I=\e(B
 \e$B8=\e(B @code{gnus-uncacheable-groups} \e$B$rNc$($P!"\e(B@samp{^nnml} \e$B$K@_Dj$7$F2<$5\e(B
 \e$B$$!#N>J}$NJQ?t$N=i4|CM$O\e(B @code{nil} \e$B$G$9!#$b$7%0%k!<%W$,N>J}$N@55,I=8=$K\e(B
 \e$B9gCW$9$k$H!"$=$N%0%k!<%W$O%-%c%C%7%e$5$l$^$;$s!#\e(B
@@ -6828,6 +6878,10 @@ Gnus \e$B$O$?$/$5$s$NJ}K!$G5-;v$rJ]B8$9$k;v$,$G$-$^$9!#0J2<$N$b$N$OHs>o$KN(\e(B
 \e$B$k\e(B) \e$B$K$D$$$F$O\e(B@code{gnus-uu} \e$B$r;H$&$N$,NI$$$G$7$g\e(B
 \e$B$&\e(B (@pxref{Decoding Articles})\e$B!#\e(B
 
+\e$B$3$3$K:\$C$F$$$k%3%^%s%I$OBP>]$,%U%!%$%k$G$9!#%0%k!<%W$KJ]B8$7$?$$>l9g\e(B
+\e$B$O\e(B @kbd{B c} (@code{gnus-summary-copy-article}) \e$B%3%^%s%I$r;2>H$7$F2<$5\e(B
+\e$B$$\e(B (@pxref{Mail Group Commands})\e$B!#\e(B
+
 @vindex gnus-save-all-headers
 @code{gnus-save-all-headers} \e$B$,\e(B @code{nil} \e$B$G$J$$$H!"\e(Bgnus \e$B$O5-;v$rJ]B8$9\e(B
 \e$B$kA0$KK>$^$7$/$J$$%X%C%@!<$r>C5n$7$^$;$s!#\e(B
@@ -7752,7 +7806,7 @@ Fonts})\e$B!#F1$8%a%C%;!<%8$NCf$KJ#?t$N5-;v$+$i$N0zMQ$,$"$k$H!"\e(Bgnus \e$B$O$=$l$
 \e$B$O\e(B @code{banner} \e$B%0%k!<%W%Q%i%a!<%?\e(B (@pxref{Group Parameters}) \e$B$r%P%J!<\e(B
 \e$B$r<h$j=|$-$?$$%0%k!<%W$KDI2C$7$^$9!#%Q%i%a!<%?$O!">C5n$5$l$k%F%-%9%H$K9g\e(B
 \e$BCW$9$k@55,I=8=$H$7$F2r<a$5$l$kJ8;zNs$+!"\e(B(\e$B:G8e$N\e(B) \e$B=pL>$,>C5n$5$l$k$H$$$&\e(B
-\e$B0UL#$G$"$k%7%s%\%k\e(B @code{signature}\e$B!"$^$?\e(B
+\e$B0UL#$G$"$k%7%s%\%k\e(B @code{signature} \e$B$^$?\e(B
 \e$B$O\e(B @code{gnus-article-banner-alist} \e$B$N@55,I=8=$KBP1~$7$?%7%s%\%k$G$"$k$3\e(B
 \e$B$H$,$G$-$^$9!#\e(B
 
@@ -7878,9 +7932,9 @@ gnus \e$B$,5-;v$rI=<($9$k4{Dj$N$d$jJ}$rJQ$($?$$$H$-\e(B
 
 @item W v
 @kindex W v (\e$B35N,\e(B)
-@findex gnus-summary-verbose-header
+@findex gnus-summary-verbose-headers
 \e$B5-;v%P%C%U%!$K$9$Y$F$N%X%C%@!<$r1J1s$KI=<($9$k$+$I$&$+$r@Z$jBX$($^\e(B
-\e$B$9\e(B (@code{gnus-summary-verbose-header})\e$B!#\e(B
+\e$B$9\e(B (@code{gnus-summary-verbose-headers})\e$B!#\e(B
 
 @item W m
 @kindex W m (\e$B35N,\e(B)
@@ -7909,6 +7963,13 @@ Sm*rtq**t*s \e$B$O$b$C$HB?$/$N0zMQJ8;z$rDs6!$9$k$?$a$K!"%^"#"#"#%="#"#$,>!<j\e(B
 \e$B$,$"$k$Y$-$H$3$m$K\e(B @code{\222} \e$B$d\e(B @code{\264} \e$B$N$h$&$J$b$N$,8+$($F$7$^$C\e(B
 \e$B$?$i!"@vBu$7$F$_$F2<$5$$!#\e(B
 
+@item W k
+@kindex W k (\e$B35N,\e(B)
+@findex gnus-article-outlook-deuglify-article
+@cindex Outlook Express
+\e$B2u$l$?\e(B Outlook (Express) \e$B$N5-;v$r\e(B deuglify \e$B$7$F:FI=<($7$^\e(B
+\e$B$9\e(B (@code{gnus-article-outlook-deuglify-article})\e$B!#\e(B
+
 @item W w
 @kindex W w (\e$B35N,\e(B)
 @findex gnus-article-fill-cited-article
@@ -7952,7 +8013,7 @@ CRLF \e$B$NAH\e(B (\e$B$9$J$o$A!"9T$N:G8e$N\e(B @samp{^M}) \e$B$r\e(B LF \e$B$KJQ49$7$^
 @c @findex gnus-article-de-base64-unreadable
 @c Treat base64 (@code{gnus-article-de-base64-unreadable}).
 @c Base64 is one common @sc{mime} encoding employed when sending non-ASCII
-@c (i. e., 8-bit) articles.  Note that the this is usually done
+@c (i. e., 8-bit) articles.  Note that this is usually done
 @c automatically by Gnus if the message in question has a
 @c @code{Content-Transfer-Encoding} header that says that this encoding has
 @c been done.
@@ -7965,14 +8026,48 @@ HZ \e$B$^$?$O\e(B HZP \e$B$r=hM}$7$^$9!#\e(BHZ (\e$B$^$?$O\e(B HZP) \e$B$OCf9q8l$N5-;v$
 \e$B$K;H$o$l$k0lHLE*$JId9f$G$9!#$3$l$O\e(B @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}} \e$B$N\e(B
 \e$B$h$&$JE57?E*$JJ8;zNs$r:n$j$^$9!#\e(B
 
-@c @item W h
-@c @kindex W h (Summary)
-@c @findex gnus-article-wash-html
-@c Treat HTML (@code{gnus-article-wash-html}).
-@c Note that the this is usually done automatically by Gnus if the message
-@c in question has a @code{Content-Type} header that says that this type
-@c has been done.
-@c If a prefix is given, a charset will be asked for.
+@item W u
+@kindex W u (Summary)
+@findex gnus-article-unsplit-urls
+URL \e$B$K4^$^$l$k2~9T$r:o=|$7$^$9!#$$$/$D$+$N%a%$%i!<$O!"9T$rC;$/$9$k$?$a$K\e(B
+\e$B=P$F$$$/%a!<%k$K2~9T$rA^F~$7$^$9$,!"$3$l$OD9$$\e(B URL \e$B$rJ#?t$N9T$KJ,3d$7$F\e(B
+\e$B$7$^$$$^$9!#2~9T$r:o=|$9$k$3$H$K$h$C$F!"$=$l$i$N\e(B URL \e$B$rI|5l$5$;$^\e(B
+\e$B$9\e(B (@code{gnus-article-unsplit-urls})\e$B!#\e(B
+
+@item W h
+@kindex W h (\e$B35N,\e(B)
+@findex gnus-article-wash-html
+@sc{html} \e$B$r=hM}$7$^$9!#Ev3:%a%C%;!<%8$,\e(B @sc{html} \e$B$G$"$k$3$H$r<(\e(B
+\e$B$9\e(B @code{Content-Type} \e$B%X%C%@!<$r;}$C$F$$$?$J$i$P!"$=$l$O\e(B gnus \e$B$K$h$C$F\e(B
+\e$B<+F0E*$K9T$J$o$l$k$3$H$KCm0U$7$F2<$5$$!#\e(B
+
+\e$B@\F,<-$,M?$($i$l$k$H!"2?$NJ8;z=89g\e(B (charset) \e$B$H$7$F07$&$+$r?R$M$i$l$^$9!#\e(B
+
+@vindex gnus-article-wash-function
+\e$B%G%#%U%)%k%H$G$O\e(B @sc{html} \e$B$NJQ49$K\e(B @code{mm-inline-text-html-renderer}
+(@pxref{Customization, , , emacs-mime}) \e$B$G@_Dj$5$l$?4X?t$r;H$$$^$9$,!"$3\e(B
+\e$B$l$OJQ?t\e(B @code{gnus-article-wash-function} \e$B$G@)8f$5$l$^$9!#;H$&$3$H$,$G\e(B
+\e$B$-$k!"$"$i$+$8$aMQ0U$5$l$?4X?t$O0J2<$NDL$j$G$9!#\e(B
+
+@table @code
+@item w3
+Emacs/w3 \e$B$r;H$$$^$9!#\e(B
+
+@item w3m
+emacs-w3m \e$B$r;H$$$^$9\e(B (\e$B>\$7$/$O\e(B @uref{http://emacs-w3m.namazu.org/} \e$B$r;2\e(B
+\e$B>H$7$F2<$5$$\e(B)\e$B!#\e(B
+
+@item links
+Links \e$B$r;H$$$^\e(B
+\e$B$9\e(B (@uref{http://artax.karlin.mff.cuni.cz/~mikulas/links/} \e$B$r;2>H\e(B)\e$B!#\e(B
+
+@item lynx
+Lynx \e$B$r;H$$$^$9\e(B (@uref{http://lynx.browser.org/} \e$B$r;2>H\e(B)\e$B!#\e(B
+
+@item html2text
+html2text (\e$B%7%s%W%k$J\e(B @sc{html} \e$B%3%s%P!<%?!<!"\e(Bgnus \e$B$K4^$^$l$F$$$k\e(B) \e$B$r;H\e(B
+\e$B$$$^$9!#\e(B
+@end table
 
 @item W b
 @kindex W b (\e$B35N,\e(B)
@@ -8001,14 +8096,14 @@ HZ \e$B$^$?$O\e(B HZP \e$B$r=hM}$7$^$9!#\e(BHZ (\e$B$^$?$O\e(B HZP) \e$B$OCf9q8l$N5-;v$
 @c @item W s
 @c @kindex W s (Summary)
 @c @findex gnus-summary-force-verify-and-decrypt
-@c Verify a signed (PGP, PGP/MIME or S/MIME) message
+@c Verify a signed (PGP, @sc{pgp/mime} or @sc{s/mime}) message
 @c (@code{gnus-summary-force-verify-and-decrypt}). @xref{Security}.
 
 @item W W H
 @kindex W W H (\e$B35N,\e(B)
-@findex gnus-article-strip-headers-from-body
+@findex gnus-article-strip-headers-in-body
 \e$B5-;v$NK\BN$N@hF,$+$i\e(B @code{X-No-Archive} \e$B%X%C%@!<$N$h$&$J%X%C%@!<$r<h$j\e(B
-\e$B=|$-$^$9\e(B (@code{gnus-article-strip-headers-from-body})\e$B!#\e(B
+\e$B=|$-$^$9\e(B (@code{gnus-article-strip-headers-in-body})\e$B!#\e(B
 
 @item W E l
 @kindex W E l (\e$B35N,\e(B)
@@ -8077,6 +8172,12 @@ HZ \e$B$^$?$O\e(B HZP \e$B$r=hM}$7$^$9!#\e(BHZ (\e$B$^$?$O\e(B HZP) \e$B$OCf9q8l$N5-;v$
 @findex gnus-article-treat-fold-header
 \e$B$9$Y$F$N%a%C%;!<%8%X%C%@!<$r@^$jJV$7$^\e(B
 \e$B$9\e(B (@code{gnus-article-treat-fold-headers})\e$B!#\e(B
+
+@item W E w
+@kindex W E w (\e$B35N,\e(B)
+@findex gnus-article-remove-leading-whitespace
+\e$B$9$Y$F$N%X%C%@!<$+$iM>7W$J6uGr$r<h$j=|$-$^\e(B
+\e$B$9\e(B (@code{gnus-article-remove-leading-whitespace})\e$B!#\e(B
 @end table
 
 @node Article Buttons
@@ -8105,7 +8206,8 @@ Gnus \e$B$O%G%#%U%)%k%H$GFCDj$NI8=`$N;2>H$K\e(B@dfn{\e$B%\%?%s\e(B}\e$B$rIU$1$^$9\e(B:
 @item regexp
 \e$B$3$N@55,I=8=\e(B (regexp) \e$B$K9gCW$9$k$9$Y$F$NJ8$O30It;2>H$G$"$k$H$_$J$5$l$^$9!#\e(B
 \e$B$3$l$OKd$a9~$^$l$?\e(B URL \e$B$K9gCW$9$kE57?E*$J@55,I=8=$G\e(B
-\e$B$9\e(B @samp{<URL:\\([^\n\r>]*\\)>}\e$B!#\e(B
+\e$B$9\e(B @samp{<URL:\\([^\n\r>]*\\)>}\e$B!#$3$l$O$^$?@55,I=8=$NCM$r;}$DJQ?t$G$"$C\e(B
+\e$B$F$b$h$/!"M-MQ$JJQ?t$H$7$F\e(B @code{gnus-button-url-regexp} \e$B$,$"$j$^$9!#\e(B
 
 @item button-par
 Gnus \e$B$O9gCW$7$?$b$N$N$I$NItJ,$,%O%$%i%$%H$5$l$k$N$+$rCN$i$J$1$l$P$J$j$^\e(B
@@ -8291,7 +8393,7 @@ gnus \e$B$G%a!<%k$rFI$`$3$H$NM-Mx$JE@$O!"C1=c$J%P%0$rAG@2$i$7$$IT>rM}$KCV$-\e(B
 @findex gnus-treat-newsgroups-picon
 \e$B$9$Y$F$N%K%e!<%9%X%C%@!<\e(B (\e$B$9$J$o\e(B
 \e$B$A\e(B @code{Newsgroups} \e$B$H\e(B @code{Followup-To}) \e$B$r\e(B Picon \e$B2=$7$^\e(B
-\e$B$9\e(B (@code{gnus-treat-from-picon})\e$B!#\e(B
+\e$B$9\e(B (@code{gnus-treat-newsgroups-picon})\e$B!#\e(B
 
 @item W D D
 @kindex W D D (\e$B35N,\e(B)
@@ -8529,11 +8631,12 @@ gnus \e$B$G%a!<%k$rFI$`$3$H$NM-Mx$JE@$O!"C1=c$J%P%0$rAG@2$i$7$$IT>rM}$KCV$-\e(B
 @end lisp
 
 \e$B$[$H$s$I$N%a!<%k%P%C%/%(%s%I$O\e(B @code{Message-ID} \e$B$G$N<hF@$,2DG=$G$9$,!"\e(B
-\e$B$"$^$jM%2m$JJ}K!$G$d$C$F$$$k$o$1$G$O$"$j$^$;$s!#\e(B
-@code{nnmbox} \e$B$H\e(B @code{nnbabyl} \e$B$O$I$N%0%k!<%W$+$i$N5-;v$b0LCV$rF@$k$3$H\e(B
-\e$B$,$G$-$^$9$,!"\e(B@code{nnml}, @code{nnfolder} \e$B$*$h$S\e(B @code{nnimap} \e$B$O8=:_$N\e(B
-\e$B%0%k!<%W$KEj9F$7$?5-;v$N0LCV$7$+F@$k;v$,$G$-$^$;$s!#\e(B(\e$B$=$NB>$N$b$N$O;~4V\e(B
-\e$B$,$+$+$j$9$.$^$9!#\e(B) @code{nnmh} \e$B$G$OA4$/IT2DG=$G$9!#\e(B
+\e$B$"$^$jM%2m$JJ}K!$G$d$C$F$$$k$o$1$G$O$"$j$^$;$s!#\e(B@code{nnmbox},
+@code{nnbabyl} \e$B$*$h$S\e(B @code{nnmaildir} \e$B$O$I$N%0%k!<%W$+$i$N5-;v$b0LCV$r\e(B
+\e$BF@$k$3$H$,$G$-$^$9$,!"\e(B@code{nnml}, @code{nnfolder} \e$B$*$h\e(B
+\e$B$S\e(B @code{nnimap} \e$B$O8=:_$N%0%k!<%W$KEj9F$7$?5-;v$N0LCV$7$+F@$k;v$,$G$-$^\e(B
+\e$B$;$s!#\e(B(\e$B$=$NB>$N$b$N$O;~4V$,$+$+$j$9$.$^$9!#\e(B) @code{nnmh} \e$B$G$OA4$/IT2DG=\e(B
+\e$B$G$9!#\e(B
 
 @node Alternative Approaches
 @section \e$BBeBX<jCJ\e(B
@@ -8831,7 +8934,7 @@ Line Formatting})\e$B!#%G%#%U%)%k%H$O\e(B @samp{Gnus: %%b %S %Z} \e$B$G$9!#;HMQ2DG=
 @findex gnus-summary-move-article
 @vindex gnus-preserve-marks
 \e$B$"$k%a!<%k%0%k!<%W$+$iJL$N$H$3$m$X5-;v$r0\F0$7$^\e(B
-\e$B$9\e(B (@code{gnus-summary-move-article})\e$B!#\e(B@var{gnus-preserve-marks} \e$B$NCM\e(B
+\e$B$9\e(B (@code{gnus-summary-move-article})\e$B!#\e(B@code{gnus-preserve-marks} \e$B$NCM\e(B
 \e$B$,\e(B nil \e$B$G$O$J$$$J$i$P\e(B (\e$B$3$l$,=i4|CM$G$9$,\e(B)\e$B!"%^!<%/$OJ]B8$5$l$^$9!#\e(B
 
 @item B c
@@ -8840,7 +8943,7 @@ Line Formatting})\e$B!#%G%#%U%)%k%H$O\e(B @samp{Gnus: %%b %S %Z} \e$B$G$9!#;HMQ2DG=
 @findex gnus-summary-copy-article
 @c @icon{gnus-summary-mail-copy}
 \e$B$"$k%0%k!<%W\e(B (\e$B%a!<%k%0%k!<%W$dB>$N$b$N\e(B) \e$B$+$i%a!<%k%0%k!<%W$K5-;v$rJ#@=$7\e(B
-\e$B$^$9\e(B (@code{gnus-summary-copy-article})\e$B!#\e(B@var{gnus-preserve-marks} \e$B$NCM\e(B
+\e$B$^$9\e(B (@code{gnus-summary-copy-article})\e$B!#\e(B@code{gnus-preserve-marks} \e$B$NCM\e(B
 \e$B$,\e(B nil \e$B$G$O$J$$$J$i$P\e(B (\e$B$3$l$,=i4|CM$G$9$,\e(B)\e$B!"%^!<%/$OJ]B8$5$l$^$9!#\e(B
 
 @item B B
@@ -8858,6 +8961,13 @@ Line Formatting})\e$B!#%G%#%U%)%k%H$O\e(B @samp{Gnus: %%b %S %Z} \e$B$G$9!#;HMQ2DG=
 \e$B$9\e(B (@code{gnus-summary-import-article})\e$B!#$"$J$?$O%U%!%$%kL>$H!"\e(B
 @code{From} \e$BMs$H\e(B @code{Subject} \e$BMs$NF~NO$rB%$5$l$^$9!#\e(B
 
+@item B I
+@kindex B I (\e$B35N,\e(B)
+@findex gnus-summary-create-article
+\e$B6u$N5-;v$r8=:_$N%a!<%k%0%k!<%W$K:n$j$^\e(B
+\e$B$9\e(B (@code{gnus-summary-create-article})\e$B!#\e(B@code{From} \e$B%X%C%@!<\e(B
+\e$B$H\e(B @code{Subject} \e$B%X%C%@!<$NFbMF$r?R$M$i$l$^$9!#\e(B
+
 @item B r
 @kindex B r (\e$B35N,\e(B)
 @findex gnus-summary-respool-article
@@ -8865,8 +8975,8 @@ Line Formatting})\e$B!#%G%#%U%)%k%H$O\e(B @samp{Gnus: %%b %S %Z} \e$B$G$9!#;HMQ2DG=
 @code{gnus-summary-respool-default-method} \e$B$,:F%9%W!<%k$9$k$H$-$N%G%#%U%)\e(B
 \e$B%k%H$NA*BrJ}K!$H$7$F;HMQ$5$l$^$9!#$3$NJQ?t$O%G%#%U%)%k%H$G\e(B @code{nil} \e$B$G!"\e(B
 \e$B$3$l$O8=:_$N%0%k!<%W$NA*BrJ}K!$,Be$o$j$K;H$o$l$k$H$$$&;v$G$9!#\e(B
-@var{gnus-preserve-marks} \e$B$NCM$,\e(B nil \e$B$G$O$J$$$J$i$P\e(B (\e$B$3$l$,=i4|CM$G$9$,\e(B)\e$B!"\e(B
-\e$B%^!<%/$OJ]B8$5$l$^$9!#\e(B
+@code{gnus-preserve-marks} \e$B$NCM$,\e(B nil \e$B$G$O$J$$$J$i$P\e(B (\e$B$3$l$,=i4|CM$G$9\e(B
+\e$B$,\e(B)\e$B!"%^!<%/$OJ]B8$5$l$^$9!#\e(B
 
 @item B w
 @itemx e
@@ -8874,10 +8984,12 @@ Line Formatting})\e$B!#%G%#%U%)%k%H$O\e(B @samp{Gnus: %%b %S %Z} \e$B$G$9!#;HMQ2DG=
 @kindex e (\e$B35N,\e(B)
 @findex gnus-summary-edit-article
 @kindex C-c C-c (\e$B5-;v\e(B)
+@findex gnus-summary-edit-article-done
 \e$B8=:_$N5-;v$rJT=8$7$^$9\e(B (@code{gnus-summary-edit-article})\e$B!#JT=8$r=*N;$7\e(B
-\e$B$FJQ99$r1J1s$K$9$k$?$a$K!"\e(B@kbd{C-c C-c} \e$B$rBG$A$^$9!#$b$7L?\e(B
-\e$BNa\e(B @kbd{C-c C-c} \e$B$K?tCM@\F,0z?t$rM?$($k$H!"\e(Bgnus \e$B$O5-;v$r:F%O%$%i%$%H$7$^\e(B
-\e$B$;$s!#\e(B
+\e$B$FJQ99$r1J1s$K$9$k$?$a\e(B
+\e$B$K\e(B @kbd{C-c C-c} (@code{gnus-summary-edit-article-done}) \e$B$rBG$A$^$9!#$b\e(B
+\e$B$7L?Na\e(B @kbd{C-c C-c} \e$B$K?tCM@\F,0z?t$rM?$($k$H!"\e(Bgnus \e$B$O5-;v$r:F%O%$%i%$%H\e(B
+\e$B$7$^$;$s!#\e(B
 
 @item B q
 @kindex B q (\e$B35N,\e(B)
@@ -8905,6 +9017,14 @@ Line Formatting})\e$B!#%G%#%U%)%k%H$O\e(B @samp{Gnus: %%b %S %Z} \e$B$G$9!#;HMQ2DG=
 \e$B8+$7$J$+$C$?$H$7$F$b!"$=$l$O$H$K$+$/Ej9F$5$l$F$$$k$+$b$7$l$^$;$s!=!=%a!<\e(B
 \e$B%k$NEAC#$O%K%e!<%9$NEAC#$h$j$b$:$C$HB.$/!"%K%e!<%9$NJ#@=$,$^$@E~Ce$7$F$$\e(B
 \e$B$J$$$@$1$+$b$7$l$J$$$N$G$9!#\e(B
+
+@c @item K E
+@c @kindex K E (Summary)
+@c @findex gnus-article-encrypt-body
+@c @vindex gnus-article-encrypt-protocol
+@c Encrypt the body of an article (@code{gnus-article-encrypt-body}).
+@c The body is encrypted with the encryption protocol specified by the
+@c variable @code{gnus-article-encrypt-protocol}.
 @end table
 
 @vindex gnus-move-split-methods
@@ -9391,8 +9511,8 @@ Gnus \e$B$K$$$D$G$b@5$7$$\e(B @code{Xref} \e$B$r<hF@$9$k$h$&$K$5$;$?$$$N$G$"$l$P!"\e
 @section Security
 
 Gnus is able to verify signed messages or decrypt encrypted messages.
-The formats that are supported are PGP, PGP/MIME and S/MIME, however
-you need some external programs to get things to work:
+The formats that are supported are PGP, @sc{pgp/mime} and @sc{s/mime},
+however you need some external programs to get things to work:
 
 @enumerate
 @item
@@ -9400,7 +9520,7 @@ To handle PGP messages, you have to install mailcrypt or gpg.el as
 well as a OpenPGP implementation (such as GnuPG).
 
 @item
-To handle S/MIME message, you need to install OpenSSL.  OpenSSL 0.9.6
+To handle @sc{s/mime} message, you need to install OpenSSL.  OpenSSL 0.9.6
 or newer is recommended.
 
 @end enumerate
@@ -9426,10 +9546,12 @@ protocols. Otherwise, ask user.
 @node Mailing List
 @section \e$B%a!<%j%s%0%j%9%H\e(B
 
+@kindex A M (\e$B35N,\e(B)
+@findex gnus-mailing-list-insinuate
 Gnus \e$B$O\e(B RFC 2369 \e$B$G4{Dj$5$l$?3F<o$N%a!<%j%s%0%j%9%H$G;H$o$l$k%U%#!<%k%I\e(B
 \e$B$rM}2r$7$^$9!#$3$l$rM-8z$K$9$k$K$O\e(B `to-list' \e$B%0%k!<%W%Q%i%a!<\e(B
-\e$B%?\e(B (@pxref{Group Parameters}) \e$B$rDI2C$7$F!"35N,%P%C%U%!$G\e(B @kbd{A M} \e$B$r;H\e(B
-\e$B$&$+\e(B
+\e$B%?\e(B (@pxref{Group Parameters}) \e$B$rDI2C$7$F!"35N,%P%C%U%!\e(B
+\e$B$G\e(B @kbd{A M} (@code{gnus-mailing-list-insinuate}) \e$B$r;H$&$+\e(B
 
 @lisp
 (add-hook 'gnus-summary-mode-hook 'turn-on-gnus-mailing-list-mode)
@@ -9597,7 +9719,7 @@ Gnus \e$B$O%X%C%@!<$NJB$YBX$(\e(B(sort)\e$B$b9T$$$^$9\e(B (\e$B$3$l$O%G%#%U%)%k%H$G9T
 @code{To} \e$BMs$,0l$D$h$j$bB?$1$l$P!"$=$l$i$rA4$F>C5n$7$^$9!#\e(B
 @end table
 
-\e$B$3$l$i$N;0$D$NMWAG$rF~$l$?$1$l$P!"$3$s$JIw$K$J$j$^$9!#\e(B
+\e$B$3$l$i$N;0$D$NMWAG$rF~$l$?$1$l$P!"$3$s$JIw$K$J$j$^$9\e(B:
 
 @lisp
 (setq gnus-boring-article-headers
@@ -9626,9 +9748,9 @@ Gnus \e$B$O%X%C%@!<$NJB$YBX$(\e(B(sort)\e$B$b9T$$$^$9\e(B (\e$B$3$l$O%G%#%U%)%k%H$G9T
 Gnus \e$B$O\e(B @code{gnus-article-display-method-for-mime} \e$B$K5-;v$r2!$7IU$1$k$3\e(B
 \e$B$H$G\e(B @sc{mime} \e$B$r07$$$^$9!#$3$N=i4|CM\e(B
 \e$B$O\e(B @code{gnus-article-display-mime-message} \e$B$G$9!#$3$N4X?t\e(B
-\e$B$O\e(B SEMI MIME-View \e$B%W%m%0%i%`$r8F$S=P$7$F<B:]$N=hM}$r9T$$$^$9!#\e(B
-SEMI MIME-View \e$B$K4X$9$k>\$7$$>pJs$O!"%^%K%e%"%k$r;2>H$7$F$/$@$5$$\e(B (\e$B$^$@\e(B
-\e$B$J$$$1$I\e(B (;_;))\e$B!#\e(B
+\e$B$O\e(B @sc{semi} MIME-View \e$B%W%m%0%i%`$r8F$S=P$7$F<B:]$N=hM}$r9T$$$^$9!#\e(B
+@sc{semi} MIME-View \e$B$K4X$9$k>\$7$$>pJs$O!"%^%K%e%"%k$r;2>H$7$F$/$@$5\e(B
+\e$B$$\e(B (\e$B$^$@$J$$$1$I\e(B (;_;))\e$B!#\e(B
 
 @sc{mime} \e$B$r>o$K;HMQ$7$?$1$l$P!"\e(B
 @code{gnus-show-mime} \e$B$r\e(B @code{t} \e$B$K@_Dj$7$F$/$@$5$$!#\e(B
@@ -9739,6 +9861,8 @@ GNUS \e$B$d\e(B Gnus \e$B$G$O!"$3$N$?$A$N0-$$LdBj$G6C$+$5$l$J$$$h$&$K$9$k$K$O!"35N,
 @item gnus-treat-strip-pem (t, last, integer)
 @item gnus-treat-strip-pgp (t, last, integer)
 @item gnus-treat-strip-trailing-blank-lines (t, last, integer)
+@item gnus-treat-unsplit-urls (t, integer)
+@item gnus-treat-decode-article-as-default-mime-charset (t, integer)
 
 @xref{Article Washing}.
 
@@ -9796,8 +9920,9 @@ GNUS \e$B$d\e(B Gnus \e$B$G$O!"$3$N$?$A$N0-$$LdBj$G6C$+$5$l$J$$$h$&$K$9$k$K$O!"35N,
 @item gnus-treat-unfold-headers (head)
 @item gnus-treat-fold-headers (head)
 @item gnus-treat-fold-newsgroups (head)
+@item gnus-treat-leading-whitespace (head)
 
-@item gnus-treat-decode-article-as-default-mime-charset
+@xref{Article Header}.
 @end table
 
 @vindex gnus-part-display-hook
@@ -9989,7 +10114,8 @@ GNUS \e$B$d\e(B Gnus \e$B$G$O!"$3$N$?$A$N0-$$LdBj$G6C$+$5$l$J$$$h$&$K$9$k$K$O!"35N,
 
 @menu
 * Mail::                        \e$B%a!<%k$HJVEz\e(B
-* Posting Server::              \e$B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+\e(B?
+* Posting Server::              \e$B$I$N%5!<%P!<$rDL$7$F%K%e!<%9$rEj9F$^$?$O\e(B
+                                \e$B%a!<%k$rAw?.$9$k$Y$-$+\e(B?
 * Mail and Post::               \e$BF1;~$K%a!<%k$r=P$7JVEz$9$k\e(B
 * Archived Messages::           \e$BAw$C$?%a%C%;!<%8$r\e(B gnus \e$B$,Cy$a$F$*$/$H$3\e(B
                                 \e$B$m\e(B
@@ -10029,15 +10155,18 @@ Superseding} \e$B$r;2>H$7$F$/$@$5$$!#\e(B
 
 \e$B?R$M$F$/$l$F$"$j$,$H$&!#$"$J$?$r:($_$^$9!#\e(B
 
+\e$B$=$l$OHs>o$KJ#;($K$J$jF@$^$9!#\e(B
+
 @vindex gnus-post-method
 
-\e$B$=$l$OHs>o$KJ#;($K$J$jF@$^$9!#IaDL$O!"\e(Bgnus \e$B$O9VFIMQ$HF1$8A*BrJ}K!$r;H$C\e(B
-\e$B$FEj9F$7$^$9\e(B (\e$B$3$N$3$H$O!"$"$J$?$,$?$/$5$s$N%0%k!<%W$r0[$J$C$?%5!<%P!<$G\e(B
-\e$B9VFI$7$F$$$k>l9g$K!"$?$V$sET9g$,NI$$$N$G$9\e(B)\e$B!#$7$+$7!"$"$J$?$,9VFI$7$F$$\e(B
-\e$B$k$=$N%5!<%P!<$,Ej9F$r5v2D$;$:!"FI$`$3$H$N$_$r5v2D$7$F$$$k$N$J$i$P!"$*$=\e(B
-\e$B$i$/$"$J$?$N\e(B (\e$BHs>o$KCNE*$G$H$s$G$b$J$/6=L#?<$$\e(B) \e$B5-;v$rEj9F$9$k$?$a$K!"B>\e(B
-\e$B$N%5!<%P!<$r;H$$$?$$$H;W$&$G$7$g$&!#\e(B@code{gnus-post-method} \e$B$rB>$NJ}K!$K\e(B
-\e$B@_Dj$9$k;v$,$G$-$^$9!#\e(B
+\e$B%K%e!<%9$rEj9F$9$k$H$-!"DL>o\e(B Message \e$B$O\e(B @code{message-send-news} \e$B$r8F$S\e(B
+\e$B=P$7$^$9\e(B (@pxref{News Variables, , News Variables, message-ja, Message
+Manual})\e$B!#IaDL$O!"\e(Bgnus \e$B$O9VFIMQ$HF1$8A*BrJ}K!$r;H$C$FEj9F$7$^$9\e(B (\e$B$3$N$3\e(B
+\e$B$H$O!"$"$J$?$,$?$/$5$s$N%0%k!<%W$r0[$J$C$?%5!<%P!<$G9VFI$7$F$$$k>l9g$K!"\e(B
+\e$B$?$V$sET9g$,NI$$$N$G$9\e(B)\e$B!#$7$+$7!"$"$J$?$,9VFI$7$F$$$k$=$N%5!<%P!<$,Ej9F\e(B
+\e$B$r5v2D$;$:!"FI$`$3$H$N$_$r5v2D$7$F$$$k$N$J$i$P!"$*$=$i$/$"$J$?$N\e(B (\e$BHs>o$K\e(B
+\e$BCNE*$G$H$s$G$b$J$/6=L#?<$$\e(B) \e$B5-;v$rEj9F$9$k$?$a$K!"B>$N%5!<%P!<$r;H$$$?$$\e(B
+\e$B$H;W$&$G$7$g$&!#\e(B@code{gnus-post-method} \e$B$rB>$NJ}K!$K@_Dj$9$k;v$,$G$-$^$9!#\e(B
 
 @lisp
 (setq gnus-post-method '(nnspool ""))
@@ -10057,6 +10186,27 @@ gnus \e$B$O>o$KEj9F$K$I$NJ}K!$r;H$&$+$r$"$J$?$K?R$M$^$9!#\e(B
 \e$B:G8e$K!"$"$J$?$,$$$D$G$b4pK\$NA*BrJ}K!$r;H$C$FEj9F$7$?$$$N$J$i$P!"$3$NJQ\e(B
 \e$B?t$r\e(B @code{native} \e$B$K$7$F2<$5$$!#\e(B
 
+\e$B%a!<%k$rAw?.$9$k$H$-$K!"\e(BMessage \e$B$O\e(B @code{message-send-mail-function} \e$B$r\e(B
+\e$B8F$S=P$7$^$9!#%G%#%U%)%k%H$N4X\e(B
+\e$B?t\e(B @code{message-send-mail-with-sendmail} \e$B$O5-;v$r=gHVBT$A$KF~\e(B
+\e$B$l\e(B (queuing) \e$B$?$jAw?.$9$k$?$a$K!"%P%$%J%j!<$G\e(B @code{sendmail} \e$B$K%Q%$%W$7\e(B
+\e$B$^$9!#%m!<%+%k%7%9%F%`$,\e(B @code{sendmail} \e$B$G%a!<%k$rAw?.$9$k$h$&$K@_Dj$5\e(B
+\e$B$l$F$$$J$/$F$b!"$"$J$?$,1s3V\e(B @sc{smtp} \e$B%5!<%P!<$K@\B3$9$k8"Mx$r;}$C$F$$\e(B
+\e$B$k$J$i$P!"\e(B
+@code{message-send-mail-function} \e$B$r\e(B @code{smtpmail-send-it} \e$B$K@_Dj$9$k\e(B
+\e$B$3$H$,$G$-$^$9!#\e(B@code{smtpmail} \e$B%Q%C%1!<%8$r;H$&$?$a$K@5$7$$@_Dj$,$J$5$l\e(B
+\e$B$F$$$k$+$I$&$+3NG'$7$F2<$5$$!#Nc$G$9\e(B:
+
+@lisp
+(setq message-send-mail-function 'smtpmail-send-it
+      smtpmail-default-smtp-server "YOUR SMTP HOST")
+@end lisp
+
+\e$BB>$N2DG=$J\e(B @code{message-send-mail-function} \e$B$NA*Br;h\e(B
+\e$B$O\e(B @code{message-send-mail-with-mh},
+@code{message-send-mail-with-qmail} \e$B$*$h$S\e(B @code{feedmail-send-it} \e$B$r4^\e(B
+\e$B$_$^$9!#\e(B
+
 @node Mail and Post
 @section \e$B%a!<%k$HEj9F\e(B
 
@@ -10117,6 +10267,10 @@ Gnus \e$B$O$"$J$?$,Aw$C$?%a!<%k$H%K%e!<%9$rCy$a$F$*$/$?$a$N$$$/$D$+$N0c$C$?\e(B
 \e$BJQ?t\e(B @code{gnus-message-archive-group} \e$B$O\e(B @code{nil} \e$B$K$J$k$Y$-$G!"$3$l\e(B
 \e$B$,%G%#%U%)%k%H$G$9!#\e(B
 
+\e$B$"$J$?$,FI$s$G6=L#$r;}$C$?%a%C%;!<%8$r%0%k!<%W$KJ]B8$9$k$K\e(B
+\e$B$O\e(B @kbd{B c} (@code{gnus-summary-copy-article}) \e$B%3%^%s%I$r;2>H$7$F2<$5\e(B
+\e$B$$\e(B (@pxref{Mail Group Commands})\e$B!#\e(B
+
 @vindex gnus-message-archive-method
 @code{gnus-message-archive-method} \e$B$OAw$C$?%a%C%;!<%8$rC_@Q$9$k$?$a$K$I\e(B
 \e$B$N;v<B>e$N%5!<%P!<$r\e(B gnus \e$B$,;H$&$Y$-$+$r;XDj$7$^$9!#%G%#%U%)%k%H$O\e(B:
@@ -10252,6 +10406,14 @@ Gnus \e$B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0\e(B
 @item gnus-gcc-mark-as-read
 @vindex gnus-gcc-mark-as-read
 \e$B$b$7Hs\e(B@code{nil}\e$B$J$i!"\e(B@code{Gcc} \e$B$N5-;v$K4{FI$N0u$rIU$1$^$9!#\e(B
+
+@c @item gnus-gcc-externalize-attachments
+@c @vindex gnus-gcc-externalize-attachments
+@c If @code{nil}, attach files as normal parts in Gcc copies; if a regexp
+@c and matches the Gcc group name, attach files as external parts; if it is
+@c @code{all}, attach local files as external parts; if it is other
+@c non-@code{nil}, the behavior is the same as @code{all}, but it may be
+@c changed in the future.
 @end table
 
 @node Posting Styles
@@ -10274,7 +10436,7 @@ Gnus \e$B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0\e(B
 
 @lisp
 ((".*"
-   (signature "Peacs and happiness")
+   (signature "Peace and happiness")
    (organization "What me?"))
  ("^comp"
   (signature "Death to everybody"))
@@ -10293,17 +10455,19 @@ Gnus \e$B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0\e(B
 
 \e$B$=$l$>$l$NMM<0$N:G=i$NMWAG$O\e(B @code{\e$B9gCW\e(B} (match) \e$B$H8F$P$l$^$9!#$b$7$=$l\e(B
 \e$B$,J8;zNs$G$"$l$P!"\e(Bgnus \e$B$O$=$l$r%0%k!<%WL>$K@55,I=858=$H$7$F9gCWA`:n$r9T\e(B
-\e$B$$$^$9!#%7%s%\%k\e(B @code{header} \e$B$G$"$l$P!"\e(Bgnus \e$B$O85$N5-;v$NCf$+$i$=$N9gCW\e(B
-\e$B$NCf$N<!$NMWAG$K9gCW$9$k%X%C%@!<$rC5$7!"$=$l$r$=$N9gCW$N:G8e$N@55,I=858=\e(B
-\e$B$HHf3S$7$^$9!#$b$7$=$l$,4X?t$N%7%s%\%k$G$"$l$P!"$=$N4X?t$,0z?tL5$7$G8F$P\e(B
-\e$B$l$^$9!#$=$l$,JQ?t$N%7%s%\%k$G$"$l$P!"$=$NJQ?t$,;2>H$5$l$^$9!#$=$l$,%j%9\e(B
-\e$B%H$G$"$l$P!"$=$N%j%9%H$,\e(B @code{\e$BI>2A\e(B} \e$B$5$l$^$9!#$I$N>l9g$G$b!"$3$l\e(B
-\e$B$,\e(B @code{nil}\e$B$G$J$$CM$r5"$;$P!"MM<0$O\e(B @code{\e$B9gCW$7$?\e(B} \e$B$H8@$$$^$9!#\e(B
+\e$B$$$^$9!#\e(B@code{(header \e$B9gCW\e(B \e$B@55,I=8=\e(B)} \e$B$H$$$&MM<0$G$"$l$P!"\e(Bgnus \e$B$O85$N5-\e(B
+\e$B;v$NCf$+$iL>A0$,9gCW$9$k%X%C%@!<$rC5$7!"$=$l$r@55,I=85$HHf3S$7$^$9!#9gCW\e(B
+\e$B$H@55,I=8=$OJ8;zNs$G$9!#$b$7$=$l$,4X?t$N%7%s%\%k$G$"$l$P!"$=$N4X?t$,0z?t\e(B
+\e$BL5$7$G8F$P$l$^$9!#$=$l$,JQ?t$N%7%s%\%k$G$"$l$P!"$=$NJQ?t$,;2>H$5$l$^$9!#\e(B
+\e$B$=$l$,%j%9%H$G$"$l$P!"$=$N%j%9%H$,\e(B @code{\e$BI>2A\e(B} \e$B$5$l$^$9!#$I$N>l9g$G$b!"\e(B
+\e$B$3$l$,\e(B @code{nil}\e$B$G$J$$CM$r5"$;$P!"MM<0$O\e(B @code{\e$B9gCW$7$?\e(B} \e$B$H8@$$$^$9!#\e(B
 
 \e$B$=$l$>$l$NMM<0$OG$0U$NNL$N\e(B @dfn{\e$BB0@-\e(B} \e$B$r;}$D;v$,$G$-$^$9!#$=$l$>$l$NB0@-\e(B
 \e$B$O\e(B @code{(@var{name} @var{value})} \e$B$NBP$K$h$j@.$jN)$C$F$$$^$9!#B0@-L>\e(B
-\e$B$O!"\e(B@code{signature}, @code{signature-file}, @code{organization}, @code{address}, @code{name}, @code{body} \e$B$N\e(B
-\e$B$I$l$+$G$"$k;v$,$G$-$^$9!#B0@-L>$OJ8;zNs$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"\e(B
+\e$B$O!"\e(B@code{signature}, @code{signature-file}, @code{x-face-file},
+@code{address} (@code{user-mail-address} \e$B$r>e=q$-$9$k\e(B), @code{name}
+(@code{user-full-name} \e$B$r>e=q$-$9$k\e(B) \e$B$^$?$O\e(B @code{body} \e$B$N$I$l$+$G$"$k;v\e(B
+\e$B$,$G$-$^$9!#B0@-L>$OJ8;zNs$^$?$O%7%s%\%k$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"\e(B
 \e$B$3$l$O%X%C%@!<L>$H$7$F;H$o$l!"$=$NCM$,5-;v$N%X%C%@!<$KA^F~$5$l$^$9!#$b$7\e(B
 \e$BB0@-L>$,\e(B @code{nil} \e$B$@$C$?$i$=$N%X%C%@!<L>$O:o=|$5$l$^$9!#$b$7B0@-L>\e(B
 \e$B$,\e(B @code{eval} \e$B$@$C$?$i$=$NMM<0$,I>2A$5$l!"7k2L$O<N$F$i$l$^$9!#\e(B
@@ -10312,7 +10476,11 @@ Gnus \e$B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0\e(B
 \e$BJQ?t\e(B (\e$B$=$NCM$,;H$o$l$^$9\e(B) \e$B$^$?$O%j%9%H\e(B (\e$B$=$l$O\e(B @code{\e$BI>2A\e(B} \e$B$5$l$F!"JV$j\e(B
 \e$BCM$,;H$o$l$^$9\e(B) \e$B$G$"$k;v$,$G$-$^$9!#4X?t$O%;%C%H%"%C%W$5$l$?%a%C%;!<%8%P%C\e(B
 \e$B%U%!$G8F$P$l\e(B (@code{eval} \e$B$5$l\e(B) \e$B$^$9!#8=:_$N5-;v$N%X%C%@!<$OJQ\e(B
-\e$B?t\e(B @code{message-reply-headers} \e$B$+$iF@$i$l$^$9!#\e(B
+\e$B?t\e(B @code{message-reply-headers} \e$B$+$iF@$i$l$^$9!#$3$l$O\e(B number subject
+from date id references chars lines xref extra \e$B$N3F%X%C%@!<$+$i@.$k%Y%/\e(B
+\e$B%H%k$G$9!#\e(B
+
+@vindex message-reply-headers
 
 \e$B$b$7!":n@.$7$h$&$H$7$F$$$k%a%C%;!<%8$,%K%e!<%95-;v$+%a!<%k%a%C%;!<%8$G$"\e(B
 \e$B$k$+$rD4$Y$?$$$H$-$O!"Fs$D$N4X\e(B
@@ -10333,13 +10501,17 @@ Gnus \e$B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0\e(B
          (organization "People's Front Against MWM"))
         ("^rec.humor"
          (signature my-funny-signature-randomizer))
-        ((equal (system-name) "gnarly")
+        ((equal (system-name) "gnarly")  ;; \e$BMM<0\e(B
          (signature my-quote-randomizer))
-        ((message-news-p)
+        (message-news-p        ;; \e$B4X?t%7%s%\%k\e(B
          (signature my-news-signature))
-        (header "to" "larsi.*org"
-                (Organization "Somewhere, Inc."))
-        ((posting-from-work-p)
+        (window-system         ;; \e$BJQ?t%7%s%\%k\e(B
+         ("X-Window-System" (format "%s" window-system)))
+        ;; Lars \e$B$5$s$KJV;v$r$9$k$H$-$O\e(B
+        ;; Organization \e$B%X%C%@!<$rIU$1$h$&!#\e(B
+        ((header "to" "larsi.*org")
+         (Organization "Somewhere, Inc."))
+        ((posting-from-work-p) ;; \e$B%f!<%6!<$,Dj5A$7$?4X?t\e(B
          (signature-file "~/.work-signature")
          (address "user@@bar.foo")
          (body "You are fired.\n\nSincerely, your boss.")
@@ -10452,17 +10624,17 @@ Gnus \e$B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0\e(B
 @cindex using smime
 
 Gnus can digitally sign and encrypt your messages, using vanilla PGP
-format or PGP/MIME or S/MIME.  For decoding such messages, see the
-@code{mm-verify-option} and @code{mm-decrypt-option} options
+format or @sc{pgp/mime} or @sc{s/mime}.  For decoding such messages,
+see the @code{mm-verify-option} and @code{mm-decrypt-option} options
 (@pxref{Security}).
 
 For PGP, Gnus supports two external libraries, @sc{gpg.el} and
-@sc{Mailcrypt}, you need to install at least one of them.  The S/MIME
-support in Gnus requires the external program OpenSSL.
+@sc{Mailcrypt}, you need to install at least one of them.  The
+@sc{s/mime} support in Gnus requires the external program OpenSSL.
 
-Instructing MML to perform security operations on a MIME part is done
-using the @code{C-c C-m s} key map for signing and the @code{C-c C-m
-c} key map for encryption, as follows.
+Instructing MML to perform security operations on a @sc{mime} part is
+done using the @kbd{C-c C-m s} key map for signing and the @kbd{C-c
+C-m c} key map for encryption, as follows.
 
 @table @kbd
 
@@ -10470,37 +10642,42 @@ c} key map for encryption, as follows.
 @kindex C-c C-m s s
 @findex mml-secure-sign-smime
 
-Digitally sign current MIME part using S/MIME.
+Digitally sign current @sc{mime} part using @sc{s/mime}.
 
 @item C-c C-m s o
 @kindex C-c C-m s o
 @findex mml-secure-sign-pgp
 
-Digitally sign current MIME part using PGP.
+Digitally sign current @sc{mime} part using PGP.
 
 @item C-c C-m s p
 @kindex C-c C-m s p
 @findex mml-secure-sign-pgp
 
-Digitally sign current MIME part using PGP/MIME.
+Digitally sign current @sc{mime} part using @sc{pgp/mime}.
 
 @item C-c C-m c s
 @kindex C-c C-m c s
 @findex mml-secure-encrypt-smime
 
-Digitally encrypt current MIME part using S/MIME.
+Digitally encrypt current @sc{mime} part using @sc{s/mime}.
 
 @item C-c C-m c o
 @kindex C-c C-m c o
 @findex mml-secure-encrypt-pgp
 
-Digitally encrypt current MIME part using PGP.
+Digitally encrypt current @sc{mime} part using PGP.
 
 @item C-c C-m c p
 @kindex C-c C-m c p
 @findex mml-secure-encrypt-pgpmime
 
-Digitally encrypt current MIME part using PGP/MIME.
+Digitally encrypt current @sc{mime} part using @sc{pgp/mime}.
+
+@item C-c C-m C-n
+@kindex C-c C-m C-n
+@findex mml-unsecure-message
+Remove security related MML tags from message.
 
 @end table
 
@@ -10544,7 +10721,7 @@ Also @xref{Security, ,Security, message, Message Manual}.
 * Getting Mail::                \e$B8D?ME*$J%a!<%k$r\e(B gnus \e$B$GFI$`\e(B
 * Browsing the Web::            \e$B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$r<hF@$9\e(B
                                 \e$B$k\e(B
-* IMAP::                        Gnus \e$B$r\e(B IMAP \e$B$N%/%i%$%"%s%H$H$7$F;H$&\e(B
+* IMAP::                        gnus \e$B$r\e(B @sc{imap} \e$B$N%/%i%$%"%s%H$H$7$F;H$&\e(B
 * Other Sources::               \e$B%G%#%l%/%H%j!<!"%U%!%$%k!"\e(BSOUP \e$B%Q%1%C%H\e(B
                                 \e$B$rFI$`\e(B
 * Combined Groups::             \e$BJ#?t$N%0%k!<%W$r0l$D$N%0%k!<%W$K7k9g$9$k\e(B
@@ -10906,6 +11083,11 @@ Also @xref{Security, ,Security, message, Message Manual}.
 @findex gnus-server-remove-denials
 Gnus \e$B$,$I$l$+$N%5!<%P!<$+$i@\B35qH]$r<u$1$?$+$I$&$+$NA4$F$N0u$r>C5n$7$^\e(B
 \e$B$9\e(B (@code{gnus-server-remove-denials})\e$B!#\e(B
+
+@item L
+@kindex L (Server)
+@findex gnus-server-offline-server
+\e$B%5!<%P!<$N>uBV$r%*%U%i%$%s$K$7$^$9\e(B (@code{gnus-server-offline-server})\e$B!#\e(B
 @end table
 
 @node Getting News
@@ -10923,7 +11105,7 @@ Gnus \e$B$,$I$l$+$N%5!<%P!<$+$i@\B35qH]$r<u$1$?$+$I$&$+$NA4$F$N0u$r>C5n$7$^\e(B
 @end menu
 
 @node NNTP
-@subsection @sc{nntp}
+@subsection NNTP
 @cindex nntp
 
 @sc{nntp} \e$B%5!<%P!<$N30It%0%k!<%W$r9XFI$9$k$N$OHf3SE*4JC1$G$9!#C1\e(B
@@ -11496,11 +11678,11 @@ gnus \e$B$O$U$D$&F1$8<jK!$G$9$Y$F$N%0%k!<%W$r07$$$^$9!#$"$J$?$O$"$k%0%k!<\e(B
 \e$B$7$P$i$/%a!<%k$H%K%e!<%9$NN>J}$r;H$C$F$_$l$P!"5-;v$N<h$j07$$$K$D$$$FG[\e(B
 \e$BAw$N5!9=$,9T$J$&$3$H$O$o$:$+$G$"$k$3$H$K5$$,IU$-$^$9!#\e(B
 
-\e$BB?$/$N?M$?$A$OJ#?t$N%a!<%j%s%0%j%9%H$r9VFI$7$F$$$^$9!#$=$l$i$O\e(B SMTP \e$B$G\e(B
-\e$BG[Aw$5$l$k!"%a!<%k!"$G$9!#$=$l$i$N5-;v$r$H$F$bCm0U?<$/FI$s$G$$$k$K$b$+\e(B
-\e$B$+$o$i$:!"2?=54V$bJV;v$,L5$$$3$H$,$"$k$G$7$g$&!#;d$?$A$O$=$&$$$&5-;v$r\e(B
-\e$B%;!<%V$9$kI,MW$O$"$j$^$;$s!#$J$<$J$i$P!"$b$&0lEYFI$`I,MW$,@8$8$F$b!"$=\e(B
-\e$B$l$i$O$I$3$+$KJ]B8$5$l$F$$$k$+$i$G$9!#\e(B
+\e$BB?$/$N?M$?$A$OJ#?t$N%a!<%j%s%0%j%9%H$r9VFI$7$F$$$^$9!#$=$l$i\e(B
+\e$B$O\e(B @sc{smtp} \e$B$GG[Aw$5$l$k!"%a!<%k!"$G$9!#$=$l$i$N5-;v$r$H$F$bCm0U?<$/FI\e(B
+\e$B$s$G$$$k$K$b$+$+$o$i$:!"2?=54V$bJV;v$,L5$$$3$H$,$"$k$G$7$g$&!#;d$?$A$O$=\e(B
+\e$B$&$$$&5-;v$r%;!<%V$9$kI,MW$O$"$j$^$;$s!#$J$<$J$i$P!"$b$&0lEYFI$`I,MW$,@8\e(B
+\e$B$8$F$b!"$=$l$i$O$I$3$+$KJ]B8$5$l$F$$$k$+$i$G$9!#\e(B
 
 \e$B$"$k?M$?$A$O>.?M?t$KMxMQ$5$l$F$$$k%m!<%+%k%K%e!<%9%0%k!<%W$r9VFI$7$F$$\e(B
 \e$B$^$9!#$=$l$i$O\e(B @sc{nntp} \e$B$GG[Aw$5$l$k!"%K%e!<%9!"$G$9!#;d$?$A$O<+J,$N;E\e(B
@@ -11545,7 +11727,7 @@ Gnus \e$B$r;H$C$F?7$7$$%a!<%k$rFI$`;v$OHs>o$K4JC1$G$9!#$"$J$?$N%a!<%k%P%C%/\e(B
 
 \e$B:#$d!"<!$K\e(B gnus \e$B$r5/F0$7$?$H$-$K$O!"$3$N%P%C%/%(%s%I$O?7$7$$5-;v$r5a$a!"\e(B
 \e$B$=$l$O$"$J$?$N%9%W!<%k%U%!%$%k$+$iA4$F$N%a%C%;!<%8$r%G%#%l%/%H%j!<!"%G%#\e(B
-\e$B%U%)%k%H$G$O\e(B @code{~/Mail/}\e$B!"$K0\F0$7$^$9!#:n@.$5$l$??7$7$$%0%k!<\e(B
+\e$B%U%)%k%H$G$O\e(B @code{~/Mail/} \e$B$K0\F0$7$^$9!#:n@.$5$l$??7$7$$%0%k!<\e(B
 \e$B%W\e(B (@samp{mail.misc}) \e$B$,9XFI$5$l!"B>$N%0%k!<%W$HF1$8$h$&$KFI$`;v$,$G$-$^\e(B
 \e$B$9!#\e(B
 
@@ -11639,6 +11821,10 @@ nnmail-split-history} \e$B$r;H$&;v$,$G$-$^$9!#$3$l$+$i%9%W!<%k$7D>$=$&$H$9$k\e(B
 @code{gnus-summary-respool-trace} \e$B$H4XO"$9$kL?\e(B
 \e$BNa\e(B (@pxref{Mail Group Commands}) \e$B$r;H$&;v$,$G$-$^$9!#\e(B
 
+@vindex nnmail-split-header-length-limit
+@code{nnmail-split-header-length-limit} \e$B$N@)8B$h$jD9$$%X%C%@!<9T$O!"J,3d\e(B
+\e$B4X?t$N=hM}BP>]$+$i=|30$5$l$^$9!#\e(B
+
 Gnus \e$B$O$"$J$?$K<+J,<+?H$KD7$MJV$C$F$/$k$h$&$J2DG=@-$N$"$kA4$F$N5!2q$rDs\e(B
 \e$B6!$7$^$9!#Nc$($P!"$"$J$?$N>e;J$+$i$/$kA4$F$N%a!<%k$r4^$s$@%0%k!<%W$r:n$C\e(B
 \e$B$?$H$7$^$7$g$&!#$=$l$+$i!"6vH/E*$K$=$N%0%k!<%W$N9XFI<h$j;_$a$,5/$3$C$?$H\e(B
@@ -11841,6 +12027,26 @@ POP \e$B%5!<%P!<$+$i%a!<%k$r<hF@$9$k$?$a$K;H$&4X?t$G$9!#$=$N4X?t$O0l$D$N%Q%i\e(B
 @item :authentication
 \e$B$3$l$O\e(B @code{password} \e$B$+%7%s%\%k\e(B @code{apop} \e$B$G!"$I$NG'>ZJ}<0$r;H$&$+$r\e(B
 \e$B7h$a$k$b$N$N$I$A$i$+$G$9!#=i4|@_Dj$O\e(B @code{password} \e$B$G$9!#\e(B
+
+@item :connection
+\e$B%5!<%P!<$K@\B3$9$k$H$-$K;H$&%9%H%j!<%`$G!"\e(B@code{ssl}, @code{tls} \e$B$^$?$O\e(B
+\e$B$=$l0J30$r;XDj$G$-$^$9!#%G%#%U%)%k%H$O\e(B @code{nil} \e$B$G!"0BA4$G$O$J$$@\B3$r\e(B
+\e$BMQ$$$^$9!#\e(BSSL/TLS \e$B$G$O30It%W%m%0%i%`$H%i%$%V%i%j$,I,MW$G$"$k$3$H$KCm0U$7\e(B
+\e$B$F2<$5$$\e(B:
+
+@itemize @bullet
+@item
+@dfn{ssl:} SSL \e$B$r;H$$$^$9!#\e(BOpenSSL (@samp{openssl} \e$B%W%m%0%i%`\e(B) \e$B$+\e(B SSLeay
+(@samp{s_client}) \e$B$H30It%i%$%V%i%j\e(B @samp{ssl.el} \e$B$,I,MW$G$9!#\e(B
+@item
+@dfn{starttls:} STARTTLS (SSL \e$B$KN`;w\e(B) \e$B$r;H$$$^$9!#30It%i%$%V%i\e(B
+\e$B%j\e(B @samp{starttls.el} \e$B$H\e(B @samp{starttls} \e$B%W%m%0%i%`$,I,MW$G$9!#\e(B
+@samp{starttls}.
+@end itemize
+
+@item :leave
+\e$BHs\e(B-@code{nil} \e$B$G%a!<%k$r%5!<%P!<$K;D$7!"%a%C%;!<%8$N<hF@$K\e(B UIDL \e$B$r;H$$$^\e(B
+\e$B$9!#%G%#%U%)%k%H$O\e(B @code{nil} \e$B$G$9!#\e(B
 @end table
 
 @code{:program} \e$B$H\e(B @code{:function} \e$B%-!<%o!<%I$,;XDj$5$l$F$$$J$$$H!"\e(B
@@ -11901,10 +12107,11 @@ Maildir \e$B%a!<%k%=!<%9$NNc$r$U$?$D\e(B:
 @end lisp
 
 @item imap
-IMAP \e$B%5!<%P!<$+$i%a!<%k$r<hF@$7$^$9!#2?$i$+$NM}M3$G\e(B IMAP \e$B$r0U?^$5$l$?$h\e(B
-\e$B$&$J%M%C%H%o!<%/>e$G%a!<%k$rFI$`%W%m%H%3%k$H$7$F07$$$?$/$J$$$H$-$O!"\e(B
-gnus \e$B$G$O\e(B POP \e$B%5!<%P!<$HF1MM$K07$&$3$H$,$G$-!"M?$($i$l$?\e(B IMAP \e$B%a!<%k%\%C\e(B
-\e$B%/%9$+$i5-;v$r<hF@$7$^$9!#>\$7$/$O\e(B @xref{IMAP} \e$B$r;2>H$7$F2<$5$$!#\e(B
+@sc{imap} \e$B%5!<%P!<$+$i%a!<%k$r<hF@$7$^$9!#2?$i$+$NM}M3$G\e(B @sc{imap} \e$B$r0U\e(B
+\e$B?^$5$l$?$h$&$J%M%C%H%o!<%/>e$G%a!<%k$rFI$`%W%m%H%3%k$H$7$F07$$$?$/$J$$$H\e(B
+\e$B$-$O!"\e(Bgnus \e$B$G$O\e(B POP \e$B%5!<%P!<$HF1MM$K07$&$3$H$,$G$-!"M?$($i$l\e(B
+\e$B$?\e(B @sc{imap} \e$B%a!<%k%\%C%/%9$+$i5-;v$r<hF@$7$^$9!#>\$7$/$O\e(B @xref{IMAP} \e$B$r\e(B
+\e$B;2>H$7$F2<$5$$!#\e(B
 
 Kerberos, GSSAPI, SSL/TLS \e$B$*$h$S\e(B STARTTLS \e$B$N$?$a$N30It%W%m%0%i%`$H%i%$%V\e(B
 \e$B%i%j$,I,MW$G$"$k$3$H$KN10U$7$F2<$5$$!#\e(B@xref{IMAP}
@@ -11913,18 +12120,18 @@ Kerberos, GSSAPI, SSL/TLS \e$B$*$h$S\e(B STARTTLS \e$B$N$?$a$N30It%W%m%0%i%`$H%i%$%
 
 @table @code
 @item :server
-IMAP \e$B%5!<%P!<$NL>A0!#=i4|CM$O4D6-JQ?t\e(B @code{MAILHOST} \e$B$+$iF@$^$9!#\e(B
+@sc{imap} \e$B%5!<%P!<$NL>A0!#=i4|CM$O4D6-JQ?t\e(B @code{MAILHOST} \e$B$+$iF@$^$9!#\e(B
 
 @item :port
-IMAP \e$B%5!<%P!<$N%]!<%HHV9f!#IaDL$O=i4|CM$O\e(B @samp{143} \e$B$G!"\e(BSSL/TLS \e$B@\B3$K\e(B
-\e$B$O\e(B @samp{993} \e$B$G$9!#\e(B
+@sc{imap} \e$B%5!<%P!<$N%]!<%HHV9f!#IaDL$O=i4|CM$O\e(B @samp{143} \e$B$G!"\e(BSSL/TLS \e$B@\\e(B
+\e$BB3$K$O\e(B @samp{993} \e$B$G$9!#\e(B
 
 @item :user
-IMAP \e$B%5!<%P!<$KEO$9MxMQ<TL>$G$9!#=i4|CM$O%m%0%$%sL>$G$9!#\e(B
+@sc{imap} \e$B%5!<%P!<$KEO$9MxMQ<TL>$G$9!#=i4|CM$O%m%0%$%sL>$G$9!#\e(B
 
 @item :password
-IMAP \e$B%5!<%P!<$KEO$9%Q%9%o!<%I$G$9!#;XDj$5$l$F$$$J$$$H$-$O!"MxMQ<T$OF~NO\e(B
-\e$B$rB%$5$l$^$9!#\e(B
+@sc{imap} \e$B%5!<%P!<$KEO$9%Q%9%o!<%I$G$9!#;XDj$5$l$F$$$J$$$H$-$O!"MxMQ<T$O\e(B
+\e$BF~NO$rB%$5$l$^$9!#\e(B
 
 @item :stream
 \e$B%5!<%P!<$K@\B3$9$k$H$-$K;H$&%9%H%j!<%`!#\e(B@code{imap-stream-alist} \e$B$K$"$k\e(B
@@ -11972,20 +12179,20 @@ UNDELETED} \e$B$O$*$=$i$/$?$$$F$$$N?M$K$O:GNI$NA*Br$G$7$g$&$,!"$H$-$I\e(B
 \e$B$-\e(B @sc{imap} \e$B%/%i%$%"%s%H$G%a!<%k%\%C%/%9$rGA$-!"$$$/$D$+$N5-;v$K4{\e(B
 \e$BFI\e(B (\e$B$b$7$/$O!"\e(BSEEN) \e$B$N0u$rIU$1$k$J$i!"\e(B@samp{nil} \e$B$K@_Dj$7$?$$$+$b$7$l$^\e(B
 \e$B$;$s!#$=$&$9$l$P!"%a!<%k%\%C%/%9$NA4$F$N5-;v$O0u$NG!2?$K4X$o$i$:<hF@$5$l\e(B
-\e$B$^$9!#=R8l$N40A4$J0lMw$O!"\e(BRFC2060 \e,A'\e(B6.4.4 \e$B$rFI$s$G$/$@$5$$!#\e(B
+\e$B$^$9!#=R8l$N40A4$J0lMw$O!"\e(BRFC2060 \e$B$N\e(B 6.4.4 \e$B@a$rFI$s$G$/$@$5$$!#\e(B
 
 @item :fetchflag
 \e$B%5!<%P!<$G!"<hF@$7$?5-;v$K0u$rIU$1$kJ}K!!#=i4|CM$N\e(B @samp{\Deleted} \e$B$O$=\e(B
 \e$B$l$i$K>C5n$N0u$rIU$1$^$9$,!"B>$K\e(B @samp{\Seen} \e$B$G$OC1$K4{FI$N0u$rIU$1$^$9!#\e(B
-\e$B$3$l$i$O:G$b$"$j$=$&$JFs$D$NA*Br$G$9$,!"B>$N0u$b\e(B RFC2060 \e,A'\e(B2.3.2 \e$B$GDj5A$5\e(B
-\e$B$l$F$$$^$9!#\e(B
+\e$B$3$l$i$O:G$b$"$j$=$&$JFs$D$NA*Br$G$9$,!"B>$N0u$b\e(B RFC2060 \e$B$N\e(B 2.3.2 \e$B@a$GDj\e(B
+\e$B5A$5$l$F$$$^$9!#\e(B
 
 @item :dontexpunge
 @code{nil} \e$B$G$J$+$C$?$i!"5-;v$r<hF@$7$?8e$G!"$=$l$i$K>C5n$N0u$,IU$$$F$$\e(B
 \e$B$F$b:o=|$7$^$;$s!#\e(B
 @end table
 
-IMAP \e$B%a!<%k%=!<%9$NNc\e(B:
+@sc{imap} \e$B%a!<%k%=!<%9$NNc\e(B:
 
 @lisp
 (imap :server "mail.mycorp.com"
@@ -11994,10 +12201,11 @@ IMAP \e$B%a!<%k%=!<%9$NNc\e(B:
 @end lisp
 
 @item webmail
-www.hotmail.com, webmail.netscape.com, www.netaddress.com,
-www.my-deja.com \e$B$J$I$N%&%'%V%a!<%k%5!<%P!<$+$i%a!<%k$r<hF@$7$^$9!#\e(B
+@uref{www.hotmail.com}, @uref{webmail.netscape.com},
+@uref{www.netaddress.com}, @uref{www.my-deja.com} \e$B$J$I$N%&%'%V%a!<%k%5!<\e(B
+\e$B%P!<$+$i%a!<%k$r<hF@$7$^$9!#\e(B
 
-\e$BCm\e(B: \e$B8=:_\e(B mail.yahoo.com \e$B$O\e(B POP3 \e$B%5!<%S%9$rDs6!$7$F$$$^$9$N$G!"\e(B
+\e$BCm\e(B: \e$B8=:_\e(B @uref{mail.yahoo.com} \e$B$O\e(B POP3 \e$B%5!<%S%9$rDs6!$7$F$$$^$9$N$G!"\e(B
 @sc{pop} \e$B%a!<%k%=!<%9$r;H$&$N$,NI$$$N$G$O$J$$$G$7$g$&$+!#\e(B
 
 \e$BCm\e(B: \e$B%&%'%V%a!<%k$O%/%C%-!<$KBg$-$/0MB8$7$^$9!#\e(Burl "4.0pre.46" \e$B$r;H$&>l9g\e(B
@@ -12487,7 +12695,7 @@ nnml:mail.others:
 \e$B%W$@$1$K;H$&$3$H$,$G$-$^$9!#\e(B
 
 @lisp
-(: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL)
+(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL)
 @end lisp
 
 @var{groups} \e$B$O=PNO$NJ,3d$r@8@.$9$k$?$a$K%Q%i%a!<%?$,Av::$5$l$k%0%k!<%W\e(B
@@ -13029,9 +13237,10 @@ rmail box \e$B$N$?$a$N%"%/%F%#%V%U%!%$%k$NL>A0!#4{DjCM\e(B
 @code{nnml} \e$B$O5-;vJ,3d$K4X$7$F$O$*$=$i$/0lHVCY$$%P%C%/%(%s%I$G$7$g$&!#$=\e(B
 \e$B$l$OB?$/$N%U%!%$%k$r:n$i$J$1$l$P$J$i$:!"$=$l$OF~$C$F$/$k%a!<%k$N$?$a\e(B
 \e$B$N\e(B @sc{nov} \e$B%G!<%?%Y!<%9$b:n@.$7$J$1$l$P$J$j$^$;$s!#$3$l$N$?$a$K!"%a!<%k\e(B
-\e$B$rFI$`;v$K4X$7$F$O:GB.$N%P%C%/%(%s%I$K$J$j$^$9!#\e(B
+\e$B$rFI$`;v$K4X$7$F$O$?$V$s:GB.$N%P%C%/%(%s%I$K$J$j$^$9!#\e(B
 
 @cindex self contained nnml servers
+@cindex marks
 \e$B0u%U%!%$%k\e(B (\e$BLuCm\e(B: marks file) \e$B$,;H$o$l$k$H\e(B (\e$B$=$l$,%G%#%U%)%k%H$G$9$,\e(B)\e$B!"\e(B
 @code{nnml} \e$B%5!<%P!<$O\e(B @code{tar} \e$B$J$I$r;H$C$F%P%C%/%"%C%W$7$?$j!"8e$G$"\e(B
 \e$B$J$?$,IU$1$?0u$,$9$Y$FJ]$?$l$?>uBV$G\e(B gnus \e$B$KLa$9\e(B (\e$BK\Mh$N\e(B @code{nnml} \e$B%5!<\e(B
@@ -13089,7 +13298,12 @@ rmail box \e$B$N$?$a$N%"%/%F%#%V%U%!%$%k$NL>A0!#4{DjCM\e(B
 
 @item nnml-marks-file-name
 @vindex nnml-marks-file-name
-@sc{\e$B0u\e(B} \e$B%U%!%$%k$NL>A0$G$9!#%G%#%U%)%k%H$O\e(B @file{.marks} \e$B$G$9!#\e(B
+@dfn{\e$B0u\e(B} \e$B%U%!%$%k$NL>A0$G$9!#%G%#%U%)%k%H$O\e(B @file{.marks} \e$B$G$9!#\e(B
+
+@item nnml-use-compressed-files
+@vindex nnml-use-compressed-files
+\e$BHs\e(B-@code{nil} \e$B$@$C$?$i\e(B @code{nnml} \e$B$O05=L$5$l$?%a%C%;!<%8%U%!%$%k$r;H$&\e(B
+\e$B$3$H$r9MN8$KF~$l$^$9!#\e(B
 @end table
 
 @findex nnml-generate-nov-databases
@@ -13146,6 +13360,7 @@ rmail box \e$B$N$?$a$N%"%/%F%#%V%U%!%$%k$NL>A0!#4{DjCM\e(B
 \e$B$($^$9!#\e(B
 
 @cindex self contained nnfolder servers
+@cindex marks
 \e$B0u%U%!%$%k\e(B (\e$BLuCm\e(B: marks file) \e$B$,;H$o$l$k$H\e(B (\e$B$=$l$,%G%#%U%)%k%H$G$9$,\e(B)\e$B!"\e(B
 @code{nnfolder} \e$B%5!<%P!<$O\e(B @code{tar} \e$B$J$I$r;H$C$F%P%C%/%"%C%W$7$?$j!"8e\e(B
 \e$B$G$"$J$?$,IU$1$?0u$,$9$Y$FJ]$?$l$?>uBV$G\e(B gnus \e$B$KLa$9\e(B (\e$BK\Mh\e(B
@@ -13457,29 +13672,31 @@ Gnus \e$B$O$3$l$i$N%=!<%9$X$N3&LL$rDs6!$9$k%P%C%/%(%s%I72$r>/$7Hw$($D$D$"$j\e(B
 @cindex archiving mail
 @cindex backup of mail
 
-\e$B$$$/$D$+$N%P%C%/%(%s%I!"FC$K\e(B nnml \e$B$H\e(B nnfolder \e$B$O!"$=$l$>$l$N%0%k!<%W$N5-\e(B
-\e$B;v$N0u$rK\Ev$KJ];}$7$^$9!#$3$l$i$N%5!<%P!<$G!"%0%k!<%W$N0u$rJ]$A$D$DJ]B8\e(B
-\e$B$7$?$j85$KLa$9$N$O$+$J$j4JC1$G$9!#\e(B
+\e$B$$$/$D$+$N%P%C%/%(%s%I!"FC$K\e(B @code{nnml}, @code{nnfolder} \e$B$*$h\e(B
+\e$B$S\e(B @code{nnmaildir} \e$B$O!"$=$l$>$l$N%0%k!<%W$N5-;v$N0u$rK\Ev$KJ];}$7$^$9!#\e(B
+\e$B$3$l$i$N%5!<%P!<$G!"%0%k!<%W$N0u$rJ]$A$D$DJ]B8$7$?$j85$KLa$9$N$O$+$J$j4J\e(B
+\e$BC1$G$9!#\e(B
 
 (\e$B$G$b!"%0%k!<%W%l%Y%k$H%0%k!<%W%Q%i%a!<%?$r$bJ];}$9$k$K$O!":#$^$G$H$*\e(B
-\e$B$j\e(B @code{.newsrc.eld} \e$B$N?@$K!"Iq$$$H@8lS$rJ{$2$J$1$l$P$J$j$^$;$s!#\e(B)
-
-@code{nnml} \e$B$+\e(B @code{nnfolder} \e$B$K$^$k$4$HJ]B8$9$k$K$O!"%5!<%P!<$N%G%#%l\e(B
-\e$B%/%H%j$r:F5"E*$K%3%T!<$7$^$9!#\e(Bgnus \e$B$r=*N;$9$kI,MW$OL5$$$N$G!"J]B8\e(B
-\e$B$O\e(B @code{cron} \e$B$d$=$l$KN`$9$k$b$N$,9T$J$&$3$H$,$G$-$^$9!#%G!<%?$rI|5"$5\e(B
-\e$B$;$k$K$O%G%#%l%/%H%jLZ\e(B (tree) \e$B$r85$KLa$9$3$H$G9T$J$$!"$=$N%G%#%l%/%H%j$r\e(B
-\e$B;X$7<($9$h$&$K\e(B gnus \e$B$N%5!<%P!<$NDj5A$KDI2C$7$^$9!#\e(B@ref{Article Backlog}\e$B!"\e(B
-@ref{Asynchronous Fetching} \e$B$*$h$S$=$NB>$O!"%G!<%?$r>e=q$-$7$F<YKb$r$9$k\e(B
-\e$B$+$b$7$l$J$$$N$G!"$"$J$?$O%G!<%?$rI|5"$5$;$kA0$K\e(B gnus \e$B$r=*N;$7$?$$$+$b$7\e(B
-\e$B$l$^$;$s!#\e(B
-
-\e$B8D!9$N\e(B @code{nnml} \e$B$d\e(B @code{nnfolder} \e$B$N%0%k!<%W$r!"0u$rJ];}$7$D$DJ]B8$9\e(B
-\e$B$k$3$H$b$G$-$^$9!#\e(B@code{nnml} \e$B$G$O!"$=$N%0%k!<%W$N%G%#%l%/%H%j$K$"$k$9$Y\e(B
-\e$B$F$N%U%!%$%k$r%3%T!<$7$^$9!#\e(B@code{nnfolder} \e$B$G$O!"4pK\$N%U%)%k%@!<%U%!%$\e(B
-\e$B%k\e(B (@code{FOO}) \e$B$H0u%U%!%$%k\e(B (@code{FOO.mrk}) \e$B$NN>J}$r%3%T!<$9$kI,MW$,$"\e(B
-\e$B$j$^$9!#%0%k!<%W$r85$KLa$9$N$O!"%0%k!<%W%P%C%U%!$G\e(B @kbd{G m} \e$B%-!<$r;H$$\e(B
-\e$B$^$9!#$=$N:G8e$N<j=g$K$h$C$F!"\e(Bgnus \e$B$O?7$7$$%G%#%l%/%H%j$,$G$-$?$3$H$rCN\e(B
-\e$B$j$^$9!#\e(B
+\e$B$j\e(B @file{.newsrc.eld} \e$B$N?@$K!"Iq$$$H@8lS$rJ{$2$J$1$l$P$J$j$^$;$s$,!#\e(B)
+
+@code{nnml}, @code{nnfolder} \e$B$^$?$O\e(B @code{nnmaildir} \e$B%5!<%P!<$K$^$k$4$H\e(B
+\e$BJ]B8$9$k$K$O!"%5!<%P!<$N%G%#%l%/%H%j$r:F5"E*$K%3%T!<$7$^$9!#\e(Bgnus \e$B$r=*N;\e(B
+\e$B$9$kI,MW$OL5$$$N$G!"J]B8$O\e(B @code{cron} \e$B$d$=$l$KN`$9$k$b$N$,9T$J$&$3$H$,\e(B
+\e$B$G$-$^$9!#%G!<%?$rI|5"$5$;$k$K$O%G%#%l%/%H%jLZ\e(B (tree) \e$B$r85$KLa$9$3$H$G9T\e(B
+\e$B$J$$!"$=$N%G%#%l%/%H%j$r;X$7<($9$h$&$K\e(B gnus \e$B$N%5!<%P!<$NDj5A$KDI2C$7$^$9!#\e(B
+@ref{Article Backlog}, @ref{Asynchronous Fetching} \e$B$*$h$S$=$NB>$O!"%G!<\e(B
+\e$B%?$r>e=q$-$7$F<YKb$r$9$k$+$b$7$l$J$$$N$G!"$"$J$?$O%G!<%?$rI|5"$5$;$kA0$K\e(B
+gnus \e$B$r=*N;$7$?$$$+$b$7$l$^$;$s!#\e(B
+
+\e$B8D!9$N\e(B @code{nnml}, @code{nnfolder} \e$B$^$?$O\e(B @code{nnmaildir} \e$B$N%0%k!<%W$r!"\e(B
+\e$B0u$rJ];}$7$D$DJ]B8$9$k$3$H$b$G$-$^$9!#\e(B@code{nnml} \e$B$+\e(B @code{nnmaildir} \e$B$G\e(B
+\e$B$O!"$=$N%0%k!<%W$N%G%#%l%/%H%j$K$"$k$9$Y$F$N%U%!%$%k$r%3%T!<$7$^$9!#\e(B
+@code{nnfolder} \e$B$G$O!"4pK\$N%U%)%k%@!<%U%!%$%k\e(B (@file{FOO}) \e$B$H0u%U%!%$\e(B
+\e$B%k\e(B (@file{FOO.mrk}) \e$B$NN>J}$r%3%T!<$9$kI,MW$,$"$j$^$9!#%0%k!<%W$r85$KLa$9\e(B
+\e$B$N$O!"%0%k!<%W%P%C%U%!$G\e(B @kbd{G m} \e$B%-!<$r;H$$$^$9!#$=$N:G8e$N<j=g$K$h$C\e(B
+\e$B$F!"\e(Bgnus \e$B$O?7$7$$%G%#%l%/%H%j$,$G$-$?$3$H$rCN$j$^$9!#\e(B@code{nnmaildir} \e$B$O\e(B
+\e$B<+F0E*$K?7$7$$%G%#%l%/%H%j$rCN$k$N$G!"$=$N>l9g\e(B @kbd{G m} \e$B$OITMW$G$9!#\e(B
 
 @node Web Searches
 @subsection \e$B%&%'%V8!:w\e(B
@@ -14037,14 +14254,14 @@ Gnus \e$B$O%&%'%V%Z!<%8$r<hF@$9$k$?$a$K\e(B url \e$B%i%$%V%i%j$r!"%&%'%V%Z!<%8$rI=<
 \e$B$9$k$h$&$K$J$k$G$7$g$&!#\e(B
 
 @node IMAP
-@section @sc{imap}
+@section IMAP
 @cindex nnimap
 @cindex IMAP
 
-IMAP \e$B$O%a!<%k\e(B (\e$B$b$7$/$O!"%K%e!<%9!"$b$7$/$O\e(B ...) \e$B$rFI$`$?$a$N%M%C%H%o!<\e(B
-\e$B%/%W%m%H%3%k$G$9!#8=BeIw$N\e(B NNTP \e$B$H9M$($F$/$@$5$$!#\e(BIMAP \e$B%5!<%P!<$X$N@\B3\e(B
-\e$B$O%K%e!<%9%5!<%P!<$X$N@\B3$HHs>o$K;w$F$$$F!"$=$N%5!<%P!<$N%M%C%H%o!<%/%"\e(B
-\e$B%I%l%9$r;XDj$9$k$@$1$K$J$C$F$$$^$9!#\e(B
+@sc{imap} \e$B$O%a!<%k\e(B (\e$B$b$7$/$O!"%K%e!<%9!"$b$7$/$O\e(B ...) \e$B$rFI$`$?$a$N%M%C%H\e(B
+\e$B%o!<%/%W%m%H%3%k$G$9!#8=BeIw$N\e(B @sc{nntp} \e$B$H9M$($F$/$@$5$$!#\e(B@sc{imap} \e$B%5!<\e(B
+\e$B%P!<$X$N@\B3$O%K%e!<%9%5!<%P!<$X$N@\B3$HHs>o$K;w$F$$$F!"$=$N%5!<%P!<$N%M%C\e(B
+\e$B%H%o!<%/%"%I%l%9$r;XDj$9$k$@$1$K$J$C$F$$$^$9!#\e(B
 
 @sc{imap} \e$B$K$OFs$D$NFC<A$,$"$j$^$9!#0l$D$O!"\e(B@sc{imap} \e$B$O\e(B POP \e$B$G$G$-$k$3\e(B
 \e$B$H$OA4It$G$-$k!"$=$l$f$(\e(B POP++ \e$B$N$h$&$K$b8+$($k$H$$$&$3$H!#Fs$DL\$O!"\e(B
@@ -14099,8 +14316,8 @@ IMAP \e$B$O%a!<%k\e(B (\e$B$b$7$/$O!"%K%e!<%9!"$b$7$/$O\e(B ...) \e$B$rFI$`$?$a$N%M%C
 @item nnimap-address
 @vindex nnimap-address
 
-\e$B1s3V\e(B IMAP \e$B%5!<%P!<$N%"%I%l%9$G$9!#;XDj$5$l$F$$$J$$>l9g$O2>A[%5!<%P!<$N$b\e(B
-\e$B$N$K$J$j$^$9!#\e(B
+\e$B1s3V\e(B @sc{imap} \e$B%5!<%P!<$N%"%I%l%9$G$9!#;XDj$5$l$F$$$J$$>l9g$O2>A[%5!<%P!<\e(B
+\e$B$N$b$N$K$J$j$^$9!#\e(B
 
 @item nnimap-server-port
 @vindex nnimap-server-port
@@ -14118,8 +14335,8 @@ IMAP \e$B$O%a!<%k\e(B (\e$B$b$7$/$O!"%K%e!<%9!"$b$7$/$O\e(B ...) \e$B$rFI$`$?$a$N%M%C
 @vindex nnimap-list-pattern
 \e$B;HMQ2DG=$J%a!<%k%\%C%/%9$r@)8B$9$k$?$a$NJ8;zNs$+%j%9%H$G$9!#$3$l$O!"%5!<\e(B
 \e$B%P!<$KHs>o$KB?$/$N%a!<%k%\%C%/%9$,$"$k$1$l$I!"6=L#$N$"$k$b$N$O>/$7$@$1$G\e(B
-\e$B$"$k$H$-$K;HMQ$7$^$9!#%5!<%P!<$K$O%[!<%`%G%#%l%/%H%j!<$r\e(B IMAP \e$B7PM3$G=P$9\e(B
-\e$B$b$N$b$"$j$^$9$N$G!"$=$N>l9g$O$*$=$i$/%a!<%k%\%C%/%9\e(B
+\e$B$"$k$H$-$K;HMQ$7$^$9!#%5!<%P!<$K$O%[!<%`%G%#%l%/%H%j!<$r\e(B @sc{imap} \e$B7PM3\e(B
+\e$B$G=P$9$b$N$b$"$j$^$9$N$G!"$=$N>l9g$O$*$=$i$/%a!<%k%\%C%/%9\e(B
 \e$B$r\e(B @file{~/Mail/*} \e$B$K@)8B$7$?$$$G$7$g$&!#\e(B
 
 \e$BJ8;zNs$O\e(B REFERENCE \e$B$H>e$NJ8;zNs$H$N\e(B cons \e$B$G$"$k$3$H$b$G$-$^$9!#$I\e(B
@@ -14138,8 +14355,8 @@ IMAP \e$B$O%a!<%k\e(B (\e$B$b$7$/$O!"%K%e!<%9!"$b$7$/$O\e(B ...) \e$B$rFI$`$?$a$N%M%C
 @vindex nnimap-stream
 \e$B%5!<%P!<$K@\B3$9$k$H$-$K;H$o$l$k%9%H%j!<%`$N7?$G$9!#=i4|@_Dj$G\e(B
 \e$B$O\e(B nnimap \e$B$O\e(B SSL/TLS \e$B$r=|$/0J2<$N$9$Y$F$r<+F0E*$K8!CN$7$F$=$l$r;H$$$^$9!#\e(B
-(SSL/TLS \e$B$r;H$&\e(B IMAP \e$B$O\e(B STARTTLS \e$B$GCV$-49$($i$l$F$$$^$9!#$3$l$O<+F08!=P\e(B
-\e$B$G$-$^$9$,!"$^$@9-HO0O$KG[Hw$5$l$F$$$^$;$s!#\e(B)
+(SSL/TLS \e$B$r;H$&\e(B @sc{imap} \e$B$O\e(B STARTTLS \e$B$GCV$-49$($i$l$F$$$^$9!#$3$l$O<+F0\e(B
+\e$B8!=P$G$-$^$9$,!"$^$@9-HO0O$KG[Hw$5$l$F$$$^$;$s!#\e(B)
 
 \e$B0J2<$O%5!<%P!<;XDj$NNc$G$9!#\e(B
 
@@ -14162,9 +14379,8 @@ IMAP \e$B$O%a!<%k\e(B (\e$B$b$7$/$O!"%K%e!<%9!"$b$7$/$O\e(B ...) \e$B$rFI$`$?$a$N%M%C
 @dfn{starttls:} STARTTLS (SSL \e$B$KN`;w\e(B) \e$B$r;H$$$^$9!#30It%i%$%V%i\e(B
 \e$B%j\e(B @samp{starttls.el} \e$B$H\e(B @samp{starttls} \e$B%W%m%0%i%`$,I,MW$G$9!#\e(B
 @item
-@dfn{ssl:} SSL \e$B$r;H$$$^$9!#\e(BOpenSSL (@samp{openssl} \e$B%W%m%0%i\e(B
-\e$B%`\e(B) \e$B$+\e(B SSLeay (@samp{s_client}) \e$B$H30It%i%$%V%i%j\e(B @samp{ssl.el} \e$B$,I,MW$G\e(B
-\e$B$9!#\e(B
+@dfn{ssl:} SSL \e$B$r;H$$$^$9!#\e(BOpenSSL (@samp{openssl} \e$B%W%m%0%i%`\e(B) \e$B$+\e(B SSLeay
+(@samp{s_client}) \e$B$H30It%i%$%V%i%j\e(B @samp{ssl.el} \e$B$,I,MW$G$9!#\e(B
 @item
 @dfn{shell:} \e$B%7%'%kL?Na$r;H$C$F\e(B @sc{imap} \e$B@\B3$r3+;O$7$^$9!#\e(B
 @item
@@ -14177,9 +14393,9 @@ IMAP \e$B$O%a!<%k\e(B (\e$B$b$7$/$O!"%K%e!<%9!"$b$7$/$O\e(B ...) \e$B$rFI$`$?$a$N%M%C
 \e$B%s\e(B 1.5.x \e$B$H\e(B 1.6.x) \e$B$r;H$C$F$$$k$J$i!"\e(B
 @code{imap-process-connection-type} \e$B$r$$$8$j2s$7$F!"\e(B
 @code{imap.el} \e$B$,\e(B @samp{imtest} \e$B$HDL?.$9$k$H$-$K%Q%$%W$G$O$J$/\e(B
-\e$B$F\e(B pty \e$B$r;H$&$h$&$K$5$;$kI,MW$,$"$j$^$9!#$=$&$9$k$H$"$J$?$O\e(B IMAP \e$B%3%^%s\e(B
-\e$B%I$N9T$ND9$5$N@)8B$KG:$^$5$l$k$G$7$g$&!#$=$l$O%a!<%k%\%C%/%9$K$?$/$5$s$N\e(B
-\e$B5-;v$,$"$k$H$-$K\e(B Gnus \e$B$rL54|8B$K%O%s%0$5$;$F$7$^$&$+$b$7$l$^$;$s!#JQ\e(B
+\e$B$F\e(B pty \e$B$r;H$&$h$&$K$5$;$kI,MW$,$"$j$^$9!#$=$&$9$k$H$"$J$?$O\e(B @sc{imap} \e$B%3\e(B
+\e$B%^%s%I$N9T$ND9$5$N@)8B$KG:$^$5$l$k$G$7$g$&!#$=$l$O%a!<%k%\%C%/%9$K$?$/$5\e(B
+\e$B$s$N5-;v$,$"$k$H$-$K\e(B Gnus \e$B$rL54|8B$K%O%s%0$5$;$F$7$^$&$+$b$7$l$^$;$s!#JQ\e(B
 \e$B?t\e(B @code{imap-kerberos4-program} \e$B$O\e(B imtest \e$B%W%m%0%i%`$KEO$9%Q%?%a!<%?$r\e(B
 \e$B4^$_$^$9!#\e(B
 
@@ -14236,11 +14452,12 @@ nnimap \e$B$O$=$l$b%5%]!<%H$7$^$9!#$7$+$7!"\e(BSSLeay \e$B$N:G?7HG$G$"$k\e(B 0.9.x \e
 @cindex Expunging
 @vindex nnimap-expunge-on-close
 
-\e$B%Q%k%a%K%G%9$H0c$C$F!"\e(BIMAP \e$B$N@_7W<TC#$O!"B8:_$7$F$$$J$$$b$N$,<B:]$K$OB8\e(B
-\e$B:_$7$F$$$k$H7h$a$^$7$?!#$b$C$H>\$7$/@bL@$9$k$H!"\e(BIMAP \e$B$O<B:]$K$O5-;v$r>C\e(B
-\e$B5n$7$J$$!"5-;v$K\e(B @code{Deleted} \e$B$H$$$&0u$rIU$1$k35G0$,$"$j!"$3$l\e(B (\e$B$($C\e(B
-\e$B$H!"\e(B@code{Deleted} \e$B$H$$$&0u$rIU$1$k$3$H$G$9\e(B) \e$B$,\e(B nnimap \e$B$,\e(B Gnus \e$B$G5-;v$r\e(B
-\e$B>C5n$9$k$H$-$K$9$k$3$H$G$9\e(B (@kbd{G DEL} \e$B$J$I$G\e(B)\e$B!#\e(B
+\e$B%Q%k%a%K%G%9$H0c$C$F!"\e(B@sc{imap} \e$B$N@_7W<TC#$O!"B8:_$7$F$$$J$$$b$N$,<B:]$K\e(B
+\e$B$OB8:_$7$F$$$k$H7h$a$^$7$?!#$b$C$H>\$7$/@bL@$9$k$H!"\e(B@sc{imap} \e$B$O<B:]$K$O\e(B
+\e$B5-;v$r>C5n$7$J$$!"5-;v$K\e(B @code{Deleted} \e$B$H$$$&0u$rIU$1$k35G0$,$"$j!"$3\e(B
+\e$B$l\e(B (\e$B$($C$H!"\e(B@code{Deleted} \e$B$H$$$&0u$rIU$1$k$3$H$G\e(B
+\e$B$9\e(B) \e$B$,\e(B nnimap \e$B$,\e(B Gnus \e$B$G5-;v$r>C5n$9$k$H$-$K$9$k$3$H$G$9\e(B (@kbd{G DEL} \e$B$J\e(B
+\e$B$I$G\e(B)\e$B!#\e(B
 (\e$BLuCm\e(B: \e$B%Q%k%a%K%G%9$O5*85A0\e(B 5 \e$B@$5*$N%.%j%7%"$N\e(B Elea \e$BGI$NE/3X<T\e(B)
 
 \e$B5-;v$r\e(B @code{Deleted} \e$B%U%i%0$G0u$rIU$1$?$H$-$K$OK\Ev$O>C5n$5$l$F$$$J$$$N\e(B
@@ -14259,8 +14476,8 @@ nnimap \e$B$O$=$l$b%5%]!<%H$7$^$9!#$7$+$7!"\e(BSSLeay \e$B$N:G?7HG$G$"$k\e(B 0.9.x \e
 \e$B$?5-;v$r>C5n$7$^$9!#\e(B
 @item never
 \e$B7h$7$F5-;v$r>C5n$7$^$;$s!#8=:_$O!">C5n$N0u$,IU$$$?5-;v$r\e(B nnimap \e$B$GI=<($9\e(B
-\e$B$kJ}K!$O$"$j$^$;$s$,!"B>$N\e(B IMAP \e$B%/%i%$%"%s%H$O$G$O$G$-$k$+$b$7$l$^$;$s!#\e(B
-\e$B<j$G\e(B EXPUNGE \e$B%3%^%s%I$rH/9T$7$?$$$H$-$O!"\e(B@xref{Expunging mailboxes}\e$B!#\e(B
+\e$B$kJ}K!$O$"$j$^$;$s$,!"B>$N\e(B @sc{imap} \e$B%/%i%$%"%s%H$O$G$O$G$-$k$+$b$7$l$^\e(B
+\e$B$;$s!#<j$G\e(B EXPUNGE \e$B%3%^%s%I$rH/9T$7$?$$$H$-$O\e(B @xref{Expunging mailboxes}\e$B!#\e(B
 @item ask
 \e$B%a!<%k%\%C%/%9$rJD$8$k$H$-$K!"\e(Bnnimap \e$B$,>C5n$5$l$?5-;v$r:o=|$9$k$+$I$&$+\e(B
 \e$B$r?R$M$^$9!#\e(B
@@ -14269,11 +14486,11 @@ nnimap \e$B$O$=$l$b%5%]!<%H$7$^$9!#$7$+$7!"\e(BSSLeay \e$B$N:G?7HG$G$"$k\e(B 0.9.x \e
 @item nnimap-importantize-dormant
 @vindex nnimap-importantize-dormant
 
-\e$BHs\e(B nil \e$B$@$C$?$i!"B>$N\e(B IMAP \e$B%/%i%$%"%s%H$N$?$a$KJ]N15-;v$r0uIU$-$H$7$F$b\e(B
-\e$B0u$rIU$1$^$9!#\e(Bgnus \e$B$NFbIt$G$O!"J]N15-;v$O85!9$9$G$K0uIU$-$H$7$F$N$_0u$,\e(B
-\e$BIU$1$i$l$F$$$^$9!#$3$l$O!"B>$N\e(B IMAP \e$B%/%i%$%"%s%H$K$*$1$kJ]N15-;v$r!"$"$?\e(B
-\e$B$+$b0uIU$-$N$h$&$K$-$oN)$?$;$^$9!#\e(B(\e$BJL$N8@$$J}$r$9$k$H!"\e(Bgnus \e$B$OFs$D$N0u$r\e(B
-\e$BIU$1!"\e(BIMAP \e$B$O$?$C$?0l$D$@$H$$$&$3$H$G$9!#\e(B)
+\e$BHs\e(B nil \e$B$@$C$?$i!"B>$N\e(B @sc{imap} \e$B%/%i%$%"%s%H$N$?$a$KJ]N15-;v$r0uIU$-$H$7\e(B
+\e$B$F$b0u$rIU$1$^$9!#\e(Bgnus \e$B$NFbIt$G$O!"J]N15-;v$O85!9$9$G$K0uIU$-$H$7$F$N$_\e(B
+\e$B0u$,IU$1$i$l$F$$$^$9!#$3$l$O!"B>$N\e(B @sc{imap} \e$B%/%i%$%"%s%H$K$*$1$kJ]N15-\e(B
+\e$B;v$r!"$"$?$+$b0uIU$-$N$h$&$K$-$oN)$?$;$^$9!#\e(B(\e$BJL$N8@$$J}$r$9$k$H!"\e(Bgnus \e$B$O\e(B
+\e$BFs$D$N0u$rIU$1!"\e(B@sc{imap} \e$B$O$?$C$?0l$D$@$H$$$&$3$H$G$9!#\e(B)
 
 \e$B$?$V$s$3$l$r$$$8$j$^$o$9$N$O!"$"$J$?$,%f!<%6C10L$NJ]N1%U%i%0$rIU$1$h$&$H\e(B
 \e$B$9$k$@$1$NM}M3$K$h$k$G$7$g$&!#$3$s$J46$8$G\e(B:
@@ -14293,7 +14510,7 @@ nnimap \e$B$O$=$l$b%5%]!<%H$7$^$9!#$7$+$7!"\e(BSSLeay \e$B$N:G?7HG$G$"$k\e(B 0.9.x \e
 @vindex nnimap-expunge-search-string
 
 \e$B$3$NJQ?t$K$O!"4|8B@Z$l>C5n$9$k$N$,K>$^$7$$5-;v$rC5$9$H$-$K%5!<%P!<$KAw$C\e(B
-\e$B$?\e(B IMAP \e$B$N8!:w%3%^%s%I$,F~$C$F$$$^$9!#%G%#%U%)%k%H\e(B
+\e$B$?\e(B @sc{imap} \e$B$N8!:w%3%^%s%I$,F~$C$F$$$^$9!#%G%#%U%)%k%H\e(B
 \e$B$O\e(B @code{"UID %s NOT SINCE %s"} \e$B$G!"$3$3$G:G=i$N\e(B @code{%s} \e$B$O\e(B UID \e$B$GCV$-\e(B
 \e$B49$($i$l!"FsHVL\$N\e(B @code{%s} \e$B$OF|IU$GCV$-49$($i$l$^$9!#\e(B
 
@@ -14323,10 +14540,10 @@ nnimap \e$B$K5-;v$NFbItE*$JF|IU$NBe$o$j$K\e(B Date: \e$B$r;H$&$h$&$K$5$;$^$9!#$5$i$
 @cindex splitting imap mail
 
 \e$BJ,3d$O\e(B gnus \e$B$NMxMQ<T$,2?G/$b$N4V0&$7$F$-$?$b$N$G!":#$d;D$j$N@$3&$bDI$$$D\e(B
-\e$B$3$&$H$7$F$$$^$9!#$O$$!"A[A|$7$F$/$@$5$$!"\e(BIMAP \e$B%5!<%P!<$N$J$+$K%5!<%P!<\e(B
-\e$BB&$GJ,3d$G$-$k$b$N$O$"$^$jB?$/$J$/!"$7$+$b$=$l$i$OI8=`$G$J$$%W%m%H%3%k$r\e(B
-\e$B;H$C$F$$$k$h$&$G$9!#$3$l$O!"\e(Bgnus \e$B$N\e(B IMAP \e$B%5%]!<%H$O<+J,<+?H$GJ,3d$r$7$J\e(B
-\e$B$1$l$P$J$i$J$$$H$$$&$3$H$G$9!#\e(B
+\e$B$3$&$H$7$F$$$^$9!#$O$$!"A[A|$7$F$/$@$5$$!"\e(B@sc{imap} \e$B%5!<%P!<$N$J$+$K%5!<\e(B
+\e$B%P!<B&$GJ,3d$G$-$k$b$N$O$"$^$jB?$/$J$/!"$7$+$b$=$l$i$OI8=`$G$J$$%W%m%H%3\e(B
+\e$B%k$r;H$C$F$$$k$h$&$G$9!#$3$l$O!"\e(Bgnus \e$B$N\e(B @sc{imap} \e$B%5%]!<%H$O<+J,<+?H$GJ,\e(B
+\e$B3d$r$7$J$1$l$P$J$i$J$$$H$$$&$3$H$G$9!#\e(B
 
 \e$B$=$7$F<B:]$K$7$^$9!#\e(B
 
@@ -14349,8 +14566,8 @@ Nnmail \e$B$GBP1~$9$k$b$N\e(B: @code{nnmail-crosspost}.
 @cindex inbox
 @vindex nnimap-split-inbox
 
-\e$BJ,3d$N85$H$J$k\e(B IMAP \e$B$N%a!<%k%\%C%/%9$NL>A0$r;XDj$7$?J8;zNs$+J8;zNs$N%j%9\e(B
-\e$B%H$G$9!#=i4|CM$O\e(B @code{nil} \e$B$G!"J,3d$O;HMQ$7$J$$$h$&$K$J$C$F$$$^$9\e(B!
+\e$BJ,3d$N85$H$J$k\e(B @sc{imap} \e$B$N%a!<%k%\%C%/%9$NL>A0$r;XDj$7$?J8;zNs$+J8;zNs\e(B
+\e$B$N%j%9%H$G$9!#=i4|CM$O\e(B @code{nil} \e$B$G!"J,3d$O;HMQ$7$J$$$h$&$K$J$C$F$$$^$9\e(B!
 
 @lisp
 (setq nnimap-split-inbox
@@ -14366,9 +14583,10 @@ Nnmail \e$B$KBP1~$9$k$b$N$O$"$j$^$;$s!#\e(B
 @code{nnimap-split-inbox} \e$B$G8+$D$+$C$??7$7$$%a!<%k$O$3$NJQ?t$K=>$C$FJ,3d\e(B
 \e$B$5$l$^$9!#\e(B
 
-\e$B$3$NJQ?t$O%j%9%H$N%j%9%H$+$i@.$j$^$9!#I{%j%9%H$N:G=i$NMWAG$O\e(B IMAP \e$B$N%a!<\e(B
-\e$B%k%\%C%/%9$G!"Fs$D$a$NMWAG$N@55,I=8=$K9gCW$7$?5-;v$N0\F0@h$r;XDj$7$^$9!#\e(B
-\e$B$o$+$j$^$7$?$+\e(B? \e$B$$$$$(!";d$b$o$+$j$^$;$s!#Nc$,I,MW$G$9!#\e(B
+\e$B$3$NJQ?t$O%j%9%H$N%j%9%H$+$i@.$j$^$9!#I{%j%9%H$N:G=i$NMWAG\e(B
+\e$B$O\e(B @sc{imap} \e$B$N%a!<%k%\%C%/%9$G!"Fs$D$a$NMWAG$N@55,I=8=$K9gCW$7$?5-;v$N\e(B
+\e$B0\F0@h$r;XDj$7$^$9!#$o$+$j$^$7$?$+\e(B? \e$B$$$$$(!";d$b$o$+$j$^$;$s!#Nc$,I,MW$G\e(B
+\e$B$9!#\e(B
 
 @lisp
 (setq nnimap-split-rule
@@ -14470,14 +14688,14 @@ Nnmail \e$B$GBP1~$9$k$b$N\e(B: @code{nnmail-split-fancy}.
 @subsection IMAP \e$B$N\e(B ACL \e$B$rJT=8$9$k!#\e(B
 @cindex editing imap acls
 @cindex Access Control Lists
-@cindex Editing IMAP ACLs
+@cindex Editing @sc{imap} ACLs
 @kindex G l
 @findex gnus-group-nnimap-edit-acl
 
-ACL \e$B$O\e(B Access Control List (\e$B;HMQ@)8B0lMw\e(B) \e$B$NN,$G$9!#\e(BIMAP \e$B$G$O\e(B ACL \e$B$OB>$N\e(B
-\e$BMxMQ<T$K$h$k$"$J$?$N%a!<%k%\%C%/%9$N;HMQ$r@)8B\e(B (\e$B$b$7$/$O5v2D\e(B) \e$B$9$k$?$a$K\e(B
-\e$B;H$o$l$F$$$^$9!#\e(BIMAP \e$B%5!<%P!<A4$F$K$3$N5!G=$,$"$k$o$1$G$O$J$/!"L5$$%5!<\e(B
-\e$B%P!<$G$3$l$i$N4X?t$r;H$&$H%(%i!<$,H/@8$7$^$9!#\e(B
+ACL \e$B$O\e(B Access Control List (\e$B;HMQ@)8B0lMw\e(B) \e$B$NN,$G$9!#\e(B@sc{imap} \e$B$G\e(B
+\e$B$O\e(B ACL \e$B$OB>$NMxMQ<T$K$h$k$"$J$?$N%a!<%k%\%C%/%9$N;HMQ$r@)8B\e(B (\e$B$b$7$/$O5v\e(B
+\e$B2D\e(B) \e$B$9$k$?$a$K;H$o$l$F$$$^$9!#\e(B@sc{imap} \e$B%5!<%P!<A4$F$K$3$N5!G=$,$"$k$o$1\e(B
+\e$B$G$O$J$/!"L5$$%5!<%P!<$G$3$l$i$N4X?t$r;H$&$H%(%i!<$,H/@8$7$^$9!#\e(B
 
 \e$B%a!<%k%\%C%/%9$X$N\e(B ACL \e$B$rJT=8$9$k$?$a$K$O!"\e(B
 @kbd{G l} (@code{gnus-group-edit-nnimap-acl}) \e$B$rF~NO$7$^$9!#$=$&$9$k$H!"\e(B
@@ -14492,8 +14710,8 @@ ACL \e$B$O\e(B Access Control List (\e$B;HMQ@)8B0lMw\e(B) \e$B$NN,$G$9!#\e(BIMAP \e$B$G
 \e$B$NB>$NMxMQ<T$,$=$l$r9XFI$9$k$3$H$J$/FI$`$3$H$,$G$-$^$9!#\e(B
 @item
 \e$B>/$J$/$H$b\e(B Cyrus \e$B$N%5!<%P!<$K$*$$$F$O!"\e(B"plussing" \e$B$,F0:n$9$k$?$a$K\e(B (\e$B$D$^\e(B
-\e$B$j!"\e(Buser+mail@@domain \e$B$,\e(B INBOX.mailbox \e$B$H$$$&\e(B IMAP \e$B$N%a!<%k%\%C%/%9$K$J\e(B
-\e$B$k\e(B)\e$B!"MxMQ<T\e(B "anyone" \e$B$KEj9F\e(B ("p") \e$B$N5v2D$rM?$($kI,MW$,$"$j$^$9!#\e(B
+\e$B$j!"\e(Buser+mail@@domain \e$B$,\e(B INBOX.mailbox \e$B$H$$$&\e(B @sc{imap} \e$B$N%a!<%k%\%C%/%9\e(B
+\e$B$K$J$k\e(B)\e$B!"MxMQ<T\e(B "anyone" \e$B$KEj9F\e(B ("p") \e$B$N5v2D$rM?$($kI,MW$,$"$j$^$9!#\e(B
 @end itemize
 
 @node Expunging mailboxes
@@ -14662,17 +14880,49 @@ rnews \e$B$N%P%C%AE>Aw7A<0!#\e(B
 \e$BE>Aw$5$l$?5-;v!#\e(B
 
 @item nsmail
-Netscape mail box\e$B!#\e(B
+Netscape \e$B$N%a!<%k%\%C%/%9!#\e(B
 
-@item mime-digest
 @item mime-parts
-MIME \e$BB>ItJ,%a%C%;!<%8\e(B (multipart) \e$B$G$9!#\e(B
+@sc{mime} \e$BItJ,%a%C%;!<%8\e(B (multipart)\e$B!#\e(B
 
 @item standard-digest
 \e$BI8=`\e(B (RFC 1153) \e$B$^$H$aAw$j7A<0!#\e(B
 
+@item mime-digest
+@sc{mime} \e$B$N$^$H$aAw$j%a%C%;!<%8!#\e(B
+
+@item lanl-gov-announce
+\e$B%m%9%"%i%b%99qN)8&5f=j\e(B (LANL) Gov Announce \e$B$+$i$NH/I=%a%C%;!<%8!#\e(B
+
+@item rfc822-forward
+RFC822 \e$B$GE>Aw$5$l$?%a%C%;!<%8!#\e(B
+
+@item outlook
+Outlook \e$B$N%a!<%k%\%C%/%9!#\e(B
+
+@item oe-dbx
+Outlook Express \e$B$N\e(B dbx \e$B%a!<%k%\%C%/%9!#\e(B
+
+@item exim-bounce
+Exim MTA \e$B$+$iD7$MJV$5$l$?%a%C%;!<%8!#\e(B
+
+@item forward
+\e$BHs8x<0$N5,B'$GE>Aw$5$l$?%a%C%;!<%8!#\e(B
+
+@item rfc934
+RFC934 \e$B7A<0$GE>Aw$5$l$?%a%C%;!<%8!#\e(B
+
+@item mailman
+mailman \e$B$N$^$H$aAw$j!#\e(B
+
+@item clari-briefs
+Clarinet \e$B$N%K%e!<%99`L\$rMWLs$7$?$^$H$aAw$j!#\e(B
+
 @item slack-digest
 \e$BHsI8=`$^$H$aAw$j7A<0\e(B --- \e$B$@$$$?$$$O$&$^$/%^%C%A$9$k$,!"$G$b07$$$O2<<j!#\e(B
+
+@item mail-in-mail
+\e$B:G8e$N<jCJ!#\e(B
 @end table
 
 \e$B$^$?!"FCJL$J\e(B ``\e$B%U%!%$%k<oJL\e(B'' @code{guess} \e$B$r;H$&$3$H$b$G$-$^$9!#$3$l\e(B
@@ -14705,8 +14955,8 @@ MIME \e$BB>ItJ,%a%C%;!<%8\e(B (multipart) \e$B$G$9!#\e(B
 @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
 @code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
 @code{slack-digest}, @code{clari-briefs}, @code{nsmail}, @code{outlook},
-@code{oe-dbx} \e$B$*$h$S\e(B @code{mailman} \e$B$^$?$O\e(B @code{guess} \e$B$N$$$:$l$+$G$J$/\e(B
-\e$B$F$O$J$j$^$;$s!#\e(B
+@code{oe-dbx}, @code{mailman} \e$B$*$h$S\e(B @code{mail-in-mail} \e$B$^$?\e(B
+\e$B$O\e(B @code{guess} \e$B$N$$$:$l$+$G$J$/$F$O$J$j$^$;$s!#\e(B
 
 @item nndoc-post-type
 @vindex nndoc-post-type
@@ -15017,7 +15267,7 @@ gnus \e$B$,JV?.%Q%1%C%H$rC5$7$K9T$/>l=j!#=i4|@_DjCM$O\e(B @file{~/}\e$B!#\e(B
 @end table
 
 @node SOUP Groups
-@subsubsection @sc{soup} \e$B%0%k!<%W\e(B
+@subsubsection SOUP \e$B%0%k!<%W\e(B
 @cindex nnsoup
 
 @code{nnsoup} \e$B$O\e(B @sc{soup} \e$B%Q%1%C%H$rFI$`$?$a$N%P%C%/%(%s%I$G$9!#$3$l$O\e(B
@@ -15441,11 +15691,11 @@ Gnus \e$B$r\e(B ``\e$B%*%U%i%$%s\e(B'' \e$B$N%K%e!<%9%j!<%@!<$H$7$F;H$&$N$O6K$a$F4JC1
 gnus \e$B$r@_Dj$7$^$9!#$^$:$d$C$F$*$$$G!#KM$O$3$3$GBT$C$F$k$+$i!#\e(B
 
 @item
-\e$B$=$7$?$i!"0J2<$NKbK!$N<vJ8$r$"$J$?$N\e(B @file{.gnus.el} \e$B%U%!%$%k$N:G8e$K=q\e(B
-\e$B$$$F$/$@$5$$!#\e(B
+\e$B$=$7$?$i!"0J2<$NKbK!$N<vJ8$r$"$J$?$N\e(B @file{.gnus.el} \e$B%U%!%$%k$K=q$$$F$/\e(B
+\e$B$@$5$$!#\e(B
 
 @lisp
-(gnus-agentize)
+(setq gnus-agent t)
 @end lisp
 @end itemize
 
@@ -15674,10 +15924,10 @@ gnus \e$B%(!<%8%'%s%H$,$=$N5-;v$r\e(B SPAM \e$B$@$H8+Pv$7$?$i??!#$3$NH/8+E*<jK!$O!"
 
 \e$B$b$7$/$O!"\e(B@file{~/.gnus.el} \e$B$d2?$+B>$N$b$N$G$b!"4{Dj\e(B
 \e$B$N\e(B @code{gnus-category-predicate-list} \e$B$K<+J,$N=R8l$rDI2C$9$k$3$H$b$G$-\e(B
-\e$B$^$9!#\e(B(\e$BCm0U\e(B: \e$B$3$l$O!"\e(B@code{gnus-agent} \e$B$G\e(B @code{(gnus-agentize)} \e$B$,FI$_\e(B
-\e$B9~$^$l$?8e$G$"$kI,MW$,$"$k$G$7$g$&\e(B)
+\e$B$^$9!#\e(B
 
 @lisp
+(require 'gnus-agent)
 (setq gnus-category-predicate-alist
       (append gnus-category-predicate-alist
              '((old . my-article-old-p))))
@@ -15959,7 +16209,7 @@ $ emacs -batch -l ~/.gnus.el -f gnus-agent-batch
 @item J S
 @kindex J S (\e$B%(!<%8%'%s%H\e(B \e$B%0%k!<%W\e(B)
 @findex gnus-group-send-queue
-\e$B2<=q$-\e(B (queue) \e$B%0%k!<%W$K$"$kAw?.2DG=$J%a%C%;!<%8$rA4$FAw?.$9\e(B
+\e$B=gHVBT$A\e(B (queue) \e$B%0%k!<%W$K$"$kAw?.2DG=$J%a%C%;!<%8$rA4$FAw?.$9\e(B
 \e$B$k\e(B (@code{gnus-group-send-queue})\e$B!#\e(B@xref{Drafts}\e$B!#\e(B
 
 @item J a
@@ -16068,6 +16318,12 @@ $ emacs -batch -l ~/.gnus.el -f gnus-agent-batch
 \e$B=i4|@_DjCM\e(B) \e$B$G$"$l$P!"4{FI5-;v$N$_$,>C5n$NBP>]$H$J$j!"L$FI!"2D;k!"J]N15-\e(B
 \e$B;v$O$5$i$KL54|8B$KJ];}$7$^$9!#\e(B
 
+@findex gnus-agent-regenerate
+\e$B4|8B@Z$l>C5n$5$l$F$$$k$O$:$J$N$K;D$C$F$$$k5-;v$r8+$D$1$?$J$i$P!"$?$V$s$$\e(B
+\e$B$/$D$+$N\e(B gnus \e$B%(!<%8%'%s%H%U%!%$%k$,2u$l$F$$$^$9!#\e(B
+@code{gnus-agent-regenerate} \e$B$O!"5/$3$j$&$kLdBj$r=$I|$9$k$?$a$NFCJL$J%3\e(B
+\e$B%^%s%I$G$9!#\e(B
+
 @node Agent and IMAP
 @subsection \e$B%(!<%8%'%s%H$r\e(B IMAP \e$B$G;H$&J}K!\e(B
 
@@ -16164,8 +16420,8 @@ Gnus \e$B%(!<%8%'%s%H$,%U%!%$%k$r3JG<$9$k>l=j!#=i4|@_DjCM\e(B
 
 @item gnus-agent-cache
 @vindex gnus-agent-cache
-plugged \e$B$N$H$-$K!"%m!<%+%k$K;}$C$F$$$k\e(B NOV \e$B$H5-;v$r;H$&$+$I$&$+$r@)8f$9\e(B
-\e$B$kJQ?t!#\e(B
+plugged \e$B$N$H$-$K!"%m!<%+%k$K;}$C$F$$$k\e(B @sc{nov} \e$B$H5-;v$r;H$&$+$I$&$+$r@)\e(B
+\e$B8f$9$kJQ?t!#\e(B
 
 @item gnus-agent-go-online
 @vindex gnus-agent-go-online
@@ -16197,7 +16453,8 @@ plugged \e$B$N$H$-$K!"%m!<%+%k$K;}$C$F$$$k\e(B NOV \e$B$H5-;v$r;H$&$+$I$&$+$r@)8f$9
 (setq gnus-secondary-select-methods '((nnml "")))
 
 ;;; Gnus \e$B$r%*%U%i%$%s%K%e!<%9%j!<%@!<$K$9$k!#\e(B
-(gnus-agentize)
+;;; (gnus-agentize) ; \e$B5l<0$N@_Dj!#\e(B
+(setq gnus-agent t)
 @end lisp
 
 \e$B4pK\E*$K$O$3$l$@$1$GNI$$$O$:$G$9!#$3$l$r$"$J$?$N\e(B @file{~/.gnus.el} \e$B%U%!\e(B
@@ -16430,6 +16687,12 @@ Gnus \e$B$O35N,%P%C%U%!$r:n@.$9$kA0$K!"8=:_$N%0%k!<%W$KE,MQ$5$l$k$I$s\e(B
 \e$B8=:_$N5-;v$K;H$o$l$F$$$kA4$F$N%9%3%"K!B'\e(B (score rule) \e$B$rI=<($7$^\e(B
 \e$B$9\e(B (@code{gnus-score-find-trace})\e$B!#\e(B
 
+@item V w
+@kindex V w (\e$B35N,\e(B)
+@findex gnus-score-find-favourite-words
+\e$B%9%3%"$K;H$o$l$F$$$k8l$N%j%9%H$rI=<($7$^\e(B
+\e$B$9\e(B (@code{gnus-score-find-favourite-words})\e$B!#\e(B
+
 @item V R
 @kindex V R (\e$B35N,\e(B)
 @findex gnus-summary-rescore
@@ -16522,6 +16785,10 @@ File Editing})\e$B!#\e(B
 @item i
 @code{Messsage-ID} \e$B%X%C%@!<$K%9%3%"$rIU$1$^$9!#\e(B
 
+@item e
+\e$BDI2C$N%X%C%@!<\e(B (@code{gnus-extra-headers} \e$B$K@_Dj$5$l$F$$$F!"\e(B@sc{nntp} \e$B%5!<\e(B
+\e$B%P!<$,\e(B overview \e$B$K$=$l$i$N>pJs$r5-O?$7$F$$$k\e(B) \e$B$K%9%3%"$rIU$1$^$9!#\e(B
+
 @item f
 \e$B%U%)%m!<%"%C%W\e(B (followup) \e$B$K%9%3%"$rIU$1$^$9\e(B---\e$B$3$l$OCx<TL>$H$N9gCW$r$7!"\e(B
 \e$B$3$NCx<T$X$N%U%)%m!<%"%C%W$K%9%3%"$r2C$($^$9!#\e(B(\e$B$3$N%-!<$r;H$&$3$H$K$h$C\e(B
@@ -16587,10 +16854,10 @@ File Editing})\e$B!#\e(B
 @end table
 
 @item
-\e$B;M$D$a$G!":G8e$N%-!<$O$3$l$,0l;~E*\e(B (\e$B$9$J$o$A!"4|8B@Z$l>C5n\e(B) \e$B$N%9%3%"EPO?\e(B
-\e$B$+!"1JB3E*$J\e(B (\e$B$9$J$o$A!"4|8B@Z$l>C5n$G$J$$\e(B) \e$B%9%3%"EPO?$G$"$k$+$H$$$&$3$H!"\e(B
-\e$B$b$7$/$O$9$0$K$J$5$l$k$Y$-$+!"%9%3%"%U%!%$%k$KDI2C$9$k;v$O$7$J$$$+$H$$$&\e(B
-\e$B;v$r;XDj$7$^$9!#\e(B
+\e$B;M$D$a$GDL>o$O:G8e$N%-!<$G$9!#$3$l$,0l;~E*\e(B (\e$B$9$J$o$A4|8B@Z$l>C5n\e(B) \e$B$N%9%3\e(B
+\e$B%"EPO?$+!"1JB3E*$J\e(B (\e$B$9$J$o$A4|8B@Z$l>C5n$G$J$$\e(B) \e$B%9%3%"EPO?$G$"$k$+$H$$$&\e(B
+\e$B$3$H!"$b$7$/$O$9$0$K$J$5$l$k$Y$-$+!"%9%3%"%U%!%$%k$KDI2C$9$k;v$O$7$J$$$+\e(B
+\e$B$H$$$&;v$r;XDj$7$^$9!#\e(B
 
 @table @kbd
 @item t
@@ -16603,6 +16870,10 @@ File Editing})\e$B!#\e(B
 \e$BB(:B$N\e(B (immediate) \e$B%9%3%"IU$1$G$9!#\e(B
 @end table
 
+@item
+\e$B$b$7\e(B `e' (\e$BDI2C$N\e(B (extra)) \e$B%X%C%@!<$G%9%3%"IU$1$r9T$J$C$F$$$k$H!"$I$NL>A0\e(B
+\e$B$N%X%C%@!<$G9T$J$&$+$r?R$M$i$l$^$9!#$3$l$O\e(B @code{gnus-extra-headers} \e$B$K\e(B
+\e$B$"$kL>A0$G$J$1$l$P$J$j$^$;$s!#\e(B@samp{TAB} \e$B$K$h$kJd40$,$G$-$^$9!#\e(B
 @end enumerate
 
 \e$B$G$9$+$i!"8=:_$NCx<T$K@53N$J9gCW$G1JB3E*$K%9%3%"$rA}$d$7$?$$$H$7$^$7$g\e(B
@@ -16904,6 +17175,18 @@ Gnus \e$B$O0lHLE*$J%9%3%"%U%!%$%k$rFCDj$N%9%3%"%U%!%$%k8~$1$N$b$N$h$jA0$KE,\e(B
 \e$B$O\e(B @code{regexp}, @code{exact}, @code{word} \e$B7?$NC;=L7A$G!"$b$7$=$&$7$?$$\e(B
 \e$B$H;W$($P$3$A$i$rBe$o$j$K;H$&;v$,$G$-$^$9!#\e(B
 
+@item Extra
+\e$BI8=`$N\e(B overview \e$B%X%C%@!<$NJ8;zNs$HF1MM!"\e(B@code{gnus-extra-headers} \e$B$r;H$C\e(B
+\e$B$F$$$k$H!"$=$l$i$N%X%C%@!<$NCM$K%9%3%"$rIU$1$k$3$H$,$G$-$^$9!#$3$N>l9g%9\e(B
+\e$B%3%"EPO?$N\e(B 5 \e$BHVL\$NMWAG$,%9%3%"$rIU$1$k%X%C%@!<$NL>A0$K$J$j$^$9!#\e(B
+@sc{nntp} \e$B%5!<%P!<$,\e(B overview \e$B$K\e(B NNTP-Posting-Host \e$B$r5-O?$7$F$$$k$J$i$P!"\e(B
+@file{all.SCORE} \e$B%U%!%$%k$N0J2<$NEPO?$O!"C10l$N%[%9%H$+$i%9%Q%`$N967b$,\e(B
+\e$B$"$k>l9g$KM-8z$G$9!#\e(B
+
+@lisp
+("111.222.333.444" -1000 nil s "NNTP-Posting-Host")
+@end lisp
+
 @item Lines, Chars
 \e$B$3$l$i$NFs$D$N%X%C%@!<$O0c$C$?9gCW$N7?$r;H$$$^$9\e(B: @code{<}, @code{>}, @code{=}, @code{>=}, @code{<=} \e$B$G\e(B
 \e$B$9!#\e(B
@@ -19911,10 +20194,10 @@ Gnus \e$B$O!"%9%3%"IU$1!"%9%l%C%I$N7A@.!"%9%l%C%IHf3S$J$I$r9T$&$H$-$K!"\e(B
 @samp{spam} \e$B%0%k!<%W$K9T$-$^$9!#\e(B(\e$B$3$N%"%$%G%"$O$*$=$i$/\e(B Tim Pierce \e$B;a$K\e(B
 \e$B$h$k$b$N$G$9!#\e(B)
 
-\e$B$3$l$K2C$($F!"B?$/$N%a!<%k\e(B spam \e$B20$O!"$"$J$?$N$H$3$m$N\e(B @code{smtp} \e$B%5!<\e(B
-\e$B%P!<$HD>@\OC$7!"\e(B@code{To} \e$B%X%C%@!<$K$"$J$?$N%a!<%k%"%I%l%9$,L@<($5$l$J$$\e(B
-\e$B$h$&$K$7$^$9!#$J$s$G$=$s$J$3$H$r$9$k$N$+$O$o$+$j$^$;$s$,\e(B --- \e$B$*$=$i$/;d\e(B
-\e$B$?$A$NN"$r$+$/5!9=$NN"$r$+$/$?$a$+$J\e(B? \e$B$I$A$i$K$7$F$b!"BP=h$O4JC1$J$3$H$G\e(B
+\e$B$3$l$K2C$($F!"B?$/$N%a!<%k\e(B spam \e$B20$O!"$"$J$?$N$H$3$m$N\e(B @sc{smtp} \e$B%5!<%P!<\e(B
+\e$B$HD>@\OC$7!"\e(B@code{To} \e$B%X%C%@!<$K$"$J$?$N%a!<%k%"%I%l%9$,L@<($5$l$J$$$h$&\e(B
+\e$B$K$7$^$9!#$J$s$G$=$s$J$3$H$r$9$k$N$+$O$o$+$j$^$;$s$,\e(B --- \e$B$*$=$i$/;d$?$A\e(B
+\e$B$NN"$r$+$/5!9=$NN"$r$+$/$?$a$+$J\e(B? \e$B$I$A$i$K$7$F$b!"BP=h$O4JC1$J$3$H$G\e(B
 \e$B$9\e(B --- \e$B$"$J$?08$F$G$J$$$b$N$rA4It\e(B @samp{spam} \e$B%0%k!<%W$K$$$l$k$@$1$G$9!#\e(B
 \e$B$3$l$O$*9%$_J,N%5,B'$N:G8e$K$3$s$JIw$KF~$l$k$3$H$G$G$-$^$9!#\e(B
 
@@ -20123,8 +20406,8 @@ but at the common table.@*
 
 XEmacs \e$B$O%Q%C%1!<%8$N=/=8$H$7$FG[I[$5$l$F$$$^$9!#\e(Bgnus \e$B$N\e(B XEmacs \e$B%Q%C%1!<\e(B
 \e$B%8$,I,MW$H$9$k$b$N$O2?$G$"$l!"$"$J$?$O%$%s%9%H!<%k$9$Y$-$G$9!#:#$N$H$3$m\e(B
-\e$BI,MW$J$N$O\e(B @samp{gnus}\e$B!"\e(B@samp{w3}\e$B!"\e(B@samp{mh-e}\e$B!"\e(B@samp{mailcrypt}\e$B!"\e(B
-@samp{rmail}\e$B!"\e(B@samp{eterm}\e$B!"\e(B@samp{mail-lib}\e$B!"\e(B@samp{xemacs-base} \e$B$*$h$S\e(B
+\e$BI,MW$J$N$O\e(B @samp{gnus}, @samp{w3}, @samp{mh-e}, @samp{mailcrypt},
+@samp{rmail}, @samp{eterm}, @samp{mail-lib}, @samp{xemacs-base} \e$B$*$h$S\e(B
 @samp{fsf-compat} \e$B$G$9!#\e(B
 
 @node History
@@ -20208,13 +20491,13 @@ XEmacs \e$B$O%Q%C%1!<%8$N=/=8$H$7$FG[I[$5$l$F$$$^$9!#\e(Bgnus \e$B$N\e(B XEmacs \e$B%
 @cindex Semi-gnus
 
 Lars \e$B$5$s$,D4@=$7$F%j%j!<%9$7$?\e(B Gnus \e$B$K2C$($F!"F|K\$G$O\e(B Semi-gnus \e$B$N3+H/\e(B
-\e$B$,9T$J$o$l$F$$$^$9!#$3$l$O\e(B SEMI \e$B$H$$$&\e(B MIME \e$B$N5!G=$r<B8=$9$k$?$a$N%i%$%V\e(B
-\e$B%i%j$r;H$&$3$H$rA0Ds$H$7$F$$$^$9!#\e(B
+\e$B$,9T$J$o$l$F$$$^$9!#$3$l$O\e(B @sc{semi} \e$B$H$$$&\e(B @sc{mime} \e$B$N5!G=$r<B8=$9$k$?\e(B
+\e$B$a$N%i%$%V%i%j$r;H$&$3$H$rA0Ds$H$7$F$$$^$9!#\e(B
 
 \e$B$3$l$i$N\e(B gnus \e$B$O\e(B Gnus 5.6 \e$B$H\e(B Pterodactyl Gnus \e$B$r85$K$7$F$$$^$9!#$=$l$i\e(B
 \e$B$O\e(B ``Semi-gnus'' \e$B$HAm>N$5$l!"\e(BT-gnus, Nana-gnus \e$B$*$h$S\e(B Chaos \e$B$N0[$J$C$?7O\e(B
-\e$BE}$,$"$j$^$9!#$3$l$i$O6/NO$J\e(B MIME \e$B$N5!G=$H3F9q8lBP1~$N5!G=$rDs6!$9$k$b$N\e(B
-\e$B$G!"FC$KF|K\?M$N%f!<%6$K$H$C$FBg;v$J$b$N$G$9!#\e(B
+\e$BE}$,$"$j$^$9!#$3$l$i$O6/NO$J\e(B @sc{mime} \e$B$N5!G=$H3F9q8lBP1~$N5!G=$rDs6!$9\e(B
+\e$B$k$b$N$G!"FC$KF|K\?M$N%f!<%6$K$H$C$FBg;v$J$b$N$G$9!#\e(B
 
 @node Why?
 @subsection \e$B$J$<\e(B?
@@ -20355,7 +20638,7 @@ RFC 1036 \e$B$N8e7Q$H$7$F=q$$$F$$$k$b$N$G$9!#%K%e!<%95-;v$NMM<0$KBP$7$F!"$$\e(B
 
 @item MIME - RFC 2045-2049 etc
 @cindex MIME
-MIME \e$B4XO"$N$9$Y$F$N\e(B RFC \e$B$,%5%]!<%H$5$l$F$$$^$9!#\e(B
+@sc{mime} \e$B4XO"$N$9$Y$F$N\e(B RFC \e$B$,%5%]!<%H$5$l$F$$$^$9!#\e(B
 
 @item Disposition Notifications - RFC 2298
 Message Mode \e$B$O<u?.<T$K3+Iu3NG'$rMW5a$9$k$3$H$,$G$-$^$9!#\e(B
@@ -20366,26 +20649,27 @@ Message Mode \e$B$O<u?.<T$K3+Iu3NG'$rMW5a$9$k$3$H$,$G$-$^$9!#\e(B
 @cindex RFC 2440
 RFC 1991 is the original PGP message specification, published as a
 Information RFC.  RFC 2440 was the follow-up, now called Open PGP, and
-put on the Standards Track.  Both document a non-MIME aware PGP
+put on the Standards Track.  Both document a non-@sc{mime} aware PGP
 format.  Gnus supports both encoding (signing and encryption) and
 decoding (verification and decryption).
 
 @item PGP/MIME - RFC 2015/3156
 RFC 2015 (superceded by 3156 which references RFC 2440 instead of RFC
-1991) describes the MIME-wrapping around the RF 1991/2440 format.
+1991) describes the @sc{mime}-wrapping around the RF 1991/2440 format.
 Gnus supports both encoding and decoding.
 
 @item S/MIME - RFC 2633
-RFC 2633 describes the S/MIME format.
+RFC 2633 describes the @sc{s/mime} format.
 
 @end ignore
 @item IMAP - RFC 1730/2060, RFC 2195, RFC 2086, RFC 2359, RFC 2595, RFC 1731
-RFC 1730 \e$B$O\e(B IMAP \e$B%P!<%8%g%s\e(B 4 \e$B$G!"\e(BRFC 2060 (IMAP 4 \e$B2~Dj\e(B 1) \e$B$GB?>/99?7$5\e(B
-\e$B$l$F$$$^$9!#\e(BRFC 2195 \e$B$O\e(B IMAP \e$B$N\e(B CRAM-MD5 \e$BG'>Z$K$D$$$F=R$Y$F$$$^$9!#\e(BRFC
-2086 \e$B$O\e(B IMAP \e$B$N;HMQ@)8B0lMw\e(B (ACL) \e$B$K$D$$$F=R$Y$F$$$^$9!#\e(BRFC
-2359 \e$B$O\e(B IMAP \e$B$N%W%m%H%3%k$N3HD%$K$D$$$F=R$Y$F$$$^$9!#\e(BRFC 2595 \e$B$O\e(B IMAP \e$B$K\e(B
-\e$B$*$1$kE,@Z$J\e(B TLS \e$B$NE}9g\e(B (STARTTLS) \e$B$K$D$$$F=R$Y$F$$$^$9!#\e(BRFC
-1731 \e$B$O\e(B IMAP \e$B$N\e(B GSSAPI/Kerberos4 \e$B$N<jK!$K$D$$$F=R$Y$F$$$^$9!#\e(B
+RFC 1730 \e$B$O\e(B @sc{imap} \e$B%P!<%8%g%s\e(B 4 \e$B$G!"\e(BRFC 2060 (@sc{imap} 4 \e$B2~Dj\e(B 1) \e$B$G\e(B
+\e$BB?>/99?7$5$l$F$$$^$9!#\e(BRFC 2195 \e$B$O\e(B @sc{imap} \e$B$N\e(B CRAM-MD5 \e$BG'>Z$K$D$$$F=R$Y\e(B
+\e$B$F$$$^$9!#\e(BRFC 2086 \e$B$O\e(B @sc{imap} \e$B$N;HMQ@)8B0lMw\e(B (ACL) \e$B$K$D$$$F=R$Y$F$$$^\e(B
+\e$B$9!#\e(BRFC 2359 \e$B$O\e(B @sc{imap} \e$B$N%W%m%H%3%k$N3HD%$K$D$$$F=R$Y$F$$$^$9!#\e(BRFC
+2595 \e$B$O\e(B @sc{imap} \e$B$K$*$1$kE,@Z$J\e(B TLS \e$B$NE}9g\e(B (STARTTLS) \e$B$K$D$$$F=R$Y$F$$\e(B
+\e$B$^$9!#\e(BRFC 1731 \e$B$O\e(B @sc{imap} \e$B$N\e(B GSSAPI/Kerberos4 \e$B$N<jK!$K$D$$$F=R$Y$F$$$^\e(B
+\e$B$9!#\e(B
 @end table
 
 \e$B>e$K=q$+$l$F$$$kJ8>O$K4X$9$k;v$G!"\e(BGnus \e$B$,$=$l$rK~$?$7$F$$$J$$$h$&$JF0:n\e(B
@@ -20428,7 +20712,7 @@ Meadow 1.00 \e$B0J>e!#\e(B(Mule for Windows \e$B$G$OF0$-$^$;$s!#\e(B)
 Gnus \e$B$OFs$D$NCJ3,$N=[4D$G3+H/$5$l$F$$$^$9!#:G=i$NCJ3,\e(B
 \e$B$O\e(B @samp{ding@@gnus.org} \e$B$G$N$?$/$5$s$N5DO@$,$"$j!"$=$3$GJQ99$d?7$7$$5!\e(B
 \e$BG=$rDs0F$7$^$9!#$3$NCJ3,$O\e(B @dfn{\e$B%"%k%U%!\e(B} \e$BCJ3,$H8F$P$l$^$9!#$H$$$&$N$O!"\e(B
-\e$B$3$NCJ3,$G%j%j!<%9$5$l$?\e(B Gnusae \e$B$O\e(B @dfn{\e$B%"%k%U%!%j%j!<%9\e(B}\e$B!"$b$7$/$O\e(B (\e$BB>\e(B
+\e$B$3$NCJ3,$G%j%j!<%9$5$l$?\e(B Gnusae \e$B$O\e(B @dfn{\e$B%"%k%U%!%j%j!<%9\e(B} \e$B$b$7$/$O\e(B (\e$BB>\e(B
 \e$B$NCDBN$G$O$h$jNI$/;H$o$l$k\e(B) @dfn{\e$B%9%J%C%W%7%g%C%H\e(B} \e$B$H8F$P$l$k$b$N$@$+$i\e(B
 \e$B$G$9!#$3$NCJ3,$G$O!"\e(Bgnus \e$B$OIT0BDj$G$"$k$H9M$($i$l$F$*$j!"0lHL$NMxMQ<T$K\e(B
 \e$B$h$C$F;H$o$l$k$b$N$G$O$"$j$^$;$s!#\e(BGnus \e$B%"%k%U%!%j%j!<%9\e(B
@@ -21468,22 +21752,22 @@ Gnus 5.8 \e$B$N?7$7$$5!G=\e(B:
 Sources \e$B$GF@$k$3$H$,$G$-$^$9!#\e(B
 
 @item
-Gnus \e$B$O\e(B MIME \e$B$KBP1~$7$?%j!<%@!<$K$J$j$^$7$?!#$3$l$O\e(B Gnus \e$B$NB?$/$NItJ,$K\e(B
-\e$B1F6A$7$F$$$F!"$?$/$5$s$N?7$7$$%3%^%s%I$,DI2C$5$l$F$$$^$9!#>\:Y$O%^%K%e%"\e(B
-\e$B%k$r;2>H$7$F2<$5$$!#\e(B(\e$BLuCm\e(B: T-gnus \e$B$O\e(B SEMI \e$B$*$h$S\e(B FLIM \e$B$N=t5!G=$K4p$E$$$F\e(B
-\e$B$$$^$9!#\e(B)
+Gnus \e$B$O\e(B @sc{mime} \e$B$KBP1~$7$?%j!<%@!<$K$J$j$^$7$?!#$3$l$O\e(B Gnus \e$B$NB?$/$NIt\e(B
+\e$BJ,$K1F6A$7$F$$$F!"$?$/$5$s$N?7$7$$%3%^%s%I$,DI2C$5$l$F$$$^$9!#>\:Y$O%^%K%e\e(B
+\e$B%"%k$r;2>H$7$F2<$5$$!#\e(B(\e$BLuCm\e(B: T-gnus \e$B$O\e(B @sc{semi} \e$B$*$h$S\e(B @sc{flim} \e$B$N=t5!\e(B
+\e$BG=$K4p$E$$$F$$$^$9!#\e(B)
 
 @item
 Gnus \e$B$O$^$?3F9q8lBP1~$K$J$j$^$7$?!#$3$3$G$OMWLs$G$-$J$$$/$i$$$K\e(B Gnus \e$B$N\e(B
 \e$BB?$/$NItJ,$K1F6A$7$F$$$F!"?7$7$$$?$/$5$s$NJQ?t$,DI2C$5$l$F$$$^$9!#\e(B(\e$BLuCm\e(B:
-T-gnus \e$B$O\e(B SEMI \e$B$*$h$S\e(B FLIM \e$B$N=t5!G=$K4p$E$$$F$$$^$9!#\e(B)
+T-gnus \e$B$O\e(B @sc{semi} \e$B$*$h$S\e(B @sc{flim} \e$B$N=t5!G=$K4p$E$$$F$$$^$9!#\e(B)
 
 @item
 @code{gnus-auto-select-first} \e$B$,4X?t$G$"$C$F$b$h$/$J$j$^$7$?!#\e(B
 
 @item
-Summary \e$B%P%C%U%!$H\e(B NOV \e$B%U%!%$%k$K4^$a$kDI2C$N%X%C%@!<$r!"%f!<%6$,7h$a$k\e(B
-\e$B$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#\e(B
+Summary \e$B%P%C%U%!$H\e(B @sc{nov} \e$B%U%!%$%k$K4^$a$kDI2C$N%X%C%@!<$r!"%f!<%6$,7h\e(B
+\e$B$a$k$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#\e(B
 
 @item
 @code{gnus-article-display-hook} \e$B$,:o=|$5$l$^$7$?!#Be$o$j\e(B
@@ -21499,7 +21783,7 @@ Gnus posting styles \e$B$,:F$S2~Au$5$l$^$7$?!#8=:_$OHyL/$K0c$&5,B'$GF0:n$7$^\e(B
 \e$B>o$KJQ2=$9$k9=@.$rB3$1$^$9!#\e(B
 
 @item
-Gnus \e$B$O\e(B @code{nnimap} \e$B$K$h$C$F\e(B IMAP \e$B%a!<%k$rFI$`$3$H$,$G$-$^$9!#\e(B
+Gnus \e$B$O\e(B @code{nnimap} \e$B$K$h$C$F\e(B @sc{imap} \e$B%a!<%k$rFI$`$3$H$,$G$-$^$9!#\e(B
 @end itemize
 
 @iftex
@@ -21618,7 +21902,7 @@ Gnus \e$B$O%K%e!<%9$H%a!<%k$NN>J}$N$$$m$$$m$J%P%C%/%(%s%I$,M?$($?5-;v$rF@$^\e(B
 @item \e$B4pK\\e(B (native)
 @cindex native
 Gnus \e$B$O$$$D$b0l$D$NJ}K!\e(B (\e$B$H%P%C%/%(%s%I\e(B) \e$B$r%K%e!<%9$rF@$k$?$a$N\e(B @dfn{\e$B4p\e(B
-\e$BK\\e(B}\e$B!"$b$7$/$O=i4|@_Dj\e(B \e$B$H$7$F;H$$$^$9!#\e(B
+\e$BK\\e(B} \e$B$b$7$/$O=i4|@_Dj\e(B \e$B$H$7$F;H$$$^$9!#\e(B
 
 @item \e$B30It\e(B (foreign)
 @cindex foreign
@@ -21779,7 +22063,7 @@ Gnus \e$B$,%0%k!<%W$KF~$k$H!"%0%k!<%W$NA4$F$NL$FI5-;v$N%X%C%@!<$r%P%C%/%(%s\e(B
 @end menu
 
 @node Slow/Expensive Connection
-@subsection \e$BCY$$\e(B/\e$B9b$$\e(B @sc{nntp} \e$B@\B3\e(B
+@subsection \e$BCY$$\e(B/\e$B9b$$\e(B NNTP \e$B@\B3\e(B
 
 \e$B$b$7\e(B Emacs \e$B$r%m!<%+%k$N%^%7%s$G<B9T$7$F$$$F!"Hs>o$K:Y$$@~$N8~$3$&$N%^%7\e(B
 \e$B%s$+$i%K%e!<%9$r<hF@$7$F$$$k$N$G$"$l$P!"\e(Bgnus \e$B$,\e(B @sc{nntp} \e$B%5!<%P!<$+$i<h\e(B
@@ -21835,25 +22119,10 @@ Gnus \e$B$,>o$K35N,%P%C%U%!$rCf?4:F@_Dj$r$9$k$3$H$r6X;_$9$k$?$a$K$3$l\e(B
 \e$B$9!#$3$l$OAm$8$F$=$s$J$K8:$i$7$^$;$s!#$3$l$O!"5-;v$r$I$C$A$K$7$mFI$_$?$/\e(B
 \e$B$J$$$H$$$&;v$r7hDj$9$kA0$K!">/$7$NItJ,$7$+8+$kI,MW$,L5$$$H$$$&;v$G$9!#\e(B
 
-@item gnus-threada-hide-subtree
+@item gnus-thread-hide-subtree
 \e$B$3$l$,\e(B @code{nil} \e$B$G$J$1$l$P!"A4$F$N35N,%P%C%U%!$N%9%l%C%I$O=i$a$K1#$5$l\e(B
 \e$B$^$9!#\e(B
 
-\e$B$3$l$O=R8l;X<(;R$G$"$k$3$H$b$G$-$^$9\e(B (@pxref{Predicate Specifiers})\e$B!#Mx\e(B
-\e$BMQ$G$-$k=R8l\e(B
-\e$B$O\e(B @code{gnus-article-unread-p} \e$B$H\e(B @code{gnus-article-unseen-p} \e$B$G$9!#\e(B
-
-\e$B$3$l$ONc$G$9\e(B:
-
-@lisp
-(setq gnus-thread-hide-subtree
-      '(or gnus-article-unread-p
-           gnus-article-unseen-p))
-@end lisp
-
-(\e$B$3$l$O$+$J$j$P$+$2$?Nc$G$9!#$J$<$J$i$9$Y$F$N$^$@FI$^$l$?$3$H$,L5$$5-;v\e(B
-\e$B$OL$FI$G$b$"$k$+$i$J$N$G$9$,!"<g;]$O5b$_<h$C$F2<$5$$!#\e(B)
-
 @item gnus-updated-mode-lines
 \e$B$3$l$,\e(B @code{nil} \e$B$G$"$k$H!"\e(Bgnus \e$B$O%P%C%U%!$N%b!<%I9T$K>pJs$rF~$l$^$;$s\e(B
 \e$B$N$G!";~4V$r@aLs$G$-$k$G$7$g$&!#\e(B
@@ -22220,10 +22489,10 @@ Gnus \e$B$O%0%k!<%WL>$H5-;vHV9f$K$h$C$F$=$l$>$l$N%a%C%;!<%8$rFCDj$7$^$9!#$=\e(B
 \e$B5-;vHV9f\e(B (\e$B$N%j%9%H\e(B) \e$B$@$1$G!"B?$/$N%P%C%/%(%s%I$G$O\e(B @code{Message-ID} \e$B$K\e(B
 \e$B$h$k<hF@$O%5%]!<%H$7$F$$$^$;$s!#$G$b$I$A$i$b%5%]!<%H$7$F$$$/$Y$-$G$7$g$&\e(B
 
-\e$B7k2L$N%G!<%?$O\e(B HEAD \e$B$+\e(B NOV \e$B9T$N$$$:$l$+$G$"$j!"JV5QCM$O$3$l$rH?1G$7\e(B
+\e$B7k2L$N%G!<%?$O\e(B HEAD \e$B$+\e(B @sc{nov} \e$B9T$N$$$:$l$+$G$"$j!"JV5QCM$O$3$l$rH?1G$7\e(B
 \e$B$?\e(B @code{headers} \e$B$+\e(B @code{nov} \e$B$N$$$:$l$+$G$J$/$F$O$J$j$^$;$s!#$3$l$O:#\e(B
-\e$B8e!"\e(BHEAD \e$B$H\e(B NOV \e$B9T$,:.:_$9$k\e(B @code{various} \e$B$K3HD%$5$l$k$+$b$7$l$^$;$s$,!"\e(B
-\e$B8=:_$N\e(B gnus \e$B$G$O%5%]!<%H$5$l$F$$$^$;$s!#\e(B
+\e$B8e!"\e(BHEAD \e$B$H\e(B @sc{nov} \e$B9T$,:.:_$9$k\e(B @code{various} \e$B$K3HD%$5$l$k$+$b$7$l$^\e(B
+\e$B$;$s$,!"8=:_$N\e(B gnus \e$B$G$O%5%]!<%H$5$l$F$$$^$;$s!#\e(B
 
 @var{fetch-old} \e$B$,\e(B @code{nil} \e$B0J30$G$"$l$P!"$"$k0UL#$G$N!VM>J,$J%X%C%@!<!W\e(B
 \e$B$r<hF@$7$h$&$H$7$^$9!#$3$l$ODL>o!"\e(B@code{articles} \e$B$NCf$N:G>.HV9f$N5-;v$h\e(B
@@ -22359,7 +22628,8 @@ field      = <text except TAB>
 \e$B$H$,$"$k$3$H$KCm0U$7$F$/$@$5$$!#$$$/$D$+$N5-;v$O<h$j>C$5$l$F$$$k$+$b$7$l\e(B
 \e$B$^$;$s!#\e(BGnus \e$B$OAm?t$OC1$K<N$F$F$7$^$C$F$$$k$N$G!"\e(B(\e$B$b$7$=$l$,LdBj$H$J$k$H\e(B
 \e$B$-$K\e(B) \e$B@5$7$$CM$r@8@.$9$kLLE]$rIi$&$Y$-$+$I$&$+$O!"FI<T$X$N2]Bj$H$7$F;D$7\e(B
-\e$B$F$"$j$^$9!#\e(B
+\e$B$F$"$j$^$9!#$b$7$=$N%0%k!<%W$K5-;v$,L5$1$l$P!":G>.5-;vHV9f$O\e(B 1\e$B!":GBg\e(B
+\e$B$O\e(B 0 \e$B$H$7$FJs9p$5$l$J$1$l$P$J$j$^$;$s!#\e(B
 
 @example
 group-status = [ error / info ] eol
@@ -22387,7 +22657,8 @@ ifi.discussion 3324 3300 n
 @end example
 
 \e$B3F9T$K$O%0%k!<%WL>$,$"$j!"$=$7$F$=$N%0%k!<%WFb$N:GBg$N5-;vHV9f!":G>.$N5-\e(B
-\e$B;vHV9f!"$=$7$F:G8e$K%U%i%0$G$9!#\e(B
+\e$B;vHV9f!"$=$7$F:G8e$K%U%i%0$G$9!#$b$7$=$N%0%k!<%W$K5-;v$,L5$1$l$P!":G>.5-\e(B
+\e$B;vHV9f$O\e(B 1\e$B!":GBg$O\e(B 0 \e$B$H$7$FJs9p$5$l$J$1$l$P$J$j$^$;$s!#\e(B
 
 @example
 active-file = *active-line
@@ -22555,10 +22826,10 @@ description-buffer = *description-line
 \e$B$O?7$7$$%0%k!<%W$r8+$D$1$k$h$j$b!"3Z$r$7$FA4$F$N%0%k!<%W$N%j%9%H$rJV$9$+\e(B
 \e$B$b$7$l$^$;$s!#$7$+$7%P%C%/%(%s%I$,JV$9B?$/$N%0%k!<%W$KBP$7$F$3$l\e(B (\e$BLuCm\e(B:
 \e$B?7$7$$%0%k!<%W$H$7$F07$&$3$H\e(B) \e$B$r$7$F$O$$$1$^$;$s!#IaDL!"%f!<%6!<<+?H$,:n$C\e(B
-\e$B$?%0%k!<%W$J$i$PB?$9$.$k$3$H$O$J$$$G$7$g$&!#$G$9$+$i\e(B nnml \e$B$H$=$l$KN`$9$k\e(B
-\e$B$b$N$O$?$V$s?4G[$"$j$^$;$s!#$7$+$7\e(B nntp \e$B$N$h$&$J%P%C%/%(%s%I$G$O%0%k!<%W\e(B
-\e$B$O%5!<%P!<$K$h$C$F:n$i$l$F$$$^$9$+$i!"B?$/$N%0%k!<%W$,JV$C$F$/$k$3$H$,$"\e(B
-\e$B$j$($^$9!#\e(B
+\e$B$?%0%k!<%W$J$i$PB?$9$.$k$3$H$O$J$$$G$7$g$&!#$G$9$+$i\e(B @code{nnml} \e$B$H$=$l\e(B
+\e$B$KN`$9$k$b$N$O$?$V$s?4G[$"$j$^$;$s!#$7$+$7\e(B @code{nntp} \e$B$N$h$&$J%P%C%/%(\e(B
+\e$B%s%I$G$O%0%k!<%W$O%5!<%P!<$K$h$C$F:n$i$l$F$$$^$9$+$i!"B?$/$N%0%k!<%W$,JV$C\e(B
+\e$B$F$/$k$3$H$,$"$j$($^$9!#\e(B
 
 @item (nnchoke-request-create-group GROUP &optional SERVER)
 
@@ -22875,9 +23146,10 @@ description-buffer = *description-line
 @node Mail-like Back Ends
 @subsubsection \e$B%a!<%kIw%P%C%/%(%s%I\e(B
 
-\e$B%a!<%k%P%C%/%(%s%I$,$=$NB>$N%P%C%/%(%s%I$KBP$7$F0l@~$r2h$7$F$$$kE@$O!"%a!<\e(B
-\e$B%k%P%C%/%(%s%I$O\e(B @file{nnmail.el} \e$B$NCf$N6&DL4X?t$K6/$/0MB8$7$F$$$k$H$$$&\e(B
-\e$BE@$G$9!#Nc$($P!"\e(B@code{nnml-request-scan} \e$B$NDj5A$O$3$N$h$&$K$J$j$^$9!#\e(B
+\e$B%a!<%k%P%C%/%(%s%I$,$=$NB>$N%P%C%/%(%s%I$KBP$7$F0l@~$r2h$7$F$$$kE@$O!"$[\e(B
+\e$B$H$s$I$N%a!<%k%P%C%/%(%s%I$O\e(B @file{nnmail.el} \e$B$NCf$N6&DL4X?t$K6/$/0MB8$7\e(B
+\e$B$F$$$k$H$$$&E@$G$9!#Nc$($P!"\e(B@code{nnml-request-scan} \e$B$NDj5A$O$3$N$h$&$K\e(B
+\e$B$J$j$^$9!#\e(B
 
 @lisp
 (deffoo nnml-request-scan (&optional group server)
index c06120b..f0d7274 100644 (file)
@@ -33,7 +33,7 @@
 \makeindex
 \begin{document}
 
-\newcommand{\gnusversionname}{Oort Gnus v0.05}
+\newcommand{\gnusversionname}{Oort Gnus v0.06}
 \newcommand{\gnuschaptername}{}
 \newcommand{\gnussectionname}{}
 
@@ -382,9 +382,9 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local
 spool or your mbox file.  All at the same time, if you want to push your
 luck.
 
-T-gnus provides MIME features based on SEMI API.  So T-gnus supports
-your right to read strange messages including big images or other
-various kinds of formats.  T-gnus also supports
+T-gnus provides @sc{mime} features based on @sc{semi} API.  So T-gnus
+supports your right to read strange messages including big images or
+other various kinds of formats.  T-gnus also supports
 internationalization/localization and multiscript features based on MULE
 API.  So T-gnus does not discriminate various language communities.
 Oh, if you are a Klingon, please wait Unicode Next Generation.
@@ -631,7 +631,7 @@ Article Buffer
 Composing Messages
 
 * Mail::                        Mailing and replying.
-* Posting Server::              What server should you post via?
+* Posting Server::              What server should you post and mail via?
 * Mail and Post::               Mailing and posting at the same time.
 * Archived Messages::           Where Gnus stores the messages you've sent.
 * Posting Styles::              An easier way to specify who you are.
@@ -1124,6 +1124,11 @@ they were created, so the latest changes will have precedence.)
 Information from the slave files has, of course, precedence over the
 information in the normal (i.e., master) @code{.newsrc} file.
 
+If the @code{.newsrc*} files have not been saved in the master when the
+slave starts, you may be prompted as to whether to read an auto-save
+file.  If you answer "yes", the unsaved changes to the master will be
+incorporated into the slave.  If you answer "no", the slave may see some
+messages as unread that have been read in the master.
 
 @node Fetching a Group
 @section Fetching a Group
@@ -1312,8 +1317,9 @@ thought it would be nice to have two of these.  This variable is more
 meant for setting some ground rules, while the other variable is used
 more for user fiddling.  By default this variable makes all new groups
 that come from mail back ends (@code{nnml}, @code{nnbabyl},
-@code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed.  If you
-don't like that, just set this variable to @code{nil}.
+@code{nnfolder}, @code{nnmbox}, @code{nnmh}, and @code{nnmaildir})
+subscribed.  If you don't like that, just set this variable to
+@code{nil}.
 
 New groups that match this regexp are subscribed using
 @code{gnus-subscribe-options-newsgroup-method}.
@@ -1763,13 +1769,13 @@ Number of read articles.
 Estimated total number of articles.  (This is really @var{max-number}
 minus @var{min-number} plus 1.)
 
-Gnus uses this estimation because the NNTP protocol provides efficient
-access to @var{max-number} and @var{min-number} but getting the true
-unread message count is not possible efficiently.  For hysterical
-raisins, even the mail back ends, where the true number of unread
-messages might be available efficiently, use the same limited
-interface.  To remove this restriction from Gnus means that the
-back end interface has to be changed, which is not an easy job.  If you
+Gnus uses this estimation because the @sc{nntp} protocol provides
+efficient access to @var{max-number} and @var{min-number} but getting
+the true unread message count is not possible efficiently.  For
+hysterical raisins, even the mail back ends, where the true number of
+unread messages might be available efficiently, use the same limited
+interface.  To remove this restriction from Gnus means that the back
+end interface has to be changed, which is not an easy job.  If you
 want to work on this, please contact the Gnus mailing list.
 
 @item y
@@ -2685,13 +2691,15 @@ entering summary buffer.
 
 See also @code{gnus-parameter-to-list-alist}.
 
+@anchor{subscribed}
 @item subscribed
 @cindex subscribed
 If this parameter is set to @code{t}, Gnus will consider the
 to-address and to-list parameters for this group as addresses of
-mailing lists you are subscribed to.  Giving Gnus this information
-will help it to generate correct Mail-Followup-To headers for your
-posts to these lists.  
+mailing lists you are subscribed to.  Giving Gnus this information is
+(only) a first step in getting it to generate correct Mail-Followup-To
+headers for your posts to these lists.  Look here @pxref{(message)Mailing
+Lists} for a complete treatment of available MFT support.
 
 See also @code{gnus-find-subscribed-addresses}, the function that
 directly uses this group parameter.
@@ -2730,8 +2738,10 @@ composed messages will be @code{Gcc}'d to the current group.  If
 generated, if @code{(gcc-self . "string")} is present, this string will
 be inserted literally as a @code{gcc} header.  This parameter takes
 precedence over any default @code{Gcc} rules as described later
-(@pxref{Archived Messages}).
-
+(@pxref{Archived Messages}).  CAVEAT:: It yields an error putting
+@code{(gcc-self . t)} in groups of a @code{nntp} server or so, because
+a @code{nntp} server doesn't accept artciles.
 @item auto-expire
 @cindex auto-expire
 If the group parameter has an element that looks like @code{(auto-expire
@@ -2801,8 +2811,8 @@ Display articles that satisfy a predicate.
 Here are some examples:
 
 @table @code
-@item [read]
-Display only read articles.
+@item [unread]
+Display only unread articles.
 
 @item [not expire]
 Display everything except expirable articles.
@@ -2814,9 +2824,9 @@ responded to.
 
 The available operators are @code{not}, @code{and} and @code{or}.
 Predicates include @code{tick}, @code{unsend}, @code{undownload},
-@code{read}, @code{dormant}, @code{expire}, @code{reply},
+@code{unread}, @code{dormant}, @code{expire}, @code{reply},
 @code{killed}, @code{bookmark}, @code{score}, @code{save},
-@code{cache}, @code{forward}, @code{seen} and @code{recent}.
+@code{cache}, @code{forward}, @code{unseen} and @code{recent}.
 
 @end table
 
@@ -2891,9 +2901,9 @@ translating the group parameter into a Sieve script (@pxref{Sieve
 Commands}) the following Sieve code is generated:
 
 @example
-  if address \"sender\" \"sieve-admin@@extundo.com\" @{
-          fileinto \"INBOX.list.sieve\";
-  @}
+if address \"sender\" \"sieve-admin@@extundo.com\" @{
+        fileinto \"INBOX.list.sieve\";
+@}
 @end example
 
 The Sieve language is described in RFC 3028.  @xref{Top, , Top, sieve,
@@ -2907,6 +2917,16 @@ that group.  @code{gnus-show-threads} will be made into a local variable
 in the summary buffer you enter, and the form @code{nil} will be
 @code{eval}ed there.
 
+@vindex gnus-list-identifiers
+A use for this feature, is to remove a mailing list identifier tag in
+the subject fields of articles.   E.g. if the news group
+@samp{nntp+news.gnus.org:gmane.text.docbook.apps} has the tag
+@samp{DOC-BOOK-APPS:} in the subject of all articles, this tag can be
+removed from the article subjects in the summary buffer for the group by
+putting @code{(gnus-list-identifiers "DOCBOOK-APPS:")} into the group
+parameters for the group.
+
+
 This can also be used as a group-specific hook function, if you'd like.
 If you want to hear a beep when you enter a group, you could put
 something like @code{(dummy-variable (ding))} in the parameters of that
@@ -3219,6 +3239,11 @@ Sort the groups by group rank
 Sort the groups alphabetically by back end name
 (@code{gnus-group-sort-selected-groups-by-method}).
 
+@item G P s
+@kindex G P s (Group)
+@findex gnus-group-sort-selected-groups
+Sort the groups according to @code{gnus-group-sort-function}.
+
 @end table
 
 And finally, note that you can use @kbd{C-k} and @kbd{C-y} to manually
@@ -3749,9 +3774,18 @@ Sort the current topic alphabetically by back end name
 Sort the current topic alphabetically by server name
 (@code{gnus-topic-sort-groups-by-server}).
 
+@item T S s
+@kindex T S s
+@findex gnus-topic-sort-groups
+Sort the current topic according to the function(s) given by the
+@code{gnus-group-sort-function} variable
+(@code{gnus-topic-sort-groups}).
+
 @end table
 
-@xref{Sorting Groups}, for more information about group sorting.
+When given a prefix argument, all these commands will sort in reverse
+order.  @xref{Sorting Groups}, for more information about group
+sorting.
 
 
 @node Topic Topology
@@ -4339,7 +4373,7 @@ possible to change this.  Just write a new function
 @code{gnus-goto-colon} which does whatever you like with the cursor.)
 @xref{Positioning Point}.
 
-The default string is @samp{%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n}.
+The default string is @samp{%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n}.
 
 The following format specification characters and extended format
 specification(s) are understood:
@@ -5085,7 +5119,7 @@ This command is mainly used if you have several accounts and want to
 ship a mail to a different account of yours.  (If you're both
 @code{root} and @code{postmaster} and get a mail for @code{postmaster}
 to the @code{root} account, you may want to resend it to
-@code{postmaster}.  Ordnung muß sein!
+@code{postmaster}.  Ordnung muss sein!
 
 This command understands the process/prefix convention
 (@pxref{Process/Prefix}).
@@ -5531,15 +5565,11 @@ All articles that you have replied to or made a followup to (i.e., have
 answered) will be marked with an @samp{A} in the second column
 (@code{gnus-replied-mark}).
 
+@item
 @vindex gnus-forwarded-mark
 All articles that you have forwarded will be marked with an @samp{F} in
 the second column (@code{gnus-forwarded-mark}).
 
-@vindex gnus-recent-mark
-Articles that are ``recently'' arrived in the group will be marked
-with an @samp{N} in the second column (@code{gnus-recent-mark}).  Most
-back end doesn't support the mark, in which case it's not shown.
-
 @item
 @vindex gnus-cached-mark
 Articles stored in the article cache will be marked with an @samp{*} in
@@ -5556,7 +5586,7 @@ religiously) are marked with an @samp{S} in the second column
 Articles that according to the back end haven't been seen by the user
 before are marked with a @samp{N} in the second column
 (@code{gnus-recent-mark}).  Note that not all back ends support this
-mark, in which case it simply never appear.
+mark, in which case it simply never appears.
 
 @item
 @vindex gnus-unseen-mark
@@ -5975,10 +6005,10 @@ score (@code{gnus-summary-limit-to-score}).
 
 @item / p
 @kindex / p (Summary)
-@findex gnus-summary-limit-to-display-parameter
+@findex gnus-summary-limit-to-display-predicate
 Limit the summary buffer to articles that satisfy the @code{display}
 group parameter predicate
-(@code{gnus-summary-limit-to-display-parameter}).  See @pxref{Group
+(@code{gnus-summary-limit-to-display-predicate}).  See @pxref{Group
 Parameters} for more on this predicate.
 
 @item / E
@@ -6305,9 +6335,10 @@ connect as many loose threads as possible, you should set this variable
 to @code{some} or a number.  If you set it to a number, no more than
 that number of extra old headers will be fetched.  In either case,
 fetching old headers only works if the back end you are using carries
-overview files---this would normally be @code{nntp}, @code{nnspool} and
-@code{nnml}.  Also remember that if the root of the thread has been
-expired by the server, there's not much gnus can do about that.
+overview files---this would normally be @code{nntp}, @code{nnspool},
+@code{nnml}, and @code{nnmaildir}.  Also remember that if the root of
+the thread has been expired by the server, there's not much Gnus can do
+about that.
 
 This variable can also be set to @code{invisible}.  This won't have any
 visible effects, but is useful if you use the @kbd{A T} command a lot
@@ -6359,6 +6390,22 @@ slower and more awkward.
 If non-@code{nil}, all threads will be hidden when the summary buffer is
 generated.
 
+This can also be a predicate specifier (@pxref{Predicate Specifiers}).
+Avaliable predicates are @code{gnus-article-unread-p} and
+@code{gnus-article-unseen-p}).
+
+Here's an example:
+
+@lisp
+(setq gnus-thread-hide-subtree
+      '(or gnus-article-unread-p
+           gnus-article-unseen-p))
+@end lisp
+
+(It's a pretty nonsensical example, since all unseen articles are also
+unread, but you get my drift.)
+
+
 @item gnus-thread-expunge-below
 @vindex gnus-thread-expunge-below
 All threads that have a total score (as defined by
@@ -6525,7 +6572,7 @@ understand the numeric prefix.
 
 @item T n
 @kindex T n (Summary)
-@itemx C-M-n
+@itemx C-M-f
 @kindex C-M-n (Summary)
 @itemx M-down
 @kindex M-down (Summary)
@@ -6534,7 +6581,7 @@ Go to the next thread (@code{gnus-summary-next-thread}).
 
 @item T p
 @kindex T p (Summary)
-@itemx C-M-p
+@itemx C-M-b
 @kindex C-M-p (Summary)
 @itemx M-up
 @kindex M-up (Summary)
@@ -6917,6 +6964,10 @@ processing of the article is done before it is saved).  For a different
 approach (uudecoding, unsharing) you should use @code{gnus-uu}
 (@pxref{Decoding Articles}).
 
+For the commands listed here, the target is a file.  If you want to
+save to a group, see the @kbd{B c} (@code{gnus-summary-copy-article})
+command (@pxref{Mail Group Commands}).
+
 @vindex gnus-save-all-headers
 If @code{gnus-save-all-headers} is non-@code{nil}, gnus will not delete
 unwanted headers before saving the article.
@@ -8022,9 +8073,9 @@ Toggle whether to display all headers in the article buffer
 
 @item W v
 @kindex W v (Summary)
-@findex gnus-summary-verbose-header
+@findex gnus-summary-verbose-headers
 Toggle whether to display all headers in the article buffer permanently
-(@code{gnus-summary-verbose-header}).
+(@code{gnus-summary-verbose-headers}).
 
 @item W m
 @kindex W m (Summary)
@@ -8055,6 +8106,13 @@ an attempt to provide more quoting characters.  If you see something
 like @code{\222} or @code{\264} where you're expecting some kind of
 apostrophe or quotation mark, then try this wash.
 
+@item W k
+@kindex W k (Summary)
+@findex gnus-article-outlook-deuglify-article
+@cindex Outlook Express
+Deuglify broken Outlook (Express) articles and redisplay
+(@code{gnus-article-outlook-deuglify-article}).
+
 @item W w
 @kindex W w (Summary)
 @findex gnus-article-fill-cited-article
@@ -8087,7 +8145,7 @@ CRs into LF (this takes care of Mac line endings)
 @findex gnus-article-de-base64-unreadable
 Treat base64 (@code{gnus-article-de-base64-unreadable}).
 Base64 is one common @sc{mime} encoding employed when sending non-ASCII
-(i. e., 8-bit) articles.  Note that the this is usually done
+(i. e., 8-bit) articles.  Note that this is usually done
 automatically by Gnus if the message in question has a
 @code{Content-Transfer-Encoding} header that says that this encoding has
 been done.
@@ -8100,15 +8158,49 @@ Treat HZ or HZP (@code{gnus-article-decode-HZ}).  HZ (or HZP) is one
 common encoding employed when sending Chinese articles.  It typically
 makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.
 
+@item W u
+@kindex W u (Summary)
+@findex gnus-article-unsplit-urls
+Remove newlines from within URLs.  Some mailers insert newlines into
+outgoing email messages to keep lines short.  This reformatting can
+split long URLs onto multiple lines.  Repair those URLs by removing
+the newlines (@code{gnus-article-unsplit-urls}).
+
 @item W h
 @kindex W h (Summary)
 @findex gnus-article-wash-html
-Treat HTML (@code{gnus-article-wash-html}).
-Note that the this is usually done automatically by Gnus if the message
-in question has a @code{Content-Type} header that says that this type
-has been done.
+Treat @sc{html} (@code{gnus-article-wash-html}).  Note that this is
+usually done automatically by Gnus if the message in question has a
+@code{Content-Type} header that says that the message is @sc{html}.
+
 If a prefix is given, a charset will be asked for.
 
+@vindex gnus-article-wash-function
+The default is to use the function specified by
+@code{mm-inline-text-html-renderer} (@pxref{Customization, , , emacs-mime}) 
+to convert the @sc{html}, but this is controlled by the
+@code{gnus-article-wash-function} variable.  Pre-defined functions you
+can use include:
+
+@table @code
+@item w3
+Use Emacs/w3.
+
+@item w3m
+Use emacs-w3m (see @uref{http://emacs-w3m.namazu.org/} for more
+information).
+
+@item links
+Use Links (see @uref{http://artax.karlin.mff.cuni.cz/~mikulas/links/}).
+
+@item lynx
+Use Lynx (see @uref{http://lynx.browser.org/}).
+
+@item html2text
+Use html2text -- a simple @sc{html} converter included with Gnus.
+
+@end table
+
 @item W b
 @kindex W b (Summary)
 @findex gnus-article-add-buttons
@@ -8134,14 +8226,14 @@ message.@footnote{PGP keys for many hierarchies are available at
 @item W s
 @kindex W s (Summary)
 @findex gnus-summary-force-verify-and-decrypt
-Verify a signed (PGP, PGP/MIME or S/MIME) message
+Verify a signed (PGP, @sc{pgp/mime} or @sc{s/mime}) message
 (@code{gnus-summary-force-verify-and-decrypt}). @xref{Security}.
 
-@item W W H
-@kindex W W H (Summary)
-@findex gnus-article-strip-headers-from-body
+@item W a
+@kindex W a (Summary)
+@findex gnus-article-strip-headers-in-body
 Strip headers like the @code{X-No-Archive} header from the beginning of
-article bodies (@code{gnus-article-strip-headers-from-body}).
+article bodies (@code{gnus-article-strip-headers-in-body}).
 
 @item W E l
 @kindex W E l (Summary)
@@ -8215,6 +8307,12 @@ Fold the @code{Newsgroups} and @code{Followup-To} headers
 Fold all the message headers
 (@code{gnus-article-treat-fold-headers}).
 
+@item W E w
+@kindex W E w
+@findex gnus-article-remove-leading-whitespace
+Remove excessive whitespace from all headers
+(@code{gnus-article-remove-leading-whitespace}).
+
 @end table
 
 
@@ -8247,7 +8345,8 @@ This is an alist where each entry has this form:
 @item regexp
 All text that match this regular expression will be considered an
 external reference.  Here's a typical regexp that matches embedded URLs:
-@samp{<URL:\\([^\n\r>]*\\)>}.
+@samp{<URL:\\([^\n\r>]*\\)>}. This can also be a variable containing a
+regexp, useful variables to use include @code{gnus-button-url-regexp}.
 
 @item button-par
 Gnus has to know which parts of the matches is to be highlighted.  This
@@ -8440,7 +8539,7 @@ Piconify all mail headers (i. e., @code{Cc}, @code{To})
 @kindex W D n (Summary)
 @findex gnus-treat-newsgroups-picon
 Piconify all news headers (i. e., @code{Newsgroups} and
-@code{Followup-To}) (@code{gnus-treat-from-picon}).
+@code{Followup-To}) (@code{gnus-treat-newsgroups-picon}).
 
 @item W D D
 @kindex W D D (Summary)
@@ -8528,7 +8627,7 @@ Translate the article from one language to another
 
 
 @node MIME Commands
-@section @sc{mime} Commands
+@section MIME Commands
 @cindex MIME decoding
 @cindex attachments
 @cindex viewing attachments
@@ -8608,9 +8707,9 @@ Decode encoded article bodies as well as charsets
 This command looks in the @code{Content-Type} header to determine the
 charset.  If there is no such header in the article, you can give it a
 prefix, which will prompt for the charset to decode as.  In regional
-groups where people post using some common encoding (but do not include
-MIME headers), you can set the @code{charset} group/topic parameter to
-the required charset (@pxref{Group Parameters}).
+groups where people post using some common encoding (but do not
+include @sc{mime} headers), you can set the @code{charset} group/topic
+parameter to the required charset (@pxref{Group Parameters}).
 
 @item W M v
 @kindex W M v (Summary)
@@ -8971,12 +9070,12 @@ then ask Deja if that fails:
 @end lisp
 
 Most of the mail back ends support fetching by @code{Message-ID}, but
-do not do a particularly excellent job at it.  That is, @code{nnmbox}
-and @code{nnbabyl} are able to locate articles from any groups, while
-@code{nnml}, @code{nnfolder} and @code{nnimap}1 are only able to locate
-articles that have been posted to the current group.  (Anything else
-would be too time consuming.)  @code{nnmh} does not support this at
-all.
+do not do a particularly excellent job at it.  That is, @code{nnmbox},
+@code{nnbabyl}, and @code{nnmaildir} are able to locate articles from
+any groups, while @code{nnml}, @code{nnfolder}, and @code{nnimap} are
+only able to locate articles that have been posted to the current group.
+(Anything else would be too time consuming.)  @code{nnmh} does not
+support this at all.
 
 
 @node Alternative Approaches
@@ -9287,7 +9386,7 @@ disk forever and ever, never to return again.'' Use with caution.
 @vindex gnus-preserve-marks
 Move the article from one mail group to another
 (@code{gnus-summary-move-article}).  Marks will be preserved if
-@var{gnus-preserve-marks} is non-@code{nil} (which is the default).
+@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
 
 @item B c
 @kindex B c (Summary)
@@ -9296,7 +9395,7 @@ Move the article from one mail group to another
 @c @icon{gnus-summary-mail-copy}
 Copy the article from one group (mail group or not) to a mail group
 (@code{gnus-summary-copy-article}).  Marks will be preserved if
-@var{gnus-preserve-marks} is non-@code{nil} (which is the default).
+@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
 
 @item B B
 @kindex B B (Summary)
@@ -9314,6 +9413,13 @@ Import an arbitrary file into the current mail newsgroup
 (@code{gnus-summary-import-article}).  You will be prompted for a file
 name, a @code{From} header and a @code{Subject} header.
 
+@item B I
+@kindex B I (Summary)
+@findex gnus-summary-create-article
+Create an empty article in the current mail newsgroups
+(@code{gnus-summary-create-article}).  You will be prompted for a
+@code{From} header and a @code{Subject} header.
+
 @item B r
 @kindex B r (Summary)
 @findex gnus-summary-respool-article
@@ -9321,7 +9427,7 @@ Respool the mail article (@code{gnus-summary-respool-article}).
 @code{gnus-summary-respool-default-method} will be used as the default
 select method when respooling.  This variable is @code{nil} by default,
 which means that the current group select method will be used instead.
-Marks will be preserved if @var{gnus-preserve-marks} is non-@code{nil}
+Marks will be preserved if @code{gnus-preserve-marks} is non-@code{nil}
 (which is the default).
 
 @item B w
@@ -9330,9 +9436,10 @@ Marks will be preserved if @var{gnus-preserve-marks} is non-@code{nil}
 @kindex e (Summary)
 @findex gnus-summary-edit-article
 @kindex C-c C-c (Article)
+@findex gnus-summary-edit-article-done
 Edit the current article (@code{gnus-summary-edit-article}).  To finish
 editing and make the changes permanent, type @kbd{C-c C-c}
-(@kbd{gnus-summary-edit-article-done}).  If you give a prefix to the
+(@code{gnus-summary-edit-article-done}).  If you give a prefix to the
 @kbd{C-c C-c} command, gnus won't re-highlight the article.
 
 @item B q
@@ -9362,6 +9469,14 @@ it didn't find the article, it may have been posted anyway---mail
 propagation is much faster than news propagation, and the news copy may
 just not have arrived yet.
 
+@item K E
+@kindex K E (Summary)
+@findex gnus-article-encrypt-body
+@vindex gnus-article-encrypt-protocol
+Encrypt the body of an article (@code{gnus-article-encrypt-body}).
+The body is encrypted with the encryption protocol specified by the
+variable @code{gnus-article-encrypt-protocol}.
+
 @end table
 
 @vindex gnus-move-split-methods
@@ -9870,8 +9985,8 @@ to you to figure out, I think.
 @section Security
 
 Gnus is able to verify signed messages or decrypt encrypted messages.
-The formats that are supported are PGP, PGP/MIME and S/MIME, however
-you need some external programs to get things to work:
+The formats that are supported are PGP, @sc{pgp/mime} and @sc{s/mime},
+however you need some external programs to get things to work:
 
 @enumerate
 @item
@@ -9879,7 +9994,7 @@ To handle PGP messages, you have to install mailcrypt or gpg.el as
 well as a OpenPGP implementation (such as GnuPG).
 
 @item
-To handle S/MIME message, you need to install OpenSSL.  OpenSSL 0.9.6
+To handle @sc{s/mime} message, you need to install OpenSSL.  OpenSSL 0.9.6
 or newer is recommended.
 
 @end enumerate
@@ -9905,9 +10020,12 @@ protocols. Otherwise, ask user.
 @node Mailing List
 @section Mailing List
 
+@kindex A M (summary)
+@findex gnus-mailing-list-insinuate
 Gnus understands some mailing list fields of RFC 2369.  To enable it,
 either add a `to-list' group parameter (@pxref{Group Parameters}),
-possibly using @kbd{A M} in the summary buffer, or say:
+possibly using @kbd{A M} (@code{gnus-mailing-list-insinuate}) in the
+summary buffer, or say:
 
 @lisp
 (add-hook 'gnus-summary-mode-hook 'turn-on-gnus-mailing-list-mode)
@@ -10077,7 +10195,7 @@ Remove the @code{To} header if it is very long.
 Remove all @code{To} headers if there are more than one.
 @end table
 
-To include these three elements, you could say something like;
+To include these three elements, you could say something like:
 
 @lisp
 (setq gnus-boring-article-headers
@@ -10107,9 +10225,9 @@ other naughty stuff in innocent-looking articles.
 Gnus handles @sc{mime} by pushing the articles through
 @code{gnus-article-display-method-for-mime}, which is
 @code{gnus-article-display-mime-message} by default.  This function
-calls the SEMI MIME-View program to actually do the work.  For more
-information on SEMI MIME-View, see its manual page (however it is not
-existed yet, sorry).
+calls the @sc{semi} MIME-View program to actually do the work.  For more
+information on @sc{semi} MIME-View, see its manual page (however it is
+not existed yet, sorry).
 
 Set @code{gnus-show-mime} to @code{t} if you want to use
 @sc{mime} all the time.  If you have @code{gnus-show-mime} set, then
@@ -10226,6 +10344,8 @@ possible but those listed are probably sufficient for most people.
 @item gnus-treat-strip-pem (t, last, integer)
 @item gnus-treat-strip-pgp (t, last, integer)
 @item gnus-treat-strip-trailing-blank-lines (t, last, integer)
+@item gnus-treat-unsplit-urls (t, integer)
+@item gnus-treat-decode-article-as-default-mime-charset (t, integer)
 
 @xref{Article Washing}.
 
@@ -10283,8 +10403,11 @@ is controlled by @code{gnus-body-boundary-delimiter}.
 @item gnus-treat-unfold-headers (head)
 @item gnus-treat-fold-headers (head)
 @item gnus-treat-fold-newsgroups (head)
+@item gnus-treat-leading-whitespace (head)
+
+@xref{Article Header}.
+
 
-@item gnus-treat-decode-article-as-default-mime-charset
 @end table
 
 @vindex gnus-part-display-hook
@@ -10487,7 +10610,7 @@ on your setup (@pxref{Posting Server}).
 
 @menu
 * Mail::                        Mailing and replying.
-* Posting Server::              What server should you post via?
+* Posting Server::              What server should you post and mail via?
 * Mail and Post::               Mailing and posting at the same time.
 * Archived Messages::           Where Gnus stores the messages you've sent.
 * Posting Styles::              An easier way to specify who you are.
@@ -10527,15 +10650,18 @@ When you press those magical @kbd{C-c C-c} keys to ship off your latest
 
 Thank you for asking.  I hate you.
 
-@vindex gnus-post-method
+It can be quite complicated.  
 
-It can be quite complicated.  Normally, Gnus will post using the same
-select method as you're reading from (which might be convenient if
-you're reading lots of groups from different private servers).
-However.  If the server you're reading from doesn't allow posting,
-just reading, you probably want to use some other server to post your
-(extremely intelligent and fabulously interesting) articles.  You can
-then set the @code{gnus-post-method} to some other method:
+@vindex gnus-post-method
+When posting news, Message usually invokes @code{message-send-news}
+(@pxref{News Variables, , News Variables, message, Message Manual}).
+Normally, Gnus will post using the same select method as you're
+reading from (which might be convenient if you're reading lots of
+groups from different private servers).  However.  If the server
+you're reading from doesn't allow posting, just reading, you probably
+want to use some other server to post your (extremely intelligent and
+fabulously interesting) articles.  You can then set the
+@code{gnus-post-method} to some other method:
 
 @lisp
 (setq gnus-post-method '(nnspool ""))
@@ -10556,6 +10682,23 @@ for posting.
 Finally, if you want to always post using the native select method,
 you can set this variable to @code{native}.
 
+When sending mail, Message invokes @code{message-send-mail-function}.
+The default function, @code{message-send-mail-with-sendmail}, pipes
+your article to the @code{sendmail} binary for further queuing and
+sending.  When your local system is not configured for sending mail
+using @code{sendmail}, and you have access to a remote @sc{smtp}
+server, you can set @code{message-send-mail-function} to
+@code{smtpmail-send-it} and make sure to setup the @code{smtpmail}
+package correctly.  An example:
+
+@lisp
+(setq message-send-mail-function 'smtpmail-send-it
+      smtpmail-default-smtp-server "YOUR SMTP HOST")
+@end lisp
+
+Other possible choises for @code{message-send-mail-function} includes
+@code{message-send-mail-with-mh}, @code{message-send-mail-with-qmail},
+and @code{feedmail-send-it}.
 
 @node Mail and Post
 @section Mail and Post
@@ -10618,6 +10761,10 @@ store the messages.  If you want to disable this completely, the
 @code{gnus-message-archive-group} variable should be @code{nil}, which
 is the default.
 
+For archiving interesting messages in a group you read, see the
+@kbd{B c} (@code{gnus-summary-copy-article}) command (@pxref{Mail
+Group Commands}).
+
 @vindex gnus-message-archive-method
 @code{gnus-message-archive-method} says what virtual server gnus is to
 use to store sent messages.  The default is:
@@ -10753,6 +10900,14 @@ but the latter is the preferred method.
 @vindex gnus-gcc-mark-as-read
 If non-@code{nil}, automatically mark @code{Gcc} articles as read.
 
+@item gnus-gcc-externalize-attachments
+@vindex gnus-gcc-externalize-attachments
+If @code{nil}, attach files as normal parts in Gcc copies; if a regexp
+and matches the Gcc group name, attach files as external parts; if it is
+@code{all}, attach local files as external parts; if it is other
+non-@code{nil}, the behavior is the same as @code{all}, but it may be
+changed in the future.
+
 @end table
 
 
@@ -10796,30 +10951,36 @@ signature and the @samp{What me?} @code{Organization} header.
 
 The first element in each style is called the @code{match}.  If it's a
 string, then Gnus will try to regexp match it against the group name.
-If it is the symbol @code{header}, then Gnus will look for header (the
-next element in the match) in the original article , and compare that to
-the last regexp in the match.  If it's a function symbol, that function
-will be called with no arguments.  If it's a variable symbol, then the
-variable will be referenced.  If it's a list, then that list will be
-@code{eval}ed.  In any case, if this returns a non-@code{nil} value,
-then the style is said to @dfn{match}.
-
-Each style may contain a arbitrary amount of @dfn{attributes}.  Each
+If it is the form @code{(header MATCH REGEXP)}, then Gnus will look in
+the original article for a header whose name is MATCH and compare that
+REGEXP.  MATCH and REGEXP are strings. If it's a function symbol, that
+function will be called with no arguments.  If it's a variable symbol,
+then the variable will be referenced.  If it's a list, then that list
+will be @code{eval}ed.  In any case, if this returns a non-@code{nil}
+value, then the style is said to @dfn{match}.
+
+Each style may contain an arbitrary amount of @dfn{attributes}.  Each
 attribute consists of a @code{(@var{name} @var{value})} pair.  The
 attribute name can be one of @code{signature}, @code{signature-file},
-@code{organization}, @code{address}, @code{name} or @code{body}.  The
-attribute name can also be a string.  In that case, this will be used as
-a header name, and the value will be inserted in the headers of the
-article; if the value is @code{nil}, the header name will be removed.
-If the attribute name is @code{eval}, the form is evaluated, and the
-result is thrown away.
+@code{x-face-file}, @code{address} (overriding
+@code{user-mail-address}), @code{name} (overriding
+@code{(user-full-name)}) or @code{body}.  The attribute name can also
+be a string or a symbol.  In that case, this will be used as a header
+name, and the value will be inserted in the headers of the article; if
+the value is @code{nil}, the header name will be removed.  If the
+attribute name is @code{eval}, the form is evaluated, and the result
+is thrown away.
 
 The attribute value can be a string (used verbatim), a function with
 zero arguments (the return value will be used), a variable (its value
 will be used) or a list (it will be @code{eval}ed and the return value
 will be used).  The functions and sexps are called/@code{eval}ed in the
 message buffer that is being set up.  The headers of the current article
-are available through the @code{message-reply-headers} variable.
+are available through the @code{message-reply-headers} variable, which
+is a vector of the following headers: number subject from date id
+references chars lines xref extra.
+
+@vindex message-reply-headers
 
 If you wish to check whether the message you are about to compose is
 meant to be a news article or a mail message, you can check the values
@@ -10839,13 +11000,16 @@ So here's a new example:
          (organization "People's Front Against MWM"))
         ("^rec.humor"
          (signature my-funny-signature-randomizer))
-        ((equal (system-name) "gnarly")
+        ((equal (system-name) "gnarly")  ;; A form
          (signature my-quote-randomizer))
-        ((message-news-p)
+        (message-news-p        ;; A function symbol
          (signature my-news-signature))
-        (header "to" "larsi.*org"
-                (Organization "Somewhere, Inc."))
-        ((posting-from-work-p)
+        (window-system         ;; A value symbol
+         ("X-Window-System" (format "%s" window-system)))
+        ;; If I'm replying to Larsi, set the Organization header.
+        ((header "to" "larsi.*org")
+         (Organization "Somewhere, Inc."))
+        ((posting-from-work-p) ;; A user defined function
          (signature-file "~/.work-signature")
          (address "user@@bar.foo")
          (body "You are fired.\n\nSincerely, your boss.")
@@ -10961,17 +11125,17 @@ typically enter that group and send all the articles off.
 @cindex using smime
 
 Gnus can digitally sign and encrypt your messages, using vanilla PGP
-format or PGP/MIME or S/MIME.  For decoding such messages, see the
-@code{mm-verify-option} and @code{mm-decrypt-option} options
+format or @sc{pgp/mime} or @sc{s/mime}.  For decoding such messages,
+see the @code{mm-verify-option} and @code{mm-decrypt-option} options
 (@pxref{Security}).
 
 For PGP, Gnus supports two external libraries, @sc{gpg.el} and
-@sc{Mailcrypt}, you need to install at least one of them.  The S/MIME
-support in Gnus requires the external program OpenSSL.
+@sc{Mailcrypt}, you need to install at least one of them.  The
+@sc{s/mime} support in Gnus requires the external program OpenSSL.
 
-Instructing MML to perform security operations on a MIME part is done
-using the @code{C-c C-m s} key map for signing and the @code{C-c C-m
-c} key map for encryption, as follows.
+Instructing MML to perform security operations on a @sc{mime} part is
+done using the @kbd{C-c C-m s} key map for signing and the @kbd{C-c
+C-m c} key map for encryption, as follows.
 
 @table @kbd
 
@@ -10979,37 +11143,42 @@ c} key map for encryption, as follows.
 @kindex C-c C-m s s
 @findex mml-secure-sign-smime
 
-Digitally sign current MIME part using S/MIME.
+Digitally sign current @sc{mime} part using @sc{s/mime}.
 
 @item C-c C-m s o
 @kindex C-c C-m s o
 @findex mml-secure-sign-pgp
 
-Digitally sign current MIME part using PGP.
+Digitally sign current @sc{mime} part using PGP.
 
 @item C-c C-m s p
 @kindex C-c C-m s p
 @findex mml-secure-sign-pgp
 
-Digitally sign current MIME part using PGP/MIME.
+Digitally sign current @sc{mime} part using @sc{pgp/mime}.
 
 @item C-c C-m c s
 @kindex C-c C-m c s
 @findex mml-secure-encrypt-smime
 
-Digitally encrypt current MIME part using S/MIME.
+Digitally encrypt current @sc{mime} part using @sc{s/mime}.
 
 @item C-c C-m c o
 @kindex C-c C-m c o
 @findex mml-secure-encrypt-pgp
 
-Digitally encrypt current MIME part using PGP.
+Digitally encrypt current @sc{mime} part using PGP.
 
 @item C-c C-m c p
 @kindex C-c C-m c p
 @findex mml-secure-encrypt-pgpmime
 
-Digitally encrypt current MIME part using PGP/MIME.
+Digitally encrypt current @sc{mime} part using @sc{pgp/mime}.
+
+@item C-c C-m C-n
+@kindex C-c C-m C-n
+@findex mml-unsecure-message
+Remove security related MML tags from message.
 
 @end table
 
@@ -11431,6 +11600,11 @@ Close the connections to all servers in the buffer
 Remove all marks to whether Gnus was denied connection from any servers
 (@code{gnus-server-remove-denials}).
 
+@item L
+@kindex L (Server)
+@findex gnus-server-offline-server
+Set server status to offline (@code{gnus-server-offline-server}).
+
 @end table
 
 
@@ -11450,7 +11624,7 @@ or it can read from a local spool.
 
 
 @node NNTP
-@subsection @sc{nntp}
+@subsection NNTP
 @cindex nntp
 
 Subscribing to a foreign group from an @sc{nntp} server is rather easy.
@@ -12045,7 +12219,7 @@ mail, is that the transport mechanism has very little to do with how
 they want to treat a message.
 
 Many people subscribe to several mailing lists.  These are transported
-via SMTP, and are therefore mail.  But we might go for weeks without
+via @sc{smtp}, and are therefore mail.  But we might go for weeks without
 answering, or even reading these messages very carefully.  We may not
 need to save them because if we should need to read one again, they are
 archived somewhere else.
@@ -12192,6 +12366,11 @@ where re-spooling messages would put the messages, you can use
 @code{gnus-summary-respool-trace} and related commands (@pxref{Mail
 Group Commands}).
 
+@vindex nnmail-split-header-length-limit
+Header lines longer than the value of
+@code{nnmail-split-header-length-limit} are excluded from the split
+function.
+
 Gnus gives you all the opportunity you could possibly want for shooting
 yourself in the foot.  Let's say you create a group that will contain
 all the mail you get from your boss.  And then you accidentally
@@ -12406,6 +12585,27 @@ This can be either the symbol @code{password} or the symbol @code{apop}
 and says what authentication scheme to use.  The default is
 @code{password}.
 
+@item :connection
+What stream to use for connecting to the server, this can be the symbol
+@code{ssl}, the symbol @code{tls} or others.  The default is @code{nil}
+and use insecure connections.  Note that for SSL/TLS, you need external
+programs and libraries:
+
+@itemize @bullet
+@item
+@dfn{ssl:} Connect through SSL@. Requires OpenSSL (the program
+@samp{openssl}) or SSLeay (@samp{s_client}) as well as the external
+library @samp{ssl.el}.
+@item
+@dfn{starttls:} Connect via the STARTTLS extension (similar to SSL)@.
+Requires the external library @samp{starttls.el} and program
+@samp{starttls}.
+@end itemize
+
+@item :leave
+Non-@code{nil} if mail is to be left on the server and UIDL used for
+message retrieval.  The default is @code{nil}.
+
 @end table
 
 If the @code{:program} and @code{:function} keywords aren't specified,
@@ -12545,13 +12745,13 @@ UNDELETED}, is probably the best choice for most people, but if you
 sometimes peek in your mailbox with a @sc{imap} client and mark some
 articles as read (or; SEEN) you might want to set this to @samp{nil}.
 Then all articles in the mailbox is fetched, no matter what.  For a
-complete list of predicates, see RFC 2060 Â§6.4.4.
+complete list of predicates, see RFC 2060 section 6.4.4.
 
 @item :fetchflag
 How to flag fetched articles on the server, the default @samp{\Deleted}
 will mark them as deleted, an alternative would be @samp{\Seen} which
 would simply mark them as read.  These are the two most likely choices,
-but more flags are defined in RFC 2060 Â§2.3.2.
+but more flags are defined in RFC 2060 section 2.3.2.
 
 @item :dontexpunge
 If non-nil, don't remove all articles marked as deleted in the mailbox
@@ -12568,10 +12768,11 @@ An example @sc{imap} mail source:
 @end lisp
 
 @item webmail
-Get mail from a webmail server, such as www.hotmail.com,
-webmail.netscape.com, www.netaddress.com, www.my-deja.com.
+Get mail from a webmail server, such as @uref{www.hotmail.com},
+@uref{webmail.netscape.com}, @uref{www.netaddress.com},
+@uref{www.my-deja.com}.
 
-NOTE: Now mail.yahoo.com provides POP3 service, so @sc{pop} mail source
+NOTE: Now @uref{mail.yahoo.com} provides POP3 service, so @sc{pop} mail source
 is suggested.
 
 NOTE: Webmail largely depends cookies. A "one-line-cookie" patch is
@@ -13072,7 +13273,7 @@ may use it for only some of them, by using @code{nnmail-split-fancy}
 splits like this:
 
 @lisp
-(: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL)
+(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL)
 @end lisp
 
 @var{groups} may be a regular expression or a list of group names whose
@@ -13636,10 +13837,11 @@ to trudge through a big mbox file just to read your new mail.
 
 @code{nnml} is probably the slowest back end when it comes to article
 splitting.  It has to create lots of files, and it also generates
-@sc{nov} databases for the incoming mails.  This makes it the fastest
-back end when it comes to reading mail.
+@sc{nov} databases for the incoming mails.  This makes it possibly the
+fastest back end when it comes to reading mail.
 
 @cindex self contained nnml servers
+@cindex marks
 When the marks file is used (which it is by default), @code{nnml}
 servers have the property that you may backup them using @code{tar} or
 similar, and later be able to restore them into Gnus (by adding the
@@ -13698,7 +13900,12 @@ default is @code{nil}.
 
 @item nnml-marks-file-name
 @vindex nnml-marks-file-name
-The name of the @sc{marks} files.  The default is @file{.marks}.
+The name of the @dfn{marks} files.  The default is @file{.marks}.
+
+@item nnml-use-compressed-files
+@vindex nnml-use-compressed-files
+If non-@code{nil}, @code{nnml} will allow using compressed message
+files.
 
 @end table
 
@@ -13759,6 +13966,7 @@ will add extra headers to keep track of article numbers and arrival
 dates.
 
 @cindex self contained nnfolder servers
+@cindex marks
 When the marks file is used (which it is by default), @code{nnfolder}
 servers have the property that you may backup them using @code{tar} or
 similar, and later be able to restore them into Gnus (by adding the
@@ -14086,30 +14294,33 @@ leisure from your local disk.  No more World Wide Wait for you.
 @cindex archiving mail
 @cindex backup of mail
 
-Some of the back ends, notably nnml and nnfolder, now actually store
-the article marks with each group.  For these servers, archiving and
-restoring a group while preserving marks is fairly simple.
+Some of the back ends, notably @code{nnml}, @code{nnfolder}, and
+@code{nnmaildir}, now actually store the article marks with each group.
+For these servers, archiving and restoring a group while preserving
+marks is fairly simple.
 
 (Preserving the group level and group parameters as well still
-requires ritual dancing and sacrifices to the @code{.newsrc.eld} deity
+requires ritual dancing and sacrifices to the @file{.newsrc.eld} deity
 though.)
 
-To archive an entire @code{nnml} or @code{nnfolder} server, take a
-recursive copy of the server directory.  There is no need to shut down
-Gnus, so archiving may be invoked by @code{cron} or similar.  You
-restore the data by restoring the directory tree, and adding a server
-definition pointing to that directory in Gnus. The @ref{Article
-Backlog}, @ref{Asynchronous Fetching} and other things might interfer
-with overwriting data, so you may want to shut down Gnus before you
-restore the data.
-
-It is also possible to archive individual @code{nnml} or
-@code{nnfolder} groups, while preserving marks.  For @code{nnml}, you
-copy all files in the group's directory.  For @code{nnfolder} you need
-to copy both the base folder file itself (@code{FOO}, say), and the
-marks file (@code{FOO.mrk} in this example).  Restoring the group is
-done with @kbd{G m} from the Group buffer.  The last step makes Gnus
-notice the new directory.
+To archive an entire @code{nnml}, @code{nnfolder}, or @code{nnmaildir}
+server, take a recursive copy of the server directory.  There is no need
+to shut down Gnus, so archiving may be invoked by @code{cron} or
+similar.  You restore the data by restoring the directory tree, and
+adding a server definition pointing to that directory in Gnus. The
+@ref{Article Backlog}, @ref{Asynchronous Fetching} and other things
+might interfer with overwriting data, so you may want to shut down Gnus
+before you restore the data.
+
+It is also possible to archive individual @code{nnml},
+@code{nnfolder}, or @code{nnmaildir} groups, while preserving marks.
+For @code{nnml} or @code{nnmaildir}, you copy all files in the group's
+directory.  For @code{nnfolder} you need to copy both the base folder
+file itself (@file{FOO}, say), and the marks file (@file{FOO.mrk} in
+this example). Restoring the group is done with @kbd{G m} from the Group
+buffer.  The last step makes Gnus notice the new directory.
+@code{nnmaildir} notices the new directory automatically, so @kbd{G m}
+is unnecessary in that case.
 
 @node Web Searches
 @subsection Web Searches
@@ -14445,7 +14656,7 @@ follow the link.
 
 
 @node IMAP
-@section @sc{imap}
+@section IMAP
 @cindex nnimap
 @cindex @sc{imap}
 
@@ -14545,7 +14756,7 @@ Example server specification:
 @vindex nnimap-stream
 The type of stream used to connect to your server.  By default, nnimap
 will detect and automatically use all of the below, with the exception
-of SSL/TLS. (IMAP over SSL/TLS is being replaced by STARTTLS, which
+of SSL/TLS. (@sc{imap} over SSL/TLS is being replaced by STARTTLS, which
 can be automatically detected, but it's not widely deployed yet.)
 
 Example server specification:
@@ -14565,10 +14776,10 @@ Please note that the value of @code{nnimap-stream} is a symbol!
 @dfn{kerberos4:} Connect with Kerberos 4. Requires the @samp{imtest} program.
 @item
 @dfn{starttls:} Connect via the STARTTLS extension (similar to
-SSL). Requires the external library @samp{starttls.el} and program
+SSL).  Requires the external library @samp{starttls.el} and program
 @samp{starttls}.
 @item
-@dfn{ssl:} Connect through SSL. Requires OpenSSL (the program
+@dfn{ssl:} Connect through SSL.  Requires OpenSSL (the program
 @samp{openssl}) or SSLeay (@samp{s_client}) as well as the external
 library @samp{ssl.el}.
 @item
@@ -14583,7 +14794,7 @@ using @samp{imtest} from Cyrus IMAPD < 2.0.14 (which includes version
 1.5.x and 1.6.x) you need to frob @code{imap-process-connection-type}
 to make @code{imap.el} use a pty instead of a pipe when communicating
 with @samp{imtest}.  You will then suffer from a line length
-restrictions on IMAP commands, which might make Gnus seem to hang
+restrictions on @sc{imap} commands, which might make Gnus seem to hang
 indefinitely if you have many articles in a mailbox.  The variable
 @code{imap-kerberos4-program} contain parameters to pass to the imtest
 program.
@@ -14675,11 +14886,11 @@ articles or not.
 @item nnimap-importantize-dormant
 @vindex nnimap-importantize-dormant
 
-If non-nil, marks dormant articles as ticked (as well), for other IMAP
-clients. Within Gnus, dormant articles will naturally still (only) be
-marked as ticked.  This is to make dormant articles stand out, just
-like ticked articles, in other IMAP clients. (In other words, Gnus has
-two ``Tick'' marks and IMAP has only one.)
+If non-nil, marks dormant articles as ticked (as well), for other
+@sc{imap} clients. Within Gnus, dormant articles will naturally still
+(only) be marked as ticked.  This is to make dormant articles stand
+out, just like ticked articles, in other @sc{imap} clients. (In other
+words, Gnus has two ``Tick'' marks and @sc{imap} has only one.)
 
 Probably the only reason for frobing this would be if you're trying
 enable per-user persistant dormant flags, using something like:
@@ -14698,7 +14909,7 @@ as ticked for other users.
 @cindex Expunging
 @vindex nnimap-expunge-search-string
 
-This variable contain the IMAP search command sent to server when
+This variable contain the @sc{imap} search command sent to server when
 searching for articles eligible for expiring.  The default is
 @code{"UID %s NOT SINCE %s"}, where the first @code{%s} is replaced by
 UID set and the second @code{%s} is replaced by a date.
@@ -14727,7 +14938,7 @@ variable @code{nntp-authinfo-file} for exact syntax; also see
 
 
 @node Splitting in IMAP
-@subsection Splitting in @sc{imap}
+@subsection Splitting in IMAP
 @cindex splitting imap mail
 
 Splitting is something Gnus users has loved and used for years, and now
@@ -14882,7 +15093,7 @@ Nnmail equivalent: @code{nnmail-split-fancy}.
 @end table
 
 @node Editing IMAP ACLs
-@subsection Editing @sc{imap} ACLs
+@subsection Editing IMAP ACLs
 @cindex editing imap acls
 @cindex Access Control Lists
 @cindex Editing @sc{imap} ACLs
@@ -15078,13 +15289,46 @@ Forwarded articles.
 Netscape mail boxes.
 
 @item mime-parts
-MIME multipart messages.
+@sc{mime} multipart messages.
 
 @item standard-digest
 The standard (RFC 1153) digest format.
 
+@item mime-digest
+A @sc{mime} digest of messages.
+
+@item lanl-gov-announce
+Announcement messages from LANL Gov Announce.
+
+@item rfc822-forward
+A message forwarded according to RFC822.
+
+@item outlook
+The Outlook mail box.
+
+@item oe-dbx
+The Outlook Express dbx mail box.
+
+@item exim-bounce
+A bounce message from the Exim MTA.
+
+@item forward
+A message forwarded according to informal rules.
+
+@item rfc934
+An RFC934-forwarded message.
+
+@item mailman
+A mailman digest.
+
+@item clari-briefs
+A digest of Clarinet brief news items.
+
 @item slack-digest
 Non-standard digest format---matches most things, but does it badly.
+
+@item mail-in-mail
+The last resort.
 @end table
 
 You can also use the special ``file type'' @code{guess}, which means
@@ -15115,8 +15359,8 @@ Virtual server variables:
 This should be one of @code{mbox}, @code{babyl}, @code{digest},
 @code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
 @code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
-@code{slack-digest}, @code{clari-briefs}, @code{nsmail},
-@code{outlook}, @code{oe-dbx}, and @code{mailman} or @code{guess}.
+@code{slack-digest}, @code{clari-briefs}, @code{nsmail}, @code{outlook},
+@code{oe-dbx}, @code{mailman}, and @code{mail-in-mail} or @code{guess}.
 
 @item nndoc-post-type
 @vindex nndoc-post-type
@@ -15440,7 +15684,7 @@ Regular expression matching @sc{soup} reply packets in
 
 
 @node SOUP Groups
-@subsubsection @sc{soup} Groups
+@subsubsection SOUP Groups
 @cindex nnsoup
 
 @code{nnsoup} is the back end for reading @sc{soup} packets.  It will
@@ -15798,11 +16042,11 @@ that has full connection to the net.  Go ahead.  I'll still be waiting
 here.
 
 @item
-Then, put the following magical incantation at the end of your
-@file{.gnus.el} file:
+Then, put the following magical incantation in your @file{.gnus.el}
+file:
 
 @lisp
-(gnus-agentize)
+(setq gnus-agent t)
 @end lisp
 @end itemize
 
@@ -16032,10 +16276,10 @@ with the predicate then defined as:
 
 or you could append your predicate to the predefined
 @code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
-wherever.  (Note: this would have to be at a point *after*
-@code{gnus-agent} has been loaded via @code{(gnus-agentize)})
+wherever. 
 
 @lisp
+(require 'gnus-agent)
 (setq  gnus-category-predicate-alist
   (append gnus-category-predicate-alist
         '((old . my-article-old-p))))
@@ -16448,11 +16692,15 @@ If you use the list form, the last element must always be the default
 method---it must always match all groups.
 
 @vindex gnus-agent-expire-all
-if @code{gnus-agent-expire-all} is non-@code{nil}, this command will
+If @code{gnus-agent-expire-all} is non-@code{nil}, this command will
 expire all articles---unread, read, ticked and dormant.  If @code{nil}
 (which is the default), only read articles are eligible for expiry, and
 unread, ticked and dormant articles will be kept indefinitely.
 
+@findex gnus-agent-regenerate
+If you find that some articles eligible for expiry are never expired,
+perhaps some Gnus Agent files are corrupted.  There's a special
+@code{gnus-agent-regenerate} command to fix possible problems.
 
 @node Agent and IMAP
 @subsection Agent and IMAP
@@ -16552,7 +16800,7 @@ Hook run when after finishing fetching articles.
 
 @item gnus-agent-cache
 @vindex gnus-agent-cache
-Variable to control whether use the locally stored NOV and articles when
+Variable to control whether use the locally stored @sc{nov} and articles when
 plugged.
 
 @item gnus-agent-go-online
@@ -16587,7 +16835,8 @@ setup, you may be able to use something like the following as your
 (setq gnus-secondary-select-methods '((nnml "")))
 
 ;;; Make Gnus into an offline newsreader.
-(gnus-agentize)
+;;; (gnus-agentize) ; The obsolete setting.
+(setq gnus-agent t)
 @end lisp
 
 That should be it, basically.  Put that in your @file{~/.gnus.el} file,
@@ -16732,6 +16981,11 @@ Display the score of the current article
 Display all score rules that have been used on the current article
 (@code{gnus-score-find-trace}).
 
+@item V w
+@kindex V w (Summary)
+@findex gnus-score-find-favourite-words
+List words used in scoring (@code{gnus-score-find-favourite-words}).
+
 @item V R
 @kindex V R (Summary)
 @findex gnus-summary-rescore
@@ -16828,6 +17082,10 @@ Score on the number of lines.
 @item i
 Score on the @code{Message-ID} header.
 
+@item e
+Score on an "extra" header, that is, one of those in gnus-extra-headers,
+if your @sc{nntp} server tracks additional header data in overviews.
+
 @item f
 Score on followups---this matches the author name, and adds scores to
 the followups to this author.  (Using this key leads to the creation of
@@ -16896,9 +17154,10 @@ Greater than number.
 @end table
 
 @item
-The fourth and final key says whether this is a temporary (i.e., expiring)
-score entry, or a permanent (i.e., non-expiring) score entry, or whether
-it is to be done immediately, without adding to the score file.
+The fourth and usually final key says whether this is a temporary (i.e.,
+expiring) score entry, or a permanent (i.e., non-expiring) score entry,
+or whether it is to be done immediately, without adding to the score
+file.
 @table @kbd
 
 @item t
@@ -16911,6 +17170,11 @@ Permanent score entry.
 Immediately scoring.
 @end table
 
+@item
+If you are scoring on `e' (extra) headers, you will then be prompted for
+the header name on which you wish to score.  This must be a header named
+in gnus-extra-headers, and @samp{TAB} completion is available.
+
 @end enumerate
 
 So, let's say you want to increase the score on the current author with
@@ -17228,6 +17492,18 @@ one-letter types are really just abbreviations for the @code{regexp},
 @code{string}, @code{exact}, and @code{word} types, which you can use
 instead, if you feel like.
 
+@item Extra
+Just as for the standard string overview headers, if you are using
+gnus-extra-headers, you can score on these headers' values.  In this
+case, there is a 5th element in the score entry, being the name of the
+header to be scored.  The following entry is useful in your
+@file{all.SCORE} file in case of spam attacks from a single origin host,
+if your @sc{nntp} server tracks NNTP-Posting-Host in overviews:
+
+@lisp
+("111.222.333.444" -1000 nil s "NNTP-Posting-Host")
+@end lisp
+
 @item Lines, Chars
 These two headers use different match types: @code{<}, @code{>},
 @code{=}, @code{>=} and @code{<=}.
@@ -20367,7 +20643,7 @@ This says that all mail to this address is suspect, but if it has a
 header, it's probably ok.  All the rest goes to the @samp{spam} group.
 (This idea probably comes from Tim Pierce.)
 
-In addition, many mail spammers talk directly to your @code{smtp} server
+In addition, many mail spammers talk directly to your @sc{smtp} server
 and do not include your email address explicitly in the @code{To}
 header.  Why they do this is unknown---perhaps it's to thwart this
 thwarting scheme?  In any case, this is trivial to deal with---you just
@@ -20797,7 +21073,7 @@ look into implementing the changes when the draft is accepted as an RFC.
 
 @item MIME - RFC 2045-2049 etc
 @cindex MIME
-All the various MIME RFCs are supported.
+All the various @sc{mime} RFCs are supported.
 
 @item Disposition Notifications - RFC 2298
 Message Mode is able to request notifications from the receiver.
@@ -20807,25 +21083,25 @@ Message Mode is able to request notifications from the receiver.
 @cindex RFC 2440
 RFC 1991 is the original PGP message specification, published as a
 Information RFC.  RFC 2440 was the follow-up, now called Open PGP, and
-put on the Standards Track.  Both document a non-MIME aware PGP
+put on the Standards Track.  Both document a non-@sc{mime} aware PGP
 format.  Gnus supports both encoding (signing and encryption) and
 decoding (verification and decryption).
 
 @item PGP/MIME - RFC 2015/3156
 RFC 2015 (superceded by 3156 which references RFC 2440 instead of RFC
-1991) describes the MIME-wrapping around the RF 1991/2440 format.
+1991) describes the @sc{mime}-wrapping around the RF 1991/2440 format.
 Gnus supports both encoding and decoding.
 
 @item S/MIME - RFC 2633
-RFC 2633 describes the S/MIME format.
+RFC 2633 describes the @sc{s/mime} format.
 
 @item IMAP - RFC 1730/2060, RFC 2195, RFC 2086, RFC 2359, RFC 2595, RFC 1731
-RFC 1730 is IMAP version 4, updated somewhat by RFC 2060 (IMAP 4
-revision 1).  RFC 2195 describes CRAM-MD5 authentication for IMAP. RFC
-2086 describes access control lists (ACLs) for IMAP. RFC 2359
-describes a IMAP protocol enhancement.  RFC 2595 describes the proper
-TLS integration (STARTTLS) with IMAP.  RFC 1731 describes the
-GSSAPI/Kerberos4 mechanisms for IMAP.
+RFC 1730 is @sc{imap} version 4, updated somewhat by RFC 2060 (@sc{imap} 4
+revision 1).  RFC 2195 describes CRAM-MD5 authentication for @sc{imap}. RFC
+2086 describes access control lists (ACLs) for @sc{imap}. RFC 2359
+describes a @sc{imap} protocol enhancement.  RFC 2595 describes the proper
+TLS integration (STARTTLS) with @sc{imap}.  RFC 1731 describes the
+GSSAPI/Kerberos4 mechanisms for @sc{imap}.
 
 @end table
 
@@ -21915,7 +22191,7 @@ More information is available in the info doc at Select Methods ->
 Getting Mail -> Mail Sources
 
 @item
-Gnus is now a MIME-capable reader.  This affects many parts of
+Gnus is now a @sc{mime}-capable reader.  This affects many parts of
 Gnus, and adds a slew of new commands.  See the manual for details.
 
 @item
@@ -21928,7 +22204,7 @@ called to position point.
 
 @item
 The user can now decide which extra headers should be included in
-summary buffers and NOV files.
+summary buffers and @sc{nov} files.
 
 @item
 @code{gnus-article-display-hook} has been removed.  Instead, a number
@@ -21944,7 +22220,7 @@ New web-based back ends have been added: @code{nnslashdot},
 again, to keep up with ever-changing layouts.
 
 @item
-Gnus can now read IMAP mail via @code{nnimap}.
+Gnus can now read @sc{imap} mail via @code{nnimap}.
 
 @end itemize
 
@@ -22241,7 +22517,7 @@ for some quite common situations.
 
 
 @node Slow/Expensive Connection
-@subsection Slow/Expensive @sc{nntp} Connection
+@subsection Slow/Expensive NNTP Connection
 
 If you run Emacs on a machine locally, and get your news from a machine
 over some very thin strings, you want to cut down on the amount of data
@@ -22301,21 +22577,6 @@ want to read them anyway.
 If this is non-@code{nil}, all threads in the summary buffer will be
 hidden initially.
 
-This can also be a predicate specifier (@pxref{Predicate Specifiers}).
-Avaliable predicates are @code{gnus-article-unread-p} and
-@code{gnus-article-unseen-p}.
-
-Here's an example:
-
-@lisp
-(setq gnus-thread-hide-subtree
-      '(or gnus-article-unread-p
-           gnus-article-unseen-p))
-@end lisp
-
-(It's a pretty nonsensical example, since all unseen articles are also
-unread, but you get my drift.)
-
 
 @item gnus-updated-mode-lines
 If this is @code{nil}, Gnus will not put information in the buffer mode
@@ -22697,10 +22958,10 @@ In the examples and definitions I will refer to the imaginary back end
 sequences (lists) of article numbers, and most back ends do not support
 retrieval of @code{Message-ID}s.  But they should try for both.
 
-The result data should either be HEADs or NOV lines, and the result
+The result data should either be HEADs or @sc{nov} lines, and the result
 value should either be @code{headers} or @code{nov} to reflect this.
 This might later be expanded to @code{various}, which will be a mixture
-of HEADs and NOV lines, but this is currently not supported by Gnus.
+of HEADs and @sc{nov} lines, but this is currently not supported by Gnus.
 
 If @var{fetch-old} is non-@code{nil} it says to try fetching "extra
 headers", in some meaning of the word.  This is generally done by
@@ -22846,7 +23107,9 @@ number of articles may be less than one might think while just
 considering the highest and lowest article numbers, but some articles
 may have been canceled.  Gnus just discards the total-number, so
 whether one should take the bother to generate it properly (if that is a
-problem) is left as an exercise to the reader.
+problem) is left as an exercise to the reader.  If the group contains no
+articles, the lowest article number should be reported as 1 and the
+highest as 0.
 
 @example
 group-status = [ error / info ] eol
@@ -22876,7 +23139,9 @@ ifi.discussion 3324 3300 n
 @end example
 
 On each line we have a group name, then the highest article number in
-that group, the lowest article number, and finally a flag.
+that group, the lowest article number, and finally a flag.  If the group
+contains no articles, the lowest article number should be reported as 1
+and the highest as 0.
 
 @example
 active-file = *active-line
@@ -23054,9 +23319,9 @@ It is okay for this function to return `too many' groups; some back ends
 might find it cheaper to return the full list of groups, rather than
 just the new groups.  But don't do this for back ends with many groups.
 Normally, if the user creates the groups herself, there won't be too
-many groups, so nnml and the like are probably safe.  But for back ends
-like nntp, where the groups have been created by the server, it is quite
-likely that there can be many groups.
+many groups, so @code{nnml} and the like are probably safe.  But for
+back ends like @code{nntp}, where the groups have been created by the
+server, it is quite likely that there can be many groups.
 
 
 @item (nnchoke-request-create-group GROUP &optional SERVER)
@@ -23391,9 +23656,9 @@ The user should be prompted for an address when doing commands like
 @subsubsection Mail-like Back Ends
 
 One of the things that separate the mail back ends from the rest of the
-back ends is the heavy dependence by the mail back ends on common
-functions in @file{nnmail.el}.  For instance, here's the definition of
-@code{nnml-request-scan}:
+back ends is the heavy dependence by most of the mail back ends on
+common functions in @file{nnmail.el}.  For instance, here's the
+definition of @code{nnml-request-scan}:
 
 @lisp
 (deffoo nnml-request-scan (&optional group server)
diff --git a/texi/gnuslogo-booklet.eps b/texi/gnuslogo-booklet.eps
new file mode 100644 (file)
index 0000000..95408ba
--- /dev/null
@@ -0,0 +1,1055 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: gnuslogo1.ps
+%%Creator: XV Version 3.00  Rev: 3/30/93  -  by John Bradley
+%%BoundingBox: 0 0 493 505
+%%Pages: 1
+%%DocumentFonts:
+%%EndComments
+%%EndProlog
+
+%%Page: 1 1
+
+% remember original state
+/origstate save def
+
+% build a temporary dictionary
+20 dict begin
+
+% define string to hold a scanline's worth of data
+/pix 62 string def
+
+% lower left corner
+0 0 translate
+
+% size of image (on paper, in 1/72inch coords)
+493.0 505.0 scale
+
+% dimensions of data
+493 505 1
+
+% mapping matrix
+[493 0 0 -505 0 505]
+
+{currentfile pix readhexstring pop}
+image
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff01fffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff8003ffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff0000ffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff8000007ffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff0000003ffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffe0000000ffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff000000003fff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff000000000fff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffc0000000007ff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff80000000003ff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff00000000001ff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffe00000000000ff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffc00000000000ff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffff8000000000007f8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffff0000000000003f8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffff0000000000003f8
+fffffffffffffffffffffffffff800ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffe0000000000001f8
+fffffffffffffffffffffffffff0001fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffc0000000000000f8
+ffffffffffffffffffffffffffc00007ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffc0000000000000f8
+ffffffffffffffffffffffffff000001ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff8000000000000078
+fffffffffffffffffffffffffe0000003ffffffffffff0001fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff0000000000000038
+fffffffffffffffffffffffffc0000001fffffffffffe00007ffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffe0000000000000038
+fffffffffffffffffffffffff800000007ffffffffff800001ffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffe0000000000000038
+fffffffffffffffffffffffff000000003fffffffffe0000003fffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffc0000000000000018
+ffffffffffffffffffffffffe000000001fffffffff80000000fffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffc0000000000000018
+ffffffffffffffffffffffffc000000000ffffffffe000000003ffffffffffffffffffff
+fffffffffffffffffffffffffffffffffff80000000000000018
+ffffffffffffffffffffffff80000000007fffffff8000000000ffffffffffffffffffff
+fffffffffffffffffffffffffffffffffff80000000000000008
+ffffffffffffffffffffffff00000000003fffffff00000000007fffffffffffffffffff
+fffffffffffffffffffffffffffffffffff00000000000000008
+fffffffffffffffffffffffe00000000001ffffffe00000000001fffffffffffffffffff
+fffffffffffffffffffffffffffffffffff00000000000000008
+fffffffffffffffffffffffc00000000000ffffff8000000000007ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffe00000000000000008
+fffffffffffffffffffffff8000000000007fffff0000000000007ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffe00000000000000008
+fffffffffffffffffffffff0000000000001ffffe0000000000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffc00000000000000000
+ffffffffffffffffffffffe0000000000000ffffc00000000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffc00000000000000000
+ffffffffffffffffffffffc00000000000007fff800000000000001fffffffffffffffff
+ffffffffffffffffffffffffffffffffff800000000000000000
+ffffffffffffffffffffff800000000000003fff000000000000000fffffffffffffffff
+ffffffffffffffffffffffffffffffffff800000000000000000
+ffffffffffffffffffffff000000000000003fff0000000000000007ffffffffffffffff
+ffffffffffffffffffffffffffffffffff000040000000000000
+fffffffffffffffffffffe000000000000000ffe0000000000000001ffffffffffffffff
+ffffffffffffffffffffffffffffffffff0007ffc00000000000
+fffffffffffffffffffffc000000000000000ffc0000000000000000ffffffffffffffff
+fffffffffffffffffffffffffffffffffe001ffffc0000000000
+fffffffffffffffffffffc0000000000000007fc00000000000000007fffffffffffffff
+fffffffffffffffffffffffffffffffffc003ffffe0000000000
+fffffffffffffffffffff80000000000000007f800000000000000003fffffffffffffff
+fffffffffffffffffffffffffffffffffc007fffffc000000000
+fffffffffffffffffffff00000000000000001f000000000000000001fffffffffffffff
+fffffffffffffffffffffffffffffffff800fffffff000000000
+ffffffffffffffffffffe00000000000000001f000000000000000000fffffffffffffff
+fffffffffffffffffffffffffffffffff801fffffff800000000
+ffffffffffffffffffffc00000000000000000e0000000000000000007ffffffffffffff
+fffffffffffffffffffffffffffffffff003ffffffff00000000
+ffffffffffffffffffff800000000000000000c0000000000000000003ffffffffffffff
+fffffffffffffffffffffffffffffffff007ffffffff00000000
+ffffffffffffffffffff00000000000000000000000000000000000000ffffffffffffff
+ffffffffffffffffffffffffffffffffe00fffffffff80000000
+fffffffffffffffffffe00000000000000000000000000000000000000ffffffffffffff
+ffffffffffffffffffffffffffffffffe01fffffffffc0000008
+fffffffffffffffffffc000000000000000000000000000000000000007fffffffffffff
+ffffffffffffffffffffffffffffffffc03fffffffffc0000008
+fffffffffffffffffff8000000000000000000000000000000000000001fffffffffffff
+ffffffffffffffffffffffffffffffffc07ffffffffff0000000
+fff9fffffffffffffff800000fe00000000000000000000000000000001fffffffffffff
+ffffffffffffffffffffffffffffffff807ffffffffff0000000
+fff9fffffffffffffff000001ff80000000000000000000000000000000fffffffffffff
+ffffffffffffffffffffffffffffffff80fffffffffff0000008
+fff0ffffffffffffffc000007ffc00000000000000000000000000000007ffffffffffff
+ffffffffffffffffffffffffffffffff81fffffffffff8000008
+fff0ffffffffffffffc00000fffc00000000000000000000000000000003ffffffffffff
+ffffffffffffffffffffffffffffffff01fffffffffff8000008
+ffe07fffffffffffff800001ffff00000000000000000000000000000001ffffffffffff
+ffffffffffffffffffffffffffffffff03fffffffffffc000008
+ffe07fffffffffffff00000fffffc0000000000000000000000000000000ffffffffffff
+fffffffffffffffffffffffffffffffe03fffffffffffc000008
+ffe03ffffffffffffc00001fffffe00000000000000000000000000000007fffffffffff
+fffffffffffffffffffffffffffffffe07fffffffffffe000008
+ffe03ffffffffffff800003ffffff00000000000000000000000000000003fffffffffff
+fffffffffffffffffffffffffffffffe07fffffffffffe000008
+ffc03ffffffffffff000007ffffff80000000000000f80000000000000003fffffffffff
+fffffffffffffffffffffffffffffffe0ffffffffffffe000008
+ffc01fffffffffffe00001fffffffe000000000000fffe000000000000001fffffffffff
+fffffffffffffffffffffffffffffffc0ffffffffffffe000008
+ffc00fffffffffffc00003ffffffff000000000001ffff800000000000000fffffffffff
+fffffffffffffffffffffffffffffffc1fffffffffffff000008
+ff800fffffffffff800003ffffffff800000000007ffffc000000000000007ffffffffff
+fffffffffffffffffffffffffffffffc3fffffffffffff000008
+ff8007fffffffffe00000fffffffffc0000000001ffffffc00000000000003ffffffffff
+fffffffffffffffffffffffffffffff87fffffffffffff000008
+ff8007fffffffffc00000fffffffffe0000000005ffffffe00000000000001ffffffffff
+fffffffffffffffffffffffffffffff87fffffffffffff000008
+ff8003fffffffff800001ffffffffff000000000ffffffffc0000000000000ffffffffff
+fffffffffffffffffffffffffffffff87fffffffffffff000008
+ff0001fffffffff000003ffffffffffc00000007fffffffff80000000000007fffffffff
+fffffffffffffffffffffffffffffff8ffffffffffffff000008
+ff0000ffffffffe000003ffffffffffc0000000ffffffffffc0000000000007fffffffff
+fffffffffffffffffffffffffffffffcffffffffffffff000008
+fe00007fffffff800000ffffffffffff0000001ffffffffffe0000000000001fffffffff
+ffffffffffffffffffffffffffffe7fdffffffffffffff000008
+fe00007fffffff000001ffffffffffff8000003fffffffffff0000000000001fffffffff
+ffffffffffffffffffffffffffffe7fdffffffffffffff000008
+fc00001ffffffc000003ffffffffffffc000007fffffffffffe0000000000007ffffffff
+ffffffffffffffffffffffffffffc7ffffffffffffffff000008
+fc00001ffffff0000003ffffffffffffe00000fffffffffffff0000000000007ffffffff
+fffffffffeffffffffffffffffff87ffffffffffffffff000008
+f800000fffffe0000007fffffffffffff00000fffffffffffff8000000000003ffffffff
+fffffffffcffffffffffffffffff87ffffffffffffffff000008
+f8000003ffff0000000ffffffffffffff80001fffffffffffffc000000000001ffffffff
+fffffffff8ffffffffffffffffff07ffffffffffffffff000008
+f8000001fffe0000001ffffffffffffff80001ffffffffffffff000000000000ffffffff
+fffffffff8fffffffffffffffffe0fffffffffffffffff000008
+f0000000fff00000003ffffffffffffffc0001ffffffffffffff8000000000007fffffff
+fffffffff0fffffffffffffffffe0fffffffffffffffff000018
+e00000001a000000007ffffffffffffffe0003ffffffffffffffc000000000003fffffff
+fffffffff0fffffffffffffffffc0fffffffffffffffff000018
+e000000000000000007fffffffffffffff0003ffffffffffffffc000000000003fffffff
+ffffffffe0fffffffffffffffffc1fffffffffffffffff000018
+c00000000000000000ffffffffffffffff0007ffffffffffffffe000000000001fffffff
+ffffffffe0fffffffffffffffff81fffffffffffffffff000018
+c00000000000000001ffffffffffffffff0007fffffffffffffff0000000000007ffffff
+ffffffffc0fffffffffffffffff83fffffffffffffffff000018
+800000000000000007ffffffffffffffff800ffffffffffffffffc000000000003ffffff
+ffffffff01fffffffffffffffff03fffffffffffffffff000038
+800000000000000007ffffffffffffffff800ffffffffffffffffe000000000001ffffff
+ffffffff01fffffffffffffffff03fffffffffffffffff800038
+00000000000000000fffffffffffffffffc00fffffffffffffffff000000000000ffffff
+fffffffe03ffffffffffffffffe07fffffffffffffffff800038
+00000000000000001fffffffffffffffffc01fffffffffffffffff8000000000007fffff
+fffffffc03ffffffffffffffffe07fffffffffffffffff800038
+00000000000000003fffffffffffffffffe03fffffffffffffffffc000000000003fffff
+fffffff803ffffffffffffffffc07fffffffffffffffff800038
+00000000000000007ffffffffffffffffff03fffffffffffffffffe000000000000fffff
+fffffff007ffffffffffffffffc0ffffffffffffffffff800038
+0000000000000000fffffffffffffffffff07ffffffffffffffffff000000000000fffff
+fffffff007ffffffffffffffff80ffffffffffffffffff800078
+0000000000000003ffffffffffffffff8ff87ffffffffffffffffff8000000000001ffff
+ffffffc00fffffffffffffffff81ffffffffffffffffff800078
+8000000000000007ffffffffffffffff0ff8fffffffffffffffffffc000000000000ffff
+ffffffc00fffffffffffffffff01ffffffffffffffffff8000f8
+8000000000000007fffffffffffffffe0ffffffffffffffffffffffe0000000000007fff
+ffffff801fffffffffffffffff03ffffffffffffffffff8000f8
+c00000000000001ffffffffffffffffc0fffffffffffffffffffffff0000000000001fff
+fffffe001ffffffffffffffffe07ffffffffffffffffff8000f8
+e00000000000007ffffffffffffffff83fffffffffffffffffffffffc0000000000007ff
+fffff8003ffffffffffffffffc07ffffffffffffffffff8000f8
+f00000000000007ffffffffffffffff03fffffffffffffffffffffffc0000000000001ff
+fffff0003ffffffffffffffff80fffffffffffffffffff8000f8
+f0000000000000fffffffffffffffff07fffffffffffffffffffffffe0000000000000ff
+ffffe0003ffffffffffffffff00fffffffffffffffffff8001f8
+f8000000000003ffffffffffffffffe07ffffffffffffffffffffffff00000000000000f
+ffff00007fffffffffffffffe01fffffffffffffffffff0001f8
+fc000000000007ffffffffffffffffc07ffffffffffffffffffffffff800000000000007
+fffc00007fffffffffffffffc01fffffffffffffffffff0001f8
+fc000000000007ffffffffffffffffc0fffffffffffffffffffffffff800000000000000
+ffe000007ffffbffffffffff801fffffffffffffffffff0001f8
+fe00000000001fffffffffffffffff03fffffffffffffffffffffffffe00000000000000
+00000000fffff3ffffffffff003fffffffffffffffffff0001f8
+fe00000000003fffffffffffffffff03ffffffffffffffffffffffffff00000000000000
+00000001fffff1fffffffffe003fffffffffffffffffff0003f8
+ff00000000007ffffffffffffffffe03ffffffffffffffffffffffffff00000000000000
+00000001ffffe1fffffffffc007fffffffffffffffffff0003f8
+ff8000000001fffffffffffffffffc07ffffffffffffffffffffffffff80000000000000
+00000003ffffe0fffffffff0007fffffffffffffffffff0003f8
+ffc000000003fffffffffffffffffc0fffffffffffffffffffffffffffc0000000000000
+00000003ffffc0ffffffffe0007fffffffffffffffffff0003f8
+ffe00000000ffffffffffffffffff81fffffffffffffffffffffffffffe0000000000000
+00000007ffffc07fffffff8000ffffffffffffffffffff0003f8
+fff00000003ffffffffffffffffff01ffffffffffffffffffffffffffff0000000000000
+00000007ffff803fffffff0000fffffffffffffffffffe0007f8
+fff8000000ffffffffffffffffffe03ffffffffffffffffffffffffffff8000000000000
+00000007ffff801ffffffc0001fffffffffffffffffffe0007f8
+fffc000001ffffffffffffffffffe07ffffffffffffffffffffffffffffc000000000000
+0000000fffff000ffffff80003fffffffffffffffffffe0007f8
+fffe00000fffffffffffffffffffc07ffffffffffffffffffffffffffffc000000000000
+0000000fffff0007ffffe00003fffffffffffffffffffe0007f8
+ffff80007fffffffffffffffffff80fffffffffffffffffffffffffffffe000000000000
+0000001ffffe0001ffff800007fffffffffffffffffffe000ff8
+ffffe007ffffffffffffffffffff80ffffffffffffffffffffffffffffff000000000000
+0000001ffffe0000fffc000007fffffffffffffffffffe000ff8
+ffffffffffffffffffffffffffff01ffffffffffffffffffffffffffffff800000000000
+0000003ffffe0000000000000ffffffffffffffffffffe000ff8
+fffffffffffffffffffffffffffe03ffffffffffffffffffffffffffffffc00000000000
+0000003ffffc0000000000000ffffffffffffffffffffe000ff8
+fffffffffffffffffffffffffffe03ffffffffffffffffffffffffffffffe00000000000
+0000007ffff80000000000001ffffffffffffffffffffe001ff8
+fffffffffffffffffffffffffffc07fffffffffffffffffffffffffffffff00000000000
+0000007ffff80000000000001ffffffffffffffffffffe001ff8
+fffffffffffffffffffffffffff807fffffffffffffffffffffffffffffff80000000000
+000000fffff80000000000003ffffffffffffffffffffc001ff8
+fffffffffffffffffffffffffff80ffffffffffffffffffffffffffffffffc0000000000
+000003fffff00000000000007ffffffffffffffffffffc001ff8
+fffffffffffffffffffffffffff01ffffffffffffffffffffffffffffffffe0000000000
+000007ffffe00000000000007ffffffffffffffffffffe003ff8
+fffffffffffffffffffffffffff01fffffffffffffffffffffffffffffffff0000000000
+000007ffffe0000000000000fffffffffffffffffffffc003ff8
+ffffffffffffffffffffffffffc07fffffffffffffffffffffffffffffffff8000000000
+00001fffffc0000000000001fffffffffffffffffffffc003ff8
+ffffffffffffffffffffffffffc07fffffffffffffffffffffffffffffffffe000000000
+00001fffffc0000000000003fffffffffffffffffffffc003ff8
+ffffffffffffffffffffffffffc07ffffffffffffffffffffffffffffffffff000000000
+00003fffff80000000000003fffffffffffffffffffffc007ff8
+ffffffffffffffffffffffffff01fffffffffffffffffffffffffffffffffff800000000
+00007fffff80000000000007fffffffffffffffffffffc007ff8
+ffffffffffffffffffffffffff03fffffffffffffffffffffffffffffffffffc00000000
+0000ffffff0000000000000ffffffffffffffffffffffc007ff8
+fffffffffffffffffffffffffe03fffffffffffffffffffffffffffffffffffc00000000
+0001ffffff0000000000001ffffffffffffffffffffffc007ff8
+fffffffffffffffffffffffffc07ffffffffffffffffffffffffffffffffffff00000000
+0003fffffe0000000000001ffffffffffffffffffffff800fff8
+fffffffffffffffffffffffff80fffffffffffffffffffffffffffffffffffff80000000
+0007fffffe0000000000003ffffffffffffffffffffff800fff8
+fffffffffffffffffffffffff01ffffffffffffffffffffffffffffffffffffff0000000
+001ffffffc0000000000007ffffffffffffffffffffff800fff8
+fffffffffffffffffffffffff03ffffffffffffffffffffffffffffffffffffff8000000
+003ffffffc000000000000fffffffffffffffffffffff800fff8
+ffffffffffffffffffffffffe07ffffffffffffffffffffffffffffffffffffffe000000
+00fffffff8000000000003fffffffffffffffffffffff001fff8
+ffffffffffffffffffffffffe07fffffffffffffffffffffffffffffffffffffff800000
+03fffffff8000000000003fffffffffffffffffffffff001fff8
+ffffffffffffffffffffffffc0ffffffffffffffffffffffffffffffffffffffffc00000
+07fffffff0000000000007fffffffffffffffffffffff001fff8
+ffffffffffffffffffffffff80fffffffffffffffffffffffffffffffffffffffffc0000
+3ffffffff000000000000ffffffffffffffffffffffff003fff8
+ffffffffffffffffffffffff01ffffffffffffffffffffffffffffffffffffffffffe03f
+fffffffff000000000003ffffffffffffffffffffffff003fff8
+ffffffffffffffffffffffff01ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffff800000000007ffffffffffffffffffffffff003fff8
+fffffffffffffffffffffffe03ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffff80000000000ffffffffffffffffffffffffe003fff8
+fffffffffffffffffffffffc07ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffc0000000003ffffffffffffffffffffffffe007fff8
+fffffffffffffffffffffffc0fffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffe0000000007ffffffffffffffffffffffffe007fff8
+fffffffffffffffffffffff81fffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffe000000000fffffffffffffffffffffffffe00ffff8
+fffffffffffffffffffffff01fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000001fffffffffffffffffffffffffe00ffff8
+ffffffffffffffffffffffe03ffffffffffffffffffffffffbffffffffffffffffffffff
+ffffffffff800000007fffffffffffffffffffffffffc00ffff8
+ffffffffffffffffffffffe07ffffffffffffffffffdfffff1ffffffffffffffffffffff
+ffffffffffc0000000ffffffffffffffffffffffffffc00ffff8
+ffffffffffffffffffffffe07ffffffffffffffffff9fffff07fffffffffffffffffffff
+ffffffffffe0000001ffffffffffffffffffffffffffc00ffff8
+ffffffffffffffffffffffc0ffffffffffffffffffe3ffffe03fffffffffffffffffffff
+fffffffffff800001fffffffffffffffffffffffffffc01ffff8
+ffffffffffffffffffffff81ffffffffffffffffffc7ffffc00fffffffffffffffffffff
+fffffffffffe00007fffffffffffffffffffffffffffc01ffff8
+ffffffffffffffffffffff81ffffffffffffffffff87ffffc007ffffffffffffffffffff
+ffffffffffff8003ffffffffffffffffffffffffffff801ffff8
+ffffffffffffffffffffff03ffffffffffffffffff0fffff8007ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff803ffff8
+fffffffffffffffffffffe07fffffffffffffffffe0fffff8001ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff803ffff8
+fffffffffffffffffffffe07fffffffffffffffffc1fffff0000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff803ffff8
+fffffffffffffffffffffc0ffffffffffffffffff83ffffe00007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff007ffff8
+fffffffffffffffffffff81fffffffffffffffffe03ffffe00007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff007ffff8
+fffffffffffffffffffff83fffffffffffffffffc07ffffc00003fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff007ffff8
+fffffffffffffffffffff03fffffffffffffffff80fffff800001fffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffe00fffff8
+ffffffffffffffffffffe07fffffffffffffffff00fffff800000fffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffe00fffff8
+ffffffffffffffffffffe0fffffffffffffffffe01fffff0000007ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffe00fffff8
+ffffffffffffffffffffc0fffffffffffffffffc01ffffe0000003ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffe00fffff8
+ffffffffffffffffffff81fffffffffffffffff803ffffe0000003ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffe01fffff8
+ffffffffffffffffffff81ffffffffffffffffe007ffffc0000003ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffc01fffff8
+ffffffffffffffffffff83ffffffffffffffffe007ffffc0000001ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffc01fffff8
+ffffffffffffffffffff07ffffffffffffffff800fffff80000000ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffc01fffff8
+fffffffffffffffffffe07ffffffffffffffff800fffff00000000ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffc03fffff8
+fffffffffffffffffffc0ffffffffffffffffe001fffff00000000ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffff803fffff8
+fffffffffffffffffffc0ffffffffffffffffc003ffffe000000007fffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffff803fffff8
+fffffffffffffffffff81ffffffffffffffff0003ffffc000000007fffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffff007fffff8
+fffffffffffffffffff01fffffffffffffffe0007ffffc000000003fffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffff007fffff8
+fffffffffffffffffff03fffffffffffffffe000fffff8000000001fffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffff007fffff8
+ffffffffffffffffffe07fffffffffffffff8000fffff0000000001fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffe00ffffff8
+ffffffffffffffffffc07fffffffffffffff0001fffff0000000001fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffe00ffffff8
+ffffffffffffffffffc0fffffffffffffffe0001ffffe0000000000fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffe00ffffff8
+ffffffffffffffffff80fffffffffffffff80003ffffe0000000000fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffe01ffffff8
+ffffffffffffffffff81fffffffffffffff00007ffffc0000000000fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffc01ffffff8
+ffffffffffffffffff81ffffffffffffffe00007ffffc00000000007ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffc01ffffff8
+ffffffffffffffffff03ffffffffffffffc0000fffffc00000000007ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffc03ffffff8
+fffffffffffffffffe03ffffffffffffff00000fffffe00000000007ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff803ffffff8
+fffffffffffffffffc07fffffffffffffe00001ffffff00000000007ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff803ffffff8
+fffffffffffffffffc07fffffffffffffc00007ffffffc0000000007ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff807ffffff8
+fffffffffffffffff807fffffffffffff00001fffffffe0000000003ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff807ffffff8
+fffffffffffffffff807ffffffffffffe00003ffffffff0000000003ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff007ffffff8
+fffffffffffffffff00fffffffffffff800007ffffffff8000000003ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff00fffffff8
+fffffffffffffffff00fffffffffffff00000fffffffffc000000001ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff00fffffff8
+ffffffffffffffffe00ffffffffffffc00003fffffffffe000000001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffe01fffffff8
+ffffffffffffffffe00ffffffffffff800007ffffffffff000000001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffe01fffffff8
+ffffffffffffffffc00ffffffffffff00000fffffffffff800000001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffe01fffffff8
+ffffffffffffffff800fffffffffffc00001fffffffffffc00000001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffe03fffffff8
+ffffffffffffffff800fffffffffff000007fffffffffffe00000001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffe03fffffff8
+ffffffffffffffff001ffffffffffe00000fffffffffffff00000001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffc07fffffff8
+ffffffffffffffff001ffffffffffc00001fffffffffffff80000001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffc07fffffff8
+fffffffffffffffe000fffffffffe000003fffffffffffff80000001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff807fffffff8
+fffffffffffffffe000fffffffffc000007fffffffffffffc0000000ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff807fffffff8
+fffffffffffffffc000fffffffff800000ffffffffffffffe0000000ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff80ffffffff8
+fffffffffffffffc0007fffffffe000001fffffffffffffff0000000ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff80ffffffff8
+fffffffffffffffc0003fffffffc000003fffffffffffffff0000000ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff01ffffffff8
+fffffffffffffff80001fffffff8000007fffffffffffffff8000000ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff01ffffffff8
+fffffffffffffff80000ffffffc000001ffffffffffffffff8000000ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff01ffffffff8
+fffffffffffffff800003fffff0000003ffffffffffffffffc000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffe01ffffffff8
+fffffffffffffff000000000000000007ffffffffffffffffc000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffe03ffffffff8
+ffffffffffffffe00000000000000000fffffffffffffffffe000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffe03ffffffff8
+ffffffffffffffe00000000000000001fffffffffffffffffe000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc07ffffffff8
+ffffffffffffffc00000000000000003fffffffffffffffffe000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc07ffffffff8
+ffffffffffffffc00000000000000007ffffffffffffffffff000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc07ffffffff8
+ffffffffffffffc0000000000000000fffffffffffffffffff000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc0fffffffff8
+ffffffffffffff80000000000000003fffffffffffffffffff800000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc0fffffffff8
+ffffffffffffff80000000000000007fffffffffffffffffff800001ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff80fffffffff8
+ffffffffffffff8000000000000001ffffffffffffffffffff800001ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff81fffffffff8
+ffffffffffffff8000000000000001ffffffffffffffffffffc00001ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff81fffffffff8
+ffffffffffffff8000000000000003ffffffffffffffffffffe00001ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff01fffffffff8
+ffffffffffffff000000000000000fffffffffffffffffffffe00001ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff03fffffffff8
+ffffffffffffff000000000000001ffffffffffffffffffffff00001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffe03fffffffff8
+fffffffffffffe000000000000003ffffffffffffffffffffff00001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffe03fffffffff8
+fffffffffffffe000000000000007ffffffffffffffffffffff00001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffe03fffffffff8
+fffffffffffffc00000000000001fffffffffffffffffffffff00001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffe07fffffffff8
+fffffffffffffc00000000000007fffffffffffffffffffffff00001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffc07fffffffff8
+fffffffffffffc00000000000007fffffffffffffffffffffff00001ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffc07fffffffff8
+fffffffffffffc0000000000003ffffffffffffffffffffffff80003ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffc0ffffffffff8
+fffffffffffffc0000000000007ffffffffffffffffffffffff80003ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffc0ffffffffff8
+fffffffffffffc000000000000fffffffffffffffffffffffff80003ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff80ffffffffff8
+fffffffffffffc000000000003fffffffffffffffffffffffff80003ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff80ffffffffff8
+fffffffffffffc000000000007fffffffffffffffffffffffff80003ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff00ffffffffff8
+fffffffffffffc00000000001ffffffffffffffffffffffffff80007ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff01ffffffffff8
+fffffffffffffe00000000001ffffffffffffffffffffffffff80007ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff01ffffffffff8
+fffffffffffffe0000000000fffffffffffffffffffffffffff80007ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffe01ffffffffff8
+ffffffffffffff0000000001fffffffffffffffffffffffffff80007ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffe03ffffffffff8
+ffffffffffffff000000000ffffffffffffffffffffffffffff80007ffffffffffffffff
+fffffffffffffffffffdffffffffffffffffffe03ffffffffff8
+ffffffffffffff800000003ffffffffffffffffffffffffffff80007ffffffffffffffff
+fffffffffffffffffff9ffffffffffffffffffc03ffffffffff8
+ffffffffffffffe0000001fffffffffffffffffffffffffffff80007ffffffffffffffff
+fffffffffffffffffff1ffffffffffffffffff807ffffffffff8
+fffffffffffffff0000001fffffffffffffffffffffffffffff8000fffffffffffffffff
+fffffffffffffffffff1ffffffffffffffffff807ffffffffff8
+fffffffffffffff800000ffffffffffffffffffffffffffffffc000fffffffffffffffff
+fffffffffffffffffff1ffffffffffffffffff807ffffffffff8
+fffffffffffffffe0003fffffffffffffffffffffffffffffffc000fffffffffffffffff
+ffffffffffffffffffe1ffffffffffffffffff807ffffffffff8
+ffffffffffffffff4007fffffffffffffffffffffffffffffffc001fffffffffffffffff
+ffffffffffffffffffc1ffffffffffffffffff00fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc001fffffffffffffffff
+ffffffffffffffffff83ffffffffffffffffff00fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc001fffffffffffffffff
+ffffffffffffffffff83ffffffffffffffffff00fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc001fffffffffffffffff
+ffffffffffffffffff03ffffffffffffffffff00fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc001fffffffffffffffff
+ffffffffffffffffff03ffffffffffffffffff01fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc003fffffffffffffffff
+ffffffffffffffffff07ffffffffffffffffff01fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc003fffffffffffffffff
+fffffffffffffffffe07fffffffffffffffffe01fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc003fffffffffffffffff
+fffffffffffffffffc07fffffffffffffffffe03fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc007fffffffffffffffff
+fffffffffffffffffc07fffffffffffffffffc03fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc007fffffffffffffffff
+fffffffffffffffff80ffffffffffffffffffc03fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe007fffffffffffffffff
+fffffffffffffffff80ffffffffffffffffffc03fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe007fffffffffffffffff
+fffffffffffffffff80ffffffffffffffffffc03fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe00ffffffffffffffffff
+fffffffffffffffff03ffffffffffffffffff807fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe00ffffffffffffffffff
+ffffffffffffffffe01ffffffffffffffffff807fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe01ffffffffffffffffff
+ffffffffffffffffe03ffffffffffffffffff807fffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe01ffffffffffffffffff
+ffffffffffffffffc07ffffffffffffffffff00ffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe03ffffffffffffffffff
+ffffffffffffffffc07ffffffffffffffffff00ffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe03ffffffffffffffffff
+ffffffffffffffff80fffffffffffffffffff00ffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe07ffffffffffffffffff
+ffffffffffffffff80fffffffffffffffffff00ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff07ffffffffffffffffff
+ffffffffffffffff00ffffffffffffffffffe01ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff07ffffffffffffffffff
+fffffffffffffffe00ffffffffffffffffffe01ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff0fffffffffffffffffff
+fffffffffffffffe00ffffffffffffffffffe01ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff0fffffffffffffffffff
+fffffffffffffffc01ffffffffffffffffffc01ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff1fffffffffffffffffff
+fffffffffffffffc03ffffffffffffffffffc01ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffffffffff
+fffffffffffffffc03ffffffffffffffffffc03ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffff
+fffffffffffffff807ffffffffffffffffffc03ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffff807ffffffffffffffffff803ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffff00fffffffffffffffffff803ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffff00fffffffffffffffffff807ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffe01fffffffffffffffffff807ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffe03fffffffffffffffffff807ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffc03fffffffffffffffffff807ffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff807fffffffffffffffffff00fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff807fffffffffffffffffff00fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff00ffffffffffffffffffff00fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff00fffffffffffffffffffe00fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffe01fffffffffffffffffffe01fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffe03fffffffffffffffffffe01fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffc03fffffffffffffffffffc01fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffc07fffffffffffffffffffc01fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff807fffffffffffffffffffc03fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff00ffffffffffffffffffffc03fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff00ffffffffffffffffffff803fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffe01ffffffffffffffffffff803fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffe01ffffffffffffffffffff803fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffc03ffffffffffffffffffff807fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffc03ffffffffffffffffffff007fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff807ffffffffffffffffffff007fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff807ffffffffffffffffffff007fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff00fffffffffffffffffffff007fffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffe00ffffffffffffffffffffe00ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffe01ffffffffffffffffffffe00ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9fffffffffffff
+fffffffffffc01ffffffffffffffffffffe00ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1fffffffffffff
+fffffffffffc03ffffffffffffffffffffe00ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1fffffffffffff
+fffffffffff803ffffffffffffffffffffc00ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1fffffffffffff
+fffffffffff807ffffffffffffffffffffc00ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1fffffffffffff
+fffffffffff00fffffffffffffffffffffc01ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3fffffffffffff
+fffffffffff00fffffffffffffffffffffc01ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffff83fffffffffffff
+ffffffffffc01fffffffffffffffffffffc01ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fffffffffffff
+ffffffffffc01fffffffffffffffffffffc01ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fffffffffffff
+ffffffffff801fffffffffffffffffffff801ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fffffffffffff
+ffffffffff803fffffffffffffffffffff801ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffff
+ffffffffff003fffffffffffffffffffff803ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ffffffffffffff
+fffffffffe007fffffffffffffffffffff803ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1ffffffffffffff
+fffffffffc007fffffffffffffffffffff003ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff81ffffffffffffff
+fffffffffc00ffffffffffffffffffffff003ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffffffffffffff
+fffffffff800ffffffffffffffffffffff003ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffffffffffffff
+fffffffff801ffffffffffffffffffffff003ffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff03ffffffffffffff
+fffffffff803ffffffffffffffffffffff007ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffe07ffffffffffffff
+fffffffff003fffffffffffffffffffffe007ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffc07ffffffffffffff
+ffffffffe007fffffffffffffffffffffe007ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffff807ffffffffffffff
+ffffffffc007fffffffffffffffffffffe007ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffff007ffffffffffffff
+ffffffffc007fffffffffffffffffffffe007ffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffff00fffffffffffffff
+ffffffff800ffffffffffffffffffffffe00fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffff00fffffffffffffff
+ffffffff000ffffffffffffffffffffffe00fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffe00fffffffffffffff
+fffffffe001ffffffffffffffffffffffe00fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffc01fffffffffffffff
+fffffffc003ffffffffffffffffffffffe00fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffc01fffffffffffffff
+9ffffffc003ffffffffffffffffffffffe00fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff803fffffffffffffff
+0ffffff8003ffffffffffffffffffffffc01fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff003ffffffffffffffe
+07fffff0007ffffffffffffffffffffffc01fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff003ffffffffffffffe
+07ffffe000fffffffffffffffffffffffc01fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffe007ffffffffffffff8
+03ffffc000fffffffffffffffffffffffc01fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffe007ffffffffffffff0
+03ffff8001fffffffffffffffffffffff801fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffffc007ffffffffffffff0
+01ffff0003fffffffffffffffffffffff803fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffff800ffffffffffffffe0
+00fffe0003fffffffffffffffffffffff803fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffff800ffffffffffffffe0
+00fffe0003fffffffffffffffffffffff803fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffff001ffffffffffffffc0
+003ffc0007fffffffffffffffffffffff003fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffe003ffffffffffffff80
+001fe0001ffffffffffffffffffffffff003fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffe003ffffffffffffff00
+000fc0001ffffffffffffffffffffffff007fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffc007fffffffffffffe00
+000000001ffffffffffffffffffffffff007fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff8007fffffffffffffe00
+000000003ffffffffffffffffffffffff007fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff800ffffffffffffffc00
+000000003ffffffffffffffffffffffff007fffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000ffffffffffffff800
+000000007fffffffffffffffffffffffe007fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe001ffffffffffffff800
+000000007fffffffffffffffffffffffe007fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffe001ffffffffffffff000
+00000001ffffffffffffffffffffffffe007fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc003ffffffffffffff000
+00000001ffffffffffffffffffffffffe007fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffffc007fffffffffffffe000
+00000001ffffffffffffffffffffffffe007fffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffff0007fffffffffffffc000
+00000003ffffffffffffffffffffffffc00ffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffff000ffffffffffffffc000
+00000003ffffffffffffffffffffffffc00ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffe000ffffffffffffff8000
+00000007ffffffffffffffffffffffffc00ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffc001ffffffffffffff0000
+0000000fffffffffffffffffffffffffc01ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffffc003ffffffffffffff0000
+0000001fffffffffffffffffffffffffc01ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffff8003fffffffffffffe0000
+0000001fffffffffffffffffffffffffc01ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffff0007fffffffffffffe0000
+0000003fffffffffffffffffffffffffc01ffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffe000ffffffffffffffc0000
+0000007fffffffffffffffffffffffff801ffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffe000ffffffffffffff80000
+0000007fffffffffffffffffffffffff801ffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffffc001ffffffffffffff80000
+000000ffffffffffffffffffffffffff801ffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffff8001ffffffffffffff00000
+000001ffffffffffffffffffffffffff801ffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffff0003ffffffffffffff00000
+000001ffffffffffffffffffffffffff801ffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffff0003ffffffffffffff00000
+000003ffffffffffffffffffffffffff801ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffe0007fffffffffffffe00000
+000003ffffffffffffffffffffffffff801ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffe000ffffffffffffffe00000
+000007ffffffffffffffffffffffffff803ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffffc000ffffffffffffffc00000
+00000fffffffffffffffffffffffffff003ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffff8001ffffffffffffff800000
+00000fffffffffffffffffffffffffff803ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffff0003ffffffffffffff800000
+00001fffffffffffffffffffffffffff803ffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffff0007ffffffffffffff000200
+00003fffffffffffffffffffffffffff007ffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffe0007fffffffffffffe000700
+00007fffffffffffffffffffffffffff00fffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffffc000ffffffffffffffe001f80
+0000ffffffffffffffffffffffffffff00fffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffff8000ffffffffffffffe001f80
+0001ffffffffffffffffffffffffffff00fffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffff8000ffffffffffffffc003fc0
+0001ffffffffffffffffffffffffffff00fffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffff0001ffffffffffffff8007fe0
+0003ffffffffffffffffffffffffffff01fffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffe0003ffffffffffffff0007fe0
+0007ffffffffffffffffffffffffffff01fffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffe0007ffffffffffffff000fff0
+0007ffffffffffffffffffffffffffff01fffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffffc000ffffffffffffffe003fff8
+001fffffffffffffffffffffffffffff07fffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffff8000ffffffffffffffe003fffc
+007fffffffffffffffffffffffffffff07fffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffff8000ffffffffffffffe003fffe
+00ffffffffffffffffffffffffffffff07fffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffff0001ffffffffffffffc007ffff
+dfffffffffffffffffffffffffffffff0ffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffe0003ffffffffffffff800fffff
+fffffffffffffffffffffffffffffffe1ffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffc0007ffffffffffffff800fffff
+fffffffffffffffffffffffffffffffe1ffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffffc0007ffffffffffffff001fffff
+fffffffffffffffffffffffffffffffe1ffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffff8000fffffffffffffff003fffff
+fffffffffffffffffffffffffffffffe3ffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffe003fffff
+ffffffffffffffffffffffffffffffff3ffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffe0001ffffffffffffffc007fffff
+ffffffffffffffffffffffffffffffff3ffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffe0003ffffffffffffffc007fffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffffc0007ffffffffffffffc00ffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffff8000fffffffffffffff800ffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffff8000fffffffffffffff801ffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffe0000fffffffffffffff001ffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffc0001fffffffffffffff003ffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffffc0003ffffffffffffffe007ffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffff80007ffffffffffffffe007ffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffc00fffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffc00fffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffe0001fffffffffffffffc00fffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffc0001fffffffffffffff801fffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffffc0003fffffffffffffff801fffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffff80003fffffffffffffff003fffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff007fffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffe0000ffffffffffffffff007fffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffc0001fffffffffffffffc007fffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffffc0001fffffffffffffffc00ffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffff80003fffffffffffffffc01ffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff801ffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffe0001ffffffffffffffff801ffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffc0001ffffffffffffffff803ffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffffc0003ffffffffffffffff803ffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffff80003fffffffffffffffe007ffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffff80007fffffffffffffffe007ffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffe00fffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffc00fffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffffc0001ffffffffffffffff801fffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffff80003ffffffffffffffff803fffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffff80003ffffffffffffffff003fffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffff00007ffffffffffffffff003fffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffe0000ffffffffffffffffe007fffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffe0000ffffffffffffffffc007fffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffffc0001ffffffffffffffffc00ffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffff80007ffffffffffffffffc00ffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffff00007ffffffffffffffff801ffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffff00007ffffffffffffffff801ffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffe0000fffffffffffffffff003ffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffffc0001fffffffffffffffff003ffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffff80003ffffffffffffffffe007ffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffff80003ffffffffffffffffe007ffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffe00007ffffffffffffffffc00fffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffe0000fffffffffffffffffc00fffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffffe0000fffffffffffffffffc00fffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffff80001fffffffffffffffff801fffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffff00003fffffffffffffffff801fffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffff00007fffffffffffffffff003fffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffe00007fffffffffffffffff007fffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffc0000ffffffffffffffffff007fffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffffc0001fffffffffffffffffc007fffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffff80003fffffffffffffffffc00ffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffff80007fffffffffffffffffc01ffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffff00007fffffffffffffffff801ffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffff0000ffffffffffffffffff801ffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffffc0001ffffffffffffffffff803ffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffff80003ffffffffffffffffff803ffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffff00007ffffffffffffffffff007ffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffff00007ffffffffffffffffff007ffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffe0000ffffffffffffffffffe00fffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffc0000ffffffffffffffffffe00fffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffffc0001ffffffffffffffffffe01fffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffff80003ffffffffffffffffffc03fffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffff00007ffffffffffffffffffc03fffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffe00007ffffffffffffffffffc03fffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffe00007ffffffffffffffffffc07fffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffffc0001fffffffffffffffffff807fffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffff80003fffffffffffffffffff80ffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffff80003fffffffffffffffffff80ffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffff00007fffffffffffffffffff81ffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffe0000ffffffffffffffffffff01ffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffe0001ffffffffffffffffffff03ffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffffc0003ffffffffffffffffffff03ffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffff80003fffffffffffffffffffe07ffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffff00007fffffffffffffffffffe07ffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffe00007fffffffffffffffffffe0fffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffe0000ffffffffffffffffffffc0fffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffe0000ffffffffffffffffffffc1fffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffffc0001ffffffffffffffffffffc1fffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffff80007ffffffffffffffffffff83fffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffff00007ffffffffffffffffffff83fffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffe00007ffffffffffffffffffff83fffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffe0000fffffffffffffffffffff87fffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffc0001fffffffffffffffffffff87fffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffffc0001fffffffffffffffffffff0ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffff80003fffffffffffffffffffff0ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffff00007fffffffffffffffffffff0ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffff0000ffffffffffffffffffffff1ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffe0000fffffffffffffffffffffe1ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffffc0001fffffffffffffffffffffe3ffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffff80003fffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffff00007fffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffe0001ffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffe0001ffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffc0003ffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffffc0007ffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffe0001fffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffc0003fffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffc0003fffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffffc0007fffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffff8000ffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffff8001ffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffff0001ffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffff0003ffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffff0003ffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffe0007ffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffffc000fffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffff8001fffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffff8001fffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffff8003fffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffff8007fffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffff8007fffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffff0007fffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffe000ffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffe001ffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffc001ffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffc007ffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffc00fffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffffc01fffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffff801fffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffff003fffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffff003fffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffe00ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffe01ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffc03ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffffc03ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffff807ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffff807ffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffff80fffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffff00fffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+fffffffffffffffffffffff01fffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffe03fffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffe07fffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffe07fffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffc1ffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffc1ffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffffc3ffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffff83ffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffff87ffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffff8fffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffff8fffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffff1fffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffff1fffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+ffffffffffffffffffffff3fffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff8
+
+
+showpage
+
+% stop using temporary dictionary
+end
+
+% restore original state
+origstate restore
+
+%%Trailer
index b8b270f..bc904a5 100644 (file)
@@ -1,4 +1,9 @@
 %% include file for the Gnus refcard and booklet
+
+\def\progver{5.10}\def\refver{5.10-1} % program and refcard versions
+\def\date{Oct 13th, 2001}
+\def\author{Gnus Bugfixing Girls + Boys $<$bugs@gnus.org$>$}
+
 %%
 \newlength{\keycolwidth}
 \newenvironment{keys}[1]% #1 is the widest key
@@ -32,7 +37,7 @@
     Copyright \copyright\ 1995 Vladimir Alexiev
     $<$vladimir@cs.ualberta.ca$>$.\\*
     Copyright \copyright\ 2000 Felix Natter $<$fnatter@gmx.net$>$.\\*
-    Copyright \copyright\ 2001 \author.\\*
+    Copyright \copyright\ 2001, 2002 \author.\\*
     Created from the Gnus manual Copyright \copyright\ 1994 Lars Magne
     Ingebrigtsen.\\*
     and the Emacs Help Bindings feature (C-h b).\\*
       \#  & (\#, M \#, M P p) Processable (will be affected by the next operation).
       [2]\\
       A   & {\bf Answered} (followed-up or replied). [2]\\
-      *   & Cached. [2]\\
+      $\ast$  & Cached. [2]\\
       S   & Saved. [2]\\
+      N   & Recently arrived. [2]\\
+      .   & Unseen. [2]\\
       +   & Over default score. [3]\\
       $-$ & Under default score. [3]\\
       $=$ & Has children (thread underneath it). Add `\%e' to
     $>$     & Go to the end of the Group buffer.\\
     ,       & Jump to the lowest-level group with unread articles.\\
     .       & Jump to the first group with unread articles.\\
-    xx & Enter the Server buffer mode.\\
-    a       & Post an {\bf article} to a group.\\
+    \^{}      & Enter the Server buffer mode.\\
+    a       & Post an {\bf article} to a group
+              [Prefix: use group under point to find posting-style].\\
     b       & Find {\bf bogus} groups and delete them.\\
     c       & Mark all unticked articles in this group as read ({\bf catch-up}).
     [p/p]\\ 
     g       & Check the server for new articles ({\bf get}). [level]\\
     M-g     & Check the server for new articles in this group ({\bf get}). [p/p]\\
     j       & {\bf Jump} to a group.\\
-    m       & {\bf Mail} a message to someone.\\
+    m       & {\bf Mail} a message to someone
+              [Prefix: use group under point to find posting-style].\\
     n       & Go to the {\bf next} group with unread articles. [distance]\\
     M-n     & Go to the {\bf next} group on the same or lower level.
     [distance]\\ 
     H d     & (C-c C-d) Show the {\bf description} of this group
     [Prefix: re-read from server].\\ 
     M-d     & {\bf Describe} all groups. [Prefix: re-read from server]\\
+    D g     & Regenerate a Sieve script from group parameters.\\
+    D u     & Regenerate Sieve script and {\bf upload} to server.\\
   \end{keys}
   }
 
 \newcommand{\ListGroups}{%
   {\esamepage
     \begin{keys}{A M}
-      A d     & List all groups whose names or {\bf descriptions} match a regexp.\\ 
+      A d     & (C-c C-M-a) List all groups whose names or {\bf descriptions} match a regexp.\\ 
       A k     & (C-c C-l) List all {\bf killed} groups.
       [Prefix: look at active-file from server]\\
       A l     & List all groups on a specific level.
       [Prefix: also list groups with no unread articles]\\
-      A d     & List all groups that have names or {\bf descriptions} matching
-      a regexp.\\
       A a     & (C-c C-a) List all groups whose names match a regexp
       ({\bf apropos}).\\ 
       A A     & List the server's active-file.\\
       A u     & (L) List all groups (including read and {\bf unsubscribed}).
       [level; 7 and lower is the default]\\
       A z     & List all {\bf zombie} groups.\\
+      A c     & List all groups with cached articles. [level]\\
+      A ?     & List all groups with dormant articles. [level]\\
     \end{keys}
     }
 
         G w     & Create ephemeral group based on web-search. [Prefix: make solid group
         instead]\\
         G DEL   & {\bf Delete} group [Prefix: delete all articles as well].\\
+        G x     & Expunge all deleted articles in an nnimap mailbox.\\
+        G l     & Edit ACL (Access Control {\bf List}) for an nnimap mailbox.\\
       \end{keys}
       You can also create mail-groups and read your mail with Gnus (very useful
       if you are subscribed to mailing lists), using one of the methods
       M u     & (M-\#) Remove the process mark from this group ({\bf unmark}).
       [scope]\\ 
       M U     & Remove the process mark from all groups (\textbf{umark all}).\\
-      M w     & Mark all groups in the current region.\\
+      M w     & Mark all groups in the current region. [prefix: unmark]\\
+      M b     & Mark all groups in the {\bf buffer}. [prefix: unmark]\\
     \end{keys}}
 
   \newcommand{\GroupTopicsGeneral}{%
         T TAB   & (TAB) Indent current topic [Prefix: unindent].\\ 
         M-TAB   & Unindent the current topic.\\
         RET     & (SPC) Either unfold topic or enter group [level].\\
+        T s     & {\bf Show} the current topic. [Prefix: show permanently]\\
+        T h     & {\bf Hide} the current topic. [Prefix: hide permanently]\\
         C-c C-x & Expire all articles in current group or topic.\\
         C-k     & {\bf Kill} a group or topic.\\
         C-y     & {\bf Yank} a group or topic.\\
         A T     & List active-file using {\bf topics}.\\
         G p     & Edit topic-{\bf parameters}.\\
+        T M-n   & Go to {\bf next} topic. [distance]\\
+        T M-p   & Go to {\bf previous} topic. [distance]\\
       \end{keys}
       }
     }
         T S v  & Sort by group score ({\bf value}).\\
         T S r  & Sort by group {\bf rank}.\\
         T S m  & Sort by {\bf method}.\\
+        T S e  & Sort by {\bf server} name.\\
+        T S s  & Sort according to `gnus-group-sort-function'.\\
       \end{keys}
+      With a prefix these commands will sort in reverse order.
       }
     }
 
         SPC     & (A SPC, A n) Select an article, scroll it one page, move to the
         next one.\\ 
         DEL     & (A DEL, A p, b) Scroll this article one page back. [distance]\\
-        RET     & Scroll this article one line forward. [distance]\\
-        M-RET   & Scroll this article one line backward. [distance]\\
+        RET     & (A RET) Scroll this article one line forward. [distance]\\
+        M-RET   & (A M-RET) Scroll this article one line backward. [distance]\\
         =       & Expand the Summary window (fullsize).
         [Prefix: shrink to display article window]\\
                                 %
         A t     & {\bf Translate} this article.\\
         A R     & Fetch all articles mentioned in the {\bf References}-header.\\
         A T     & Fetch full \textbf{thread} in which the current article appears.\\
-        M-\^{}   & Fetch the article with a given Message-ID.\\
+        M-\^{}  & Fetch the article with a given Message-ID.\\
         S y     & {\bf Yank} the current article into an existing message-buffer.
         [p/p]\\
+        A M     & Setup group parameters for {\bf mailing} lists from
+        headers. [Prefix: replace old settings]\\
       \end{keys}
       }
     }
       MIME button in the article buffer, use the corresponding bindings for the
       article buffer instead.
       \begin{keys}{W M w}
-        K v      & (b) {\bf View} the MIME-part.\\
+        K v      & (b, W M b) {\bf View} the MIME-part.\\
         K o      & {\bf Save} the MIME part.\\
         K c      & {\bf Copy} the MIME part.\\
         K e      & View the MIME part {\bf externally}.\\
         K $\mid$ & Pipe the MIME part to an external command.\\
         K b      & Make all the MIME parts have buttons in front of them.\\
         K m      & Try to repair {\bf multipart-headers}.\\
+        K C      & View the MIME part using a differenct {\bf charset}.\\
         X m      & Save all parts matching a MIME type to a directory. [p/p]\\
         M-t      & Toggle the buttonized display of the article buffer.\\
         W M w    & Decode RFC2047-encoded words in the article headers.\\
         C-c C-s C-a & Sort the summary-buffer by {\bf author}.\\
         C-c C-s C-d & Sort the summary-buffer by {\bf date}.\\
         C-c C-s C-i & Sort the summary-buffer by article score.\\
-        C-c C-s C-l & Sort the summary-buffer by amount of lines.\\
+        C-c C-s C-l & Sort the summary-buffer by amount of {\bf lines}.\\
         C-c C-s C-c & Sort the summary-buffer by length.\\
         C-c C-s C-n & Sort the summary-buffer by article {\bf number}.\\
         C-c C-s C-s & Sort the summary-buffer by {\bf subject}.\\
+        C-c C-s C-o & Sort the summary-buffer using the default method.\\
       \end{keys}
+      With a prefix these functions sort in reverse order.
       }
     }
 
         B c     & {\bf Copy} this article from any group to a mail group. [p/p]\\
         B e     & {\bf Expire} all expirable articles in this group. [p/p]\\
         B i     & {\bf Import} a random file into this group.\\
+        B I     & Create an empty article in this group.\\
         B m     & {\bf Move} the article from one mail group to another. [p/p]\\
-        B p     & Query whether the article was posted as well.\\
+        B p     & Query whether the article was {\bf posted} as well.\\
         B q     & {\bf Query} where the article will end up after fancy splitting\\
         B r     & {\bf Respool} this mail article. [p/p]\\
         B t     & {\bf Trace} the fancy splitting patterns applied to this article.\\
         B w     & (e) Edit this article.\\
         B M-C-e & {\bf Expunge} (delete from disk) all expirable articles in this group
         (!). [p/p]\\ 
+        K E     & {\bf Encrypt} article body. [p/p]\\
       \end{keys}
       }
     }
   \newcommand{\WashArticle}{% formerly \Wsubmap
     {\esamepage
       \begin{keys}{W W H}
+        W 6     & Translate a base64 article.\\
+        W a     & Strip certain {\bf headers} from body.\\
         W b     & Make Message-IDs and URLs in the article mouse-clickable
         {\bf buttons}.\\  
-        W l     & (w) Remove page breaks ({\bf\^{}L}) from the article.\\
         W c     & Translate CRLF-pairs to LF and then the remaining CR's to LF's.\\
         W d     & Treat {\bf dumbquotes}.\\
-        W f     & Look for and display any X-{\bf Face} headers.\\
+        W e     & Treat {\bf emphasized} text.\\
+        W h     & Treat {\bf HTML}.\\
+        W k     & Deuglify broken Outlook (Express) articles and redisplay.\\
+        W l     & (w) Remove page breaks ({\bf\^{}L}) from the article.\\
         W m     & Toggle {\bf MIME} processing.\\
         W o     & Treat {\bf overstrike} or underline (\^{}H\_) in the article.\\
+        W p     & Verify X-{\bf PGP}-Sig header.\\
         W q     & Treat {\bf quoted}-printable in the article.\\
         W r     & (C-c C-r) Do a Caesar {\bf rotate} (rot13) on the article.\\
+        W s     & Verify (and decrypt) a {\bf signed} message.\\
         W t     & (t) {\bf Toggle} display of all headers.\\
+        W u     & {\bf Unsplit} broken URLs.\\
         W v     & (v) Toggle permanent {\bf verbose} displaying of all headers.\\
         W w     & Do word {\bf wrap} in the article.\\
         W B     & Add clickable {\bf buttons} to the article headers.\\
         W C     & {\bf Capitalize} first word in each sentence.\\
         W Q     & Fill long lines.\\
+        W Z     & Translate a HZ-encoded article.\\
                                 %
-        W W H   & Strip certain {\bf headers} from body.\\
-                                %
+        W G u   & {\bf Unfold} folded header lines.\\
+        W G f   & {\bf Fold} all header lines.\\
+        W G n   & Unfold {\bf Newsgroups:} and Follow-Up-To:.\\
+      \end{keys}
+      }
+    }
+
+  \newcommand{\BlankAndWhitespace}{% 
+    {\esamepage
+      \begin{keys}{W E w}
         W E l   & Strip blank {\bf lines} from the beginning of the article.\\
         W E m   & Replace blank lines with empty lines and remove {\bf multiple}
         blank lines.\\
         W E A   & Strip {\bf all} blank lines.\\
         W E s   & Strip leading blank lines from the article body.\\
         W E e   & Strip trailing blank lines from the article body.\\
-                                %
+        W E w   & Remove leading {\bf whitespace} from all headers.\\
+      \end{keys}
+      }
+    }
+
+  \newcommand{\Picons}{% 
+    {\esamepage
+      \begin{keys}{W D D}
+        W D s   & (W g) Display {\bf smilies}.\\
+        W D x   & (W f) Look for and display any X-{\bf Face} headers.\\
+        W D n   & Toggle picons in {\bf Newsgroups} and Followup-To.\\
+        W D m   & Toggle picons in {\bf mail} headers (To and Cc).\\
+        W D f   & Toggle picons in {\bf From}.\\
+        W D D   & Remove all images from the article buffer.\\
+      \end{keys}
+      }
+    }
+
+  \newcommand{\TimeAndDate}{% 
+    {\esamepage
+      \begin{keys}{W T u}
         W T u   & (W T z) Display the article timestamp in GMT ({\bf UT, ZULU}).\\
         W T i   & Display the article timestamp in {\bf ISO} 8601.\\
         W T l   & Display the article timestamp in the {\bf local} timezone.\\
         W T s   & Display according to `gnus-article-time-format'.\\
         W T e   & Display the time {\bf elapsed} since it was sent.\\
         W T o   & Display the {\bf original} timestamp.\\
+        W T p   & Display the date in format that's {\bf
+          pronounceable} in English.\\        
       \end{keys}
       }
     }
         RET     & (BUTTON-2) Toggle display of the MIME object.\\
         v       & (M-RET) Prompt for a method and then view object using this method.\\
         o       & Prompt for a filename and save the MIME object.\\
+        C-o       & Prompt for a filename to save the MIME object to and remove it.\\
         c       & {\bf Copy} the MIME object to a new buffer and display this buffer.\\
+        i       & Display the MIME object in this buffer.\\
+        C       & Copy the MIME object to a new buffer and display this buffer using {\bf Charset} \\
+        E       & View internally. \\
+        e       & View {\bf externally}. \\
         t       & View the MIME object as a different {\bf type}.\\
+        p       & {\bf Print} the MIME object.\\
         $\mid$  & Pipe the MIME object to a process.\\
+        .       & Take action on the MIME object.\\
       \end{keys}
       }
     }
       M P u   & (M-\#, M M-\#) \textbf{unmark} this article.\\
       M P b   & Mark all articles in {\bf buffer}.\\
       M P r   & Mark all articles in the {\bf region}.\\
+      M P g   & Unmark all articles in the region.\\
       M P R   & Mark all articles matching a {\bf regexp}.\\
+      M P G   & Unmark all articles matching a regexp.\\
       M P t   & Mark all articles in this (sub){\bf thread}.\\
+      M P T   & Unmark all articles in this (sub){\bf thread}.\\
       M P s   & Mark all articles in the current {\bf series}.\\
       M P S   & Mark all {\bf series} that already contain a marked article.\\
       M P a   & Mark {\bf all} articles (in series order).\\
       M P U   & \textbf{unmark} all articles.\\
-                                %
       M P i   & {\bf Invert} the list of process-marked articles.\\
       M P k   & Push the current process-mark set onto stack and unmark
       all articles.\\
       M P y   & Pop process-mark set from stack and restore it.\\
+      M P w   & Push process-mark set on the stack.\\
+      M P v   & Mark all articles with score over the default score. [Prefix: score]\\
     \end{keys}
     }
   }
       /c   & Exclude all dormant articles that have no children from the limit.\\
       /C   & Mark all excluded unread articles as read.
       [Prefix: also mark ticked and dormant articles]\\
+      /o   & Insert all {\bf old} articles. [Prefix: how many]\\
+      /N   & Insert all {\bf new} articles.\\
+      /p   & Limit to articles {\bf predicated} in the `display' group parameter.\\
     \end{keys}
     }
   }
       O m     & Save this article in {\bf mail} format. [p/p]\\
       O r     & Save this article in {\bf rmail} format. [p/p]\\
       O v     & Save this article in {\bf vm} format. [p/p]\\
-      O p     & ($\mid$) Pipe this article to a shell command. [p/p]\\
+      O p     & ($\mid$) {\bf Pipe} this article to a shell command. [p/p]\\
+      O P     & \textbf{Print} this article using Muttprint. [p/p]\\
     \end{keys}
     }
   }
       S p     & (a) {\bf Post} an article to this group.\\
       S f     & (f) Post a {\bf followup} to this article.\\
       S F     & (F) Post a {\bf followup} and include the original. [p/p]\\
-      S o p   & Forward this article as a {\bf post} to a newsgroup.
-      [Prefix: include all headers]\\
+      S o p   & Forward this article as a {\bf post} to a newsgroup.\\
       S M-c   & Send a complaint about excessive crossposting to the author of this
       article. [p/p]\\
                                 %
-      S m     & (m) Send {\bf a} mail to some other person.\\
+      S m     & (m) Send a {\bf mail} to some other person.\\
       S r     & (r) Mail a {\bf reply} to the author of this article.\\
       S R     & (R) Mail a {\bf reply} and include the original. [p/p]\\
+      S B r   & Like S r but ignore the Reply-To: header.\\
+      S B R   & Like S R but ignore the Reply-To: header.\\
       S w     & Mail a {\bf wide} reply to this article.\\
-      S W     & Mail a {\bf wide} reply to this article.\\
-      S o m   & (C-c C-f) Forward this article by {\bf mail} to a person.
-      [Prefix: include all headers]\\
+      S W     & Mail a {\bf wide} reply to this article and include
+      the original.\\
+      S v     & Mail a {\bf very} wide reply to this article.\\
+      S V     & Mail a {\bf very} wide reply to this article and include the original.\\
+      S o m   & (C-c C-f) Forward this article by {\bf mail} to a person.\\
       S D b   & Resend {\bf bounced} mail.\\
       S D r   & {\bf Resend} mail to a different person.\\
+      S D e   & {\bf Edit} and resend.\\
                                 %
       S n     & Post a followup via {\bf news} even if you got the message
       through mail.\\
       S N     & Post a followup via {\bf news} and include the original mail.
       [p/p]\\
                                 %
-      S c     & (C) {\bf Cancel} this article (only works if it is your own).\\
+      S c     & (C) {\bf Cancel} this article (only works if it is
+      your own). [p/p]\\
       S s     & {\bf Supersede} this article with a new one (only for own
       articles).\\
                                 %
       T M-\#  & Remove process-marks from this thread.\\
                                 %
       T t     & Re-{\bf thread} the current article's thread.\\
+      T \^{}  & Make the current article child of the marked (or previous) article.\\
                                 % movement
-      T n     & (M-C-f) Go to the {\bf next} thread. [distance]\\
-      T p     & (M-C-b) Go to the {\bf previous} thread. [distance]\\
+      T n     & (M-C-f, M-down) Go to the {\bf next} thread. [distance]\\
+      T p     & (M-C-b, M-up) Go to the {\bf previous} thread. [distance]\\
       T d     & {\bf Descend} this thread. [distance]\\
       T u     & Ascend this thread ({\bf up}-thread). [distance]\\
       T o     & Go to the top of this thread.\\
       V m     & {\bf Mark} all articles below a given score as read.\\
       V s     & Set the {\bf score} of this article.\\
       V t     & Display all score rules applied to this article ({\bf track}).\\
+      W w     & List {\bf words} used in scoring.\\
       V x     & {\bf Expunge} all low-scored articles. [score]\\
       V C     & {\bf Customize} the current score file through a user-friendly
-      interface.\\ 
+      interface.\\
+      V F     & {\bf Flush} the cache of score files.\\
+      V R     & {\bf Re-score} the summary buffer.\\
       V S     & Display the {\bf score} of this article.\\
       \bf A p m l& Make a scoring entry based on this article.\\
     \end{keys}
       C-c C-m & {\bf Mail} reply to the address near point.
       [Prefix: include the original]\\
                                 % modify headers/body
-      C-c C-t & Paste the recipient's address into \textbf{To:}-field.\\
-      C-c C-n & Insert a \textbf{Newsgroups:}-header.\\
       C-c C-o & Sort headers.\\
       C-c C-e & \textbf{Elide} region.\\
       C-c C-v & Kill everything outside region.\\
       C-c C-z & Kill everything up to signature.\\
       C-c C-y & \textbf{Yank} original message.\\
       C-c C-q & Fill the yanked message.\\
+      C-c M-C-y & \textbf{Yank} a buffer and quote it.\\
+      M-RET   & Insert four newlines and format quoted text. [Prefix:
+      justify as well]\\
+      C-c M-r & \textbf{Rename} message buffer. [Prefix: ask for new name]\\
     \end{keys}
     }
   }
     \begin{keys}{C-c C-f C-u}
       C-c TAB & Move to \textbf{signature}.\\
       C-c C-b & Move to \textbf{body}.\\
-      C-c C-f C-t & Move to \textbf{To:}.\\
+      C-c C-f C-t & (C-c C-t) Move to \textbf{To:}.\\
       C-c C-f C-c & Move to \textbf{Cc:}.\\
       C-c C-f C-b & Move to \textbf{Bcc:}.\\
       C-c C-f C-w & Move to \textbf{Fcc:}.\\
       C-c C-f C-s & Move to \textbf{Subject:}.\\
       C-c C-f C-r & Move to \textbf{Reply-To:}.\\
       C-c C-f C-f & Move to \textbf{Followup-To:}.\\
-      C-c C-f C-n & Move to \textbf{Newsgroups:}.\\
+      C-c C-f C-n & (C-c C-n) Move to \textbf{Newsgroups:}.\\
       C-c C-f C-u & Move to \textbf{Summary:}.\\
       C-c C-f C-k & Move to \textbf{Keywords:}.\\
       C-c C-f C-d & Move to \textbf{Distribution:}.\\
+      C-c C-f C-m & Move to \textbf{Mail-Followup-To:}.\\
+      C-c C-f C-o & Move to \textbf{From:}.\\
+      C-c C-f C-a & Insert a resonable \textbf{Mail-Followup-To:} for
+      an unsubscribed list. [Prefix: include addresses in \textbf{Cc:}]\\
+      C-c C-f TAB & (C-c C-u) Move to \textbf{Importance:}.\\
+      C-c M-n     & Insert \textbf{Disposition-Notification-To:}
+      (request receipt).\\
     \end{keys}
     }
   }
       C-c C-m f   & (C-c C-a) Attach \textbf{file}.\\
       C-c C-m b   & Attach contents of \textbf{buffer}.\\
       C-c C-m e   & Attach \textbf{external} file (ftp..).\\
-      C-c C-m P   & Create MIME-\textbf{preview} (new buffer).\\
+      C-c C-m P   & Create MIME-\textbf{preview} (new
+      buffer). [Prefix: show raw MIME preview]\\
       C-c C-m v   & \textbf{Validate} article.\\
       C-c C-m p   & Insert \textbf{part}.\\
       C-c C-m m   & Insert \textbf{multi}-part.\\
       C-c C-m q   & \textbf{Quote} region.\\
+      C-c C-m c s & Encrypt message using \textbf{S/MIME}.\\
+      C-c C-m c o & Encrypt message usging PGP.\\
+      C-c C-m c p & Encrypt message using \textbf{PGP/MIME}.\\
+      C-c C-m s s & Sign message using \textbf{S/MIME}.\\
+      C-c C-m s o & Sign message using PGP.\\
+      C-c C-m s p & Sign message using \textbf{PGP/MIME}.\\
+      C-c C-m C-n & Remove security related MML tags from message.\\
                                 % TODO: narrow headers (C-c C-m n) ?
     \end{keys}
     }
 %% TODO:
 \newcommand{\ServerMode}{%
   {\esamepage
-    To enter this mode, press `\^' while in Group mode.\\*
+    To enter this mode, press \^{} while in Group mode.\\*
     \begin{keys}{SPC}
       SPC     & (RET) Browse this server.\\
       a       & {\bf Add} a new server.\\
       s       & Request that the server scan its sources for new articles.\\
       g       & Request that the server regenerate its data.\\
       y       & {\bf Yank} the previously killed server.\\
+      O       & Try to {\bf open} a connection to this server.\\
+      C       & {\bf Close} connection to this server.\\
+      D       & Mark this server as unreachable ({\bf deny}).\\
+      M-o     & {\bf Open} the connection to all servers.\\
+      M-c     & {\bf Close} the connection to all servers.\\
+      R       & Make all denied servers into closed servers.\\
+      L       & Set server status to offline.\\
     \end{keys}
     }
   }
   {\esamepage
     \begin{keys}{J S}
       J j & Toggle plugged-state.\\
-      J s & Fetch articles from current group.\\
       J s & Fetch articles from all groups for offline-reading.\\
+      J u & Fetch all eligible articles from this group.\\
       J S & \textbf{Send} all sendable messages in the drafts group.\\
                                 %
       J c & Enter \textbf{category} buffer.\\
       J a & \textbf{Add} this group to an Agent category [p/p].\\
       J r & \textbf{Remove} this group from its Agent category [p/p].\\
+      J Y & Synchronize flags changed while unplugged with remote server.\\
     \end{keys}
     }
   }
       J M-\# & \textbf{Unmark} the article for downloading.\\
       @      & \textbf{Toggle} whether to download the article.\\
       J c    & Mark all undownloaded articles as read (\textbf{catch-up}).\\
+      J u    & Download all downloadable articles from group.\\
     \end{keys}
     }
   }
index 8f3d67f..d17fe3a 100644 (file)
@@ -69,7 +69,7 @@ license to the document, as described in section 6 of the license.
 @page
 
 @vskip 0pt plus 1filll
-Copyright @copyright{} 1996, 1997, 1998, 1999, 2000
+Copyright @copyright{} 1996, 1997, 1998, 1999, 2000, 2001, 2002
      Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
@@ -223,10 +223,15 @@ Message \e$B$OJVEz$,2?=h$K9T$/$+$r7hDj$9$k$?$a$KIaDL$NJ}K!$r;H$$$^$9$,!"\e(B
 \e$BJQ99$9$k;v$,$G$-$^$9!#$=$l$O\e(B @code{message-reply-to-function} \e$B$HF1$8$h$&\e(B
 \e$B$K;H$o$l$^$9\e(B (@pxref{Reply})\e$B!#\e(B
 
-@findex message-dont-reply-to-names
+@vindex message-dont-reply-to-names
 \e$B@55,I=8=\e(B @code{rmail-dont-reply-to-names} \e$B$K9gCW$9$k%"%I%l%9$O\e(B @code{Cc}
 \e$B%X%C%@!<$+$i<h$j=|$+$l$^$9!#\e(B
 
+@vindex message-wide-reply-confirm-recipients
+@code{message-wide-reply-confirm-recipients} \e$B$,Hs\e(B-@code{nil} \e$B$@$C$?$i!"\e(B
+\e$BJ#?t$N<u<h?M$KJV?.$9$k$+$I$&$+$N3NG'$r5a$a$i$l$^$9!#%G%#%U%)%k%H\e(B
+\e$B$O\e(B @code{nil} \e$B$G$9!#\e(B
+
 @node Followup
 @section \e$B%U%)%m!<%"%C%W\e(B
 
@@ -253,6 +258,10 @@ Message \e$B$O%U%)%m!<%"%C%W$,$I$3$K9T$/$+$rIaDL$NJ}K!$r;H$C$F7hDj$7$^$9$,!"\e(B
 @findex message-cancel-news
 \e$BL?Na\e(B @code{message-cancel-news} \e$B$O8=:_$N%P%C%U%!$N5-;v$r<h$j>C$7$^$9!#\e(B
 
+@vindex message-cancel-message
+@code{message-cancel-message} \e$B$NCM$,<h$j>C$75-;v$NK\J8$KA^F~$5$l$^$9!#%G%#\e(B
+\e$B%U%)%k%H$O\e(B @samp{I am canceling my own article.} \e$B$G$9!#\e(B
+
 @node Superseding
 @section \e$BBeBX\e(B
 
@@ -279,6 +288,45 @@ Message \e$B$O%U%)%m!<%"%C%W$,$I$3$K9T$/$+$rIaDL$NJ}K!$r;H$C$F7hDj$7$^$9$,!"\e(B
 @vindex message-forward-ignored-headers
 \e$B$3$N@55,I=8=$K9gCW$9$k$9$Y$F$N%X%C%@!<$,!"E>Aw$5$l$k%a%C%;!<%8$+$i:o=|$5\e(B
 \e$B$l$^$9!#\e(B
+
+@ignore
+@item message-make-forward-subject-function
+@vindex message-make-forward-subject-function
+A list of functions that are called to generate a subject header for
+forwarded messages.  The subject generated by the previous function is
+passed into each successive function.
+
+The provided functions are:
+
+@table @code
+@item message-forward-subject-author-subject
+@findex message-forward-subject-author-subject
+Source of article (author or newsgroup), in brackets followed by the
+subject.
+
+@item message-forward-subject-fwd
+Subject of article with @samp{Fwd:} prepended to it.
+@end table
+
+@item message-wash-forwarded-subjects
+@vindex message-wash-forwarded-subjects
+If this variable is @code{t}, the subjects of forwarded messages have
+the evidence of previous forwards (such as @samp{Fwd:}, @samp{Re:},
+@samp{(fwd)}) removed before the new subject is
+constructed.  The default value is @code{nil}.
+
+@item message-forward-as-mime
+@vindex message-forward-as-mime
+If this variable is @code{t} (the default), forwarded messages are
+included as inline @sc{mime} RFC822 parts.  If it's @code{nil}, forwarded
+messages will just be copied inline to the new message, like previous,
+non @sc{mime}-savvy versions of gnus would do.
+@end ignore
+
+@item message-forward-before-signature
+@vindex message-forward-before-signature
+\e$BHs\e(B-@code{nil} \e$B$@$C$?$i=pL>$NA0$K!"$=$l0J30$@$C$?$i8e$K!"E>Aw$9$k%a%C%;!<\e(B
+\e$B%8$rCV$-$^$9!#\e(B
 @end table
 
 @node Resending
@@ -313,13 +361,18 @@ Message \e$B$O%U%)%m!<%"%C%W$,$I$3$K9T$/$+$rIaDL$NJ}K!$r;H$C$F7hDj$7$^$9$,!"\e(B
 \e$B%W5-;v$N08@h$r;XDj$7$?$$$3$H$,$"$j$^$9!#\e(BMail-Followup-To (MFT) \e$B$O$^$5$K\e(B
 \e$B$3$l$r2DG=$K$9$k$?$a$K:n$i$l$^$7$?!#$3$l$,Lr$KN)$D>l9g$NNc$rFs$D\e(B:
 
-@itemize
+@itemize @bullet
 @item
 \e$B%a!<%j%s%0%j%9%H$KEj9F$9$k?M$O!"JV;v$rEj9F<T$r4^$a$:$KC1$K%a!<%j%s%0%j%9\e(B
 \e$B%H$@$1$KAw?.$9$Y$-$G$"$k$3$H$r!"\e(BMFT \e$B$r;H$C$FI=8=$9$k$3$H$,$G$-$^$9!#$3$l\e(B
 \e$B$O!"Ej9F<T$,$9$G$K$=$N%a!<%j%s%0%j%9%H$r9XFI$7$F$$$k>l9g$,3:Ev$7$^$9!#\e(B
 
 @item
+\e$B%a!<%j%s%0%j%9%H$KEj9F$9$k?M$O!"JV;v$r%a!<%j%s%0%j%9%H$HEj9F<T$K$bAw?.$9\e(B
+\e$B$Y$-$G$"$k$3$H$r!"\e(BMFT \e$B$r;H$C$FI=8=$9$k$3$H$,$G$-$^$9!#$3$l$O!"Ej9F<T$,$=\e(B
+\e$B$N%a!<%j%s%0%j%9%H$r9XFI$7$F$$$J$$>l9g$,3:Ev$7$^$9!#\e(B
+
+@item
 \e$B%a%C%;!<%8$,$$$/$D$+$N%a!<%j%s%0%j%9%H$KEj9F$5$l$F$$$k>l9g$K!"$=$l0J9_$N\e(B
 \e$B5DO@$r0l$D$N%a!<%j%s%0%j%9%H$@$1$G9T$J$&$3$H$r;XDj$9$k$?$a$K$b\e(B MFT \e$B$O;H\e(B
 \e$B$o$l$^$9!#5DO@$,$$$/$D$+$N%a!<%j%s%0%j%9%H$G9T$J$o$l$F$7$^$&$H$P$i$P$i$K\e(B
@@ -344,6 +397,7 @@ gnus \e$B$OB>$N?M$N%a%C%;!<%8$K$"$k\e(B MFT \e$B%X%C%@!<$rB:=E$7\e(B (\e$B$9$J$o$A!"$
 \e$B$G$-$^$9!#0J2<$NJQ?t$,<j$4$m$G$7$g$&!#\e(B
 
 @table @code
+@vindex message-subscribed-addresses
 @item message-subscribed-addresses
 \e$B$3$l$O9XFI$7$F$$$k%a!<%j%s%0%j%9%H$N%"%I%l%9$N%j%9%H$G$J$1$l$P$J$j$^$;$s!#\e(B
 \e$B%G%#%U%)%k%HCM$O\e(B @code{nil} \e$B$G$9!#Nc\e(B:
@@ -353,6 +407,7 @@ gnus \e$B$OB>$N?M$N%a%C%;!<%8$K$"$k\e(B MFT \e$B%X%C%@!<$rB:=E$7\e(B (\e$B$9$J$o$A!"$
       '("ding@@gnus.org" "bing@@noose.org"))
 @end lisp
 
+@vindex message-subscribed-regexps
 @item message-subscribed-regexps
 \e$B$3$l$O9XFI$7$F$$$k%a!<%j%s%0%j%9%H$N%"%I%l%9$r<($9@55,I=8=$N%j%9%H$G$J$1\e(B
 \e$B$l$P$J$j$^$;$s!#%G%#%U%)%k%HCM$O\e(B @code{nil} \e$B$G$9!#>e5-$HF1$87k2L$r@.$7?k\e(B
@@ -360,14 +415,27 @@ gnus \e$B$OB>$N?M$N%a%C%;!<%8$K$"$k\e(B MFT \e$B%X%C%@!<$rB:=E$7\e(B (\e$B$9$J$o$A!"$
 
 @lisp
 (setq message-subscribed-regexps
-      '("[bd]ing@@\\(gnus\\|noose\\)\\.org"))
+      '("\\(ding@@gnus\\)\\|\\(bing@@noose\\)\\.org")
 @end lisp
 
+@vindex message-subscribed-address-functions
 @item message-subscribed-address-functions
 \e$B$3$l$O\e(B MFT \e$B%X%C%@!<$NCM$r7h$a$k$?$a$K\e(B (\e$B0lEY$K0l2s\e(B!!) \e$B8F$P$l$k4X?t$N%j%9\e(B
 \e$B%H$G$"$k$3$H$,$G$-$^$9!#$=$l$i$N4X?t$K$O0z?t$,L5$$$3$H$rCi9p$7$F$*$-$^$9!#\e(B
 \e$B%G%#%U%)%k%HCM$O\e(B @code{nil} \e$B$G$9!#\e(B
 
+gnus \e$B$K$O$3$NJQ?t$N9%E,$J8uJd$G$"$k$H$3$m$N!"$"$i$+$8$aDj5A$5$l$F$$$k4X\e(B
+\e$B?t$,$"$j$^$9!#4X?t\e(B @code{gnus-find-subscribed-addresses} \e$B$O!"\e(B
+@code{subscribed} (@pxref{(gnus)subscribed}) \e$B%0%k!<%W%Q%i%a!<%?$,\e(B
+\e$BHs\e(B-nil \e$B$K@_Dj$5$l$F$$$k%0%k!<%W$KBP1~$9$k%"%I%l%9$N%j%9%H$rJV$7$^$9!#$3\e(B
+\e$B$s$J$U$&$K$7$^$7$g$&!#\e(B
+
+@lisp
+(setq message-subscribed-address-functions
+      '(gnus-find-subscribed-addresses))
+@end lisp
+
+@vindex message-subscribed-address-file
 @item message-subscribed-address-file
 \e$B$"$J$?$O$b$7$+$7$?$i?l68$J?M\e(B (\e$B86E5\e(B: one organised human freak) \e$B$G!"9XFI\e(B
 \e$B$7$F$$$k$9$Y$F$N%a!<%j%s%0%j%9%H$N%"%I%l%9$N%j%9%H$rJL%U%!%$%k$G;}$C$F$$\e(B
@@ -380,38 +448,51 @@ gnus \e$B$OB>$N?M$N%a%C%;!<%8$K$"$k\e(B MFT \e$B%X%C%@!<$rB:=E$7\e(B (\e$B$9$J$o$A!"$
 
 \e$B$5$"MQ0U$,$G$-$^$7$?!#$$$D$b$N$h$&$K%a%C%;!<%8$N:n@.$r;O$a$^$7$g$&!#$=$7\e(B
 \e$B$F$$$D$bDL$j$KAw?.$7$^$7$g$&!#%a%C%;!<%8$,Aw=P$5$l$kD>A0\e(B
-\e$B$K\e(B gnus \e$B$N\e(B MFT \e$B$r:n$k;E3]$1$,F0:n$7$F!"%a%C%;!<%8$,$9$G$K\e(B MFT \e$B%X%C%@!<$r\e(B
-\e$B;}$C$F$$$k$+$I$&$+$rD4$Y$^$9!#$b$7$=$l$,0l$D$J$i!"$=$l$OJ|$C$F$*$+$l$^$9!#\e(B
-\e$BL5$+$C$?>l9g$O<u<h?M$N%"%I%l%9$N%j%9%H\e(B (To: \e$B$H\e(B Cc: \e$B%X%C%@!<$K$"$k\e(B) \e$B$r!"\e(B
-\e$B$=$l$i$N0l$D$,9XFI$7$F$$$k%a!<%j%s%0%j%9%H$N%"%I%l%9$+$I$&$+$rD4$Y$^$9!#\e(B
-\e$B$=$l$i$N$I$l$b$,%a!<%j%s%0%j%9%H$N%"%I%l%9$G$J$+$C$?$i!"\e(BMFT \e$B$O:n$i$l$^$;\e(B
-\e$B$s!#$=$l0J30$N>l9g$K$O\e(B MFT \e$B$,$=$NB>$N%X%C%@!<$KIU$12C$($i$l!"$=$NCM\e(B
-\e$B$O\e(B To: \e$B$H\e(B Cc: \e$B$K$"$k$9$Y$F$N%"%I%l%9$K@_Dj$5$l$^$9!#\e(B
-
+\e$B$K\e(B gnus \e$B$N\e(B MFT \e$B$r:n$k;E3]$1$,F0:n$7$F!"%a%C%;!<%8$,$9$G$K\e(B MFT \e$B%U%#!<%k%I\e(B
+\e$B$r;}$C$F$$$k$+$I$&$+$rD4$Y$^$9!#$b$7$=$l$,0l$D$J$i!"$=$l$OJ|$C$F$*$+$l$^\e(B
+\e$B$9\e(B (\e$B$?$@$7$=$N>l9g$K$=$l$,6u$C$]$@$C$?$i!"$=$N%U%#!<%k%I$O:o=|$5$l<+F0@8\e(B
+\e$B@.$5$l$?$b$N$GCV$-49$($i$l$k$3$H$b$"$j$^$;$s!#$3$l$O8D!9$N%a%C%;!<%8$K$D\e(B
+\e$B$$$F\e(B MFT \e$B$N@8@.$r6X;_$5$;$k4pK\$G$9\e(B)\e$B!#L5$+$C$?>l9g$O<u<h?M$N%"%I%l%9$N%j\e(B
+\e$B%9%H\e(B (To: \e$B$H\e(B Cc: \e$B%X%C%@!<$K$"$k\e(B) \e$B$r!"$=$l$i$N0l$D$,9XFI$7$F$$$k%a!<%j%s\e(B
+\e$B%0%j%9%H$N%"%I%l%9$+$I$&$+$rD4$Y$^$9!#$=$l$i$N$I$l$b$,%a!<%j%s%0%j%9%H$N\e(B
+\e$B%"%I%l%9$G$J$+$C$?$i!"\e(BMFT \e$B$O:n$i$l$^$;$s!#$=$l0J30$N>l9g$K$O\e(B MFT \e$B$,$=$N\e(B
+\e$BB>$N%X%C%@!<$KIU$12C$($i$l!"$=$NCM$O\e(B To: \e$B$H\e(B Cc: \e$B$K$"$k$9$Y$F$N%"%I%l%9$K\e(B
+\e$B@_Dj$5$l$^$9!#\e(B
+
+@kindex C-c C-f C-a
+@findex message-gen-unsubscribed-mft
+@kindex C-c C-f C-m
+@findex message-goto-mail-followup-to
 \e$B$&!<$`!#$=$&$9$k$H$"$J$?$O!V9XFI$7$F$$$J$$%a!<%j%s%0%j%9%H$K%a!<%k$rAw?.\e(B
-\e$B$9$k$H$-$O$I$&$J$k$N\e(B?\e$B!W$H?R$M$^$9$M!#$(!<$H!"?F@Z$J\e(B Gnus \e$B%?%o!<$N?M$?$A\e(B
-\e$B$,!"$3$NL\E*$G;H$($k$9$Y$F$N4{CN$N%a!<%j%s%0%j%9%H$N%"%I%l%9$N%G!<%?%Y!<\e(B
-\e$B%9$N:n@.$K$$$=$7$s$G$$$^$9!#$=$l$^$G$O!"\e(B@kbd{C-c C-f m} \e$B$r;H$C$F<jF0\e(B
-\e$B$G\e(B MFT \e$B%X%C%@!<$rA^F~$9$k$J$I$7$F2<$5$$\e(B!!
+\e$B$9$k$H$-$O$I$&$J$k$N\e(B?  \e$B;d$OM>J,$N%3%T!<$,M_$7$$$3$H$r\e(B MFT \e$B$G8@$$$?$$!W$H\e(B
+\e$B?R$M$^$9$M\e(B (\e$B$?$V$sB>$N?M$O\e(B MFT \e$B$,L5$+$C$?>l9g$HF1MM$K=hM}$7$F$7$^$&$@$m\e(B
+\e$B$&$1$l$I!"C/$+$N\e(B to-address \e$B%0%k!<%W%Q%i%a!<%?$r>e=q$-$9$k$?$a$K!"L@<(E*\e(B
+\e$B$J\e(B MFT \e$B$r;H$&$3$H$,$G$-$k$N$G$9\e(B)\e$B!#4X\e(B
+\e$B?t\e(B @code{message-gen-unsubscribed-mft} \e$B$,Lr$KN)$D$3$H$,$"$k$G$7$g$&!#$3\e(B
+\e$B$l$O%G%#%U%)%k%H$G\e(B @kbd{C-c C-f C-a} \e$B$K3d$jEv$F$i$l$F$$$^$9!#$I$s$J>l9g\e(B
+\e$B$G$b!"$"$J$?$O<+J,$,A*$s$@\e(B MFT \e$B$rA^F~$9$k$3$H$,$G$-$^$9\e(B; \e$B$=$l$r;O$a$k$N\e(B
+\e$B$K\e(B @kbd{C-c C-f C-m} (@code{message-goto-mail-followup-to}) \e$B$,=u$1$F$/$l\e(B
+\e$B$k$G$7$g$&!#\e(B
 
 @c @node Honoring an MFT post
 @subsection MFT \e$BEj9F$NB:=E\e(B
 
+@vindex message-use-mail-followup-to
 \e$B%a!<%j%s%0%j%9%H$KEj9F$5$l$?5-;v$K%U%)%m!<%"%C%W$9$k$H$-!"$=$N5-;v\e(B
 \e$B$,\e(B MFT \e$B%X%C%@!<$r;}$C$F$$$?$i!"\e(Bgnus \e$B$NF0:n$OJQ\e(B
 \e$B?t\e(B @code{message-use-mail-followup-to} \e$B$NCM$K$h$C$F7h$^$j$^$9!#$3$NCM$O\e(B
 \e$B0J2<$N$I$l$+$K$J$j$^$9\e(B:
 
 @table @code
-@item t
+@item use
 \e$B>o$K\e(B MFT \e$B$rB:=E$7$^$9!#%U%)%m!<%"%C%W5-;v$N\e(B To: \e$B$H\e(B Cc: \e$B%X%C%@!<$O!"85$N\e(B
-\e$B5-;v$N\e(B MFT \e$B%X%C%@!<$+$i0z$-=P$7$^$9!#\e(B
+\e$B5-;v$N\e(B MFT \e$B%X%C%@!<$+$i0z$-=P$7$^$9!#$3$l$,%G%#%U%)%k%H$G$9!#\e(B
 
 @item nil
 \e$B>o$K\e(B MFT \e$B$rB:=E$7$^$;$s\e(B (\e$B40`z$KL5;k\e(B)\e$B!#\e(B
 
 @item ask
-\e$B$I$&$9$k$+?R$M$^$9!#$3$l$,%G%#%U%)%k%H$G$9!#\e(B
+\e$B$I$&$9$k$+?R$M$^$9!#\e(B
 @end table
 
 MFT \e$B$rB:=E$9$k$3$H$ONI$$%M%A%1%C%H\e(B (nettiquette) \e$B$G$"$k$H9M$($i$l$F$$$^\e(B
@@ -626,7 +707,7 @@ automatically add the @code{Content-Type} and
 
 The most typical thing users want to use the multipart things in
 @sc{mime} for is to add ``attachments'' to mail they send out.  This can
-be done with the @code{C-c C-a} command, which will prompt for a file
+be done with the @kbd{C-c C-a} command, which will prompt for a file
 name and a @sc{mime} type.
 
 You can also create arbitrarily complex multiparts using the MML
@@ -641,71 +722,84 @@ Manual}).
 @cindex PGP/MIME
 @cindex sign
 @cindex encrypt
+@cindex secure
 
 Using the MML language, Message is able to create digitally signed and
 digitally encrypted messages.  Message (or rather MML) currently
-support PGP (RFC 1991), PGP/MIME (RFC 2015/3156) and S/MIME.
-Instructing MML to perform security operations on a MIME part is done
-using the @code{C-c C-m s} key map for signing and the @code{C-c C-m
-c} key map for encryption, as follows.
+support PGP (RFC 1991), @sc{pgp/mime} (RFC 2015/3156) and @sc{s/mime}.
+Instructing MML to perform security operations on a @sc{mime} part is
+done using the @kbd{C-c C-m s} key map for signing and the @kbd{C-c
+C-m c} key map for encryption, as follows.
 
 @table @kbd
 
 @item C-c C-m s s
 @kindex C-c C-m s s
-@findex mml-secure-sign-smime
+@findex mml-secure-message-sign-smime
 
-Digitally sign current MIME part using S/MIME.
+Digitally sign current message using @sc{s/mime}.
 
 @item C-c C-m s o
 @kindex C-c C-m s o
-@findex mml-secure-sign-pgp
+@findex mml-secure-message-sign-pgp
 
-Digitally sign current MIME part using PGP.
+Digitally sign current message using PGP.
 
 @item C-c C-m s p
 @kindex C-c C-m s p
-@findex mml-secure-sign-pgp
+@findex mml-secure-message-sign-pgpmime
 
-Digitally sign current MIME part using PGP/MIME.
+Digitally sign current message using @sc{pgp/mime}.
 
 @item C-c C-m c s
 @kindex C-c C-m c s
-@findex mml-secure-encrypt-smime
+@findex mml-secure-message-encrypt-smime
 
-Digitally encrypt current MIME part using S/MIME.
+Digitally encrypt current message using @sc{s/mime}.
 
 @item C-c C-m c o
 @kindex C-c C-m c o
-@findex mml-secure-encrypt-pgp
+@findex mml-secure-message-encrypt-pgp
 
-Digitally encrypt current MIME part using PGP.
+Digitally encrypt current message using PGP.
 
 @item C-c C-m c p
 @kindex C-c C-m c p
-@findex mml-secure-encrypt-pgpmime
+@findex mml-secure-message-encrypt-pgpmime
+
+Digitally encrypt current message using @sc{pgp/mime}.
+
+@item C-c C-m C-n
+@kindex C-c C-m C-n
+@findex mml-unsecure-message
+Remove security related MML tags from message.
 
-Digitally encrypt current MIME part using PGP/MIME.
 @end table
 
 These commands do not immediately sign or encrypt the message, they
-merely insert proper MML tags to instruct the MML engine to perform that
-operation when the message is actually sent.  They may perform other
-operations too, such as locating and retrieving a S/MIME certificate of
-the person you wish to send encrypted mail to.
+merely insert the proper MML secure tag to instruct the MML engine to
+perform that operation when the message is actually sent. They may
+perform other operations too, such as locating and retrieving a
+@sc{s/mime} certificate of the person you wish to send encrypted mail
+to.  When the mml parsing engine converts your MML into a properly
+encoded @sc{mime} message, the secure tag will be replaced with either
+a part or a multipart tag.  If your message contains other mml parts,
+a multipart tag will be used; if no other parts are present in your
+message a single part tag will be used.  This way, message mode will
+do the Right Thing (TM) with signed/encrypted multipart messages.
 
 Since signing and especially encryption often is used when sensitive
 information is sent, you may want to have some way to ensure that your
 mail is actually signed or encrypted.  After invoking the above
 sign/encrypt commands, it is possible to preview the raw article by
-using @code{C-u C-m P} (@code{mml-preview}).  Then you can verify that
-your long rant about what your ex-significant other or whomever actually
-did with that funny looking person at that strange party the other
-night, actually will be sent encrypted.
+using @kbd{C-u C-c RET P} (@code{mml-preview}).  Then you can
+verify that your long rant about what your ex-significant other or
+whomever actually did with that funny looking person at that strange
+party the other night, actually will be sent encrypted.
 
-@emph{Note!}  Neither PGP/MIME nor S/MIME encrypt/signs RFC822 headers.
-They only operate on the MIME object.  Keep this in mind before sending
-mail with a sensitive Subject line.
+@emph{Note!}  Neither @sc{pgp/mime} nor @sc{s/mime} encrypt/signs
+RFC822 headers.  They only operate on the @sc{mime} object.  Keep this
+in mind before sending mail with a sensitive Subject line.
 
 Actually using the security commands above is not very difficult.  At
 least not compared with making sure all involved programs talk with each
@@ -715,52 +809,54 @@ programs are required to make things work, and some small general hints.
 @subsection Using S/MIME
 
 @emph{Note!}  This section assume you have a basic familiarity with
-modern cryptography, S/MIME, various PKCS standards, OpenSSL and so on.
-
-The S/MIME support in Message (and MML) require OpenSSL.  OpenSSL
-perform the actual S/MIME sign/encrypt operations.  OpenSSL can be found
-at @uref{http://www.openssl.org/}.  OpenSSL 0.9.6 and later should work.
-Version 0.9.5a cannot extract mail addresses from certificates, and it
-insert a spurious CR character into MIME separators so you may wish to
-avoid it if you would like to avoid being regarded as someone who send
-strange mail. (Although by sending S/MIME messages you've probably
-already lost that contest.)
+modern cryptography, @sc{s/mime}, various PKCS standards, OpenSSL and
+so on.
+
+The @sc{s/mime} support in Message (and MML) require OpenSSL.  OpenSSL
+perform the actual @sc{s/mime} sign/encrypt operations.  OpenSSL can
+be found at @uref{http://www.openssl.org/}.  OpenSSL 0.9.6 and later
+should work.  Version 0.9.5a cannot extract mail addresses from
+certificates, and it insert a spurious CR character into @sc{mime}
+separators so you may wish to avoid it if you would like to avoid
+being regarded as someone who send strange mail. (Although by sending
+@sc{s/mime} messages you've probably already lost that contest.)
 
 To be able to send encrypted mail, a personal certificate is not
 required.  Message (MML) need a certificate for the person to whom you
 wish to communicate with though.  You're asked for this when you type
-@code{C-c C-m c s}.  Currently there are two ways to retrieve this
-certificate, from a local file or from DNS.  If you chose a local file,
-it need to contain a X.509 certificate in PEM format.  If you chose DNS,
-you're asked for the domain name where the certificate is stored, the
-default is a good guess.  To my belief, Message (MML) is the first mail
-agent in the world to support retrieving S/MIME certificates from DNS,
-so you're not likely to find very many certificates out there.  At least
-there should be one, stored at the domain @code{simon.josefsson.org}.
-LDAP is a more popular method of distributing certificates, support for
-it is planned.  (Meanwhile, you can use @code{ldapsearch} from the
-command line to retrieve a certificate into a file and use it.)
+@kbd{C-c C-m c s}.  Currently there are two ways to retrieve this
+certificate, from a local file or from DNS.  If you chose a local
+file, it need to contain a X.509 certificate in PEM format.  If you
+chose DNS, you're asked for the domain name where the certificate is
+stored, the default is a good guess.  To my belief, Message (MML) is
+the first mail agent in the world to support retrieving @sc{s/mime}
+certificates from DNS, so you're not likely to find very many
+certificates out there.  At least there should be one, stored at the
+domain @code{simon.josefsson.org}.  LDAP is a more popular method of
+distributing certificates, support for it is planned.  (Meanwhile, you
+can use @code{ldapsearch} from the command line to retrieve a
+certificate into a file and use it.)
 
 As for signing messages, OpenSSL can't perform signing operations
 without some kind of configuration.  Especially, you need to tell it
 where your private key and your certificate is stored.  MML uses an
-Emacs interface to OpenSSL, aptly named @code{smime.el}, and it contain
-a @code{custom} group used for this configuration.  So, try @code{M-x
-customize-group RET smime RET} and look around.
-
-Currently there is no support for talking to a CA (or RA) to create your
-own certificate.  None is planned either.  You need to do this manually
-with OpenSSL or using some other program.  I used Netscape and got a
-free S/MIME certificate from one of the big CA's on the net.  Netscape
-is able to export your private key and certificate in PKCS #12 format.
-Use OpenSSL to convert this into a plain X.509 certificate in PEM format
-as follows.
+Emacs interface to OpenSSL, aptly named @code{smime.el}, and it
+contain a @code{custom} group used for this configuration.  So, try
+@kbd{M-x customize-group RET smime RET} and look around.
+
+Currently there is no support for talking to a CA (or RA) to create
+your own certificate.  None is planned either.  You need to do this
+manually with OpenSSL or using some other program.  I used Netscape
+and got a free @sc{s/mime} certificate from one of the big CA's on the
+net.  Netscape is able to export your private key and certificate in
+PKCS #12 format.  Use OpenSSL to convert this into a plain X.509
+certificate in PEM format as follows.
 
 @example
 $ openssl pkcs12 -in ns.p12 -clcerts -nodes > key+cert.pem
 @end example
 
-The @code{key+cert.pem} file should be pointed to from the
+The @file{key+cert.pem} file should be pointed to from the
 @code{smime-keys} variable.  You should now be able to send signed mail.
 
 @emph{Note!}  Your private key is store unencrypted in the file, so take
@@ -768,9 +864,9 @@ care in handling it.
 
 @subsection Using PGP/MIME
 
-PGP/MIME requires an external OpenPGP implementation, such as GNU Privacy
-Guard (@uref{http://www.gnupg.org/}).  It also requires an Emacs interface
-to it, such as Mailcrypt (available from
+@sc{pgp/mime} requires an external OpenPGP implementation, such as GNU
+Privacy Guard (@uref{http://www.gnupg.org/}).  It also requires an
+Emacs interface to it, such as Mailcrypt (available from
 @uref{http://www.nb.net/~lbudney/linux/software/mailcrypt.html}) or
 Florian Weimer's @code{gpg.el}.
 
@@ -797,6 +893,7 @@ documentation of your OpenPGP implementation, so we refer to it.
 @item C-c C-e
 @kindex C-c C-e
 @findex message-elide-region
+@vindex message-elide-ellipsis
 \e$B%]%$%s%H$H%^!<%/$N4V$NJ8$r>J$-$^$9\e(B (@code{message-elide-region})\e$B!#J8>O$O\e(B
 \e$B@Z$i$l$F\e(B (killed) \e$BJQ?t\e(B @code{message-elide-ellipsis} \e$B$NCM$GCV$-49$($i$l\e(B
 \e$B$^$9!#%G%#%U%)%k%H$N>JN,Id9f$H$7$F;H$o$l$kCM$O\e(B (@samp{[...]}) \e$B$G$9!#\e(B
@@ -852,6 +949,13 @@ documentation of your OpenPGP implementation, so we refer to it.
 \e$B$rH?1G$7$?\e(B @code{Newsgroups} \e$B%X%C%@!<$rA^F~$7$^\e(B
 \e$B$9\e(B (@code{message-insert-newsgroups})\e$B!#\e(B
 
+@item C-c C-o
+@kindex C-c C-o
+@findex message-sort-headers
+@vindex message-header-format-alist
+@code{message-header-format-alist} \e$B$K=>$C$F%X%C%@!<$rJB$YBX$($^\e(B
+\e$B$9\e(B (@code{message-sort-headers})\e$B!#\e(B
+
 @item C-c M-r
 @kindex C-c M-r
 @findex message-rename-buffer
@@ -1044,9 +1148,9 @@ Message \e$B$O%a%C%;!<%8:n@.ItJ,$K4X$7$F$OHs>o$K@Q6KE*$G$9!#$=$l$O<!$N$h$&$G\e(B
 
 @item message-subject-re-regexp
 @vindex message-subject-re-regexp
-@cindex Aw:
-@cindex Sv:
-@cindex Re:
+@cindex Aw
+@cindex Sv
+@cindex Re
 \e$B%a%C%;!<%8$X$N1~Ez$O\e(B @samp{Re: } \e$B$G;O$^$j$^$9!#$3$l$O1Q8l\e(B
 \e$B$N\e(B ``response'' \e$B$NN,$G$O\e(B @emph{\e$B$"$j$^$;$s\e(B} \e$B$,!"%i%F%s8l$G!"\e(B``\e$B$=$l$K1~Ez\e(B
 \e$B$7$F\e(B'' (in response to) \e$B$H8@$&0UL#$G$9!#$$$/$D$+$NL53X$NGO</$O$3$N;v<B$r\e(B
@@ -1061,7 +1165,7 @@ Message \e$B$O%a%C%;!<%8:n@.ItJ,$K4X$7$F$OHs>o$K@Q6KE*$G$9!#$=$l$O<!$N$h$&$G\e(B
 
 @lisp
 (setq message-subject-re-regexp
-     "^\\(\\(\\([Rr][Ee]\\|[Ss][Vv]\\|[Aa][Ww]\\): *\\)+\\))
+     "^\\(\\(\\([Rr][Ee]\\|[Ss][Vv]\\|[Aa][Ww]\\): *\\)+\\)")
 @end lisp
 
 @item message-alternative-emails
@@ -1120,10 +1224,37 @@ Lines (optional . User-Agent))} \e$B$G$9!#\e(B
 \e$B$J$?$N\e(B MH \e$B$,$3$l$i$N%X%C%@!<$r07$($k$N$G$"$l$P!"$=$l$r\e(B @code{nil} \e$B$K@_Dj\e(B
 \e$B$7$F2<$5$$!#\e(B
 
+@item message-qmail-inject-program
+@vindex message-qmail-inject-program
+@cindex qmail
+qmail-inject \e$B%W%m%0%i%`$G$9!#\e(B
+
+@item message-qmail-inject-args
+@vindex message-qmail-inject-args
+qmail-inject \e$B%W%m%0%i%`$KEO$90z?t$G$9!#$3$l$OJ8;zNs$N%j%9%H$G!"$=$l$>$l\e(B
+\e$B$N0z?t$O0l$D$NJ8;zNs$G$J$1$l$P$J$j$^$;$s!#$3$l$O4X?t$G$bNI$$$G$9!#\e(B
+
+\e$BNc$($P!"@5$7$$>l=j$KD7$MJV$7$?$j!"%a!<%j%s%0%j%9%H$N47=,$K=>$&$?$a\e(B
+\e$B$K\e(B envelope sender \e$B$N%"%I%l%9$r@_Dj$7$?$$>l9g$O!"$3$NJQ?t\e(B
+\e$B$r\e(B @code{'("-f" "you@@some.where")} \e$B$K@_Dj$9$l$PNI$$$G$7$g$&!#\e(B
+
+@item message-sendmail-f-is-evil
+@vindex message-sendmail-f-is-evil
+@cindex sendmail
+\e$BHs\e(B-@code{nil} \e$B$G\e(B sendmail \e$B$N%3%^%s%I9T$K\e(B @samp{-f username} \e$B$rIU2C$7$^$;\e(B
+\e$B$s!#$=$&$9$k$3$H$O!"IU2C$7$J$$$h$j<Y0-$G$9$i$"$k$G$7$g$&!#\e(B
+
+@item message-mailer-swallows-blank-line
+@vindex message-mailer-swallows-blank-line
+\e$B%7%9%F%`$N%a%$%i!<$,%X%C%@!<$HK\J8$r0l=o$K$7$F$7$^$&>l9g$O!"\e(B
+\e$BHs\e(B-@code{nil} \e$B$K@_Dj$7$F2<$5$$!#\e(B(Sunos 4 \e$B$G\e(B sendmail \e$B$,%j%b!<%H%b!<%I$G\e(B
+\e$BF0:n$9$k>l9g$,3:Ev$7$^$9!#\e(B) \e$BCM$O!">c32$,<B:]$K5/$-$k$+$I$&$+$r%F%9%H$9$k\e(B
+\e$B$?$a$N<0$K$9$Y$-$G$9!#\e(B
+
 @c @item message-send-mail-partially-limit
 @c @vindex message-send-mail-partially-limit
 @c The limitation of messages sent as message/partial.
-@c The lower bound of message size in characters, beyond which the message 
+@c The lower bound of message size in characters, beyond which the message
 @c should be sent in several parts. If it is nil, the size is unlimited.
 @end table
 
@@ -1156,6 +1287,8 @@ Lines (optional . User-Agent))} \e$B$G$9!#\e(B
 
 @item Organization
 @cindex organization
+@vindex message-user-organization
+@vindex message-user-organization-file
 \e$B$3$NA*BrG$0U$J%X%C%@!<$OJQ?t\e(B @code{message-user-organization} \e$B$K0MB8$7$F\e(B
 \e$B:n@.$5$l$^$9!#$b$7$3$NJQ?t$,\e(B @code{t} \e$B$G$"$l$P!"\e(B
 @code{message-user-organization-file} \e$B$,;H$o$l$^$9!#$3$NJQ?t$OJ8;zNs$G$"\e(B
@@ -1189,17 +1322,20 @@ Message \e$B$O\e(B @code{system-name} \e$B$r%7%9%F%`L>$r7h$a$k$?$a$K;H$$$^$9!#$b$7$
 
 @item Expires
 @cindex Expires
+@vindex message-expires
 \e$B$3$NHs>o$KA*Br<+M3$J%X%C%@!<$OJQ?t\e(B @code{message-expires} \e$B$K$7$?$,$C$FA^\e(B
 \e$BF~$5$l$^$9!#$3$l$O<+J,$,2?$r$7$F$$$k$+$rCN$i$J$$8B$j!";HMQ$OA4$/4+$a$i$l\e(B
 \e$B$^$;$s!#\e(B
 
 @item Distribution
 @cindex Distribution
+@vindex message-distribution-function
 \e$B$3$NA*Br<+M3$J%X%C%@!<$OJQ?t\e(B @code{message-distribution-function} \e$B$K$7$?\e(B
 \e$B$,$C$F:n$i$l$^$9!#$=$l$OHs?d>)$G!"Hs>o$K8m2r$5$l$?%X%C%@!<$G$9!#\e(B
 
 @item Path
 @cindex path
+@vindex message-user-path
 \e$B$3$NHs>o$KA*Br<+M3$J%X%C%@!<$O$*$=$i$/7h$7$F;H$o$l$F$O$J$i$J$$$G$7$g$&!#\e(B
 \e$B$7$+$7$$$/$D$+$N\e(B @emph{\e$B$H$F$b\e(B} \e$B8E$$%5!<%P!<$O$3$N%X%C%@!<$,B8:_$9$k;v$r\e(B
 \e$BMW5a$7$^$9!#\e(B@code{message-user-path} \e$B$,$3$N\e(B @code{Path} \e$B%X%C%@!<$,$I$N$h\e(B
@@ -1423,10 +1559,10 @@ Hallvard B Furuseth <h.b.furuseth@@usit.uio.no> writes:
 \e$B$"$l$P!"<0$N7k2L$,JQ$o$j$K;H$o$l$^$9!#$3$NJQ?t$,\e(B @code{nil} \e$B$G$"$l$P!"=p\e(B
 \e$BL>$OA4$/A^F~$5$l$^$;$s!#\e(B
 
-@item messsage-signature-file
+@item message-signature-file
 @vindex message-signature-file
 \e$B%P%C%U%!$N:G8e$KA^F~$5$l$k=pL>$NF~$C$F$$$k%U%!%$%k$G$9!#=i4|CM\e(B
-\e$B$O\e(B @samp{~/.signature} \e$B$G$9!#\e(B
+\e$B$O\e(B @file{~/.signature} \e$B$G$9!#\e(B
 @end table
 
 RFC1036bis \e$B$O!"=pL>$O$=$NA0$K\e(B @samp{-- } \e$B$N\e(B3\e$BJ8;z$@$1$N9T$,$"$k$Y$-$G$"$k\e(B
@@ -1467,6 +1603,12 @@ follows this line--} \e$B$G$9!#\e(B
 \e$BB?$/$N%a!<%k$N$b$N$+$i;H$o$l$k%G%#%l%/%H%j!<$G$9!#=i4|CM\e(B
 \e$B$O\e(B @file{~/Mail/} \e$B$G$9!#\e(B
 
+@item message-auto-save-directory
+@vindex message-auto-save-directory
+gnus \e$B$,F0:n$7$F$$$J$$$H$-$K\e(B Message \e$B$,%P%C%U%!$r<+F0J]B8$9$k%G%#%l%/%H%j\e(B
+\e$B$G$9!#\e(B@code{nil} \e$B$@$C$?$i\e(B Message \e$B$O<+F0J]B8$r9T$J$$$^$;$s!#%G%#%U%)%k%H\e(B
+\e$B$O\e(B @file{~/Mail/drafts/} \e$B$G$9!#\e(B
+
 @item message-signature-setup-hook
 @vindex message-signature-setup-hook
 \e$B%a%C%;!<%8%P%C%U%!$r=i4|2=$9$k$H$-$K<B9T$5$l$k%U%C%/$G$9!#$=$l$O%X%C%@!<\e(B
@@ -1526,10 +1668,23 @@ follows this line--} \e$B$G$9!#\e(B
 @vindex message-sent-hook
 \e$B%a%C%;!<%8$rAw$k8e$K<B9T$5$l$k%U%C%/$G$9!#\e(B
 
+@item message-cancel-hook
+@vindex message-cancel-hook
+\e$B%K%e!<%95-;v$r<h$j>C$9$H$-$K<B9T$5$l$k%U%C%/$G$9!#\e(B
+
 @item message-mode-syntax-table
 @vindex message-mode-syntax-table
 \e$B%a%C%;!<%8%b!<%I%P%C%U%!$G;H$o$l$k9=J8%F!<%V%k$G$9!#\e(B
 
+@item message-strip-special-text-properties
+@vindex message-strip-special-text-properties
+Emacs \e$B$O%a%C%;!<%8:n@.$r$$$m$$$m$K2u$7$F$7$^$&$3$H$,$G$-$kB?$/$N%F%-%9%H\e(B
+\e$BB0@-\e(B (text properties) \e$B$r;}$C$F$$$^$9!#$3$l$,@_Dj$5$l$F$$$k$H\e(B message \e$B$O\e(B
+\e$B$=$l$i$NB0@-$r%a%C%;!<%8$r:n@.$9$k%P%C%U%!$+$iGm$.<h$j$^$9!#$7$+$7$$$/$D\e(B
+\e$B$+$N%Q%C%1!<%8$O!"F0:n$9$k$?$a$K$=$l$i$NB0@-$,$"$k$3$H$,I,MW$G$9!#$=$l$i\e(B
+\e$B$N%Q%C%1!<%8$N0l$D$r;H$&$J$i$P!"$3$N%*%W%7%g%s$r\e(B off \e$B$K$7$F!"%a%C%;!<%8\e(B
+\e$B$,2u$l$F$7$^$o$J$$$3$H$r5'$C$F2<$5$$!#\e(B
+
 @item message-send-method-alist
 @vindex message-send-method-alist
 
@@ -1578,6 +1733,17 @@ follows this line--} \e$B$G$9!#\e(B
 \e$B$,\e(B @code{nil} \e$B$G$"$l$P!"$=$N$h$&$J?F@Z%a%C%;!<%8$O2C$($i$l$^$;$s!#=i4|CM\e(B
 \e$B$O\e(B @samp{"The following message is a courtesy copy of an article\nthat has
 been posted to %s as well.\n\n"} \e$B$G$9!#\e(B
+
+@c @item message-fcc-externalize-attachments
+@c @vindex message-fcc-externalize-attachments
+@c If @code{nil}, attach files as normal parts in Fcc copies; if it is
+@c non-@code{nil}, attach local files as external parts.
+
+@item message-interactive
+@vindex message-interactive
+\e$BHs\e(B-@code{nil} \e$B$G!"%a%C%;!<%8$rAw?.$9$k$H$-$K%(%i!<$,=P$k$N$rBT$C$F$rI=<(\e(B
+\e$B$7$^$9!#\e(B@code{nil} \e$B$@$C$?$i!"%a%$%i!<$K%(%i!<$NJs9p$r%a!<%k$G9T$J$o$;$^\e(B
+\e$B$9!#\e(B
 @end table
 
 @node Message Buffers
@@ -1696,7 +1862,7 @@ Message \e$B$O$3$l$i$N%j%9%H$H:nMQ$9$k4X?t$rDs6!$7$F$$$^$9\e(B:
 
 Message \e$B$O;v<B>e!"$=$l<+?H$NJQ?t$7$+;H$$$^$;$s\e(B---\e$B8E$$\e(B @code{mail-} \e$B$NJQ\e(B
 \e$B?t$O9MN8$5$l$^$;$s!#\e(BMessage \e$B$K$3$l$i$NJQ?t$r7W;;$KF~$l$5$;$?$$$N$G$"$l$P!"\e(B
-\e$B0J2<$N$b$N$r\e(B @code{.emacs} \e$B%U%!%$%k$KF~$l$k;v$,$G$-$^$9\e(B:
+\e$B0J2<$N$b$N$r\e(B @file{.emacs} \e$B%U%!%$%k$KF~$l$k;v$,$G$-$^$9\e(B:
 
 @lisp
 (require 'messcompat)
index 2d16c8b..3bca7a5 100644 (file)
@@ -47,7 +47,7 @@ license to the document, as described in section 6 of the license.
 @page
 
 @vskip 0pt plus 1filll
-Copyright @copyright{} 1996, 1997, 1998, 1999, 2000 
+Copyright @copyright{} 1996, 1997, 1998, 1999, 2000, 2001, 2002 
      Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
@@ -193,10 +193,14 @@ but you can change the behavior to suit your needs by fiddling with the
 @code{message-wide-reply-to-function}.  It is used in the same way as
 @code{message-reply-to-function} (@pxref{Reply}).
 
-@findex message-dont-reply-to-names
+@vindex message-dont-reply-to-names
 Addresses that match the @code{message-dont-reply-to-names} regular
 expression will be removed from the @code{Cc} header.
 
+@vindex message-wide-reply-confirm-recipients
+If @code{message-wide-reply-confirm-recipients} is non-@code{nil} you
+will be asked to confirm that you want to reply to multiple
+recipients.  The default is @code{nil}.
 
 @node Followup
 @section Followup
@@ -226,6 +230,11 @@ it is @code{nil}, don't use the value.
 The @code{message-cancel-news} command cancels the article in the
 current buffer.
 
+@vindex message-cancel-message
+The value of @code{message-cancel-message} is inserted in the body of
+the cancel message.  The default is @samp{I am canceling my own
+article.}.
+
 
 @node Superseding
 @section Superseding
@@ -283,9 +292,14 @@ constructed.  The default value is @code{nil}.
 @item message-forward-as-mime
 @vindex message-forward-as-mime
 If this variable is @code{t} (the default), forwarded messages are
-included as inline MIME RFC822 parts.  If it's @code{nil}, forwarded
+included as inline @sc{mime} RFC822 parts.  If it's @code{nil}, forwarded
 messages will just be copied inline to the new message, like previous,
-non MIME-savvy versions of gnus would do.
+non @sc{mime}-savvy versions of gnus would do.
+
+@item message-forward-before-signature
+@vindex message-forward-before-signature
+If non-@code{nil}, put forwarded message before signature, else after.
+
 @end table
 
 
@@ -326,13 +340,18 @@ followups to the post to specific places.  The Mail-Followup-To (MFT)
 was created to enable just this.  Two example scenarios where this is
 useful:
 
-@itemize
+@itemize @bullet
 @item
 A mailing list poster can use MFT to express that responses should be
 sent to just the list, and not the poster as well.  This will happen
 if the poster is already subscribed to the list.
 
 @item
+A mailing list poster can use MFT to express that responses should be
+sent to the list and the poster as well.  This will happen if the poster
+is not subscribed to the list.
+
+@item
 If a message is posted to several mailing lists, MFT may also be used
 to direct the following discussion to one list only, because
 discussions that are spread over several lists tend to be fragmented
@@ -359,6 +378,7 @@ way.  The following variables would come in handy.
 
 @table @code
 
+@vindex message-subscribed-addresses
 @item message-subscribed-addresses
 This should be a list of addresses the user is subscribed to.  Its
 default value is @code{nil}.   Example: 
@@ -367,20 +387,34 @@ default value is @code{nil}.   Example:
       '("ding@@gnus.org" "bing@@noose.org"))
 @end lisp
 
+@vindex message-subscribed-regexps
 @item message-subscribed-regexps
 This should be a list of regexps denoting the addresses of mailing
 lists subscribed to.  Default value is @code{nil}.  Example: If you
 want to achieve the same result as above:
 @lisp
 (setq message-subscribed-regexps
-      '("[bd]ing@@\\(gnus\\|noose\\)\\.org"))
+      '("\\(ding@@gnus\\)\\|\\(bing@@noose\\)\\.org")
 @end lisp
 
+@vindex message-subscribed-address-functions
 @item message-subscribed-address-functions
 This can be a list of functions to be called (one at a time!!) to
 determine the value of MFT headers.  It is advisable that these
 functions not take any arguments.  Default value is @code{nil}.
 
+There is a pre-defined function in Gnus that is a good candidate for
+this variable.  @code{gnus-find-subscribed-addresses} is a function
+that returns a list of addresses corresponding to the groups that have
+the @code{subscribed} (@pxref{(gnus)subscribed})
+group parameter set to a non-nil value.  This is how you would do it.
+
+@lisp
+(setq message-subscribed-address-functions
+      '(gnus-find-subscribed-addresses))
+@end lisp
+
+@vindex message-subscribed-address-file
 @item message-subscribed-address-file
 You might be one organised human freak and have a list of addresses of
 all subscribed mailing lists in a separate file!  Then you can just
@@ -391,39 +425,50 @@ set this variable to the name of the file and life would be good.
 You can use one or more of the above variables.  All their values are
 ``added'' in some way that works :-)
 
-Now you are all set.  Just start composing a message as you normally
-do.  And just send it; as always.  Just before the message is sent
-out, Gnus' MFT generation thingy kicks in and checks if the message
-already has a MFT header.  If there is one, the header is left alone.
-If not then the list of recipient addresses (in the To: and Cc:
-headers) is checked to see if one of them is a list address you are
-subscribed to.  If none of them is a list address, then no MFT is
-generated; otherwise, a MFT is added to the other headers and set to
-the value of all addresses in To: and Cc:
-
+Now you are all set.  Just start composing a message as you normally do.
+And just send it; as always.  Just before the message is sent out, Gnus'
+MFT generation thingy kicks in and checks if the message already has a
+MFT field.  If there is one, it is left alone.  (Except if it's empty -
+in that case, the field is removed and is not replaced with an
+automatically generated one.  This lets you disable MFT generation on a
+per-message basis.)  If there is none, then the list of recipient
+addresses (in the To: and Cc: headers) is checked to see if one of them
+is a list address you are subscribed to.  If none of them is a list
+address, then no MFT is generated; otherwise, a MFT is added to the
+other headers and set to the value of all addresses in To: and Cc:
+
+@kindex C-c C-f C-a
+@findex message-gen-unsubscribed-mft
+@kindex C-c C-f C-m
+@findex message-goto-mail-followup-to
 Hm. ``So'', you ask, ``what if I send an email to a list I am not
-subscribed to?''  Well, the kind folks at Gnus Towers are working on a
-database of all known mailing list addresses that can be used for this
-purpose.  Till then, you could, like, insert a MFT header manually,
-with the help of @kbd{C-c C-f m} !!
+subscribed to?  I want my MFT to say that I want an extra copy.''
+(This is supposed to be interpreted by others the same way as if there
+were no MFT, but you can use an explicit MFT to override someone
+else's to-address group parameter.)  The function
+@code{message-gen-unsubscribed-mft} might come in handy.  It is bound
+to @kbd{C-c C-f C-a} by default.  In any case, you can insert a MFT of
+your own choice; @kbd{C-c C-f C-m}
+(@code{message-goto-mail-followup-to}) will help you get started.
 
 @c @node Honoring an MFT post
 @subsection Honoring an MFT post
 
+@vindex message-use-mail-followup-to
 When you followup to a post on a mailing list, and the post has a MFT
 header, Gnus' action will depend on the value of the variable
 @code{message-use-mail-followup-to}.  This variable can be one of:
 
 @table @code
-@item t
+@item use
  Always honor MFTs.  The To: and Cc: headers in your followup will be
- derived from the MFT header of the original post.
+ derived from the MFT header of the original post.  This is the default.
 
 @item nil
  Always dishonor MFTs (just ignore the darned thing)
 
 @item ask
-Gnus will prompt you for an action.  This is the default.
+Gnus will prompt you for an action.
 
 @end table
 
@@ -650,7 +695,7 @@ automatically add the @code{Content-Type} and
 
 The most typical thing users want to use the multipart things in
 @sc{mime} for is to add ``attachments'' to mail they send out.  This can
-be done with the @code{C-c C-a} command, which will prompt for a file
+be done with the @kbd{C-c C-a} command, which will prompt for a file
 name and a @sc{mime} type.
 
 You can also create arbitrarily complex multiparts using the MML
@@ -665,72 +710,84 @@ Manual}).
 @cindex PGP/MIME
 @cindex sign
 @cindex encrypt
+@cindex secure
 
 Using the MML language, Message is able to create digitally signed and
 digitally encrypted messages.  Message (or rather MML) currently
-support PGP (RFC 1991), PGP/MIME (RFC 2015/3156) and S/MIME.
-Instructing MML to perform security operations on a MIME part is done
-using the @code{C-c C-m s} key map for signing and the @code{C-c C-m
-c} key map for encryption, as follows.
+support PGP (RFC 1991), @sc{pgp/mime} (RFC 2015/3156) and @sc{s/mime}.
+Instructing MML to perform security operations on a @sc{mime} part is
+done using the @kbd{C-c C-m s} key map for signing and the @kbd{C-c
+C-m c} key map for encryption, as follows.
 
 @table @kbd
 
 @item C-c C-m s s
 @kindex C-c C-m s s
-@findex mml-secure-sign-smime
+@findex mml-secure-message-sign-smime
 
-Digitally sign current MIME part using S/MIME.
+Digitally sign current message using @sc{s/mime}.
 
 @item C-c C-m s o
 @kindex C-c C-m s o
-@findex mml-secure-sign-pgp
+@findex mml-secure-message-sign-pgp
 
-Digitally sign current MIME part using PGP.
+Digitally sign current message using PGP.
 
 @item C-c C-m s p
 @kindex C-c C-m s p
-@findex mml-secure-sign-pgp
+@findex mml-secure-message-sign-pgpmime
 
-Digitally sign current MIME part using PGP/MIME.
+Digitally sign current message using @sc{pgp/mime}.
 
 @item C-c C-m c s
 @kindex C-c C-m c s
-@findex mml-secure-encrypt-smime
+@findex mml-secure-message-encrypt-smime
 
-Digitally encrypt current MIME part using S/MIME.
+Digitally encrypt current message using @sc{s/mime}.
 
 @item C-c C-m c o
 @kindex C-c C-m c o
-@findex mml-secure-encrypt-pgp
+@findex mml-secure-message-encrypt-pgp
 
-Digitally encrypt current MIME part using PGP.
+Digitally encrypt current message using PGP.
 
 @item C-c C-m c p
 @kindex C-c C-m c p
-@findex mml-secure-encrypt-pgpmime
+@findex mml-secure-message-encrypt-pgpmime
+
+Digitally encrypt current message using @sc{pgp/mime}.
 
-Digitally encrypt current MIME part using PGP/MIME.
+@item C-c C-m C-n
+@kindex C-c C-m C-n
+@findex mml-unsecure-message
+Remove security related MML tags from message.
 
 @end table
 
 These commands do not immediately sign or encrypt the message, they
-merely insert proper MML tags to instruct the MML engine to perform that
-operation when the message is actually sent.  They may perform other
-operations too, such as locating and retrieving a S/MIME certificate of
-the person you wish to send encrypted mail to.
+merely insert the proper MML secure tag to instruct the MML engine to
+perform that operation when the message is actually sent. They may
+perform other operations too, such as locating and retrieving a
+@sc{s/mime} certificate of the person you wish to send encrypted mail
+to.  When the mml parsing engine converts your MML into a properly
+encoded @sc{mime} message, the secure tag will be replaced with either
+a part or a multipart tag.  If your message contains other mml parts,
+a multipart tag will be used; if no other parts are present in your
+message a single part tag will be used.  This way, message mode will
+do the Right Thing (TM) with signed/encrypted multipart messages.
 
 Since signing and especially encryption often is used when sensitive
 information is sent, you may want to have some way to ensure that your
 mail is actually signed or encrypted.  After invoking the above
 sign/encrypt commands, it is possible to preview the raw article by
-using @code{C-u C-m P} (@code{mml-preview}).  Then you can verify that
-your long rant about what your ex-significant other or whomever actually
-did with that funny looking person at that strange party the other
-night, actually will be sent encrypted.
+using @kbd{C-u C-c RET P} (@code{mml-preview}).  Then you can
+verify that your long rant about what your ex-significant other or
+whomever actually did with that funny looking person at that strange
+party the other night, actually will be sent encrypted.
 
-@emph{Note!}  Neither PGP/MIME nor S/MIME encrypt/signs RFC822 headers.
-They only operate on the MIME object.  Keep this in mind before sending
-mail with a sensitive Subject line.
+@emph{Note!}  Neither @sc{pgp/mime} nor @sc{s/mime} encrypt/signs
+RFC822 headers.  They only operate on the @sc{mime} object.  Keep this
+in mind before sending mail with a sensitive Subject line.
 
 Actually using the security commands above is not very difficult.  At
 least not compared with making sure all involved programs talk with each
@@ -740,52 +797,54 @@ programs are required to make things work, and some small general hints.
 @subsection Using S/MIME
 
 @emph{Note!}  This section assume you have a basic familiarity with
-modern cryptography, S/MIME, various PKCS standards, OpenSSL and so on.
-
-The S/MIME support in Message (and MML) require OpenSSL.  OpenSSL
-perform the actual S/MIME sign/encrypt operations.  OpenSSL can be found
-at @uref{http://www.openssl.org/}.  OpenSSL 0.9.6 and later should work.
-Version 0.9.5a cannot extract mail addresses from certificates, and it
-insert a spurious CR character into MIME separators so you may wish to
-avoid it if you would like to avoid being regarded as someone who send
-strange mail. (Although by sending S/MIME messages you've probably
-already lost that contest.)
+modern cryptography, @sc{s/mime}, various PKCS standards, OpenSSL and
+so on.
+
+The @sc{s/mime} support in Message (and MML) require OpenSSL.  OpenSSL
+perform the actual @sc{s/mime} sign/encrypt operations.  OpenSSL can
+be found at @uref{http://www.openssl.org/}.  OpenSSL 0.9.6 and later
+should work.  Version 0.9.5a cannot extract mail addresses from
+certificates, and it insert a spurious CR character into @sc{mime}
+separators so you may wish to avoid it if you would like to avoid
+being regarded as someone who send strange mail. (Although by sending
+@sc{s/mime} messages you've probably already lost that contest.)
 
 To be able to send encrypted mail, a personal certificate is not
 required.  Message (MML) need a certificate for the person to whom you
 wish to communicate with though.  You're asked for this when you type
-@code{C-c C-m c s}.  Currently there are two ways to retrieve this
-certificate, from a local file or from DNS.  If you chose a local file,
-it need to contain a X.509 certificate in PEM format.  If you chose DNS,
-you're asked for the domain name where the certificate is stored, the
-default is a good guess.  To my belief, Message (MML) is the first mail
-agent in the world to support retrieving S/MIME certificates from DNS,
-so you're not likely to find very many certificates out there.  At least
-there should be one, stored at the domain @code{simon.josefsson.org}.
-LDAP is a more popular method of distributing certificates, support for
-it is planned.  (Meanwhile, you can use @code{ldapsearch} from the
-command line to retrieve a certificate into a file and use it.)
+@kbd{C-c C-m c s}.  Currently there are two ways to retrieve this
+certificate, from a local file or from DNS.  If you chose a local
+file, it need to contain a X.509 certificate in PEM format.  If you
+chose DNS, you're asked for the domain name where the certificate is
+stored, the default is a good guess.  To my belief, Message (MML) is
+the first mail agent in the world to support retrieving @sc{s/mime}
+certificates from DNS, so you're not likely to find very many
+certificates out there.  At least there should be one, stored at the
+domain @code{simon.josefsson.org}.  LDAP is a more popular method of
+distributing certificates, support for it is planned.  (Meanwhile, you
+can use @code{ldapsearch} from the command line to retrieve a
+certificate into a file and use it.)
 
 As for signing messages, OpenSSL can't perform signing operations
 without some kind of configuration.  Especially, you need to tell it
 where your private key and your certificate is stored.  MML uses an
-Emacs interface to OpenSSL, aptly named @code{smime.el}, and it contain
-a @code{custom} group used for this configuration.  So, try @code{M-x
-customize-group RET smime RET} and look around.
-
-Currently there is no support for talking to a CA (or RA) to create your
-own certificate.  None is planned either.  You need to do this manually
-with OpenSSL or using some other program.  I used Netscape and got a
-free S/MIME certificate from one of the big CA's on the net.  Netscape
-is able to export your private key and certificate in PKCS #12 format.
-Use OpenSSL to convert this into a plain X.509 certificate in PEM format
-as follows.
+Emacs interface to OpenSSL, aptly named @code{smime.el}, and it
+contain a @code{custom} group used for this configuration.  So, try
+@kbd{M-x customize-group RET smime RET} and look around.
+
+Currently there is no support for talking to a CA (or RA) to create
+your own certificate.  None is planned either.  You need to do this
+manually with OpenSSL or using some other program.  I used Netscape
+and got a free @sc{s/mime} certificate from one of the big CA's on the
+net.  Netscape is able to export your private key and certificate in
+PKCS #12 format.  Use OpenSSL to convert this into a plain X.509
+certificate in PEM format as follows.
 
 @example
 $ openssl pkcs12 -in ns.p12 -clcerts -nodes > key+cert.pem
 @end example
 
-The @code{key+cert.pem} file should be pointed to from the
+The @file{key+cert.pem} file should be pointed to from the
 @code{smime-keys} variable.  You should now be able to send signed mail.
 
 @emph{Note!}  Your private key is store unencrypted in the file, so take
@@ -793,9 +852,9 @@ care in handling it.
 
 @subsection Using PGP/MIME
 
-PGP/MIME requires an external OpenPGP implementation, such as GNU
-Privacy Guard (@uref{http://www.gnupg.org/}).  It also requires an Emacs
-interface to it, such as Mailcrypt (available from
+@sc{pgp/mime} requires an external OpenPGP implementation, such as GNU
+Privacy Guard (@uref{http://www.gnupg.org/}).  It also requires an
+Emacs interface to it, such as Mailcrypt (available from
 @uref{http://www.nb.net/~lbudney/linux/software/mailcrypt.html}) or
 Florian Weimer's @code{gpg.el}.
 
@@ -822,6 +881,7 @@ many places to rotate the text.  The default is 13.
 @item C-c C-e
 @kindex C-c C-e
 @findex message-elide-region
+@vindex message-elide-ellipsis
 Elide the text between point and mark (@code{message-elide-region}).
 The text is killed and replaced with the contents of the variable
 @code{message-elide-ellipsis}. The default value is to use an ellipsis
@@ -876,6 +936,13 @@ Insert a @code{Newsgroups} header that reflects the @code{Followup-To}
 or @code{Newsgroups} header of the article you're replying to
 (@code{message-insert-newsgroups}).
 
+@item C-c C-o
+@kindex C-c C-o
+@findex message-sort-headers
+@vindex message-header-format-alist
+Sort headers according to @code{message-header-format-alist}
+(@code{message-sort-headers}).
+
 @item C-c M-r
 @kindex C-c M-r
 @findex message-rename-buffer
@@ -1081,9 +1148,9 @@ buffers.
 
 @item message-subject-re-regexp
 @vindex message-subject-re-regexp
-@cindex Aw:
-@cindex Sv:
-@cindex Re:
+@cindex Aw
+@cindex Sv
+@cindex Re
 Responses to messages have subjects that start with @samp{Re: }.  This
 is @emph{not} an abbreviation of the English word ``response'', but is
 Latin, and means ``in response to''.  Some illiterate nincompoops have
@@ -1099,7 +1166,7 @@ responding to a message:
 
 @lisp
 (setq message-subject-re-regexp
-     "^\\(\\(\\([Rr][Ee]\\|[Ss][Vv]\\|[Aa][Ww]\\): *\\)+\\))
+     "^\\(\\(\\([Rr][Ee]\\|[Ss][Vv]\\|[Aa][Ww]\\): *\\)+\\)")
 @end lisp
 
 @item message-alternative-emails
@@ -1157,6 +1224,34 @@ the default), these headers will be removed before mailing when sending
 messages via MH.  Set it to @code{nil} if your MH can handle these
 headers.
 
+@item message-qmail-inject-program
+@vindex message-qmail-inject-program
+@cindex qmail
+Location of the qmail-inject program.
+
+@item message-qmail-inject-args
+@vindex message-qmail-inject-args
+Arguments passed to qmail-inject programs.
+This should be a list of strings, one string for each argument.  It
+may also be a function.
+
+For e.g., if you wish to set the envelope sender address so that bounces
+go to the right place or to deal with listserv's usage of that address, you
+might set this variable to @code{'("-f" "you@@some.where")}.
+
+@item message-sendmail-f-is-evil
+@vindex message-sendmail-f-is-evil
+@cindex sendmail
+Non-@code{nil} means don't add @samp{-f username} to the sendmail
+command line.  Doing so would be even more evil than leaving it out.
+
+@item message-mailer-swallows-blank-line
+@vindex message-mailer-swallows-blank-line
+Set this to non-@code{nil} if the system's mailer runs the header and
+body together.  (This problem exists on Sunos 4 when sendmail is run
+in remote mode.)  The value should be an expression to test whether
+the problem will actually occur.
+
 @item message-send-mail-partially-limit
 @vindex message-send-mail-partially-limit
 The limitation of messages sent as message/partial.
@@ -1196,6 +1291,8 @@ to.  If it isn't present already, it will be prompted for.
 
 @item Organization
 @cindex organization
+@vindex message-user-organization
+@vindex message-user-organization-file
 This optional header will be filled out depending on the
 @code{message-user-organization} variable.
 @code{message-user-organization-file} will be used if this variable is
@@ -1229,18 +1326,21 @@ header of the article being replied to.
 
 @item Expires
 @cindex Expires
+@vindex message-expires
 This extremely optional header will be inserted according to the
 @code{message-expires} variable.  It is highly deprecated and shouldn't
 be used unless you know what you're doing.
 
 @item Distribution
 @cindex Distribution
+@vindex message-distribution-function
 This optional header is filled out according to the
 @code{message-distribution-function} variable.  It is a deprecated and
 much misunderstood header.
 
 @item Path
 @cindex path
+@vindex message-user-path
 This extremely optional header should probably never be used.
 However, some @emph{very} old servers require that this header is
 present.  @code{message-user-path} further controls how this
@@ -1480,7 +1580,7 @@ If this variable is @code{nil}, no signature will be inserted at all.
 @item message-signature-file
 @vindex message-signature-file
 File containing the signature to be inserted at the end of the buffer.
-The default is @samp{~/.signature}.
+The default is @file{~/.signature}.
 
 @end table
 
@@ -1524,6 +1624,11 @@ follows this line--} by default.
 @vindex message-directory
 Directory used by many mailey things.  The default is @file{~/Mail/}.
 
+@item message-auto-save-directory
+@vindex message-auto-save-directory
+Directory where Message auto-saves buffers if Gnus isn't running.  If
+@code{nil}, Message won't auto-save.  The default is @file{~/Mail/drafts/}.
+
 @item message-signature-setup-hook
 @vindex message-signature-setup-hook
 Hook run when initializing the message buffer.  It is run after the
@@ -1583,10 +1688,23 @@ Hook run before sending news messages.
 @vindex message-sent-hook
 Hook run after sending messages.
 
+@item message-cancel-hook
+@vindex message-cancel-hook
+Hook run when cancelling news articles.
+
 @item message-mode-syntax-table
 @vindex message-mode-syntax-table
 Syntax table used in message mode buffers.
 
+@item message-strip-special-text-properties
+@vindex message-strip-special-text-properties
+Emacs has a number of special text properties which can break message
+composing in various ways.  If this option is set, message will strip
+these properties from the message composition buffer.  However, some
+packages requires these properties to be present in order to work.  If
+you use one of these packages, turn this option off, and hope the
+message composition doesn't break too bad.
+
 @item message-send-method-alist
 @vindex message-send-method-alist
 
@@ -1640,6 +1758,16 @@ this variable is @code{nil}, no such courtesy message will be added.
 The default value is @samp{"The following message is a courtesy copy of
 an article\\nthat has been posted to %s as well.\\n\\n"}.
 
+@item message-fcc-externalize-attachments
+@vindex message-fcc-externalize-attachments
+If @code{nil}, attach files as normal parts in Fcc copies; if it is
+non-@code{nil}, attach local files as external parts.
+
+@item message-interactive
+@vindex message-interactive
+If non-@code{nil} wait for and display errors when sending a message;
+if @code{nil} let the mailer mail back a message to report errors.
+
 @end table
 
 
@@ -1762,7 +1890,7 @@ a form to be @code{eval}ed.
 
 Message uses virtually only its own variables---older @code{mail-}
 variables aren't consulted.  To force Message to take those variables
-into account, you can put the following in your @code{.emacs} file:
+into account, you can put the following in your @file{.emacs} file:
 
 @lisp
 (require 'messcompat)
index 3ef0339..cf72fb3 100644 (file)
@@ -5,21 +5,25 @@
 
 \def\Guide{Card}\def\guide{card}
 \def\logoscale{0.25}
+\newlength{\logowidth} \setlength{\logowidth}{6.861in}
+\newlength{\logoheight} \setlength{\logoheight}{7.013in}
+
+\raggedbottom\raggedright
+
+\usepackage{epsfig}
+
 \setlength{\textwidth}{7.26in} \setlength{\textheight}{10in}
 \setlength{\topmargin}{-1.0in}
 % the same settings work for A4, although there is a bit of space at the
 % top and bottom of the page. 
 \setlength{\oddsidemargin}{-0.5in} \setlength{\evensidemargin}{-0.5in}
 
-\usepackage{epsfig}
 
-% README:
-% *** purpose
-% this was originally thought of as a reference card (but as it is now 5+
-% pages long, it may not be more useful than the online-help). It helps
-% to get an overview for the Gnus-functionality.
+% README (for refcard + booklet)
+% This is a 5+ page reference card. In addition there is a booklet
+% (bk-a4.tex for A4 and bk-lt.tex for Letter).
 %
-% *** files
+% *** files for the refcard
 % refcard.tex (this file), gnusref.tex ("include"-file) and
 % gnuslogo-refcard.eps (Gnus logo).
 %
 % $xdvi refcard.dvi [C-c C-v]
 % and print using something like
 % $dvips refcard.dvi 
-% which creates refcard.ps (print using 'lpr refcard.ps')
+%
+% If you want to print the booklet, you need to use `pstops' from the
+% `psutils' package (TODO: somebody write a howto ?)
 %
 % *** customization:
+
 % the part following \begin{document} in this file consists of a macro for
 % each section and section-headers (\section*{..}). It should be easy to
 % reorder things and/or remove sections (put '%' at the beginning of the line).
-% (i.e. you might want to omit \notes in the printed version ?)
+% (i.e. you might want to omit \notes in the printed version)
+% The same goes for the booklet: Its contents are defined in booklet.tex.
 % If you think that the order is not logical and you have ideas for
 % improvements, please send mail to the current maintainer.
-%
-% *** ChangeLog:
-% 2000-03-26  Felix Natter  <fnatter@gmx.net>:
-% refcard updated for Gnus 5.8.x: please send corrections or suggestions
-% to the above email-address
-% changes since 2000-03-26:
-% o Create/Edit Foreign Groups: remove S b and S B (not available in 5.8.3)
-% o Send/Reply etc.: remove w and W (the only bindings are S w and S W)
-% Mon Apr  3 18:41:09 2000:
-% o added C-c C-n and C-c C-t (Article)
-% o C-c C-a as alias for M-m f (Article) + some other M-m *-bindings
-% o added section for ``jumping'' in article-mode
-% o now there's a difference between ``reading'' and ``composition''
-% (article-modes)
-% Apr 24th, 2000:
-% o added D s, D S and D t for nndraft
-% o group-mode: i.e. C-u RET does not actually fetch fewer articles; also ,=>;
-% Fri Jul 14 23:15:43 2000:
-% o added README-section
-% Thu Jul 27 20:51:01 2000:
-% o added Unplugged-commands
-%
+
 % *** TODO:
-% o (LaTeX) how can you get 'tabular' to wrap around pages ?
 % o some things might not be updated: scoring and server modes, maybe more
 % o Gnus Unplugged category-buffer commands need to be written
 
 \begin{document}
-\newlength{\logowidth} \setlength{\logowidth}{6.861in}
-\newlength{\logoheight} \setlength{\logoheight}{7.013in}
 
 \def\progver{5.10}\def\refver{5.10-1} % program and refcard versions
-\def\date{Oct 13th, 2001}
+\def\date{Mar 23rd, 2002}
 \def\author{Gnus Bugfixing Girls + Boys $<$bugs@gnus.org$>$}
 \raggedbottom\raggedright
 
 \twocolumn
-% use \tiny to shrink it to 4 pages (needs a high-resaoultion printer, though)
+% use \tiny to shrink it to 4 pages (needs a high-resolution printer though)
 %\tiny
 \scriptsize
 \pagestyle{plain}
     \SortSummary
     \subsection*{Score (Value) Commands}
     \Scoring
-% 
-    \subsection*{MIME operations from the Summary-Buffer}
-    \MIMESummary
     \subsection*{Extract Series (Uudecode etc)}
     \ExtractSeries
     \subsection*{Output Articles}
     \OutputArticles
+    \subsection*{MIME operations from the Summary-Buffer}
+    \MIMESummary     
 %
     \subsection*{Post, Followup, Reply, Forward, Cancel}
     \PostReplyetc
 %
     \subsection*{Summary-Unplugged}
     \SummaryUnplugged
+\pagebreak    
     \subsection*{Mail-Group Commands}
     \MailGroups
     \subsection*{Draft-Group Commands}
 \ArticleModeGeneral
     \subsection*{Wash the Article-Buffer}
     \WashArticle
+    \subsubsection*{Blank Lines and Whitespace}
+    \BlankAndWhitespace
+    \subsubsection*{Picons, X-faces, Smileys}
+    \Picons
+    \subsubsection*{Time and Date}
+    \TimeAndDate
     \subsection*{Hide/Highlight Parts of the Article}
     \HideHighlightArticle
     \subsection*{MIME operations from the Article-Buffer (reading)}
diff --git a/todo b/todo
index 5fa540a..92ff87e 100644 (file)
--- a/todo
+++ b/todo
@@ -1,6 +1,20 @@
 ;; Also know as the "wish list".  Some are done. For the others, no
 ;; promise when to be implemented.
 
+* gnus-topic-kill-region
+  From Colin Marquardt <colin.marquardt@usa.alcatel.com>
+  
+  I noticed that when re-arranging topics, C-k yanks a topic just fine
+  (runs gnus-topic-kill-group).
+
+  However, my habit is to do marking and the yanking the region, so I
+  would run C-w on the marked topic. But C-w runs
+  gnus-group-kill-region and doesn't yank the topic (for groups it
+  works fine).
+
+  So could we have a gnus-topic-kill-region, or a
+  gnus-group-kill-region which handles topics as well?
+
 * Speed up sorting in summary buffer if there is a limit.
   
   Suggested by Daniel Ortmann <ortmann@isl.net>.