Index: gnus/lisp/ChangeLog
diff -u gnus/lisp/ChangeLog:6.410 gnus/lisp/ChangeLog:6.421
--- gnus/lisp/ChangeLog:6.410	Sat Apr 14 01:16:35 2001
+++ gnus/lisp/ChangeLog	Tue May  1 19:22:46 2001
@@ -1,3 +1,80 @@
+2001-05-01 19:21:19 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no>
+
+	* gnus.el: Oort Gnus v0.03 is released.
+
+2001-05-01 19:06:21  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+	* nnultimate.el (nnultimate-topic-article-to-article): Use the
+	group.
+
+2001-04-24 19:50:14  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+	* gnus-srvr.el (gnus-server-insert-server-line): Add a space.
+
+2001-04-15 14:55:03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+	* nnultimate.el (nnultimate-retrieve-headers): Return all
+	available headers. 
+
+	* gnus-sum.el (gnus-read-all-available-headers): New variable.
+	(gnus-get-newsgroup-headers-xover): Use it.
+
+2001-04-14 15:47:26  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+	* nnultimate.el (nnultimate-retrieve-headers): Clean up.
+
+2001-04-30 17:00:00  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+	* nntp.el (nntp-retrieve-groups): Use throw instead of error.
+
+2001-04-29 09:00:00  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+	* nnrss.el (nnrss-insert-w3): Use cache before I figure out how to
+	disable it.
+
+	* gnus.el (gnus-info-nodes): Remove a few The's.
+
+2001-04-29 08:00:00  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+	* mail-source.el (mail-source-movemail): Call-process may return a
+	signal description string.
+
+	* gnus-start.el (gnus-read-newsrc-el-file):
+	gnus-newsrc-file-version may be nil.
+
+	* nnmail.el (nnmail-get-new-mail): Use the exact file only.
+	Suggested by Michael Sperber [Mr. Preprocessor]  
+	<sperber@informatik.uni-tuebingen.de>.
+
+2001-04-25  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+	* mm-uu.el (mm-uu-configure-list): Fixed customize type.
+
+2001-04-24  Hrvoje Niksic  <hniksic@arsdigita.com>
+
+	* mm-view.el (mm-display-inline-fontify): Allow XEmacs to fully
+	fontify HANDLE.
+
+2001-04-18  Simon Josefsson  <simon@josefsson.org>
+
+	* smime.el (smime-ask-passphrase): Rework to return value.
+	(smime-sign-region): Rework to bind value and use it.
+	(smime-decrypt-region): Ditto.
+
+2001-04-18  Mathias Herberts <Mathias.Herberts@iroise.net>
+	Committed by Simon Josefsson  <simon@josefsson.org>
+
+	* smime.el (smime-ask-passphrase): New function.
+	(smime-sign-region): Use it.
+	(smime-encrypt-cipher): New variable.
+	(smime-decrypt-region): Ditto.
+
+2001-04-12  Jason Merrill  <jason_merrill@redhat.com>
+	Committed by Simon Josefsson  <simon@josefsson.org>
+
+	* imap.el (imap-shell-open): Erase the buffer *after* copying it into
+	the log.
+
 2001-04-14 01:14:42 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no>
 
 	*gnus.el: Oort Gnus v0.02 is released.
