<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.21 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wright-http-patch-byterange-02" category="exp" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title>Byte Range PATCH</title>
    <seriesInfo name="Internet-Draft" value="draft-wright-http-patch-byterange-02"/>
    <author initials="A." surname="Wright" fullname="Austin Wright">
      <organization/>
      <address>
        <email>aaa@bzfx.net</email>
      </address>
    </author>
    <date year="2023" month="May" day="02"/>
    <workgroup>HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>HTTP</keyword>
    <abstract>
      <t>This document specifies a media type for PATCH payloads that overwrites a specific byte range, to allow random access writes, or allow a resource to be uploaded in several segments.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Filesystem interfaces typically provide some way to write at a specific position in a file. While HTTP supports reading byte range offsets using the Range header (<xref section="14" sectionFormat="of" target="RFC9110"/>), this technique cannot generally be used in PUT, because the server may ignore the Content-Range header while executing the write, causing data corruption. However, by using a method and media type that the server must understand, writes to byte ranges with Content-Range semantics becomes possible even when server support is undetermined.</t>
      <t>This media type is intended for use in a wide variety of applications where overwriting specific parts of the file is desired. This includes idempotently writing data to a stream, appending data to a file, overwriting specific byte ranges, or writing to multiple regions in a single operation (for example, appending audio to a recording in progress while updating metadata at the beginning of the file).</t>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>This document uses ABNF as defined in <xref target="RFC5234"/> and imports grammar rules from <xref target="RFC9112"/>.</t>
        <t>For brevity, example HTTP requests or responses may add newlines or whitespace,
or omit some headers necessary for message transfer.</t>
        <t>The term "byte" is used in the <xref target="RFC9110"/> sense to mean "octet." Ranges are zero-indexed and inclusive. For example, "bytes 0-0" means the first byte of the document, and "bytes 1-2" is a range with two bytes, starting one byte into the document. Ranges of zero bytes are described by an address offset rather than a range. For example, "at byte 5" would separate the byte ranges 0-4 and 5-9.</t>
      </section>
    </section>
    <section anchor="modifying-a-content-range-with-patch">
      <name>Modifying a content range with PATCH</name>
      <t>The Content-Range field in a PUT request requires support by the server in order to be processed correctly. Without specific support, the server's normal behavior would be to ignore the header, replacing the entire resource with just the part that changed, causing data corruption. To mitigate this, Content-Range may be used in conjunction with the PATCH method <xref target="RFC5789"/> as part of a media type whose semantics are to write at the specified byte offset. This document re-uses the "multipart/byteranges" media type, and defines the "message/byterange" media type, for this purpose.</t>
      <t>A byte range patch lists one or more <em>parts</em>. Each part specifies two essential components:</t>
      <ol spacing="normal" type="1"><li>Part fields: a list of HTTP fields that specify metadata, including the range being written to, the length of the body, and information about the target document that cannot be listed in the PATCH headers, e.g. Content-Type (where it would describe the patch itself, rather than the document being updated).</li>
        <li>A part body: the actual data to write to the specified location.</li>
      </ol>
      <t>Each part MUST indicate a single contiguous range to be written to. Servers MUST reject byte range patches that don't contain a known range with a 422 or 400 error. (This would mean the client may be using a yet-undefined mechanism to specify the target range.)</t>
      <t>The simplest form to represent a byte range patch is the "message/byterange" media type, which is similar to an HTTP message:</t>
      <sourcecode type="http"><![CDATA[
Content-Range: bytes 2-5/12

cdef
]]></sourcecode>
      <t>This patch represents an instruction to write the four bytes "cdef" at an offset of 2 bytes. A document listing the digits 0-9 in a row, would look like this after applying the patch:</t>
      <artwork><![CDATA[
01cdef6789␍␊
]]></artwork>
      <t>Although this example is a text document with a line terminator, patches are only carried as binary data, and can potentially carry or overwrite parts of multi-byte characters.</t>
      <section anchor="the-content-range-field">
        <name>The Content-Range field</name>
        <t>The Content-Range field (as seen inside a patch document) is used to specify the range to write to for each part:</t>
        <t>The client MAY indicate the anticipated final size of the document by providing the complete-length form, for example <tt>bytes 0-11/12</tt>. This value does not affect the outcome of the write, however the server MAY use it for other purposes, especially for preallocating an optimal amount of space, and deciding when an upload in multiple parts has finished.</t>
        <t>If the client does not know or care about the final length of the document, it MAY use <tt>*</tt> in place of complete-length. For example, <tt>bytes 0-11/*</tt>. Most random access writes will follow this form.</t>
        <t>As a special case, a Content-Range where the "last-pos" is omitted indicates that the upload length is indeterminate, and only the starting offset is known:</t>
        <sourcecode type="abnf"><![CDATA[
Content-Range =/ range-unit SP first-pos "-/" ( complete-length / "*" )
]]></sourcecode>
        <t>The unsatisfied-range form (e.g. <tt>bytes */1000</tt>) is not meaningful, it MUST be treated as a syntax error. <cref anchor="_1">This form could potentially be used to specify the intended size of the target resource, without providing any data at all.</cref></t>
      </section>
      <section anchor="the-content-length-field">
        <name>The Content-Length field</name>
        <t>A "Content-Length" part field, if provided, describes the length of the part body. (To describe the size of the entire target resource, see the Content-Range field.)</t>
        <t>If provided, it MUST exactly match the length of the range specified in the Content-Range field, and servers MUST error when the Content-Length mismatches the length of the range.</t>
      </section>
      <section anchor="the-content-type-field">
        <name>The Content-Type field</name>
        <t>A "Content-Type" part field MUST have the same effect as if provided in a PUT request uploading the entire resource (patch applied).
