<?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.7.29 (Ruby 2.7.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lundblade-cbor-serialization-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title abbrev="CBOR Serialization">CBOR Serialization and Determinism</title>
    <seriesInfo name="Internet-Draft" value="draft-lundblade-cbor-serialization-01"/>
    <author initials="L." surname="Lundblade" fullname="Laurence Lundblade">
      <organization>Security Theory LLC</organization>
      <address>
        <email>lgl@securitytheory.com</email>
      </address>
    </author>
    <date year="2025" month="May" day="27"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR</workgroup>
    <keyword>cbor</keyword>
    <abstract>
      <?line 30?>

<t>This document updates and clarifies CBOR Serialization and Deterministic Encoding as defined in <xref target="RFC8949"/>.
It also provides background explanations that were not included in the original specification.</t>
    </abstract>
  </front>
  <middle>
    <?line 35?>

<section anchor="Introduction">
      <name>Introduction</name>
      <t>This document provides a complete definition of both Preferred Serialization and CBOR Deterministic Encoding Requirements (CDER) such that the reader does not need to refer to their definitions in <xref target="RFC8949"/>.</t>
      <t>The overwhelming purpose of this document is clarity and ease for the CBOR ecosystem on the subject of serialization and determinism.
Aside from one small change, this restatement of the requirements doesn’t change anything in <xref target="RFC8949"/>.
No new concepts or terminology is introduced.</t>
      <t>The small change is to Preferred Serialization.
The conditional “preference” for deterministic length encoding in <xref section="4.1" sectionFormat="of" target="RFC8949"/> is promoted to an unconditional requirement by this document.
This change is considered reasonably compatible with the extant CBOR ecosystem.
Since the publication of <xref target="RFC8949"/>, a period of five years, the CBOR community largely assumed deterministic length encoding was a requirement of Preferred Serialization.
It is better to make this minor change than to create a third serialization concept that would compound the complexity and confusion in this part of the CBOR ecosystem.</t>
    </section>
    <section anchor="models">
      <name>Information Model, Data Model and Serialization</name>
      <t>To understand CBOR serialization and determinism, it's helpful to distinguish between the general concepts of an information model, a data model, and serialization.</t>
      <table>
        <thead>
          <tr>
            <th align="left"> </th>
            <th align="left">Information Model</th>
            <th align="left">Data Model</th>
            <th align="left">Serialization</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Abstraction Level</td>
            <td align="left">Top level; conceptual</td>
            <td align="left">Realization of information in data structures and data types</td>
            <td align="left">Actual bytes encoded for transmission</td>
          </tr>
          <tr>
            <td align="left">Example</td>
            <td align="left">The temperature of something</td>
            <td align="left">A floating-point number representing the temperature</td>
            <td align="left">Encoded CBOR of a floating-point number</td>
          </tr>
          <tr>
            <td align="left">Standards</td>
            <td align="left"> </td>
            <td align="left">CDDL</td>
            <td align="left">CBOR</td>
          </tr>
          <tr>
            <td align="left">Implementation Representation</td>
            <td align="left"> </td>
            <td align="left">API Input to CBOR encoder library, output from CBOR decoder library</td>
            <td align="left">Encoded CBOR in memory or for transmission</td>
          </tr>
        </tbody>
      </table>
      <t>CBOR doesn't provide facilities for information models.
They are mentioned here for completeness and to provide some context.</t>
      <t>CBOR defines a palette of basic types that are the usual integers, floating-point numbers, strings, arrays, maps and other.
Extended types may be constructed from these basic types.
These basic and extended types are used to construct the data model of a CBOR protocol.
While not required, <xref target="RFC8610"/> may be used to describe the data model of a protocol.
The types in the data model are serialized per <xref target="RFC8949"/> to create encoded CBOR.</t>
      <t>CBOR allows certain data types to be serialized in multiple ways to facilitate easier implementation in constrained environments.
For example, indefinite-length encoding enables strings, arrays, and maps to be streamed without knowing their length upfront.</t>
      <t>Crucially, CBOR allows — and even expects — that some implementations will not support all serialization variants.
In contrast, JSON permits variations (e.g., representing 1 as 1, 1.0, or 0.1e1), but expects all parsers to handle them.
That is, the variation in JSON is for human readability, not to facilitate easier implementation in some environments.</t>
      <t>Since CBOR does not require implementations to support every serialization variant, defining a common serialization format is highly beneficial for those that don’t need specialized encoding.
This is the role of preferred serialization.
It mandates a specific variant for each data type when multiple options exist.</t>
    </section>
    <section anchor="PreferredSerialization">
      <name>Preferred Serialization</name>
      <t>The requirements in the next two sections replace the definition of Preferred Serialization in <xref target="RFC8949"/>.</t>
      <t>They are restated in normative form to be more clear and so they can be formally referenced by the restatement of <xref target="CDER"/>.</t>
      <t>To claim support for Preferred Serialization, everything output by an encoder MUST meet all these requirements.
In particular this disallows using tag 2 and 3 for values in the range of -(2<sup>64</sup>) to 2<sup>64</sup> - 1.</t>
      <t>As mentioned in <xref target="Introduction"/> there is one change relative to the definition of Preferred Serialization in <xref target="RFC8949"/>.</t>
      <section anchor="PreferredEncoding">
        <name>Encoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Shortest-form encoding of the argument MUST be used for all major types.
The shortest form encoding for any argument that is not a floating  point value is:  </t>
            <ul spacing="normal">
              <li>
                <t>0 to 23 and -1 to -24 MUST be encoded in the same byte as the major type.</t>
              </li>
              <li>
                <t>24 to 255 and -25 to -256 MUST be encoded only with an additional byte (ai = 0x18).</t>
              </li>
              <li>
                <t>256 to 65535 and -257 to -65536 MUST be encoded only with an additional two bytes (ai = 0x19).</t>
              </li>
              <li>
                <t>65536 to 4294967295 and -65537 to -4294967296 MUST be encoded only with an additional four bytes (ai = 0x1a).</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If maps or arrays are emitted, they MUST use definite-length encoding (never indefinite-length).</t>
          </li>
          <li>
            <t>If text or byte strings are emitted, they MUST use definite-length encoding (never indefinite-length).</t>
          </li>
          <li>
            <t>If floating-point numbers are emitted, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>The length of the argument indicates half (binary16, ai = 0x19), single (binary32, ai = 0x1a) and double (binary64, ai = 0x1b) precision encoding.
If multiple of these encodings preserve the precision of the value to be encoded, only the shortest form of these MUST be emitted.
That is, encoders MUST support half-precision and single-precision floating point.
Positive and negative infinity and zero MUST be represented in half-precision floating point.</t>
              </li>
              <li>
                <t>NaNs, and thus NaN payloads MUST be supported.      </t>
                <t>
As with all floating point numbers, NaNs with payloads MUST be reduced to the shortest of double, single or half precision that preserves the NaN payload.
The reduction is performed by removing the rightmost N bits of the payload, where N is the difference in the number of bits in the significand (mantissa) between the original format and the
reduced format.
The reduction is performed only (preserves the value only) if all the rightmost bits removed are zero.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If big numbers (tags 2 and 3) are supported, the Preferred Serialization requirements decribed in <xref target="bignum"/> MUST be implemented.</t>
          </li>
        </ol>
      </section>
      <section anchor="PreferredDecoding">
        <name>Decoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Decoders MUST accept shortest-form encoded arguments.</t>
          </li>
          <li>
            <t>If arrays or maps are supported, definite-length arrays or maps MUST be accepted.</t>
          </li>
          <li>
            <t>If text or byte strings are supported, definite-length text or byte strings MUST be accepted.</t>
          </li>
          <li>
            <t>If floating-point numbers are supported, the following apply:  </t>
            <ul spacing="normal">
              <li>
                <t>Half-precision values MUST be accepted.</t>
              </li>
              <li>
                <t>Double- and single-precision values SHOULD be accepted; leaving these out is only foreseen for decoders that need to work in exceptionally constrained environments.</t>
              </li>
              <li>
                <t>If double-precision values are accepted, single-precision values MUST be accepted.</t>
              </li>
              <li>
                <t>NaNs, and thus NaN payloads, MUST be accepted.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If big numbers (tags 2 and 3) are supported, the Preferred Serialization requirements decribed in <xref target="bignum"/> MUST be implemented.</t>
          </li>
        </ol>
      </section>
      <section anchor="when-to-use-preferred-serialization">
        <name>When to use Preferred Serialization</name>
        <t>It is recommended that Preferred Serialization be used unless an application has special needs.</t>
        <t>It is usually implementations in constrained environments that have special needs.
For example, indefinite-length encoding is useful to send a lot of data from a device that has insufficient memory to store the data to be sent.</t>
      </section>
    </section>
    <section anchor="CDER">
      <name>CBOR Deterministic Encoding Requirements</name>
      <t>The requirements in the next two sections replace the definition of CDER from <xref target="RFC8949"/>:</t>
      <t>There are no differences between these requirements and those of <xref target="RFC8949"/>.
This restatement is only for the sake of clarity.
(<xref target="RFC8949"/> allowed indefinite-length encoding for preferred serialization but not for CDER; that is why there is a change to preferred serialization in this document but not to CDER).</t>
      <t>To claim support for CDER, everything output by an encoder MUST meet all these requirements.
In particular this disallows using tag 2 and 3 for values in the range of -(2<sup>64</sup>) to 2<sup>64</sup> - 1.</t>
      <section anchor="encoder-requirements">
        <name>Encoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Preferred Serialization defined in <xref target="PreferredEncoding"/> MUST be used.</t>
          </li>
          <li>
            <t>If a map is emitted, the keys in it MUST be sorted in the bytewise lexicographic order of their deterministic encodings.</t>
          </li>
        </ol>
      </section>
      <section anchor="decoder-requirements">
        <name>Decoder Requirements</name>
        <ol spacing="normal" type="1"><li>
            <t>Decoders MUST meet the decoder requirements for <xref target="PreferredDecoding"/>.
That is, deterministic encoding imposes no requirements over and above the requirements for decoding Preferred Serialization.</t>
          </li>
        </ol>
      </section>
      <section anchor="when-to-use-deterministic-serialization">
        <name>When to use Deterministic Serialization</name>
        <t>Most applications do not require deterministic encoding—even those that use signing or hashing to authenticate or protect the integrity of data.
For example, the payload of a COSE_Sign message does not need to be encoded deterministically, because it is transmitted along with the message.
The recipient receives the exact same bytes that were signed.</t>
        <t>Deterministic encoding becomes important when the data being protected is NOT transmitted in the form needed for authenticity or integrity checks—typically when that form is derived from other data.
This can happen for reasons such as data size, privacy concerns, or other constraints.</t>
        <t>The only difference between preferred and non-deterministic serialization is map key sorting.
Sorting can be prohibitively expensive in very constrained environments.
However, in many systems, sorting maps is not costly, and deterministic encoding can be used by default.
Deterministically encoded data is always decodable, even by receivers that do not specifically support deterministic encoding.
It can also be helpful for debugging protocols.</t>
      </section>
    </section>
    <section anchor="bignum">
      <name>Clarified Big Number Requirements</name>
      <section anchor="big-number-requirements">
        <name>Big Number Requirements</name>
        <t>This text replaces <xref section="3.4.3" sectionFormat="of" target="RFC8949"/>.</t>
        <t>Tag numbers 2 and 3 are used to represent bignums, which encode arbitrary-precision integers.</t>
        <t>The content of a bignum tag MUST be a byte string, interpreted as an unsigned integer n in network byte order (big-endian).</t>
        <ul spacing="normal">
          <li>
            <t>For tag 2 (positive bignum), the value is n.</t>
          </li>
          <li>
            <t>For tag 3 (negative bignum), the value is -1 - n.</t>
          </li>
        </ul>
        <t>Decoders MUST accept and ignore leading zeros in the byte string of a bignum.
Decoders MUST also accept an empty byte string and treat it as representing the value zero.</t>
        <t>CBOR defines both Preferred and Non-Preferred Serializations for bignums.
The Preferred Serialization of bignums is also deterministic; therefore, no additional requirements are needed for deterministic encoding beyond those of Preferred Serialization.</t>
        <section anchor="preferred-serialization">
          <name>Preferred Serialization</name>
          <t>In Preferred Serialization, the bignum number space is unified with CBOR major types 0 and 1.
This means that any value that can be represented using major type 0 (unsigned integers) or 1 (negative integers) MUST NOT be encoded as a bignum.</t>
          <t>For example, the value 1 MUST be encoded as the single-byte 0x01, and MUST NOT be encoded as a bignum (e.g., 0xc24101).</t>
          <t>Additionally, bignums in Preferred Serialization MUST NOT be encoded with leading zeros.</t>
        </section>
        <section anchor="non-preferred-serialization">
          <name>Non-Preferred Serialization</name>
          <t>In Non-Preferred Serialization, the unification of the bignum number space with major types 0 and 1 does not apply.
Values that can be represented using major types 0 or 1 MAY instead be encoded as bignums.</t>
          <t>For example, the value 1 MAY be encoded as 0xc24101.</t>
        </section>
        <section anchor="implementation-guidance">
          <name>Implementation Guidance</name>
          <t>Implementations operating in environments that support 128-bit integers SHOULD implement tags 2 and 3 to encode and decode those values.</t>
        </section>
      </section>
      <section anchor="background-discussion-on-preferred-serialization-of-big-numbers">
        <name>Background Discussion on Preferred Serialization of Big Numbers</name>
        <t>The requirement for Preferred Serialization of big numbers is atypical.
The following subsections explain why this is the case and why this design choice was made.
This background is intended to help clarify the distinction between serialization and data models, as the inclusion of this particular requirement in Preferred Serialization blurs that line.</t>
        <section anchor="preferred-serialization-background">
          <name>Preferred Serialization Background</name>
          <t>As mentioned in <xref target="models"/>, CBOR was intentionally designed to allow variation in serialization to support implementation in constrained environments.
All requirements associated with Preferred Serialization and the CBOR Deterministic Encoding Rules (CDER) — except those concerning big numbers — exist to eliminate this variation in deployments that do not require it.
These requirements provide interoperability and determinism for the CBOR major types and don't affect anything at the data model level.</t>
          <t>For example, the Preferred Serialization requirement to use the shortest form of an argument eliminates variability in how arguments are encoded — variability that is sometimes intentionally made use of in constrained environments.</t>
        </section>
        <section anchor="data-model-background">
          <name>Data Model Background</name>
          <t><xref target="models"/> distinguishes serialization from data models.
In CBOR data models, the major types (such as types 0 and 1 for integers) and tags (such as tags 2 and 3 for bignums) are distinct constructs.
The way a particular value is serialized is separate from how it manifests in the data model level.</t>
          <t>For instance, a floating-point number remains the same at the data model level regardless of whether it is serialized as a half-, single-, or double-precision float.
The encoding is orthogonal to its meaning in the data model.</t>
          <t>Similarly, major types 0 and 1 are conceptually separate from tags 2 and 3.
Unifying these two representations — by requiring values encodable with major types 0 or 1 to be encoded that way instead of using tags 2 or 3 — amounts to a unification at the data model level.
As such, this requirement is unlike other Preferred Serialization constraints, which are focused solely on serialization variability.</t>
        </section>
        <section anchor="rationale-for-including-unification-in-preferred-serialization">
          <name>Rationale for Including Unification in Preferred Serialization</name>
          <t>An alternate interpretation is that, since every value representable as a bignum within the range of major types 0 and 1 has an exact equivalent encoding using those major types, this is merely a matter of serialization choice.
From this perspective, selecting one encoding form over the other could be seen as a serialization preference — even though it also implies unifying distinct data model types.</t>
          <t>Another reason is that this is what <xref target="RFC8949"/> specified and this document seeks maximal compatibility with it.</t>
          <t>Finally, including the unification rule in Preferred Serialization promotes consistent encoding of 128-bit integers.
By incorporating this requirement, the specification encourages broader adoption and implementation of uniform 128-bit integer representations within CBOR.</t>
        </section>
      </section>
    </section>
    <section anchor="Tags">
      <name>Deterministic Encoding for Popular Tags</name>
      <t>The definitions of the following tags in <xref target="RFC8610"/> allow variation in the data mode, thus it is useful to define a deterministic encoding for them should a particular deterministic protocol need one.
The tags defined in <xref target="RFC8610"/> but not mentioned here have no variability in their data model.</t>
      <section anchor="date-strings-tag-0">
        <name>Date Strings, Tag 0</name>
        <t>TODO -- complete this work and remove this comment before publication</t>
      </section>
      <section anchor="epoch-date-tag-1">
        <name>Epoch Date, Tag 1</name>
        <section anchor="encoder-requirements-1">
          <name>Encoder Requirements</name>
          <t>The integer form MUST be used unless one of the following applies: (1) the date is too far in the past or future to fit in a 64-bit integer of type 0 or 1, or (2) the date requires sub-second precision.
In these cases, the floating-point form MUST be used instead.</t>
        </section>
        <section anchor="decoder-requirements-1">
          <name>Decoder Requirements</name>
          <t>The decoder MUST decode both the integer and floating-point form.</t>
        </section>
      </section>
      <section anchor="big-numbers-tags-2-and-3">
        <name>Big Numbers, Tags 2 and 3</name>
        <t>See <xref target="bignum"/>.</t>
      </section>
      <section anchor="big-floats-and-decimal-fractions-tags-4-and-5">
        <name>Big Floats and Decimal Fractions, Tags 4 and 5</name>
        <section anchor="encoder-requirements-2">
          <name>Encoder Requirements</name>
          <t>The mantissa MUST be encoded in the preferred serialization form specified in Section 3.4.3 of RFC 8949.</t>
          <t>The mantissa MUST NOT contain trailing zeros. For example, the decimal fraction with value 10 must be encoded with a mantissa of 1 and an exponent of 1. For big floats, the mantissa must not include any trailing zero bits if encoded as a type 0 or 1 integer, and no trailing zero bytes if encoded as a big number</t>
        </section>
        <section anchor="decoder-requirements-2">
          <name>Decoder Requirements</name>
          <t>Both the integer and big number forms of the mantissa MUST be decoded.</t>
        </section>
      </section>
    </section>
    <section anchor="general-protocol-considerations-for-determinism">
      <name>General Protocol Considerations for Determinism</name>
      <t>This is the section that covers what is know as ALDR in some discussions.</t>
      <t><cref anchor="rfced">RFC Editor:</cref> Please remove above sentence before publication</t>
      <t>In addition to <xref target="CDER"/> and <xref target="Tags"/>, there are considerations in the design of any deterministic protocol.</t>
      <t>For a protocol to be deterministic, both the encoding (serialization) and data model (application) layer must be deterministic.
While CDER ensures determinism at the encoding layer, requirements at the application layer may also be necessary.</t>
      <t>Here’s an example application layer specification:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>At the sender’s convenience, the birth date MAY be sent either as an integer epoch date or string date. The receiver MUST decode both formats.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>While this specification is interoperable, it lacks determinism.
There is variability in the data model layer akin to variability in the CBOR encoding layer when CDER is not required.</t>
      <t>To make this example application layer specification deterministic, specify one date format and prohibit the other.</t>
      <t>A more interesting source of application layer variability comes from CBOR’s variety of number types. For instance, the number 2 can be represented as an integer, float, big number, decimal fraction and other.
Most protocols designs will just specify one number type to use, and that will give determinism, but here’s an example specification that doesn’t:</t>
      <ul empty="true">
        <li>
          <ul empty="true">
            <li>
              <t>At the sender’s convenience, the fluid level measurement MAY be encoded as an integer or a floating-point number. This allows for minimal encoding size while supporting a large range. The receiver MUST be able to accept both integers and floating-point numbers for the measurement.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>Again, this ensures interoperability but not determinism—identical fluid level measurements can be represented in more than one way.
Determinism can be achieved by allowing only floating-point, though that doesn’t minimize encoding size.</t>
      <t>A better solution requires the fluid level always be encoded using the smallest representation for every particular value.
For example, a fluid level of 2 is always encoding as an integer, never as a floating-point number.
2.000001 is always be encoded as a floating-point number so as to not lose precision.
See the numeric reduction defined by dCBOR.</t>
      <t>Although this is not strictly a CBOR issue, deterministic CBOR protocol designers should be mindful of variability in Unicode text, as some characters can be encoded in multiple ways.</t>
      <t>While this is not an exhaustive list of application-layer considerations for deterministic CBOR protocols, it highlights the nature of variability in the data model layer and some sources of variability in the CBOR data model (i.e., in the application layer).</t>
    </section>
    <section anchor="cddl-support">
      <name>CDDL Support</name>
      <t>TODO -- complete work and remove this comment</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations in <xref section="10" sectionFormat="of" target="RFC8949"/> apply.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO -- complete work and remove this comment before publication</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC8949">
        <front>
          <title>Concise Binary Object Representation (CBOR)</title>
          <author fullname="C. Bormann" initials="C." surname="Bormann"/>
          <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
          <date month="December" year="2020"/>
          <abstract>
            <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
            <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="94"/>
        <seriesInfo name="RFC" value="8949"/>
        <seriesInfo name="DOI" value="10.17487/RFC8949"/>
      </reference>
      <reference anchor="RFC8610">
        <front>
          <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
          <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
          <author fullname="C. Vigano" initials="C." surname="Vigano"/>
          <author fullname="C. Bormann" initials="C." surname="Bormann"/>
          <date month="June" year="2019"/>
          <abstract>
            <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8610"/>
        <seriesInfo name="DOI" value="10.17487/RFC8610"/>
      </reference>
    </references>
    <?line 352?>

<section anchor="examples-and-test-vectors">
      <name>Examples and Test Vectors</name>
      <t>TODO -- complete work and remove this comment before publication</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9Vc624bSXb+z6corIGstCAZSb7sWLMZRGPZOw489sDS7CII
kqDYXSR73Oxm+iKJ4zHgh5g/CyQv5yfJ+c45VV3dTcreYAMkgwEssqvrcq7f
uRRns9nk5tw8nEyarMnduXn27Zu35spVmc2zn22TlYWxRWouXeOqTVZk9WZi
F4vK3ewbOknLpLAbmiat7LKZ5W2RLnKbulmyKKtZHY+d5bZxdTNJbHNu6iad
TFL64nySlEXtirqtz01TtW5SN5Wzm3Pz8vn1i0m2rfjrujk7OXl6cjax9PDc
mN9cbLd5lvDENW/4rbP57DrbuN9Mbsvq3aoq261sefLO7eir9NxgU5PJxLbN
uqzOJzOTFbTqq7l55fc9MUbO88q2lSsS13tUVqtzIkDSVlmzM9drV1Y78+rV
M3rkNjbLz02+yv+x1gENP58n5WYyKcpqQ5u9ofMa8/bFs6+ePnrq9yNfPDk9
oS/SNKcNzmYzYxdECJs0k8n1OqsNEbrduKIx7RZkkzMnua2yZUafPsvFJkvM
8yIp06xYGUvzuWVWuJQoYN6/Z259+DCfvGyMzevSbKvyJktp3oVNmJQ0l7vb
5rZQijdr25hbVzlTlA1NkuRtKrPRqYlO2SorbG7qrUtog8KnuRxsk9Eh3WTy
wLwsmqpM24S3+/5B/PHD8NhhR9YQQbc5HUzOkPHb5dIsymZtfqjc0lUVbWVM
DKbRAYq8df/RZpXDUrU5enb5/O2xqdtkLQfFmUjuUlfRhmgPOHPhaJGmNLwg
/qBBWRXtqR7Qlg5ElLlx1e3a5Rssum2rbVk7bL7pHZb+ZtaSkGHjztKgZVnx
PvgULinrXd24jSmF4nW7+MklDaaqRwdPO12eTy5qIqNZViXepRc3Ns9NsrbF
yk1lGxVpKYkY74S3hsNH5AEJik8f/9Loa7QGyToO1D/w65KIdEvsIjXa0ns4
AO+jzMvVDofMlOMuVfLEu8EAIusBjs55PM2dMrFJ1j59/M8tj4Xafvr4X0yx
tMfu3BUrEhLnuc77JX1mSj2an+K4un2sTjK3KRthsy1MW8TLRSQxi12fgXMR
3u4csHFEdpyC5KimCRb5jgWZDrPInbnNmjVT2t01lmbsc3k+ucpgizBg2y68
4cN2A72npBlbolCZ4uslmRqzc7aqp53U0HqbtoBUkXCtHO3A1jVtOP0MmW4t
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

-->

</rfc>