Index: gnus/lisp/gnus-srvr.el
diff -u gnus/lisp/gnus-srvr.el:6.7 gnus/lisp/gnus-srvr.el:6.8
--- gnus/lisp/gnus-srvr.el:6.7	Sun Apr  1 00:53:37 2001
+++ gnus/lisp/gnus-srvr.el	Tue May  1 19:09:42 2001
@@ -189,7 +189,7 @@
 	 (gnus-tmp-agent (if (and gnus-agent
 				  (member method
 					  gnus-agent-covered-methods))
-			     "(agent)"
+			     " (agent)"
 			   "")))
     (beginning-of-line)
     (gnus-add-text-properties
Index: gnus/lisp/gnus-start.el
diff -u gnus/lisp/gnus-start.el:6.17 gnus/lisp/gnus-start.el:6.18
--- gnus/lisp/gnus-start.el:6.17	Mon Apr  9 03:57:06 2001
+++ gnus/lisp/gnus-start.el	Sun Apr 29 14:56:37 2001
@@ -2077,7 +2077,9 @@
 	   (error "Error in %s" ding-file))))
       ;; Older versions of `gnus-format-specs' are no longer valid
       ;; in Oort Gnus 0.01.
-      (let ((version (gnus-continuum-version gnus-newsrc-file-version)))
+      (let ((version 
+	     (and gnus-newsrc-file-version
+		  (gnus-continuum-version gnus-newsrc-file-version))))
 	(when (or (not version)
 		  (< version 5.090002))
 	  (setq gnus-format-specs nil)))
Index: gnus/lisp/gnus-sum.el
diff -u gnus/lisp/gnus-sum.el:6.66 gnus/lisp/gnus-sum.el:6.67
--- gnus/lisp/gnus-sum.el:6.66	Sat Apr 14 00:51:30 2001
+++ gnus/lisp/gnus-sum.el	Tue May  1 19:09:44 2001
@@ -956,6 +956,13 @@
   :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
+wish to widen the summary buffer to include all headers
+that were fetched.  Say, for nnultimate groups."
+  :group 'gnus-summary
+  :type '(choice boolean regexp))
 
 ;;; Internal variables
 
@@ -5094,6 +5101,13 @@
 	(mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets)
 	(cur nntp-server-buffer)
 	(dependencies (or dependencies gnus-newsgroup-dependencies))
+	(allp (cond
+	       ((eq gnus-read-all-available-headers t)
+		t)
+	       ((stringp gnus-read-all-available-headers)
+		(string-match gnus-read-all-available-headers group))
+	       (t
+		nil)))
 	number headers header)
     (save-excursion
       (set-buffer nntp-server-buffer)
@@ -5103,19 +5117,22 @@
       (goto-char (point-min))
       (while (not (eobp))
 	(condition-case ()
-	    (while (and sequence (not (eobp)))
+	    (while (and (or sequence allp)
+			(not (eobp)))
 	      (setq number (read cur))
-	      (while (and sequence
-			  (< (car sequence) number))
-		(setq sequence (cdr sequence)))
-	      (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))
+	      (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)"
Index: gnus/lisp/gnus.el
diff -u gnus/lisp/gnus.el:6.27 gnus/lisp/gnus.el:6.29
--- gnus/lisp/gnus.el:6.27	Sat Apr 14 00:51:32 2001
+++ gnus/lisp/gnus.el	Sun Apr 29 15:04:55 2001
@@ -256,7 +256,7 @@
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "0.02"
+(defconst gnus-version-number "0.03"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Oort Gnus v%s" gnus-version-number)
@@ -1772,10 +1772,10 @@
   "The mail address of the Gnus maintainers.")
 
 (defvar gnus-info-nodes
-  '((gnus-group-mode "(gnus)The Group Buffer")
-    (gnus-summary-mode "(gnus)The Summary Buffer")
-    (gnus-article-mode "(gnus)The Article Buffer")
-    (gnus-server-mode "(gnus)The Server Buffer")
+  '((gnus-group-mode "(gnus)Group Buffer")
+    (gnus-summary-mode "(gnus)Summary Buffer")
+    (gnus-article-mode "(gnus)Article Buffer")
+    (gnus-server-mode "(gnus)Server Buffer")
     (gnus-browse-mode "(gnus)Browse Foreign Server")
     (gnus-tree-mode "(gnus)Tree Display"))
   "Alist of major modes and related Info nodes.")
Index: gnus/lisp/imap.el
diff -u gnus/lisp/imap.el:6.5 gnus/lisp/imap.el:6.6
--- gnus/lisp/imap.el:6.5	Tue Apr 10 14:54:52 2001
+++ gnus/lisp/imap.el	Mon Apr 16 02:00:45 2001
@@ -653,13 +653,13 @@
 		      (not (imap-parse-greeting)))
 	    (accept-process-output process 1)
 	    (sit-for 1))
-	  (erase-buffer)
 	  (and imap-log
 	       (with-current-buffer (get-buffer-create imap-log)
 		 (imap-disable-multibyte)
 		 (buffer-disable-undo)
 		 (goto-char (point-max))
 		 (insert-buffer-substring buffer)))
+	  (erase-buffer)
 	  (when (memq (process-status process) '(open run))
 	    (setq done process)))))
     (if done
Index: gnus/lisp/mail-source.el
diff -u gnus/lisp/mail-source.el:6.4 gnus/lisp/mail-source.el:6.5
--- gnus/lisp/mail-source.el:6.4	Wed Jan 24 15:53:19 2001
+++ gnus/lisp/mail-source.el	Sun Apr 29 14:56:37 2001
@@ -539,8 +539,9 @@
 		  (goto-char (point-min))
 		  (when (looking-at "movemail: ")
 		    (delete-region (point-min) (match-end 0)))
+		  ;; Result may be a signal description string.
 		  (unless (yes-or-no-p
-			   (format "movemail: %s (%d return).  Continue? "
+			   (format "movemail: %s (%s return).  Continue? "
 				   (buffer-string) result))
 		    (error "%s" (buffer-string)))
 		  (setq to nil)))))))
Index: gnus/lisp/mm-uu.el
diff -u gnus/lisp/mm-uu.el:6.13 gnus/lisp/mm-uu.el:6.14
--- gnus/lisp/mm-uu.el:6.13	Fri Feb 16 20:31:14 2001
+++ gnus/lisp/mm-uu.el	Wed Apr 25 19:28:21 2001
@@ -132,13 +132,10 @@
   "A list of mm-uu configuration.
 To disable dissecting shar codes, for instance, add
 `(shar . disabled)' to this list."