Its use is typically limited to providing the media type of new resources that don't exist.</t>
      </section>
      <section anchor="other-fields">
        <name>Other fields</name>
        <t>Other part fields in the patch document SHOULD have the same meaning as if provided in a PUT request uploading the entire resource (patch applied).</t>
        <t>Use of such fields SHOULD be limited to cases where the meaning in the HTTP request headers would be different, where they would describe the entire patch, rather than the part. For example, the "Content-Type" field.</t>
      </section>
      <section anchor="applying-a-patch">
        <name>Applying a patch</name>
        <t>Servers SHOULD NOT accept requests that write beyond, and not adjacent to, the end of the resource. This would create a sparse file, where some bytes are undefined. For example, writing at byte 601 of a resource where bytes 0-599 are defined; this would leave byte 600 undefined. Servers that accept sparse writes MUST NOT disclose existing content, and SHOULD fill in undefined regions with zeros.</t>
        <t>The expected length of the write can be computed from the part fields. If the actual length of the part body mismatches the expected length, this MUST be treated the same as a network interruption at the shorter length, but anticipating the longer length. Recovering from this interruption may involve rolling back the entire request, or saving as many bytes as possible. The client can then recover the same way it would recover from a network error.</t>
      </section>
      <section anchor="the-multipartbyteranges-media-type">
        <name>The multipart/byteranges media type</name>
        <t>The following is a request with a "multipart/byteranges" body to write two ranges in a document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
Content-Length: 206
If-Match: "xyzzy"
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

--THIS_STRING_SEPARATES
Content-Range: bytes 2-6/25
Content-Type: text/plain

23456
--THIS_STRING_SEPARATES
Content-Range: bytes 17-21/25
Content-Type: text/plain

78901
--THIS_STRING_SEPARATES--
]]></sourcecode>
        <t>The syntax for multipart messages is defined in <xref section="5.1.1" sectionFormat="comma" target="RFC2046"/>. While the body cannot contain the boundary, servers MAY use the Content-Length field to skip to the boundary (potentially ignoring a boundary in the body, which would be an error by the client).</t>
        <t>The multipart/byteranges type may be used for operations where multiple regions must be updated at the same time; clients may have an expectation that if there's an interruption, all of the parts will be rolled back.</t>
      </section>
      <section anchor="message-byterange">
        <name>The message/byterange media type</name>
        <t>When making a request with a single byte range, there is no need for a multipart boundary marker. This document defines a new media type "message/byterange" with the same semantics as a single byte range in a multipart/byteranges message, but with a simplified syntax.</t>
        <t>The "message/byterange" form may be used in a request as so:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 272
If-Match: "xyzzy"
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

Content-Range: bytes 100-299/600
Content-Type: text/plain

