summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc5182.txt
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
commit4bfd864f10b68b71482b35c818559068ef8d5797 (patch)
treee3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc5182.txt
parentea76e11061bda059ae9f9ad130a9895cc85607db (diff)
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc5182.txt')
-rw-r--r--doc/rfc/rfc5182.txt731
1 files changed, 731 insertions, 0 deletions
diff --git a/doc/rfc/rfc5182.txt b/doc/rfc/rfc5182.txt
new file mode 100644
index 0000000..a7f9147
--- /dev/null
+++ b/doc/rfc/rfc5182.txt
@@ -0,0 +1,731 @@
+
+
+
+
+
+
+Network Working Group A. Melnikov
+Request for Comments: 5182 Isode Ltd.
+Updates: 3501 March 2008
+Category: Standards Track
+
+
+ IMAP Extension for Referencing the Last SEARCH Result
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Abstract
+
+ Many IMAP clients use the result of a SEARCH command as the input to
+ perform another operation, for example, fetching the found messages,
+ deleting them, or copying them to another mailbox.
+
+ This can be achieved using standard IMAP operations described in RFC
+ 3501; however, this would be suboptimal. The server will send the
+ list of found messages to the client; after that, the client will
+ have to parse the list, reformat it, and send it back to the server.
+ The client can't pipeline the SEARCH command with the subsequent
+ command, and, as a result, the server might not be able to perform
+ some optimizations.
+
+ This document proposes an IMAP extension that allows a client to tell
+ a server to use the result of a SEARCH (or Unique Identifier (UID)
+ SEARCH) command as an input to any subsequent command.
+
+1. Introduction
+
+ Many IMAP clients use the result of a SEARCH command as the input to
+ perform another operation, for example, fetching the found messages,
+ deleting them, or copying them to another mailbox.
+
+ This document proposes an IMAP extension that allows a client to tell
+ a server to use the result of a SEARCH (or UID SEARCH) command as an
+ input to any subsequent command.
+
+ The SEARCH result reference extension defines a new SEARCH result
+ option [IMAPABNF] "SAVE" that tells the server to remember the result
+ of the SEARCH or UID SEARCH command (as well as any command based on
+ SEARCH, e.g., SORT and THREAD [SORT]) and store it in an internal
+
+
+
+Melnikov Standards Track [Page 1]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+ variable that we will reference as the "search result variable". The
+ client can use the "$" marker to reference the content of this
+ internal variable. The "$" marker can be used instead of message
+ sequence or UID sequence in order to indicate that the server should
+ substitute it with the list of messages from the search result
+ variable. Thus, the client can use the result of the latest
+ remembered SEARCH command as a parameter to another command. The
+ search result marker has several advantages:
+
+ * it avoids wasted bandwidth and associated delay;
+
+ * it allows the client to pipeline a SEARCH [IMAP4] command with a
+ subsequent FETCH/STORE/COPY/SEARCH [IMAP4] or UID EXPUNGE
+ [UIDPLUS] command;
+
+ * the client doesn't need to spend time reformatting the result of
+ a SEARCH command into a message set used in the subsequent
+ command;
+
+ * it allows the server to perform optimizations. For example, if
+ the server can execute several pipelined commands in parallel
+ (or out of order), presence of the search result marker can
+ allow the server to decide which commands may or may not be
+ executed out of order.
+
+ In absence of any other SEARCH result option, the SAVE result option
+ also suppresses any SEARCH response that would have been otherwise
+ returned by the SEARCH command.
+
+1.1. Conventions Used in This Document
+
+ In examples, "C:" indicates lines sent by a client that is connected
+ to a server. "S:" indicates lines sent by the server to the client.
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [KEYWORDS].
+
+ Explanatory comments in examples start with // and are not part of
+ the protocol.
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 2]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+2. Overview
+
+2.1. Normative Description of the SEARCHRES Extension
+
+ The SEARCH result reference extension described in this document is
+ present in any IMAP4 server implementation that returns "SEARCHRES"
+ as one of the supported capabilities in the CAPABILITY command
+ response. Any such server MUST also implement the [ESEARCH]
+ extension.
+
+ Upon successful completion of a SELECT or an EXAMINE command (after
+ the tagged OK response), the current search result variable is reset
+ to the empty sequence.
+
+ A successful SEARCH command with the SAVE result option sets the
+ value of the search result variable to the list of messages found in
+ the SEARCH command. For example, if no messages were found, the
+ search result variable will contain the empty list.
+
+ Any of the following SEARCH commands MUST NOT change the search
+ result variable:
+
+ o a SEARCH command that caused the server to return the BAD tagged
+ response,
+
+ o a SEARCH command with no SAVE result option that caused the
+ server to return NO tagged response,
+
+ o a successful SEARCH command with no SAVE result option.
+
+ A SEARCH command with the SAVE result option that caused the server
+ to return the NO tagged response sets the value of the search result
+ variable to the empty sequence.
+
+ When a message listed in the search result variable is EXPUNGEd, it
+ is automatically removed from the list. Implementors are reminded
+ that if the server stores the list as a list of message numbers, it
+ MUST automatically adjust them when notifying the client about
+ expunged messages, as described in Section 7.4.1 of [IMAP4].
+
+ If the server decides to send a new UIDVALIDITY value while the
+ mailbox is opened, this causes resetting of the search variable to
+ the empty list.
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 3]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+ Note that even if the "$" marker contains the empty list of messages,
+ it must be treated by all commands accepting message sets as
+ parameters as a valid, but non-matching list of messages. For
+ example, the "FETCH $" command would return a tagged OK response and
+ no FETCH responses. See also the Example 5 below.
+
+ Note that even if the "$" marker contains the empty list of messages,
+ it must be treated as a valid but non-matching list of messages, by
+ all commands that accept message sets as parameters.
+
+ Implementation note: server implementors should note that "$" can
+ reference IMAP message sequences or UID sequences, depending on the
+ context where it is used. For example, the "$" marker can be set as
+ a result of a SEARCH (SAVE) command and used as a parameter to a UID
+ FETCH command (which accepts a UID sequence, not a message sequence),
+ or the "$" marker can be set as a result of a UID SEARCH (SAVE)
+ command and used as a parameter to a FETCH command (which accepts a
+ message sequence, not a UID sequence).
+
+2.2. Examples
+
+ 1) The following example demonstrates how the client can use the
+ result of a SEARCH command to FETCH headers of interesting
+ messages:
+
+ Example 1:
+ C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994
+ NOT FROM "Smith"
+ S: A282 OK SEARCH completed, result saved
+ C: A283 FETCH $ (UID INTERNALDATE FLAGS RFC822.HEADER)
+ S: * 2 FETCH (UID 14 ...
+ S: * 84 FETCH (UID 100 ...
+ S: * 882 FETCH (UID 1115 ...
+ S: A283 OK completed
+
+ The client can also pipeline the two commands:
+
+ Example 2:
+ C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994
+ NOT FROM "Smith"
+ C: A283 FETCH $ (UID INTERNALDATE FLAGS RFC822.HEADER)
+ S: A282 OK SEARCH completed
+ S: * 2 FETCH (UID 14 ...
+ S: * 84 FETCH (UID 100 ...
+ S: * 882 FETCH (UID 1115 ...
+ S: A283 OK completed
+
+
+
+
+
+Melnikov Standards Track [Page 4]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+ 2) The following example demonstrates that the result of one SEARCH
+ command can be used as input to another SEARCH command:
+
+ Example 3:
+ C: A300 SEARCH RETURN (SAVE) SINCE 1-Jan-2004
+ NOT FROM "Smith"
+ S: A300 OK SEARCH completed
+ C: A301 UID SEARCH UID $ SMALLER 4096
+ S: * SEARCH 17 900 901
+ S: A301 OK completed
+
+ Note that the second command in Example 3 can be replaced with:
+ C: A301 UID SEARCH $ SMALLER 4096
+ and the result of the command would be the same.
+
+ 3) The following example shows that the "$"
+ marker can be combined with other message numbers using the OR
+ SEARCH criterion.
+
+ Example 4:
+ C: P282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994
+ NOT FROM "Smith"
+ S: P282 OK SEARCH completed
+ C: P283 SEARCH CHARSET UTF-8 (OR $ 1,3000:3021) TEXT {8}
+ C: YYYYYYYY
+ S: * SEARCH 882 1102 3003 3005 3006
+ S: P283 OK completed
+
+ Note: Since this document format is restricted to 7-bit ASCII text,
+ it is not possible to show actual UTF-8 data. The "YYYYYYYY" is a
+ placeholder for what would be 8 octets of 8-bit data in an actual
+ transaction.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 5]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+ 4) The following example demonstrates that a failed SEARCH sets the
+ search result variable to the empty list.
+
+ Example 5:
+ C: B282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994
+ NOT FROM "Smith"
+ S: B282 OK SEARCH completed
+ C: B283 SEARCH CHARSET KOI8-R (OR $ 1,3000:3021) TEXT {4}
+ C: XXXX
+ S: B283 NO [BADCHARSET UTF-8] KOI8-R is not supported
+ //After this command the saved result variable contains
+ //no messages. A client that wants to reissue the B283
+ //SEARCH command with another CHARSET would have to reissue
+ //the B282 command as well. One possible workaround for
+ //this is to include the desired CHARSET parameter
+ //in the earliest SEARCH RETURN (SAVE) command in a
+ //sequence of related SEARCH commands.
+ //A better approach might be to always use CHARSET UTF-8
+ //instead.
+
+ Note: Since this document format is restricted to 7-bit ASCII text,
+ it is not possible to show actual KOI8-R data. The "XXXX" is a
+ placeholder for what would be 4 octets of 8-bit data in an actual
+ transaction.
+
+ 5) The following example demonstrates that it is not an error to use
+ the "$" marker when it contains no messages.
+
+ Example 6:
+ C: E282 SEARCH RETURN (SAVE) SINCE 28-Oct-2006
+ NOT FROM "Eric"
+ C: E283 COPY $ "Other Messages"
+ //The "$" contains no messages
+ S: E282 OK SEARCH completed
+ S: E283 OK COPY completed, nothing copied
+
+2.3. Multiple Commands in Progress
+
+ Use of a SEARCH RETURN (SAVE) command followed by a command using the
+ "$" marker creates direct dependency between the two commands. As
+ directed by Section 5.5 of [IMAP4], a server MUST execute the two
+ commands in the order they were received. (A server capable of
+ out-of-order execution can in some cases execute the two commands in
+ parallel, for example, if a SEARCH RETURN (SAVE) is followed by
+ "SEARCH $", the search criteria from the first command can be
+ directly substituted into the second command.)
+
+
+
+
+
+Melnikov Standards Track [Page 6]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+ A client supporting this extension MAY pipeline a SEARCH RETURN
+ (SAVE) command with one or more command using the "$" marker, as long
+ as this doesn't create an ambiguity, as described in Section 5.5 of
+ [IMAP4].
+
+ Example 7:
+ C: F282 SEARCH RETURN (SAVE) KEYWORD $Junk
+ C: F283 COPY $ "Junk"
+ C: F284 STORE $ +FLAGS.Silent (\Deleted)
+ S: F282 OK SEARCH completed
+ S: F283 OK COPY completed
+ S: F284 OK STORE completed
+
+ Example 8:
+ C: G282 SEARCH RETURN (SAVE) KEYWORD $Junk
+ C: G283 SEARCH RETURN (ALL) SINCE 28-Oct-2006
+ FROM "Eric"
+ //The server can execute the two SEARCH commands
+ //in any order, as they don't have any dependency.
+ //Note that the second command is making use of
+ //the [ESEARCH] extension.
+ S: * ESEARCH (TAG "G283") ALL 3:15,27,29:103
+ S: G283 OK SEARCH completed
+ S: G282 OK SEARCH completed
+
+ The following example demonstrates that the result of the second
+ SEARCH always overrides the result of the first.
+
+ Example 9:
+ C: H282 SEARCH RETURN (SAVE) KEYWORD $Junk
+ C: H283 SEARCH RETURN (SAVE) SINCE 28-Oct-2006
+ FROM "Eric"
+ S: H282 OK SEARCH completed
+ S: H283 OK SEARCH completed
+
+2.4. Interaction with ESEARCH Extension
+
+ Servers that implement the extension defined in this document MUST
+ implement [ESEARCH] and conform to additional requirements listed in
+ this section.
+
+ The SAVE result option doesn't change whether the server would return
+ items corresponding to MIN, MAX, ALL, or COUNT [ESEARCH] result
+ options.
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 7]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+ When the SAVE result option is combined with the MIN or MAX [ESEARCH]
+ result option, and none of the other ESEARCH result options are
+ present, the corresponding MIN/MAX is returned (if the search result
+ is not empty), but the "$" marker would contain a single message as
+ returned in the MIN/MAX return item.
+
+ If the SAVE result option is combined with both MIN and MAX result
+ options, and none of the other ESEARCH result options are present,
+ the "$" marker would contain one or two messages as returned in the
+ MIN/MAX return items.
+
+ If the SAVE result option is combined with the ALL and/or COUNT
+ result option(s), the "$" marker would always contain all messages
+ found by the SEARCH or UID SEARCH command. (Note that the last rule
+ might affect ESEARCH implementations that optimize how the COUNT
+ result is constructed.)
+
+ The following table summarizes the additional requirement on ESEARCH
+ server implementations described in this section.
+
+ +----------------+-------------------+
+ | Combination of | "$" marker value |
+ | Result option | |
+ +----------------+-------------------+
+ | SAVE MIN | MIN |
+ +----------------+-------------------+
+ | SAVE MAX | MAX |
+ +----------------+-------------------+
+ | SAVE MIN MAX | MIN & MAX |
+ +----------------+-------------------+
+ | SAVE * [m] | all found messages|
+ +----------------+-------------------+
+
+ where '*' means "ALL" and/or "COUNT"
+ '[m]' means optional "MIN" and/or "MAX"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 8]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+ The following example demonstrates behavioral difference for
+ different combinations of ESEARCH result options. Explanatory
+ comments start with // and are not part of the protocol:
+
+ Example 10:
+ C: C282 SEARCH RETURN (ALL) SINCE 12-Feb-2006
+ NOT FROM "Smith"
+ S: * ESEARCH (TAG "C283") ALL 2,10:15,21
+ //$ value hasn't changed
+ S: C282 OK SEARCH completed
+
+ C: C283 SEARCH RETURN (ALL SAVE) SINCE 12-Feb-2006
+ NOT FROM "Smith"
+ S: * ESEARCH (TAG "C283") ALL 2,10:15,21
+ //$ value is 2,10:15,21
+ S: C283 OK SEARCH completed
+
+ C: C284 SEARCH RETURN (SAVE MIN) SINCE 12-Feb-2006
+ NOT FROM "Smith"
+ S: * ESEARCH (TAG "C284") MIN 2
+ //$ value is 2
+ S: C284 OK SEARCH completed
+
+ C: C285 SEARCH RETURN (MAX SAVE MIN) SINCE
+ 12-Feb-2006 NOT FROM "Smith"
+ S: * ESEARCH (TAG "C285") MIN 2 MAX 21
+ //$ value is 2,21
+ S: C285 OK SEARCH completed
+
+ C: C286 SEARCH RETURN (MAX SAVE MIN COUNT)
+ SINCE 12-Feb-2006 NOT FROM "Smith"
+ S: * ESEARCH (TAG "C286") MIN 2 MAX 21 COUNT 8
+ //$ value is 2,10:15,21
+ S: C286 OK SEARCH completed
+
+ C: C286 SEARCH RETURN (ALL SAVE MIN) SINCE
+ 12-Feb-2006 NOT FROM "Smith"
+ S: * ESEARCH (TAG "C286") MIN 2 ALL 2,10:15,21
+ //$ value is 2,10:15,21
+ S: C286 OK SEARCH completed
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 9]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+2.5. Refusing to Save Search Results
+
+ In some cases, the server MAY refuse to save a SEARCH (SAVE) result,
+ for example, if an internal limit on the number of saved results is
+ reached.
+
+ In this case, the server MUST return a tagged NO response containing
+ the NOTSAVED response code and set the search result variable to the
+ empty sequence, as described in Section 2.1.
+
+3. Formal Syntax
+
+ The following syntax specification uses the Augmented Backus-Naur
+ Form (ABNF) notation as specified in [ABNF]. Non-terminals
+ referenced but not defined below are as defined in [IMAP4] or
+ [IMAPABNF].
+
+ Except as noted otherwise, all alphabetic characters are
+ case-insensitive. The use of upper- or lower-case characters to
+ define token strings is for editorial clarity only. Implementations
+ MUST accept these strings in a case-insensitive fashion.
+
+ capability =/ "SEARCHRES"
+ ;; capability is defined in [IMAP4]
+
+ sequence-set =/ seq-last-command
+ ;; extends sequence-set to allow for
+ ;; "result of the last command" indicator.
+
+ seq-last-command = "$"
+
+ search-return-opt = "SAVE"
+ ;; conforms to generic search-return-opt
+ ;; syntax defined in [IMAPABNF]
+
+ resp-text-code =/ "NOTSAVED"
+ ;; <resp-text-code> from [IMAP4]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 10]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+4. Security Considerations
+
+ This extension requires the server to keep additional state, that may
+ be used to simplify Denial of Service attacks. In order to minimize
+ damage from such attacks, server implementations MAY limit the number
+ of saved searches they allow across all connections at any given time
+ and return the tagged NO response containing the NOTSAVED response
+ code (see Section 2.5) to a SEARCH RETURN (SAVE) command when this
+ limit is exceeded.
+
+ Apart from that, it is believed that this extension doesn't raise any
+ additional security concerns not already discussed in [IMAP4].
+
+5. IANA Considerations
+
+ This document defines the "SEARCHRES" IMAP capability. IANA has
+ added it to the IMAP4 Capabilities Registry, which is currently
+ located at:
+
+ http://www.iana.org/assignments/imap4-capabilities
+
+6. Acknowledgments
+
+ The author would like to thank Mark Crispin, Cyrus Daboo, and Curtis
+ King for remembering that this document had to be written, as well as
+ for comments and corrections received.
+
+ The author would also like to thank Dave Cridland, Mark Crispin,
+ Chris Newman, Dan Karp, and Spencer Dawkins for comments and
+ corrections received.
+
+ Valuable comments, both in agreement and in dissent, were received
+ from Arnt Gulbrandsen.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 11]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+7. References
+
+7.1. Normative References
+
+ [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [ABNF] Crocker, D., Ed., and P. Overell, "Augmented BNF for
+ Syntax Specifications: ABNF", STD 68, RFC 5234, January
+ 2008.
+
+ [IMAP4] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION
+ 4rev1", RFC 3501, March 2003.
+
+ [IMAPABNF] Melnikov, A. and C. Daboo, "Collected Extensions to IMAP4
+ ABNF", RFC 4466, April 2006.
+
+ [ESEARCH] Melnikov, A. and D. Cridland, "IMAP4 Extension to SEARCH
+ Command for Controlling What Kind of Information Is
+ Returned", RFC 4731, November 2006.
+
+7.2. Informative References
+
+ [UIDPLUS] Crispin, M., "Internet Message Access Protocol (IMAP) -
+ UIDPLUS extension", RFC 4315, December 2005.
+
+ [SORT] Crispin, M. and K. Murchison, "INTERNET MESSAGE ACCESS
+ PROTOCOL - SORT AND THREAD EXTENSIONS", Work in Progress,
+ Septemeber 2007.
+
+Author's Address
+
+ Alexey Melnikov
+ Isode Ltd.
+ 5 Castle Business Village,
+ 36 Station Road,
+ Hampton, Middlesex,
+ TW12 2BX, United Kingdom
+
+ EMail: Alexey.Melnikov@isode.com
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 12]
+
+RFC 5182 Last SEARCH Result Reference March 2008
+
+
+Full Copyright Statement
+
+ Copyright (C) The IETF Trust (2008).
+
+ This document is subject to the rights, licenses and restrictions
+ contained in BCP 78, and except as set forth therein, the authors
+ retain all their rights.
+
+ This document and the information contained herein are provided on an
+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+ The IETF takes no position regarding the validity or scope of any
+ Intellectual Property Rights or other rights that might be claimed to
+ pertain to the implementation or use of the technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; nor does it represent that it has
+ made any independent effort to identify any such rights. Information
+ on the procedures with respect to rights in RFC documents can be
+ found in BCP 78 and BCP 79.
+
+ Copies of IPR disclosures made to the IETF Secretariat and any
+ assurances of licenses to be made available, or the result of an
+ attempt made to obtain a general license or permission for the use of
+ such proprietary rights by implementers or users of this
+ specification can be obtained from the IETF on-line IPR repository at
+ http://www.ietf.org/ipr.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights that may cover technology that may be required to implement
+ this standard. Please address the information to the IETF at
+ ietf-ipr@ietf.org.
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 13]
+