-  :type `(repeat (cons
-		  ,(cons 'choice
-			 (mapcar
-			  (lambda (entry)
-			    (cons 'item (car entry)))
-			  mm-uu-type-alist))
-		  (choice (item disabled))))
+  :type 'alist
+  :options (mapcar (lambda (entry)
+		     (list (car entry) '(const disabled)))
+		   mm-uu-type-alist)
   :group 'gnus-article-mime)
 
 ;; functions
Index: gnus/lisp/mm-view.el
diff -u gnus/lisp/mm-view.el:6.5 gnus/lisp/mm-view.el:6.6
--- gnus/lisp/mm-view.el:6.5	Fri Feb  9 14:42:27 2001
+++ gnus/lisp/mm-view.el	Tue Apr 24 14:21:19 2001
@@ -266,17 +266,36 @@
 
 (defun mm-display-inline-fontify (handle mode)
   (let (text)
-    (with-temp-buffer
-      (mm-insert-part handle)
-      (funcall mode)
-      (font-lock-fontify-buffer)
-      (when (fboundp 'extent-list)
-	(map-extents (lambda (ext ignored)
-		       (set-extent-property ext 'duplicable t)
-		       nil)
-		     nil nil nil nil nil 'text-prop))
-      (setq text (buffer-string)))
+    ;; XEmacs @#$@ version of font-lock refuses to fully turn itself
+    ;; on for buffers whose name begins with " ".  That's why we use
+    ;; save-current-buffer/get-buffer-create rather than
+    ;; with-temp-buffer.
+    (save-current-buffer
+      (set-buffer (generate-new-buffer "*fontification*"))
+      (unwind-protect
+	  (progn
+	    (buffer-disable-undo)
+	    (mm-insert-part handle)
+	    (funcall mode)
+	    (let ((font-lock-verbose nil))
+	      ;; I find font-lock a bit too verbose.
+	      (font-lock-fontify-buffer))
+	    ;; By default, XEmacs font-lock uses non-duplicable text
+	    ;; properties.  This code forces all the text properties
+	    ;; to be copied along with the text.
+	    (when (fboundp 'extent-list)
+	      (map-extents (lambda (ext ignored)
+			     (set-extent-property ext 'duplicable t)
+			     nil)
+			   nil nil nil nil nil 'text-prop))
+	    (setq text (buffer-string)))
+	(kill-buffer (current-buffer))))
     (mm-insert-inline handle text)))
+
+;; Shouldn't these functions check whether the user even wants to use
+;; font-lock?  At least under XEmacs, this fontification is pretty
+;; much unconditional.  Also, it would be nice to change for the size
+;; of the fontified region.
 
 (defun mm-display-patch-inline (handle)
   (mm-display-inline-fontify handle 'diff-mode))
Index: gnus/lisp/nnmail.el
diff -u gnus/lisp/nnmail.el:6.12 gnus/lisp/nnmail.el:6.13
--- gnus/lisp/nnmail.el:6.12	Fri Apr 13 17:57:45 2001
+++ gnus/lisp/nnmail.el	Sun Apr 29 14:36:09 2001
@@ -1566,11 +1566,9 @@
 				 (list
 				  :predicate
 				  `(lambda (file)
-				     (string-match
-				      ,(concat
-					(regexp-quote (concat group suffix))
-					"$")
-				      file)))))))
+				     (string-equal
+				      ,(concat group suffix)
+				      (file-name-nondirectory file))))))))
 	(when nnmail-fetched-sources
 	  (if (member source nnmail-fetched-sources)
 	      (setq source nil)
Index: gnus/lisp/nnrss.el
diff -u gnus/lisp/nnrss.el:6.2 gnus/lisp/nnrss.el:6.3
--- gnus/lisp/nnrss.el:6.2	Fri Mar  9 05:30:44 2001
+++ gnus/lisp/nnrss.el	Sun Apr 29 15:24:18 2001
@@ -310,12 +310,18 @@
 (defun nnrss-no-cache (url)
   "")
 
+;; TODO:: disable cache.
+;;
+;; (defun nnrss-insert-w3 (url)
+;;   (require 'url)
+;;   (require 'url-cache)
+;;   (let ((url-cache-creation-function 'nnrss-no-cache))
+;;     (mm-with-unibyte-current-buffer
+;;       (nnweb-insert url))))
+
 (defun nnrss-insert-w3 (url)
-  (require 'url)
-  (require 'url-cache)
-  (let ((url-cache-creation-function 'nnrss-no-cache))
-    (mm-with-unibyte-current-buffer
-      (nnweb-insert url))))
+  (mm-with-unibyte-current-buffer
+    (nnweb-insert url)))
 
 (defun nnrss-decode-entities-unibyte-string (string)
   (mm-with-unibyte-buffer
Index: gnus/lisp/nntp.el
diff -u gnus/lisp/nntp.el:6.7 gnus/lisp/nntp.el:6.8
--- gnus/lisp/nntp.el:6.7	Thu Jan 25 01:50:35 2001
+++ gnus/lisp/nntp.el	Mon Apr 30 23:39:59 2001
@@ -493,84 +493,85 @@
   "Retrieve group info on GROUPS."
   (nntp-possibly-change-group nil server)
   (when (nntp-find-connection-buffer nntp-server-buffer)
-    (save-excursion
-      ;; Erase nntp-server-buffer before nntp-inhibit-erase.
-      (set-buffer nntp-server-buffer)
-      (erase-buffer)
-      (set-buffer (nntp-find-connection-buffer nntp-server-buffer))
-      ;; The first time this is run, this variable is `try'.  So we
-      ;; try.
-      (when (eq nntp-server-list-active-group 'try)
-	(nntp-try-list-active (car groups)))
-      (erase-buffer)
-      (let ((count 0)
-	    (received 0)
-	    (last-point (point-min))
-	    (nntp-inhibit-erase t)
-	    (buf (nntp-find-connection-buffer nntp-server-buffer))
-	    (command (if nntp-server-list-active-group "LIST ACTIVE" "GROUP")))
-	(while groups
-	  ;; Send the command to the server.
-	  (nntp-send-command nil command (pop groups))
-	  (incf count)
-	  ;; Every 400 requests we have to read the stream in
-	  ;; order to avoid deadlocks.
-	  (when (or (null groups)	;All requests have been sent.
-		    (zerop (% count nntp-maximum-request)))
-	    (nntp-accept-response)
+    (catch 'done
+      (save-excursion
+	;; Erase nntp-server-buffer before nntp-inhibit-erase.
+	(set-buffer nntp-server-buffer)
+	(erase-buffer)
+	(set-buffer (nntp-find-connection-buffer nntp-server-buffer))
+	;; The first time this is run, this variable is `try'.  So we
+	;; try.
+	(when (eq nntp-server-list-active-group 'try)
+	  (nntp-try-list-active (car groups)))
+	(erase-buffer)
+	(let ((count 0)
+	      (received 0)
+	      (last-point (point-min))
+	      (nntp-inhibit-erase t)
+	      (buf (nntp-find-connection-buffer nntp-server-buffer))
+	      (command (if nntp-server-list-active-group "LIST ACTIVE" "GROUP")))
+	  (while groups
+	    ;; Send the command to the server.
+	    (nntp-send-command nil command (pop groups))
+	    (incf count)
+	    ;; Every 400 requests we have to read the stream in
+	    ;; order to avoid deadlocks.
+	    (when (or (null groups)	;All requests have been sent.
+		      (zerop (% count nntp-maximum-request)))
+	      (nntp-accept-response)
+	      (while (and (gnus-buffer-live-p buf)
+			  (progn
+			    ;; Search `blue moon' in this file for the
+			    ;; reason why set-buffer here.
+			    (set-buffer buf)
+			    (goto-char last-point)
+			    ;; Count replies.
+			    (while (re-search-forward "^[0-9]" nil t)
+			      (incf received))
+			    (setq last-point (point))
+			    (< received count)))
+		(nntp-accept-response))))
+	  
+	  ;; Wait for the reply from the final command.
+	  (unless (gnus-buffer-live-p buf)
+	    (nnheader-report 'nntp "Connection to %s is closed." server)
+	    (throw 'done nil))
+	  (set-buffer buf)
+	  (goto-char (point-max))
+	  (re-search-backward "^[0-9]" nil t)
+	  (when (looking-at "^[23]")
 	    (while (and (gnus-buffer-live-p buf)
 			(progn
-			  ;; Search `blue moon' in this file for the
-			  ;; reason why set-buffer here.
 			  (set-buffer buf)
-			  (goto-char last-point)
-			  ;; Count replies.
-			  (while (re-search-forward "^[0-9]" nil t)
-			    (incf received))
-			  (setq last-point (point))
-			  (< received count)))
-	      (nntp-accept-response))))
-
-	;; Wait for the reply from the final command.
-	(unless (gnus-buffer-live-p buf)
-	  (error
-	   (nnheader-report 'nntp "Connection to %s is closed." server)))
-	(set-buffer buf)
-	(goto-char (point-max))
-	(re-search-backward "^[0-9]" nil t)
-	(when (looking-at "^[23]")
-	  (while (and (gnus-buffer-live-p buf)
-		      (progn
-			(set-buffer buf)
-			(goto-char (point-max))
-			(if (not nntp-server-list-active-group)
-			    (not (re-search-backward "\r?\n" (- (point) 3) t))
-			  (not (re-search-backward "^\\.\r?\n"
-						   (- (point) 4) t)))))
-		      (nntp-accept-response)))
-
-	;; Now all replies are received.  We remove CRs.
-	(unless (gnus-buffer-live-p buf)
-	  (error
-	   (nnheader-report 'nntp "Connection to %s is closed." server)))
-	(set-buffer buf)
-	(goto-char (point-min))
-	(while (search-forward "\r" nil t)
-	  (replace-match "" t t))
-
-	(if (not nntp-server-list-active-group)
-	    (progn
-	      (copy-to-buffer nntp-server-buffer (point-min) (point-max))
-	      'group)
-	  ;; We have read active entries, so we just delete the
-	  ;; superfluous gunk.
+			  (goto-char (point-max))
+			  (if (not nntp-server-list-active-group)
+			      (not (re-search-backward "\r?\n" (- (point) 3) t))
+			    (not (re-search-backward "^\\.\r?\n"
+						     (- (point) 4) t)))))
+	      (nntp-accept-response)))
+	  
+	  ;; Now all replies are received.  We remove CRs.
+	  (unless (gnus-buffer-live-p buf)
+	    (nnheader-report 'nntp "Connection to %s is closed." server)
+	    (throw 'done nil))
+	  (set-buffer buf)
 	  (goto-char (point-min))
-	  (while (re-search-forward "^[.2-5]" nil t)
-	    (delete-region (match-beginning 0)
-			   (progn (forward-line 1) (point))))
-	  (copy-to-buffer nntp-server-buffer (point-min) (point-max))
-	  'active)))))
-
+	  (while (search-forward "\r" nil t)
+	    (replace-match "" t t))
+	  
+	  (if (not nntp-server-list-active-group)
+	      (progn
+		(copy-to-buffer nntp-server-buffer (point-min) (point-max))
+		'group)
+	    ;; We have read active entries, so we just delete the
+	    ;; superfluous gunk.
+	    (goto-char (point-min))
+	    (while (re-search-forward "^[.2-5]" nil t)
+	      (delete-region (match-beginning 0)
+			     (progn (forward-line 1) (point))))
+	    (copy-to-buffer nntp-server-buffer (point-min) (point-max))
+	    'active))))))
+  
 (deffoo nntp-retrieve-articles (articles &optional group server)
   (nntp-possibly-change-group group server)
   (save-excursion
Index: gnus/lisp/nnultimate.el
diff -u gnus/lisp/nnultimate.el:6.5 gnus/lisp/nnultimate.el:6.6
--- gnus/lisp/nnultimate.el:6.5	Wed Mar 21 20:18:57 2001
+++ gnus/lisp/nnultimate.el	Tue May  1 19:09:48 2001
@@ -85,6 +85,8 @@
       (setq map mapping)
       (while (and (setq article (car articles))
 		  map)
+	;; Skip past the articles in the map until we reach the
+	;; article we're looking for.
 	(while (and map
 		    (or (> article (caar map))
 			(< (cadar map) (caar map))))
@@ -138,14 +140,21 @@
 	      (setq contents (cdr (nth 2 (car (nth 2 table)))))
 	      (setq total-contents (nconc total-contents contents))
 	      (incf current-page))
-	    ;;(setq total-contents (nreverse total-contents))
-	    (dolist (art (cdr elem))
-	      (if (not (nth (1- (cdr art)) total-contents))
-		  ()			;(debug)
-		(push (list (car art)
-			    (nth (1- (cdr art)) total-contents)
-			    subject)
-		      nnultimate-articles)))))
+	    (when t
+	      (let ((i 0))
+		(dolist (co total-contents)
+		  (push (list (or (nnultimate-topic-article-to-article
+				   group (car elem) (incf i))
+				  1)
+			      co subject)
+			nnultimate-articles))))
+	    (when nil
+	      (dolist (art (cdr elem))
+		(when (nth (1- (cdr art)) total-contents)
+		  (push (list (car art)
+			      (nth (1- (cdr art)) total-contents)
+			      subject)
+			nnultimate-articles))))))
 	(setq nnultimate-articles
 	      (sort nnultimate-articles 'car-less-than-car))
 	;; Now we have all the articles, conveniently in an alist
@@ -190,7 +199,7 @@
 	     from (or date "")
 	     (concat "<" (number-to-string sid) "%"
 		     (number-to-string article)
-		     "@ultimate>")
+		     "@ultimate." server ">")
 	     "" 0
 	     (/ (length (mapconcat
 			 'identity
@@ -208,6 +217,16 @@
 	    (dolist (header nnultimate-headers)
 	      (nnheader-insert-nov (cdr header))))))
       'nov)))
+
+(defun nnultimate-topic-article-to-article (group topic article)
+  (catch 'found
+    (dolist (elem (nth 5 (assoc group nnultimate-groups)))
+      (when (and (= topic (nth 2 elem))
+		 (>= article (nth 3 elem))
+		 (< article (+ (- (nth 1 elem) (nth 0 elem)) 1
+			       (nth 3 elem))))
+	(throw 'found
+	       (+ (nth 0 elem) (- article (nth 3 elem))))))))
 
 (deffoo nnultimate-request-group (group &optional server dont-check)
   (nnultimate-possibly-change-server nil server)
Index: gnus/lisp/smime.el
diff -u gnus/lisp/smime.el:6.10 gnus/lisp/smime.el:6.11
--- gnus/lisp/smime.el:6.10	Sun Jan 21 07:00:28 2001
+++ gnus/lisp/smime.el	Wed Apr 18 13:57:00 2001
@@ -85,6 +85,10 @@
 ;; that decision.  One might think that this even influenced were I
 ;; store my keys, and one would probably be right. :-)
 ;;
+;; Update: Mathias Herberts sent the patch.  However, it uses
+;; environment variables to pass the password to OpenSSL, which is
+;; slightly insecure. Hence a new todo: use a better -passin method.
+;;
 ;; Suggestions and comments are appreciated, mail me at simon@josefsson.org.
 
 ;; <rant>
@@ -108,6 +112,7 @@
 ;;; Code:
 
 (require 'dig)
+(require 'comint)
 (eval-when-compile (require 'cl))
 
 (defgroup smime nil
@@ -159,6 +164,17 @@
   :type 'string
   :group 'smime)
 
+;; OpenSSL option to select the encryption cipher
+
+(defcustom smime-encrypt-cipher "-des3"
+  "Cipher algorithm used for encryption."
+  :type '(choice (const :tag "Triple DES" "-des3")
+		 (const :tag "DES"  "-des")
+		 (const :tag "RC2 40 bits" "-rc2-40")
+		 (const :tag "RC2 64 bits" "-rc2-64")
+		 (const :tag "RC2 128 bits" "-rc2-128"))
+  :group 'smime)
+  
 (defcustom smime-dns-server nil
   "DNS server to query certificates from.
 If nil, use system defaults."
@@ -168,6 +184,17 @@
 
 (defvar smime-details-buffer "*OpenSSL output*")
 
+;; Password dialog function
+
+(defun smime-ask-passphrase ()
+  "Asks the passphrase to unlock the secret key."
+  (let ((passphrase
+	 (comint-read-noecho
+	  "Passphrase for secret key (RET for no passphrase): " t)))
+    (if (string= passphrase "")
+	nil
+      passphrase)))
+
 ;; OpenSSL wrappers.
 
 (defun smime-call-openssl-region (b e buf &rest args)
@@ -186,15 +213,22 @@
 If signing fails, the buffer is not modified.  Region is assumed to
 have proper MIME tags.  KEYFILE is expected to contain a PEM encoded
 private key and certificate."
-  (let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))))
+  (let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*")))
+	(passphrase (smime-ask-passphrase)))
+    (if passphrase
+	(setenv "GNUS_SMIME_PASSPHRASE" passphrase))
     (prog1
-	(when (smime-call-openssl-region b e buffer "smime" "-sign"
-					 "-signer" (expand-file-name keyfile))
+	(when (apply 'smime-call-openssl-region b e buffer "smime" "-sign" 
+		     "-signer" (expand-file-name keyfile)
+		     (if passphrase
+			 (list "-passin" "env:GNUS_SMIME_PASSPHRASE")))
 	  (delete-region b e)
 	  (insert-buffer buffer)
 	  (when (looking-at "^MIME-Version: 1.0$")
 	    (delete-region (point) (progn (forward-line 1) (point))))
 	  t)
+      (if passphrase
+	  (setenv "GNUS_SMIME_PASSPHRASE" "" t))
       (with-current-buffer (get-buffer-create smime-details-buffer)
 	(goto-char (point-max))
 	(insert-buffer buffer))
@@ -208,7 +242,7 @@
   (let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))))
     (prog1
 	(when (apply 'smime-call-openssl-region b e buffer "smime" "-encrypt"
-		     (mapcar 'expand-file-name certfiles))
+		     smime-encrypt-cipher (mapcar 'expand-file-name certfiles))
 	  (delete-region b e)
 	  (insert-buffer buffer)
 	  (when (looking-at "^MIME-Version: 1.0$")
@@ -277,11 +311,17 @@
 
 (defun smime-decrypt-region (b e keyfile)
   (let ((buffer (generate-new-buffer (generate-new-buffer-name "*smime*")))
-	CAs)
-    (when (apply 'smime-call-openssl-region b e buffer "smime" "-decrypt"
-		 "-recip" (list keyfile))
-
+	CAs (passphrase (smime-ask-passphrase)))
+    (if passphrase
+	(setenv "GNUS_SMIME_PASSPHRASE" passphrase))
+    (when (apply 'smime-call-openssl-region
+		 b e buffer "smime" "-decrypt" 
+		 "-recip" (list keyfile)
+		 (if passphrase
+		     (list "-passin" "env:GNUS_SMIME_PASSPHRASE" )))
       )
+    (if passphrase
+	(setenv "GNUS_SMIME_PASSPHRASE" "" t))
     (with-current-buffer (get-buffer-create smime-details-buffer)
       (goto-char (point-max))
       (insert-buffer buffer))
Index: gnus/texi/ChangeLog
diff -u gnus/texi/ChangeLog:6.75 gnus/texi/ChangeLog:6.79
--- gnus/texi/ChangeLog:6.75	Fri Apr 13 01:53:51 2001
+++ gnus/texi/ChangeLog	Tue May  1 19:10:32 2001
@@ -1,3 +1,17 @@
+2001-04-15 19:38:54  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+	* gnus.texi (Mail and Post): Fix.
+
+2001-04-29 09:00:00  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+	* gnus.texi: Remove a few The's.
+	(RSS): New.
+
+2001-04-26  Kai Gro,A_(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+	* gnus.texi (Unread Articles): Say that dormants are similar to
+	ticked.
+
 2001-04-13  Kai Gro,A_(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
 
 	* gnus.texi (Sorting Groups): Note `C-k' and `C-y' for manually
Index: gnus/texi/gnus.texi
diff -u gnus/texi/gnus.texi:6.69 gnus/texi/gnus.texi:6.73
--- gnus/texi/gnus.texi:6.69	Sat Apr 14 01:11:15 2001
+++ gnus/texi/gnus.texi	Tue May  1 19:10:32 2001
@@ -433,7 +433,7 @@
 * Subscription Methods::     What Gnus should do with new groups.
 * Filtering New Groups::     Making Gnus ignore certain new groups.
 
-The Group Buffer
+Group Buffer
 
 * Group Buffer Format::    Information listed and how you can change it.
 * Group Maneuvering::      Commands for moving in the group buffer.
@@ -474,7 +474,7 @@
 * Group Timestamp::       Making Gnus keep track of when you last read a group.
 * File Commands::         Reading and writing the Gnus files.
 
-The Summary Buffer
+Summary Buffer
 
 * Summary Buffer Format::       Deciding how the summary buffer is to look.
 * Summary Maneuvering::         Moving around the summary buffer.
@@ -584,7 +584,7 @@
 * Summary Generation Commands::       (Re)generating the summary buffer.
 * Really Various Summary Commands::   Those pesky non-conformant commands.
 
-The Article Buffer
+Article Buffer
 
 * Hiding Headers::        Deciding what headers should be displayed.
 * Using MIME::            Pushing articles through @sc{mime} before reading them.
@@ -613,7 +613,7 @@
 * Combined Groups::       Combining groups into one group.
 * Gnus Unplugged::        Reading news and mail offline.
 
-The Server Buffer
+Server Buffer
 
 * Server Buffer Format::      You can customize the look of this buffer.
 * Server Commands::           Commands to manipulate servers.
@@ -665,6 +665,8 @@
 * Slashdot::              Reading the Slashdot comments.
 * Ultimate::              The Ultimate Bulletin Board systems.
 * Web Archive::           Reading mailing list archived on web.
+* RSS::                   Reading RDF site summary.
+* Customizing w3::        Doing stuff to Emacs/w3 from Gnus.
 
 Other Sources
 
@@ -4937,6 +4939,8 @@
 @dfn{Dormant articles} will only appear in the summary buffer if there
 are followups to it.  If you want to see them even if they don't have
 followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
+Otherwise (except for the visibility issue), they are just like ticked
+messages.
 
 @item SPACE
 @vindex gnus-unread-mark
@@ -5796,6 +5800,18 @@
 off sparse leaf nodes that don't lead anywhere.  This variable is
 @code{nil} by default.
 
+@item gnus-read-all-available-headers
+@vindex gnus-read-all-available-headers
+This is a rather obscure variable that few will find useful.  It's
+intended for those non-news newsgroups where the backend has to fetch
+quite a lot to present the summary buffer, and where it's impossible to
+go back to parents of articles.  This is mostly the case in the
+web-based groups, like the @code{nnultimate} groups.
+
+If you don't use those, then it's safe to leave this as the default
+@code{nil}.  If you want to use this variable, it should be a regexp
+that matches the group name, or @code{t} for all groups.
+
 @end table
 
 
@@ -9775,7 +9791,8 @@
 (add-hook 'gnus-select-group-hook
           (lambda ()
             (cond
-             ((string-match "^de\\." gnus-newsgroup-name)
+             ((string-match
+               "^de\\." (gnus-group-real-name gnus-newsgroup-name))
               (ispell-change-dictionary "deutsch"))
              (t
               (ispell-change-dictionary "english")))))
@@ -12902,6 +12919,7 @@
 * Slashdot::              Reading the Slashdot comments.
 * Ultimate::              The Ultimate Bulletin Board systems.
 * Web Archive::           Reading mailing list archived on web.
+* RSS::                   Reading RDF site summary.
 * Customizing w3::        Doing stuff to Emacs/w3 from Gnus.
 @end menu
 
@@ -13163,6 +13181,29 @@
 The password for your account on the web server.
 @end table
 
+@node RSS
+@subsection RSS
+@cindex nnrss
+@cindex RSS
+
+Some sites have RDF site summary (RSS)
+@uref{http://purl.org/rss/1.0/spec}.  It has a quite regular and nice
+interface, and it's possible to get the information Gnus needs to keep
+groups updated.
+
+The easiest way to get started with @code{nnrss} is to say something
+like the following in the group buffer: @kbd{B nnrss RET RET}, then
+subscribe groups.
+
+The following @code{nnrss} variables can be altered:
+
+@table @code
+@item nnrss-directory
+@vindex nnrss-directory
+The directory where @code{nnrss} stores its files.  The default is
+@samp{~/News/rss/}.
+
+@end table
 
 @node Customizing w3
 @subsection Customizing w3