[200 bytes...]
]]></sourcecode>
        <t>This represents a request to modify a 600-byte document, overwriting 200 bytes of it, starting at a 100-byte offset.</t>
        <section anchor="syntax">
          <name>Syntax</name>
          <t>The syntax re-uses concepts from the "multipart/byteranges" media type, except it omits the multipart separator, and so only allows a single range to be specified. It is also similar to the "message/http" media type, except the first line (the status line or request line) is omitted; a message/byterange document can be fed into a message/http parser by first prepending a line like "PATCH / HTTP/1.1".</t>
          <t>It follows the syntax of HTTP message headers and body. It MUST include the Content-Range header field. If the message length is known by the sender, it SHOULD contain the Content-Length header field. Unknown or nonapplicable header fields MUST be ignored.</t>
          <t>The field-line and message-body productions are specified in <xref target="RFC9112"/>.</t>
          <sourcecode type="abnf"><![CDATA[
byterange-document = *( field-line CRLF )
                     CRLF
                     [ message-body ]
]]></sourcecode>
          <t>This document has the same semantics as a single part in a "multipart/byteranges" document (<xref section="5.1.1" sectionFormat="of" target="RFC2046"/>) or any response with a 206 (Partial Content) status code (<xref section="15.3.7" sectionFormat="of" target="RFC9110"/>). A "message/byterange" document may be trivially transformed into a "multipart/byteranges" document by prepending a dash-boundary and CRLF, and appending a close-delimiter (a CRLF, dash-boundary, terminating "<tt>--</tt>", and optional CRLF).</t>
        </section>
      </section>
      <section anchor="message-byterange-bhttp">
        <name>The message/byterange+bhttp media type</name>
        <t>The "message/byterange+bhttp" has the same semantics as "message/byterange" but follows a binary format similar to "message/bhttp" <xref target="RFC9292"/>, and may be more suitable for some clients and servers, as all variable length strings are tagged with their length.</t>
        <section anchor="syntax-1">
          <name>Syntax</name>
          <artwork><![CDATA[
Request {
  Framing Indicator (i) = 8,
  Known-Length Field Section (..),
  Known-Length Content (..),
  Padding (..),
}

Known-Length Field Section {
  Length (i),
  Field Line (..) ...,
}

Known-Length Content {
  Content Length (i),
  Content (..),
}

Field Line {
  Name Length (i) = 1..,
  Name (..),
  Value Length (i),
  Value (..),
}
]]></artwork>
        </section>
      </section>
      <section anchor="range-units">
        <name>Range units</name>
        <t>Currently, the only defined range unit is "bytes", however this may be other, yet-to-be-defined values.</t>
        <t>In the case of "bytes", the bytes that are read are exactly the same as the bytes that are changed. However, other units may define write semantics different from a read, if symmetric behavior would not make sense. For example, if a Content-Range field adds an item in a JSON array, this write may add a leading or trailing comma, not technically part of the item itself, in order to keep the resulting document well-formed.</t>
        <t>Even though the length in alternate units isn't changed, the byte length might. This might only be acceptable to servers storing these values in a database or memory structure, rather than on a byte-based filesystem.</t>
      </section>
    </section>
    <section anchor="segmented-document-creation-with-patch">
      <name>Segmented document creation with PATCH</name>
      <t>As an alternative to using PUT to create a new resource, the contents of a resource may be uploaded in segments, written across several PATCH requests.</t>
      <t>A user-agent may also use PATCH to recover from an interrupted PUT request, if it was expected to create a new resource. The server will store the data sent to it by the user agent, but will not finalize the upload until the final length of the document is known and received.</t>
      <ol spacing="normal" type="1"><li>The client makes a PUT or PATCH request to a URL, a portion of which is generated by the client, to be unpredictable to other clients. This first request creates the resource, and should include <tt>If-None-Match: *</tt> to verify the target does not exist. If a PUT request, the server reads the Content-Length header and stores the intended final length of the document. If a PATCH request, the "Content-Range" field in the "message/byterange" patch is read for the final length. The final length may also be undefined, and defined in a later request.</li>
        <li>If any request is interrupted, the client may make a HEAD request to determine how much, if any, of the previous response was stored, and resumes uploading from that point. The server will return 200 (OK), but this may only indicate the write has been saved; the server is not obligated to begin acting on the upload until it is complete.</li>
        <li>If the client sees from the HEAD response that additional data remains to be uploaded, it may make a PATCH request to resume uploading. Even if no data was uploaded or the resource was not created, the client should attempt creating the resource with PATCH to mitigate the possibility of another interrupted connection with a server that does not save incomplete transfers. However if in response to PATCH, the server reports 405 (Method Not Allowed), 415 (Unsupported Media Type), or 501 (Not Implemented), then the client must resort to a PUT request.</li>
        <li>The server detects the completion of the final request when the current received data matches the indicated final length. For example, a <tt>Content-Range: 500-599/600</tt> field is a write at the end of the resource. The server processes the upload and returns a response for it.</li>
      </ol>
      <t>For building POST endpoints that support large uploads, clients can first upload the data to a scratch file as described above, and then process by submitting a POST request that links to the scratch file.</t>
      <t>For updating an existing large file, the client can upload to a scratch file, then execute a MOVE (<xref section="9.9" sectionFormat="of" target="RFC4918"/>) over the intended target.</t>
      <section anchor="example">
        <name>Example</name>
        <t>A single PUT request that creates a new resource may be split apart into multiple PATCH requests. Here is an example that uploads a 600-byte document across three 200-byte segments.</t>
        <t>The first PATCH request creates the resource:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 281
If-None-Match: *

Content-Range: bytes 0-199/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>This request allocates a 600 byte document, and uploading the first 200 bytes of it. The server responds with 200, indicating that the complete upload was stored.</t>
        <t>Additional requests upload the remainder of the document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 283
If-None-Match: *

Content-Range: bytes 200-399/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>This second request also returns 200 (OK).</t>
        <t>A third request uploads the final portion of the document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 283
If-None-Match: *

Content-Range: bytes 200-399/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>The server responds with 200 (OK). Since this completely writes out the 600-byte document, the server may also perform final processing, for example, checking that the document is well formed. The server MAY return an error code if there is a syntax or other error, or in an earlier response as soon as it it able to detect an error, however the exact behavior is left undefined.</t>
      </section>
    </section>
    <section anchor="prefer-transaction">
      <name>Preserving Incomplete Uploads with "Prefer: transaction"</name>
      <t>The stateless design of HTTP generally implies that a request is atomic (otherwise parties would need to keep track of the state of a request while it's in progress). A benefit of this design is that a client does not need to be concerned with the complexities of resolving only the first half of an upload being honored, if there's an error partway through.</t>
      <t>However, some clients may desire partial state changes, particularly when remaking the upload is more expensive than the complexity of recovering from an interruption. In these cases, clients will want an incomplete request to be preserved as much as possible, so they may re-synchronize the state and pick up from where the incomplete request was terminated.</t>
      <t>The client's preference for atomic or upload-preserving behavior may be signaled by a Prefer header:</t>
      <artwork><![CDATA[
Prefer: transaction=atomic
Prefer: transaction=persist
]]></artwork>
      <t>The <tt>transaction=atomic</tt> preference indicates that the request SHOULD apply only when a successful response is returned, and not any time during the upload.</t>
      <t>The <tt>transaction=persist</tt> preference indicates that uploaded data SHOULD be continuously stored as soon as possible, so that if the upload is interrupted, it is possible to resume the upload from where it left off.</t>
      <t>This preference is generally applicable to any HTTP request (and not merely for PATCH or byte range patches). While this is often easier to implement on the server, is much more complicated to recover from, because many more infrequent error cases must be handled, and specifics will vary by server, media type, and resource-specific semantics.</t>
      <t>Servers SHOULD indicate when this preference was honored, using a "Preference-Applied" response header. For example:</t>
      <artwork><![CDATA[
Preference-Applied: transaction=atomic
Preference-Applied: transaction=persist
]]></artwork>
    </section>
    <section anchor="registrations">
      <name>Registrations</name>
      <section anchor="messagebyterange">
        <name>message/byterange</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>message</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>byterange</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>See <xref target="security-considerations"/></t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>See <xref target="message-byterange"/> of this document</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>HTTP applications that process filesystem-like writes to locations within a resource.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl spacing="compact">
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>N/A</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>None.</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IESG</t>
          </dd>
        </dl>
      </section>
      <section anchor="messagebyterangebhttp">
        <name>message/byterange+bhttp</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>message</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>byterange+bhttp</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>See <xref target="security-considerations"/></t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>See <xref target="message-byterange-bhttp"/> of this document</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>HTTP applications that process filesystem-like writes to locations within a resource.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl spacing="compact">
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>N/A</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>None.</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IESG</t>
          </dd>
        </dl>
      </section>
      <section anchor="transaction-preference">
        <name>"transaction" preference</name>
        <dl>
          <dt>Preference:</dt>
          <dd>
            <t>transaction</t>
          </dd>
          <dt>Value:</dt>
          <dd>
            <t>either "atomic" or "persist"</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>Specify if the client would prefer incomplete uploads to be saved, or committed only on success.</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="prefer-transaction"/></t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="unallocated-ranges">
        <name>Unallocated ranges</name>
        <t>A byterange patch may permit writes to offsets beyond the end of the resource. This may have non-obvious behavior.</t>
        <t>Servers supporting sparse files MUST NOT return uninitialized memory or storage contents. Uninitialized regions may be initialized prior to executing the write, or this may be left to the filesystem if it can guarantee that unallocated space will be read as a constant value.</t>
        <t>If a server fills in unallocated space by initializing it, servers SHOULD protect against patches that make writes to very large offsets. Servers may account for this by treating it as a write by the client, similar to "Document Size Hints" below.</t>
      </section>
      <section anchor="document-size-hints">
        <name>Document Size Hints</name>
        <t>A byte range patch is, overall, designed to require server resources that's proportional to the patch size. One possible exception to this rule is the complete-length part of the Content-Range field, which hints at the final upload size. Generally, this does not require the server to (immediately) allocate this amount of data. However, some servers may choose to begin preallocating disk space right away, which could be a very expensive operation compared to the actual size of the request.</t>
        <t>In general, servers SHOULD treat the complete-length hint the same as a PUT request of that size, and issue a 400 (Client Error). <cref anchor="_3">413 (Payload Too Large) might not be appropriate for this situation, as it would indicate the patch is too large and the client should break up the patches into smaller chunks, rather than the intended final upload size being too large.</cref></t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes. </t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns. </t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker">
              <organization/>
            </author>
            <author fullname="P. Overell" initials="P." surname="Overell">
              <organization/>
            </author>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC2046">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types</title>
            <author fullname="N. Freed" initials="N." surname="Freed">
              <organization/>
            </author>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein">
              <organization/>
            </author>
            <date month="November" year="1996"/>
            <abstract>
              <t>This second document defines the general structure of the MIME media typing system and defines an initial set of media types.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2046"/>
          <seriesInfo name="DOI" value="10.17487/RFC2046"/>
        </reference>
        <reference anchor="RFC4918">
          <front>
            <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
            <author fullname="L. Dusseault" initials="L." role="editor" surname="Dusseault">
              <organization/>
            </author>
            <date month="June" year="2007"/>
            <abstract>
              <t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t>
              <t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4918"/>
          <seriesInfo name="DOI" value="10.17487/RFC4918"/>
        </reference>
        <reference anchor="RFC5789">
          <front>
            <title>PATCH Method for HTTP</title>
            <author fullname="L. Dusseault" initials="L." surname="Dusseault">
              <organization/>
            </author>
            <author fullname="J. Snell" initials="J." surname="Snell">
              <organization/>
            </author>
            <date month="March" year="2010"/>
            <abstract>
              <t>Several applications extending the Hypertext Transfer Protocol (HTTP) require a feature to do partial resource modification.  The existing HTTP PUT method only allows a complete replacement of a document. This proposal adds a new HTTP method, PATCH, to modify an existing HTTP resource.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5789"/>
          <seriesInfo name="DOI" value="10.17487/RFC5789"/>
        </reference>
        <reference anchor="RFC9292">
          <front>
            <title>Binary Representation of HTTP Messages</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson">
              <organization/>
            </author>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood">
              <organization/>
            </author>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document defines a binary format for representing HTTP messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9292"/>
          <seriesInfo name="DOI" value="10.17487/RFC9292"/>
        </reference>
      </references>
    </references>
    <section anchor="discussion">
      <name>Discussion</name>
      <t><cref anchor="_2">This section to be removed before final publication.</cref></t>
      <section anchor="indeterminate-length-uploads">
        <name>Indeterminate Length Uploads</name>
        <t>There is no standard way for a Content-Range header to indicate an unknown or indeterminate-length body starting at a certain offset; the design of partial content messages requires that the sender know the total length before transmission. However it seems it should be possible to generate an indeterminate-length partial content response (e.g. return a continuously growing audio file starting at a 4MB offset). Fixing this would require a new header, update to HTTP, or a revision of HTTP.</t>
        <t>Ideally, this would look something like:</t>
        <sourcecode type="abnf"><![CDATA[
Content-Range =/ range-unit SP first-pos "-/" ( complete-length / "*" )
]]></sourcecode>
        <t>For example: "<tt>Content-Range: bytes 200-/*</tt>" would indicate overwriting or appending content, starting at a 200 byte offset.</t>
        <t>And "<tt>Content-Range: bytes 200-/4000</tt>" would indicate overwriting an unknown amount of content, but not past 4000 bytes, starting at a 200 byte offset.</t>
        <t>Note these are different than "<tt>Content-Range: bytes 200/*</tt>" which would indicate splicing in content at a 200 byte offset.</t>
      </section>
      <section anchor="sparse-documents">
        <name>Sparse Documents</name>
        <t>This pattern can enable multiple, parallel uploads to a document at the same time. For example, uploading a large log file from multiple devices. However, this document does not define any ways for clients to track the unwritten regions in sparse documents, and the existing conditional request headers are designed to cause conflicts. Parallel uploads may requires a byte-level locking scheme or conflict-free operators. This may be addressed in a later document.</t>
      </section>
      <section anchor="recovering-from-interrupted-put">
        <name>Recovering from interrupted PUT</name>
        <t>Servers do not necessarily save the results of an incomplete upload; since most clients prefer atomic writes, many servers will discard an incomplete upload. A mechanism to indicate a preference for atomic vs. non-atomic writes may be defined at a later time.</t>
        <t>Byte range PATCH cannot by itself be used to recover from an interrupted PUT that updates an existing document. If the server operation is atomic, the entire operation will be lost. If the server saves the upload, it may not possible to know how much of the request was received by the server, and what was old content that already existed.</t>
        <t>One technique would be to use a 1xx interim response to indicate a location where the partial upload is being stored. If PUT request is interrupted, the client can make PATCH requests to this temporary, non-atomic location to complete the upload. When the last part is uploaded, the original interrupted PUT request will appear.</t>
      </section>
      <section anchor="splicing-and-binary-diff">
        <name>Splicing and Binary Diff</name>
        <t>Operations more complicated than standard filesystem operations are out of scope for this media type. A feature of byte range patch is an upper limit on the complexity of applying the patch. In contrast, prepending, splicing, replace, or other complicated file operations could potentially require the entire file on disk be rewritten.</t>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAEz1UWQAA+1cW3PbRpZ+x6/opR8ieUlKlOUkUi61ii3H2liWVpKT2kpl
oybQJBGBABcNSGJcyg/Yqq2a3zi/ZM+tLyApJbOVeZmaechYBNB9+vQ537l2
DwaDpMmbwhyqb5aNURe6nBp1fnT16m2SVWmp5/Akq/WkGdzV+XTWDGZNsxgs
dJPOBmP4osYPBrt7iW3H89zavCqb5QI+ysvMLAz8p2ySVDdmWtXLQ2XuF0m+
qA9VU7e22dvdPYBP76r6ZlpX7eJQvb26OldH5yc2uTFL+D07TJQaqJMSZipN
M3iNpNBP+GZiG11mP+uiKmHGpbHJIj9UPzZV2le2qpvaTCz8aznHf/yUJLpt
ZlUNQw5gCAUk2kN1NFQ/0MroJ17wEdCWl/HvZq7z4lBprf9t/Ovkfgi0JElZ
1XPd5LcGibx482pvNDo4VN+ZpULKrZpUtWqtgXnwqeWXDkajXVnnJYxaNnka
nuzxk53RcJQkeTlZnWB3/9ND1TttiyZftPWigsEda9QpUKiO7xtT4iZYtXV6
cnq8rc513airu+pQnZos1+oKdsf2eLz9g9HnMB4RE32JdP9gxup1bps6H7eN
yYAlyLq8nCrguPre1Pgq/rkFb74++n5bhnz52efAgx5JEMwIH2U0Hs4hrxzs
HcA6e9/kpa6X6sIsamNBSmChVamqCfPm1Firp0gp/G8wGCg9BmJ0Cmy/muVW
gXC2c/hK2YVJ80lurNJqTitE+aM5mYiFXhaVhu1oZrpR1a2pQZIbel++TRVK
siJR7qumUrooqjv8O6vmSqcp0KL4o76CcfmxVkB31dapwU/GRrULnAd4Bftt
DcyjC/j/KVJph24Z8zzLCpMkz3Dj6iprU1x2krzJC2OXtjFz+Bx2dKJhVlxK
nsJ0S7Woq9s8MyDWc6Pu9BLnJJIULCpaCchETowEIrSawKgg3zP4P2arbRcL
UAwLtOsMty+sHFg/sQYetRYfNDOHBjN41dRq6+PHS0PUqtE+7pMI88PDNjAN
96Qx6azM/7s1KtVlWTVqakrkApCP7LHMmvMPV334O9WoGjiLNTUwS81hUfkU
dIp/fQVAApwbdGi4o5WYe5O2jSOSuNBXOB7+lOlGq7Sq63aBtA7V2+oONwPm
XMrSUFBIMFGUI5khAYkpAhhQLUBYTTjTFxmg7fZsA8nIm9kKudZpNi4Udszi
vth8jMTfmhLWYUo3i2yJAgbiXLD387w02VAEPaIP/kLZKFHGImzRQAFIxq2u
c9MscWf0YlGA3DSkzTAXsNTJPa4/CItGUYAPcNEoKzhFZmxew/yKps/LtGjh
JwVTzBcVrhG2041EzEaFUaCcRs/7ODUQ2H2GI/c3UxDxkVTLvQDfzQnlgKba
TGkhtFTcQPitWoBgkSxuISfMvZ4vcJIwvW6zvOL5a9iDmn6EIUCRpjUpNMlS
uwA68RGIhCaSRQbGMGtJCBfxZxv1+Nkz9b5iuAINh42HHSVW444ZdePxv3f6
4fKq1+f/V+/P6N8Xx//x4eTi+DX++/Lt0bt3/h+JvHH59uzDu9fhX+HLV2en
p8fvX/PH8Kvq/JT0To/+E56gVPfOzq9Ozt4fvevhmpsOYuraIRYhDcAvAry2
CWxzCnjPavrNq3PU848f/0Us28OD/PH56LN9+ANlmCerShQJ+hMYtUxwE3RN
+1UUoJiLvNEF7K+2ys6qu1KhRA5XgRyk2aqjb96/wfcyM0ElwDF40pd7L3BS
nC6fM4RNaz2fwzx1C9CpJjVgNb+LhvThASZ4A6Ixrs1t3iz7TkYYB2sDMGVR
+GuE8QXsHoyBEKSzTJXmroDp6SmICej8AuC4n8Cf1TxvGIQZkiy8jPYBTRlK
4pztFvg3urQTUw9ZKFCrVQ+lvUeKLliIcuVpBiQFTCgt7c7c6FL1qrQxzbDH
QGxp5341dTVA5+reMICRhlpwEobqTawKNJtVu4PdHo1mRYoBzFjtRK7dBojg
8FejwR4RqsU2EMY1dwx86FM1AB2kHKXh0UCWqs54Q0c1zINE86e0hiBogMmw
TuA5qSRbIJgSxqkRjktHwOratKzhZQ90rS0yYByAGbiZrLsROu8O9mlhLwcH
pLzqtMryyZLtQMqoHS+SfV/atC6mg49RZAxCYMKcBNH/A15aj+OwpMiGwPuA
Bbga0jhAH5QWWDmaKDCnxRLsM8xbtU1ARRmqHw30CQgaeoMFjDLTtzlKJi18
TOISGU6Wyz4Qtih06qwkQlRtgstCa/0FDRw+RUPA5i+d4WKzJ+zpFQgngPSU
mZ2DMHT5hEoUmXtg8S9tyX4DS9FMAgxnhT9+FL8R9dsyLWjEYtN3N0NfN5hV
wTDvARGjxBPMnHijMIkZ8yhTmwEBDX7QYxMD8+34UMb2omlZJRiL3Ces3+GD
7vsIAYS24p6DyB3FPhYFTqrICXpAdRAxcON+JlP881Ada3hOLAiOLeodCg0s
HfYf/AmAK3QqD5NkNGQHn4QTohlNY3svmn/mneXxlt7Q9cW2OwlhAscG/0a+
wpYCi1kGC1NOYesEMcZVtuwL9kiIApurxyjD+BywYQpq7HnOgsUuIUgGUhjg
j0VBwBRQejgdeoHCWEVtsQMDsMsC78BDBBf5mTfWFJN+BzhiKJJVka03GRrx
vaE6YjbjYg7pbQguWuCv81tYtgTUgmwVFTtWMEjYKzLwAMrodJngpSC85NO2
aq1wl0EgcHcIMSBqt+URavMLQMKavBjZwawqP2loUE0wdFOiMY2wS6v9vT2U
qf3dXWXquqqHaovkn1lHRgWXkxY5ssWrKqPhEgJsdEHZ9M4NYkFu50i1E55o
exmXtxkqbY7ADJKH8oAf1C6sg3HX5D//Y8oEppdfhtHzQhOGwgJIsuVTUIHf
fvsNcxJJB4UOxdrsDV7ujPaSJIVV4ZvidDAZnkaLw+Yl+LAcjkXbjyYTEFOG
6+E4PQq5SmetQCn2+DHKlBc5lHKnWlk+BREFU3TA9qOu7vqyJUVV3cC7N4yl
Sk+AE+S/L93HRCuv87dkd4QUfApg+de//O9f//I//GtyVKAFmc54EOfpkP1u
zH2kiiIm6N0ojjR0U4GxcHKGuEruXKrrOie3UI05UGfMQK0HVVYcCuQU3OG7
SxQ7H1yHyIIgljJFaFowgAdpFy/6ERv7uPHdQg/SGNorDHm0bKRb3rb3rVZE
1mufV2qKGpz+HvKUohXgRQddJmBAmwN2AlELdAPD+vzXNf8JDT9H6W7nEKkL
cK4HAp+oG2wi3A5dOx9tNAIxvRZjdauLFsc1aPNB1CYTRAUcERAWw0k3tYS+
M45wY7cD10DhIWmkqggXxSYhyhJzaPPwMagB5jRSjoRQtMHWo6+h51Vbkoiz
Byz2MOU1UhQLb3PiA0Xbx2y8/zPYL2BYbmcUz55MYvDx60MYQ+lJUfiCFWFO
dy1P8FXzxq/x+vk1BXbg7RBnVti+4jrGLH8OHD+tbLMx1QO6AtHLpKJkD+kV
7h8adJ86QmusLbJlRVzZZBHGFdo2A2A7udMYPbDtY/GyIecgTJT1UuTtkgG6
MVGgRbvs3W/GIHidjAHDhB6Xky4cqq92WAcA34Fzl+ccByBdqjfY6amtNWHd
Ub3nPbXtQBMILC3Ih0UjOGB9IqzfIostXH2+M9rd3b0mPcStRYMDZE7agncM
jRxabpA3jjmRk0uwZ/fOXP34X6OfkgT/e8jKQJOkhJUx5jgPc0XRfX4k1lBn
sMT37RMKopgFddUlAxxBe1FsAKh3osOMUEeq133QY0eAHsNaJy5hB384h8Vu
cKW8C4KGuur6NvESxH1fWwmg4YZsGVGBpvkkpsNtAKgCxh1g/RE712nizQ0e
jzhqG6ZgqbSxC0PbyMjQrHNvDu6E92g2zruB8+QFrvMdf465zvNDbCTc04CT
hqET5CzakfUYjnXvsVBpi40MJdXIezyhJCnZ15CgLcBHaVggu1YgimJgoaW5
8yN33DpzDw6DrP6M4Jqd9yThv8JCrduRrvFTki3qckA08M9mQfLB0nJsm84c
VTI/efieF4iPNsJDR48sIU7G+IyKD2whUJ/Ah4j3foTlpjBA6CUq18MAZN2K
FSBo7koSKw1vwJFzwMTDSBLnp4eUHFmLRRNSSbSZ7GCMzbIqRT3IhGe/gHHC
UEgCKoNoLmIvTBbjz6tLCSHJzujaGkmhMhMo+xSSKd5jX1miS6W6VMmnuyMO
q0MOgIZz9vDlwYEkZ2i0L9jmiZdqUKhkmN14SscXWrxwRGgWM+qSn7CbNi0w
jCdRR9Ik/cJ8Es5O0OqCdIRAxOV/yXfFTJKVpJq5B4xCOeviCG8BOqlj9sGo
gEX5QQ+5LLJDJS6JhH6PYPMqbK3MK9WPVePmVZCsXGkaLHNyylVyKT5xMatq
dPvdcOO2CT6nU8miAnR07wzVhUnR28ansjKpDvjBqZ5S3lYF7FwNXgxVe3R6
01Vwkl1KvVt9K0AxR2soAhYqF0MV+cgpq1ZJuXXve2qpTflY3T0lEgMT2NYH
pN+Uh4lwk3ebPTHCDspLCmhIRPNILoe2L/j9d5VLCxIAOuhkt8mpTsIpiR2G
RLszqapQlY0x43Aj4V/ApCC8EDJ9dfX25PLny6uLk/ff/nx5fH50cXR1fJl0
beKh2tv9FAz14JTiPNW7X/7667KHv3wo55irRIfrMi9TmO9Sw17tHagzMGqj
g4N9+M/h/ovDFyP17ekVFhifnnElNP50Z+/lyoIwWtwBTzovk2Tvxf7LT/+2
MUefDfZGT48Koevu6LFRB4Pgb4pfSEl1x2YX9lsuVEU1AqmO95WrUb4cwnY9
PLjqp8tbuTyUy6Lw77xf/eDKSGixwYVhXwPdzpt84dJDbgQwlJGPSklZtiL+
BT8lptA4weHNHegUu0+SQmZd2xa026gk5FbEGVeK9lxxzBnetVIaVTbHxmXE
PBChAkPkZ76QubkkQh4FEke4x9k+wvucgLI2n0gCJaBPn0o/EZBKODVmLMIc
LUBRDAGrqaDYb/r4TB6HlpOHJPkB8Weub5jDK3ggGbhOYZ/ziBiZABIJr3Qk
XH6T5rq+MfVq6tjlgTU5cRF5m/JYPtVNPI0S13YTcQxHj8Agjc1WwS8OcIqd
c9YSEZFNhFD8tJKTD9zChEr1/4e/1enWse2zvT8J2zbjze7uYO/gYAeckicg
58c98Fk4Qzcc/hSlAeMEoGcJFt+oRAS/wbicuwqJh7iM7cdFSc+bqCxGTRkj
97WUIkjan6lL2rIOyLmqBKASelA2eCt/oEZh7snrAqOL6QV2UYJQS2EMk3wU
rFWcRaAelkgW4/y0D/3AP6Lcgi7gsygJ20neYvJ1I0Gh3Ejpxi1JXDSt5R+o
9Mo8x7+3owTJF1T9WUUEr4ni201ImqnEHxOjyP0kFOXpYZN9VwBPTQlXaVLa
8dLdwxxVI44G81H2x9VTXHXXRSrIUY7eT3wRgPolHm9h4TDDOZ5uwJD24aS+
LyKWVMvLfXQX260Vy9Sd4EPJIwGXy6qUjhBsQIlfC14rFxAzARJ6OCBWcY+M
oC8a0IXvWuL4o5Mo+FHK7z8NGVMoFRX6BP0OfqWeb8WzvLp490ZtU6vd2v/w
2eYnP3Ypi1Xbz4Q5yN/BYdITgsVHtM0PFvVAkX8hbVDoeTw8bFNvGLjOrqHA
wTU4eGoLy3Q594s0lKoWVUgrkJa4t+rl8MXws25/FRYWNmG7p0vwvanzW3Y9
uP0AoD+oyO+tjdLXkaJk2s4G3iSiGOBGMIpEbTaKYrpBZjjor9WWlhc7A/R9
uQG/6l0PBtfSqlItXCcNfLX9lEvwr2NS76cdgwG99PCYQeQxek+IxSZGo+11
sKBdQYRLnzEuhk95EnJLsd3x4YHXKvtEJV/b5g0pJLohFNM7nytKqlHTDLpS
2N1FbwtSYGdmOZVCuJ5OYZ+dy5H7KLFrb1A5LgRwP4JCvan1HDfjhJPRQMVW
vg2a+XkfHn6H4OGQ5Q35vE5Ct4bD7bVXRKz9w3OdkXzw37AdTwyIxMgDoAC/
5ufvyGzAAArs9vogbkr83P27O0yXqAfssvTj4lfvcfPDJ7D2EU4kD9xSvqdy
THdk/s2NS7CDYstIjzl2Cx5LW9fULscpHzK7PqfhX0TM56abXlzJya0TFqrd
9Kk421SDMaoaj0FlIsyFnEhRV3NOzo/mWmFcdoYCfp3RP1wSOM5SbHhf2kGi
LkouJdESiUKmRgLsoEg+dedif5yZEuN2OZ8bkN50tZOFCgb6xnAT1Eo2K5+s
FVk4EgM54+iDW2fhrX+/PHsPxNd6KZkZps01d2nMZpFsYq9GrfOCU1Hzue4T
DdzGKm230oxCtQWaQVoN4r6eG2MWLpWHGItdM77gaopiwECMHQO3lBeXUm0w
+9gph23cmPNj1uaWav2uG8dtjftijp3pEqDQv1m8MIikHBxBBQapEtDahiNR
GMcakRzJgWh4mSQHm9cAmZaK6+BtbbqpVExYEREDfD+jnCS3LHNj1SX3OsOT
4KhhLsx3/khr1RHtl1twfkuEcg8CZqQxaeyyn3G2vC81VRIBu5LKdAFOpwWb
W6/7vt9Cp3Vlre/NZvfPpW+pUwec8HoAAC4mlfxezAPwq9TWECe0opgX5ozS
6SSvmAXTNmQLH1sYJ9akcEtRMu4Wu5BUk7KcOcYBxS9EOhXR6eJC+Apll4qm
WDeKSootaGTxuyXV4Hui+YF1GtgZlNlRJ/GHCmqlduBb7KPQSasPF++wIIoN
bNLQ7/s4uB+84b6/kOHouwb6EhwQsEVeehlrxCyKtLNL72ZkhtpOIl0CnRmB
ivPHryHmfF+VxoWiz69xAsygdrtafFWa6zHop+vuzkZVdsQ0+4QrTnTgXtpu
cfKpfXBTxoxdqVdcSGTvGhKbjZ5OLzTbEOpza1pXCHhrO+R4uR9HpYW4EU4y
CIVujA/guKMKCSf3l/cmTkg7DIsajwjqtXp7fPQ6FiDfAY/GEOJYLOjkNHDf
55OwpZeaqryjrRniHKUIxNh1H6paElCDWVtUedms61xtAPFKCum3zr7bZr3y
dpjQtdMUwkYF3cgxdqRYfcs1k9D5yXJUjQvqlcxYyKfIvFRaZ9e1lP0BV4sH
tr7woaKwzhoTpQeEe8IGNtvgeIlHTehR49ml0q4cUqGYMtqGNUVmFgYODhUZ
L9iKsuKBkekecEW4Qm1J8/JZQbu7L6qpAZTnC2ckXBdip0HV427UcWqkIgF2
W047lIwTMRaDmShN1HSq3a5IxVWUHHcNIUL47bu2rXd4CMjLiMUVE7WCA9yR
vr/7Um3Joaf3MPwRRgwmA2HaH8GTD6U09gKB4TDWNlVfXu6O1BZ+c4KksB2l
czWm27HXWi7/14K2ETSBtOx35BpVKZWEkCxREDnggE+b+onYa/UWgPc6Ln85
NchWoKTjr2l1vZKxe7lLNUbM1V077EJL0unhfaQu6pfk+qdtrDqs8ai+nMeT
rULAyxt3DKDNCwKC8zPsUigzggHXGiut2wXaABkV/AYXj2G6ic2OTOgtMx99
SWsCWjpAQ2cXXHe7HoOzwIhEGynUo/Wj45IN5wqZJq97SBH4pDfWN59GE8hy
/LEVSstLOZXJ51JxJDNpaNFao1ckjE9UIQ6cnn1/HKcjDoYHkovAw4KU5HDl
Pm/O2HTSETeIgY4ljQzulORX4j4D7gUWq931g5wTZxeg2UpLViY+CbTisam3
ktAnJnBHHY0vO7gpgeucwGZWG4Noz4+jc3pXPm3ZxcRNrsbfM3P++ShZ9Vke
yYLvDka/lwNfrznuPpkXl+oANwUa4aRaSYWjXHf7RphvK2nxjgKzdmZSzYc3
+w5PeAzBAY/IIrjBwKOfHiycb76INJMNHvpfK67V33W3XvzR3UKZe/Hn7peF
qIQw0G2brTwgOoeG4hvwZ+rwnlOTYA0ip/0fn3GPyyQzTFFhin1AJ49y9hFF
W9pUN5SIIs/Ae9MLU1MlTvjMhgBEvtMPDCZnZtKbjibE8RkmE5QkE2KlwnK1
+K++hkx5ZVegZUvrihmuH5heJO8j5w91DRYjHIjj6iCG/ZYcU5AsCczYs/CT
dVuQKbUUkjswdWEmTdQ0RNmCc6y81becgPTq/kFEknaiB++AM3bIbpkmg9RT
H58t6OdB9KukezGlbgq0sHiIdRpOk4eDyFQ59RmuOFbRTTXPU7VFvLnLLdcF
8F1JTxn24TnbU2MnjagJTesSEs6dotO0zSc2PnNKifwx0DLJJauUe1JzT9Nq
f7SbmLqZQCLrMkr2imTe50QpjImmqbjl+ELye4zKM11M2F12YMmnYmZVyYFT
t5rPUoQsoNPmsxqTVrB1PhHYSVlzJtByEx4XOpgrnMGyff45bcFHkcOihNM3
znK4HnLLyXFMmpSWckOui88vdMnL7PY/rfQfQNRUSrKLOhCDM0fB3p0uG/7E
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

-->

</rfc>
