<?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.18 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bormann-cbor-numbers-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title abbrev="CBOR Numbers">On Numbers in CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-numbers-00"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2024" month="July" day="09"/>
    <area>Applications and Real-Time</area>
    <workgroup>Concise Binary Object Representation Maint&amp;Ext</workgroup>
    <abstract>
      <?line 66?>

<t>The Concise Binary Object Representation (CBOR), as defined in STD 94 (RFC 8949), is a data representation format whose design goals include the
possibility of extremely small code size, fairly small message
size, and extensibility without the need for version negotiation.</t>
      <t>Among the kinds of data that a data representation format needs to be
able to carry, numbers have a prominent role, but also have
inherent complexity that needs attention from protocol designers
and implementers of CBOR
libraries and of the applications that use them.</t>
      <t>This document gives an overview over number formats available in
CBOR and some notable CBOR tags registered, and it attempts to
provide information about opportunities and potential pitfalls of these
number formats.</t>
      <t><cref anchor="disclaimer">This is a rather drafty initial revision, pieced
together from various components, so it has a higher level of
redundancy than ultimately desired.</cref></t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-bormann-cbor-numbers/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Concise Binary Object Representation Maintenance and Extensions Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cabo/cbor-numbers"/>.</t>
    </note>
  </front>
  <middle>
    <?line 95?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Concise Binary Object Representation (CBOR), as defined in RFC 8949 <xref target="STD94"/>, is a data representation format whose design goals include the
possibility of extremely small code size, fairly small message
size, and extensibility without the need for version negotiation.</t>
      <t>Among the kinds of data that a data representation format needs to be
able to carry, numbers have a prominent role, but also have
inherent complexity that needs attention from protocol designers
and implementers of CBOR
libraries and of the applications that use them.</t>
      <t>This document gives an overview over number formats available in
CBOR and some notable CBOR tags registered, and it attempts to
provide information about opportunities and potential pitfalls of these
number formats.</t>
      <t>It discusses CBOR representation of numbers in four main Sections:</t>
      <ul spacing="normal">
        <li>
          <t><xref format="title" target="sec-int"/> (<xref target="sec-int"/>),</t>
        </li>
        <li>
          <t><xref format="title" target="sec-ieee"/> (<xref target="sec-ieee"/>),</t>
        </li>
        <li>
          <t><xref format="title" target="sec-float"/> (<xref target="sec-float"/>),</t>
        </li>
        <li>
          <t><xref format="title" target="sec-array"/> (<xref target="sec-array"/>).</t>
        </li>
      </ul>
      <t>These sections will generally address considerations such as:</t>
      <ul spacing="normal">
        <li>
          <t>Encoding efficiency (number of bytes needed), possibly processing
efficiency (CPU used in processing)</t>
        </li>
        <li>
          <t>Preferred Serialization, Common Deterministic Encoding Profile (CDE,
<xref target="I-D.ietf-cbor-cde"/>, see also <xref target="I-D.bormann-cbor-det"/> for more background discussion)</t>
        </li>
        <li>
          <t>Use by applications</t>
        </li>
        <li>
          <t>Interoperability considerations, potential "dark corners"</t>
        </li>
      </ul>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="BCP14"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>Terms and definitions from <xref target="STD94"/>, <xref target="RFC8610"/>, and <xref target="IEEE754"/> apply.</t>
      </section>
    </section>
    <section anchor="sec-int">
      <name>Integer Numbers</name>
      <t>CBOR provides representations of integer numbers in unsigned and negative forms:</t>
      <ul spacing="normal">
        <li>
          <t>Unsigned integers up to 2<sup>64</sup>−1, major type 0</t>
        </li>
        <li>
          <t>Negative integers down to −2<sup>64</sup>, major type 1</t>
        </li>
        <li>
          <t>Unsigned integers with no size limitations, tag 2 on a byte string</t>
        </li>
        <li>
          <t>Negative integers with no size limitations, tag 3 on a byte string</t>
        </li>
      </ul>
      <t>The latter two forms are often called "bignums" for historical
reasons, the former "basic" integers.  The Concise Data Definition
Language (CDDL) <xref target="RFC8610"/> has the types <tt>uint</tt>,
<tt>nint</tt>, and <tt>int</tt>, for the ranges of values covered by major type 0,
major type 1, and either of them, respectively; <tt>biguint</tt>, <tt>bignint</tt>,
and <tt>bigint</tt> for the range of value covered by tag 2, tag3, and either;
and <tt>unsigned</tt> and <tt>integer</tt> for a choice of either form (but
interestingly no <tt>negative</tt>).
As the preferred encoding for an integer chooses between major type
0/1 and tag 2/3 automatically, in practice <tt>biguint</tt> and <tt>unsigned</tt>
are the same type, as are <tt>bigint</tt> and <tt>integer</tt>.</t>
      <t>The Major type 0 numbers come in five different encoding sizes, as
indicated by their initial byte:
immediate ("1+0") encoding (0..23), one-byte ("1+1") (0..255),
two-byte ("1+2", 0..65535), four-byte, and eight-byte.
The Preferred Serialization always uses the shortest of the major type
0 encodings
available for an unsigned integer.
The intention is that there is no semantic difference between the
major type 0 encodings, and there also is no semantic difference between major type 0 and
tag 2.
This means that Preferred Serialization always uses major type 0
over tag 2 when possible, and the shortest encoding of these (and thus no leading
zero bytes for the tagged encodings).
Major type 1 and tag 3 are analogous.</t>
      <t>Note that there is no "signed type" in CBOR: as any specific number to
be represented is either negative or not, it is represented as an
unsigned integer or as a negative integer.
Major type 0 unsigned integers cover exactly the range of platform
types such as <tt>uint64_t</tt> or <tt>u64</tt>.
Signed platform types such as <tt>int64_t</tt> or <tt>i64</tt> can be represented in
the lower half of the unsigned space and the upper half of the
negative space.
Platforms typically have no <tt>nint64_t</tt> type that could take all
negative numbers representable in major type 1; generic decoders will
therefore treat the lower half of the negative space in the same way
they will treat bignums that do not fit the signed platform type.
Similarly, generic encoders for a platform with <tt>u128</tt>/<tt>i128</tt> types
will choose between major type 0/1 and tag 2/3 just like they would
choose between the encoding sizes inside major type 0/1.</t>
      <t>While additional representation of integers could be developed, the
options already provided by <xref target="STD94"/> should be able to satisfy most
applications.</t>
    </section>
    <section anchor="sec-ieee">
      <name>IEEE 754 Floating Point Numbers</name>
      <t>While integer numbers are relatively easy to represent, floating point
numbers as a realization of rational or real numbers are a much more
varied subject.  Many rational or real numbers require rounding until
they can be encoded as a floating point number.</t>
      <t>There are many choices that can be made when designing a machine
representation for floating point numbers.
After decades of vendor-specific formats, IEEE standardized <xref target="IEEE754"/>,
initially in 1985, updated in 2008 and then 2019 (IEC 559 is then mirroring
IEEE 754).
This standard is widely adopted in hardware and software, offering
choices such as binary vs. decimal floating point numbers, and
different representation sizes.
Out of the large choice available, CBOR directly supports the three
formats binary16, binary32, and binary64, i.e., the signed binary
floating point formats in 16, 32, and 64 bits, colloquially known as
half (16 bits), single (32 bits), and double (64 bits) precision.
Most platforms that support floating point computation support at
least single precision, except for the most constrained ones also
double precision, while half precision is mostly used for storage and
interchange only and may be software-supported only.</t>
      <section anchor="integer-vs-floating-point">
        <name>Integer vs. Floating Point</name>
        <t>Mathematically speaking, integer numbers are a subset of the rational
or real numbers from which floating point numbers are drawn.
In many programming environments, however, integer numbers are clearly
separated from floating point numbers (the most notable exception
being the original JavaScript language, which only had one number type).</t>
        <t>For specific applications, it may be desirable to represent all
numbers that can be represented as integers as such, even if they are
used where floating point numbers are used for non-integers.
<xref target="I-D.mcnally-deterministic-cbor"/> defines a CDE application profile that enforces this for
a certain subset of the integers.</t>
        <t>Most CBOR applications so far have tended to get by with the kind of
strong separation between the integer and floating point worlds that
programming environments usually favor, so our focus will not be on
approaches for intermingling them in this document.</t>
      </section>
      <section anchor="considerations-for-non-finite-numbers-and-non-numbers">
        <name>Considerations for non-finite numbers and non-numbers</name>
        <t>IEEE754 distinguishes three kinds of floating point data item:</t>
        <ul spacing="normal">
          <li>
            <t>finite floating-point number: A finite number that is representable
in a floating-point format.  Note that these further divide into
zero, subnormal, and normal; this distinction is usually not of
interest in interchange, except that there are a few platforms with
limited floating point support that may not support subnormal
numbers.</t>
          </li>
          <li>
            <t>infinite floating-point number: One of the two values −Infinite and
(positive) Infinite.
On many platforms, infinite numbers can be accessed via a floating
point operation such as 1.0/0.0 (positive infinity) or −1.0/0.0
(negative infinity); they react to comparisons as one would expect.</t>
          </li>
          <li>
            <t>NaN: a <em>floating point datum</em> that is not a number (NaN), used to
represent computations that didn't lead to a numeric result, not
even an infinity.
A commonly implemented example for such a computation is 0.0/0.0.
The formats provide a way to include additional information with a
NaN, such as its sign bit, whether operations on the NaN are
intended to fail immediately (signaling) or just return another NaN
(quiet), and some remaining bits that may carry additional
information (intended as diagnostic).  </t>
            <t>
It can be surprising that according to <xref target="IEEE754"/>, NaN values always
compare as different even if they have the same NaN information
(i.e., are identical).  (There is also a totalorder relation that
does give NaNs a defined place, depending on their sign bits; this
only recently has been standardized as part of std::strong_order in
C++20 <xref target="Cplusplus20"/>.)</t>
          </li>
        </ul>
        <t>Not all platforms that can use IEEE 754 do provide all these kinds, e.g.,
Erlang only provides finite floating-point numbers.
Platforms that do provide them widely vary in the way they provide
access to non-finite numbers and NaNs beyond the floating point
operations given above.
Usually there is an operation such as <tt>isnan()</tt> in C, which is needed
as comparison to a NaN always yields inequality.</t>
        <section anchor="protocol-design-considerations">
          <name>Protocol Design Considerations</name>
          <t>CBOR supports the interchange of all kinds of IEEE 754 data items,
including non-finite numbers and non-numbers (NaNs).
For an application developer that is already using IEEE 754 floating
point, there is little additional consideration required:
Both infinities and NaN are widely supported in IEEE-754 hardware and
software by CPUs, OS’s and programming environments.
CBOR protocol designs can generally rely on infinities and NaN as a
concept being supported, but implementations may run into dark corners
of their platforms when it comes to distinguishing and preserving NaN
information in NaN values.</t>
          <t>However, for a protocol that wants to achieve good interoperability
over a wide variety of platforms, the fact that platforms differ in
their support of non-finite numbers and NaNs becomes relevant.
(See <xref target="implcons"/> below for reasons for such differences.)
Protocol designs aiming for the widest possible platform support may
want to implement replacements for infinite numbers and NaNs, or at
least not rely on NaN information being successfully preserved during
interchange.</t>
          <section numbered="false" anchor="json-compatibility">
            <name>JSON Compatibility</name>
            <t>Note that JSON supports neither infinite numbers nor NaN.
For protocols that are intended to work in both CBOR and JSON
representations and need an out-of-band indicator comparable to NaN, a
protocol developer might consider this (in CDDL, where <tt>float</tt> is not
intended to be a NaN value):</t>
            <sourcecode type="cddl"><![CDATA[
float-with-null = float / null
]]></sourcecode>
            <t>Additional choices can be added for the infinities (e.g., <tt>false</tt> and
<tt>true</tt>, to stay within the CBOR simple values), if required.</t>
            <t>Since <tt>null</tt>, <tt>false</tt> and <tt>true</tt> have single-byte representations, the
replacement of NaN, −Infinity, and (positive) Infinity by these values can save
bytes even if JSON compatibility is not a consideration.</t>
            <t>Applications that need to preserve the information in a NaN (sign bit,
quiet bit, payload) may want to replace <tt>null</tt> with an
application-oriented representation of that information, or simply
with a (left-aligned, truncating trailing zero bytes) byte string
representing those bits:</t>
            <t>float-with-nan-replacement = float / bytes</t>
            <t>For JSON, the byte string can be base16- or base64-encoded, or it can
be represented by an integer, preserving its left-aligned nature, or
even as a (tagged) floating point value with a different exponent.</t>
          </section>
        </section>
        <section anchor="implcons">
          <name>Implementation Considerations</name>
          <t>All floating-point numbers, including zeros and infinities, are signed.
A NaN also carries a sign bit.
Each of the three formats binary16, binary32, and binary64 define a
fixed assignment of bits in the representation towards the sign bit,
an exponent, and a "significand" (which represents the mantissa, with
details sometimes depending on the specific exponent value).</t>
          <table anchor="tab-bits">
            <name>Bit Allocation in Floating Point Formats</name>
            <thead>
              <tr>
                <th align="left">Format</th>
                <th align="left">Sign bit</th>
                <th align="left">Exponent</th>
                <th align="left">Significand</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">binary16</td>
                <td align="left">1</td>
                <td align="left">5</td>
                <td align="left">10</td>
              </tr>
              <tr>
                <td align="left">binary32</td>
                <td align="left">1</td>
                <td align="left">8</td>
                <td align="left">23</td>
              </tr>
              <tr>
                <td align="left">binary64</td>
                <td align="left">1</td>
                <td align="left">11</td>
                <td align="left">52</td>
              </tr>
            </tbody>
          </table>
          <t>Infinite numbers are represented in each format choice with a sign
bit, the highest available exponent value (all ones) and all-zero
significand.
NaN values are represented with a sign bit, the highest available
exponent value (all ones) and a non-zero significand, which carries a
leading quiet bit with the rest of the bits allocated to the NaN payload.</t>
          <t>To qualify as a generic encoder or decoder, a CBOR library needs to
implement as much of <xref target="IEEE754"/> support as reasonably possible on the
platform it addresses.
What is reasonably possible depends on:</t>
          <ul spacing="normal">
            <li>
              <t>platform support for <xref target="IEEE754"/> numbers.  If there is no such
support, the generic decoder may need to resort to offering the
interchanged value to the application, suitably tagged.</t>
            </li>
            <li>
              <t>If there is partial support, it may be harder to find a good
solution.  This is specifically a problem for platform support that
works well in most cases, but exhibits some dark corners.
E.g., the implementation may support a single NaN value
consistently, but not preserve NaN information present in the NaN
values.</t>
            </li>
          </ul>
          <t>Where an implementation needs to convert between different floating
point formats, e.g., because not all formats are fully supported by
the platform, or to implement Preferred Serialization (as needed for
Common Deterministic Encoding <xref target="I-D.ietf-cbor-cde"/>) in an encoder, conversion of NaNs in
these formats is best done by operating on the bit patterns of the
<xref target="IEEE754"/> number in the following way:</t>
          <ul spacing="normal">
            <li>
              <t>Expansion (towards a larger size format):
              </t>
              <ul spacing="normal">
                <li>
                  <t>preserve the sign bit</t>
                </li>
                <li>
                  <t>expand the (all-ones) exponent to the larger (all-ones) exponent</t>
                </li>
                <li>
                  <t>fill up the significand with zero bits on the right</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Contraction (towards a smaller size format):
              </t>
              <ul spacing="normal">
                <li>
                  <t>preserve the sign bit</t>
                </li>
                <li>
                  <t>truncate the (all-ones) exponent to the smaller (all-ones) exponent</t>
                </li>
                <li>
                  <t>truncate the significand from the right; check if the removed
bits were all zero.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>If the contraction is optional, e.g., for Preferred Serialization, do
not perform the contraction if the removed bits in the significand
truncation aren't all zero.
If the contraction is required to fit into limited platform types
(e.g., binary32 only), a failed truncation check indicates the loss of
information and should be signaled to the application.
We say a contraction "preserves the NaN information" if subsequent
expansion to the original size format recreates the exact same NaN value.</t>
          <t><xref target="app-nan"/> gives additional detailed considerations for implementations
that aspire to provide full support for NaNs, preserving NaN information.</t>
        </section>
      </section>
    </section>
    <section anchor="sec-float">
      <name>Other Floating Point Numbers</name>
      <t>RFC 8949 <xref target="STD94"/> also defines tags 4 and 5 for a representation of
decimal and binary floating point numbers that is not constrained by
the types provided by IEEE 754.
These tags are very flexible, but this flexibility comes with a choice
of ways they could be integrated into a generic encoder.
Because of this flexibility, tags 4 and 5 do not define a Preferred
Serialization or a deterministic encoding.</t>
      <t><xref section="3.2" sectionFormat="of" target="I-D.ietf-cbor-time-tag"/> uses representations derived
from the tags 4 and 5 to represent timestamps.
<xref section="6.1" sectionFormat="of" target="I-D.ietf-cbor-time-tag"/> lists various other tags that
can be used for representing numbers for advanced arithmetic,
including rational numbers in fraction form (tag 30).</t>
    </section>
    <section anchor="sec-array">
      <name>Tagged Arrays of Numbers</name>
      <t><xref target="RFC8746"/> defines tags for typed arrays, i.e., arrays of numbers that
all are represented in the same way.
The choices defined in the <xref target="RFC8746"/> are all based on traditional
platform number representations (unsigned integers, signed integers,
IEEE 754 floating point values) and even come in little-endian and
big-endian variants, often removing the need to convert the numbers
from an internal to an interchange form.
As conversion for interchange is not envisioned,
considerations for a preferred serialization are not applicable.
As the recipient may need a conversion for ingestion of the arrays,
some considerations from <xref target="sec-ieee"/> may apply.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The general security considerations for representing data in common
data representation formats apply, e.g., those in Section <xref target="RFC8949" section="10" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
      <t>(TODO)</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>(TODO:</t>
      <t>Add nan'' registration when that is ready)</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94">
          <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/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>
        </referencegroup>
        <reference anchor="RFC8746">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Typed Arrays</title>
            <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR), as defined in RFC 7049, 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.</t>
              <t>This document makes use of this extensibility to define a number of CBOR tags for typed arrays of numeric data, as well as additional tags for multi-dimensional and homogeneous arrays. It is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8746"/>
          <seriesInfo name="DOI" value="10.17487/RFC8746"/>
        </reference>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </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>
        <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
          <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
            <front>
              <title>Key words for use in RFCs to Indicate Requirement Levels</title>
              <author fullname="S. Bradner" initials="S." surname="Bradner"/>
              <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="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
            <front>
              <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
              <author fullname="B. Leiba" initials="B." surname="Leiba"/>
              <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>
        </referencegroup>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-cbor-cde">
          <front>
            <title>CBOR Common Deterministic Encoding (CDE)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="3" month="March" year="2024"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2, providing some flexibility for application specific
   decisions.  To facilitate Deterministic Encoding to be offered as a
   selectable feature of generic encoders, the present document defines
   a CBOR Common Deterministic Encoding (CDE) Profile that can be shared
   by a large set of applications with potentially diverging detailed
   requirements.

   This document also introduces the concept of Application Profiles,
   which are layered on top of the CBOR CDE Profile and can address more
   application specific requirements.  Application Profiles are defined
   in separate documents.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-02"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-det">
          <front>
            <title>CBOR: On Deterministic Encoding</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="3" month="March" year="2024"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2.  The present document provides additional
   information about use cases, deployment considerations, and
   implementation choices for Deterministic Encoding.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-02"/>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>dCBOR: A Deterministic CBOR Application Profile</title>
            <author fullname="Wolf McNally" initials="W." surname="McNally">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Christopher Allen" initials="C." surname="Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="10" month="June" year="2024"/>
            <abstract>
              <t>   The purpose of determinism is to ensure that semantically equivalent
   data items are encoded into identical byte streams.  CBOR (RFC 8949)
   defines "Deterministically Encoded CBOR" in its Section 4.2, but
   leaves some important choices up to the application developer.  The
   CBOR Common Deterministic Encoding (CDE) Internet Draft builds on
   this by specifying a baseline for application profiles that wish to
   implement deterministic encoding with CBOR.  The present document
   provides an application profile "dCBOR" that can be used to help
   achieve interoperable deterministic encoding based on CDE for a
   variety of applications wishing an even narrower and clearly defined
   set of choices.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-10"/>
        </reference>
        <reference anchor="Cplusplus20" target="https://isocpp.org/files/papers/N4860.pdf">
          <front>
            <title>Programming languages - C++</title>
            <author>
              <organization>International Organization for Standardization</organization>
            </author>
            <date year="2020" month="March"/>
          </front>
          <seriesInfo name="ISO/IEC" value="ISO/IEC JTC1 SC22 WG21 N 4860"/>
          <refcontent>Sixth Edition</refcontent>
        </reference>
        <reference anchor="I-D.ietf-cbor-time-tag">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Time, Duration, and Period</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Ben Gamari" initials="B." surname="Gamari">
              <organization>Well-Typed</organization>
            </author>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer Institute for Secure Information Technology</organization>
            </author>
            <date day="30" month="October" year="2023"/>
            <abstract>
              <t>   The Concise Binary Object Representation (CBOR, RFC 8949) 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.

   In CBOR, one point of extensibility is the definition of CBOR tags.
   RFC 8949 defines two tags for time: CBOR tag 0 (RFC3339 time as a
   string) and tag 1 (POSIX time as int or float).  Since then,
   additional requirements have become known.  The present document
   defines a CBOR tag for time that allows a more elaborate
   representation of time, as well as related CBOR tags for duration and
   time period.  This document is intended as the reference document for
   the IANA registration of the CBOR tags defined.


   // (This cref will be removed by the RFC editor:) The present
   // revision (–12) addresses the IESG reviews.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-time-tag-12"/>
        </reference>
      </references>
    </references>
    <?line 448?>

<section anchor="impcheck">
      <name>Implementers' Checklists for Floating Point Values</name>
      <t>This check list employs <xref target="BCP14"/> keywords to indicate interoperability
requirements on implementations.</t>
      <t>The following considerations apply to encoding (emitting) floating
point values in a generic encoder:</t>
      <ul spacing="normal">
        <li>
          <t>The length of the argument is encoded in the lower 5 bits of the
first byte ("ai"), which indicates half precision (binary16, ai = 0x19),
single precision (binary32, ai = 0x1a) and double precision
(binary64, ai = 0x1b).  </t>
          <t>
For preferred serialization: if multiple of these encodings
preserve the precision of the value to be encoded, only the
shortest form of these <bcp14>MUST</bcp14> be emitted.
That implies that encoders <bcp14>MUST</bcp14> support half-precision and (if
there is support for more than half precision on the platform)
single-precision floating point.
Positive and negative infinity and zero <bcp14>MUST</bcp14> be represented in
half-precision floating point.</t>
        </li>
        <li>
          <t>NaNs <bcp14>MUST</bcp14> be supported, for all values of NaN information allowed
in <xref target="IEEE754"/>.  </t>
          <t>
As with all floating point numbers, NaNs with payloads <bcp14>MUST</bcp14> be
contracted to the shortest of double, single or half precision that
preserves the NaN information.  </t>
          <t>
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.
(This will always reduce a double or single quiet NaN with an
otherwise zero NaN payload, which is typically what is returned
from an operation such as 0.0/0.0, to a half-precision quiet NaN
encoded as 0xf9 7e00.)</t>
        </li>
      </ul>
      <t>The following considerations apply to decoding (ingesting) floating
point values in a generic decoder that supports IEEE 754 floating-point numbers:</t>
      <ul spacing="normal">
        <li>
          <t>Half-precision values <bcp14>MUST</bcp14> be accepted.</t>
        </li>
        <li>
          <t>Double- and single-precision values <bcp14>SHOULD</bcp14> 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
<bcp14>MUST</bcp14> be accepted.</t>
        </li>
        <li>
          <t>NaNs, <bcp14>MUST</bcp14> be accepted, preserving the NaN information for use of
the application.</t>
        </li>
      </ul>
      <section anchor="app-nan">
        <name>NaN Payloads</name>
        <t>An IEEE-754 data item has up to 52 bits in the significand.
For a NaN, the first of these bits is used to indicate whether the NaN
is signalling (0) or quiet (1).
The up to 51 bits in the rest of the significand are called the "NAN
payload".</t>
        <t>The payload’s original purpose is diagnostic information to explain
why a NaN was generated by a local computation.
There is no standard for the contents of a NaN payload.</t>
        <t>CBOR allows NaNs with non-zero payloads to be encoded.
(Due to the way infinite numbers are encoded in <xref target="IEEE754"/>,
zero-payload NaN always must be quiet NaNs.)</t>
        <t>As a result, if a protocol design does not use NaNs with non-zero
payloads and is using preferred serialization then NaN must be encoded
as a half-precision with the quiet bit set and the payload set as 0,
specifically 0xF97E00.
If a design does not use NaNs with non-zero payloads and preferred
serialization is not used, then the single and double precision quiet
NaNs, 0xFA7FC00000 and 0xFB7FF0000000000000, may also be used.</t>
        <t>NaN payloads have been in the IEEE-754 standard since 2008, but
programming environments often still do not provide facilities (e.g.,
APIs) to make use of them.
For example, in C there is the isnan() API to check if a value is a
NaN, but there are no APIs to construct or access the NaN payload.
The typical way to work with a NaN payload is to reinterpret the
floating-point value as an unsigned integer and then use shifts and
masks to unpack the IEEE-754 representation.</t>
        <section anchor="nan-implementation-details">
          <name>NaN Implementation Details</name>
          <t>This section is primarily for CBOR library implementors.</t>
          <t>CBOR attempts to limit the MUSTs about CBOR implementations in order
to allow its use in a large variety of constrained use cases.
For example, support for integers is not required because a protocol
might need only strings.
Similarly, there is no <bcp14>MUST</bcp14> that requires support of NaN and NaNs with
non-zero payloads, but the recommendation here is that any generic
CBOR library that supports floating-point support NaNs, preferably
also with non-zero NaN payloads.</t>
          <t>In most environments, there is little extra work to do to support NaN
without payloads if floating-point is supported.
NaNs will usually flow through as any other floating-point value.</t>
          <t>Generic CBOR libraries are expected to support preferred serialization
of floating-point including NaNs.
For NaNs with zero payloads, this requires reducing to a half-precision
NaN without a payload.
This requires a few explicit extra lines of code.
See the sample half-precision implementation in Appendix D of RFC 8949.</t>
          <t>The implementation of preferred serialization of NaN payloads needs a
few more additional lines.
As with preferred serialization, NaN payloads must be reduced but only
if they can be reduced without the loss of any non-zero payload bits.
Programming platform provided floating-point hardware and software may
or may not do this correctly for double to single conversion.
The sample half-precision implementation in Appendix D of RFC 8949
only supports NaNs without payloads.</t>
          <t>A double precision NaN payload contains 51 bits, a single 22 bits and
a half 9 bits, in each case all but the first bit of the significand.
A double precision NaN can be reduced to a single precision NaN only if the right-most 29 payload bits are zero.
A single precision NaN can be reduced to a half precision NaN only if the right-most 13 payload bits are zero.
A double NaN can be reduced to a half precision NaN only if the right-most 42 payload bits are zero.
Note that the exponent is always all-ones for NaN, so this is simpler
than the equivalent contraction of regular, non-NAN, floating-point values.</t>
          <t>To implement the above, most CBOR libraries will have to reinterpret
the floating point value as an unsigned integer and use shifts and
masks, based in the internal representation defined in <xref target="IEEE754"/>.</t>
          <t>Testing on some CPUs has shown them to do this correctly for conversion between single and double.
However, it may not be very useful to rely on platform libraries for the following reasons.
First, they may provide no support at all for half-precision and half-precision is required for preferred serialization.
Second, NaN payloads are a relatively recent and very specialist
feature that is not usually used in interchange.</t>
          <t>If platform implementation is relied upon, NaN payload reduction should be tested on each platform.
Open source libraries intended to run on multiple platforms may be
better off not relying on the platform.</t>
        </section>
        <section anchor="nan-tests-examples">
          <name>NaN Tests Examples</name>
          <t>The IEEE-754 numbers are given as a 64-bit (binary64) or 32-bit
(binary32) unsigned integer in hex to show the bits that make up the
floating-point value.
All of the following are NaNs.</t>
          <table anchor="nan-examples">
            <name>Examples for Preferred Serialization of NaN values</name>
            <thead>
              <tr>
                <th align="left">IEEE-754 Number</th>
                <th align="left">CBOR Preferred Serialization</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x7ff8000000000000</td>
                <td align="left">0xf97e00</td>
                <td align="left">qNaN contracted from double to half</td>
              </tr>
              <tr>
                <td align="left">0x7ff8000000000001</td>
                <td align="left">0xfb7ff8000000000001</td>
                <td align="left">Can't be contracted because of bit set in right-side part of payload</td>
              </tr>
              <tr>
                <td align="left">0x7ffffc0000000000</td>
                <td align="left">0xf97fff</td>
                <td align="left">10-bit payload that can be contracted to half</td>
              </tr>
              <tr>
                <td align="left">0x7ff80000000003ff</td>
                <td align="left">0xfb7ff80000000003ff</td>
                <td align="left">right-justified payload can't be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fffffffe0000000</td>
                <td align="left">0xfa7fffffff</td>
                <td align="left">23-bit payload that reduces to single</td>
              </tr>
              <tr>
                <td align="left">0x7ffffffff0000000</td>
                <td align="left">0xfb7ffffffff0000000</td>
                <td align="left">24-bit payload that can't be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fffffffffffffff</td>
                <td align="left">0xfb7fffffffffffffff</td>
                <td align="left">All payload bits set, can't be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fc00000</td>
                <td align="left">0xf97e00</td>
                <td align="left">qNaN contracted from single to half</td>
              </tr>
              <tr>
                <td align="left">0x7fffe000</td>
                <td align="left">0xf97fff</td>
                <td align="left">single 10-bit payload that can be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fbff000</td>
                <td align="left">0xfa7fbff000</td>
                <td align="left">single payload that can't be contracted to 10 bits</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="L." surname="Lundblade" fullname="Laurence Lundblade">
        <organization>Security Theory LLC</organization>
        <address>
          <email>lgl@securitytheory.com</email>
        </address>
      </contact>
      <t>Laurence wrote much of the initial text about NaN processing.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA6V83XIbybHmfT1FLSdiB5wBIACkKIkz/qFIyqZDQ+qMqHX4
OHzMAroAtNXohrsbpGiOHHt5rs/d3s3FeZLZN/GTbH6ZVdXVDVAjrxVhD9g/
VVmZWZlf/lQPBgN1e6wPlKrTOrPH+irXl5vV1JaVTnN9+vLqe2Wm09LSQ/jD
31RJMcvNil5ISjOvB9OiXJk8H8zoxyCXZwaZqW1Vqxn9Z1GU98c04rxQVV1a
szrWF+fXr5RK6OaxmhV5ZfNqUx3rutxYZeiRY713sl5nKb2e0m1t8kR/b002
uE5Xdk/dFeX7RVls1vTcaZHP0srql2luynt9Nf2LndX08Lq0NGzNA+jvTJrX
//P8Q72n3tt7ej05VurW5huaX+t/fiibm3xmmSwalKgHlXs01MqkGY0EVvw6
tfV8WJQLXF+k9XIzPdYzMy2exIxSymzqZVEeq4HWWth6asqKBtUvhbH0utY0
zrF+l6e39E5a/9//rvXL0q7ooet/v+AHwFpbH+s3RVXPzWypDw5Gh4cjvjdL
a5KAvCAXioTmORtMnh88feGubPIacvqNxaT3fHG9LHJ67uvDF4PDyXgwGT8f
HB28mIz5ppW1YkW/rv+WYqWQZV2m000tC5LlvDab0oJdrzd5Ms1MYpVbz1s7
25REm75eWlIS/fr1qQoDZ4vs15V7oOb7w1mxUiDVTUJMj0a/K4va6tWGll7M
Nb1BKpfWqcl0bT/Umsjc1PrSXOp1WcxsVaX5YqhUDh7XxFYowtvrsxeHtCSS
j/oCa/zFsf7+1enzF4dgEn49Ozw61qYszX1FVy7Oz8+fPT08Zn7UplxAAMu6
XlfHT56k1toP66wo7RA/wZ8ntHM2JIP6yfNnR0eTibDe7T4Mpt/WpFOmTPS8
KPWrrCDS8sXgTUE6p0+IE8uVrdMZv+b1Br8Hwk8MwX/zztJzk1VWlMOWqa2w
BeV57WdLjjUtYDAZjV+4G2dXF8d6PBqOx6MXT/AUMWWI+8OGZnDiaDwiTiVJ
phTGjbh4MTgbQvfFIMygaTOWOW60jEUCftH/uXsrMitZdo/LpIQkvYrWyk/S
U/xCUaYLevh0nW0q/G8yeoT3VTFbr5nl8zSz1ZO1WdPGeXJ5+PxoNFwn85jx
b8piUZoVTbjQmckXG7OwFbH09OuvH2U0mYAyZ4NA+nVVLkye/k3sAwTnpeiu
RSKZjCajwejgMaG8vSKWnx77H/p316dj/fZ0MtG//81krC816OeHSzvHPiBd
8oS9TT/US32epDylGgwGpPNkFcysVuqP/0G/x4M/QcV/+vHFoe6RDH/6EZq9
39d8dzL4U/OcDErbUn+WUezBP9BApiJxztPcJrT53GgTP1pKdhxsMER8623R
Hn23LGiehFiyyPWiIOWlQWbZJrHYzWKQCtq30zSDzaBNTvsaNi2719WKNIfN
mq7Sv9k+6X5ahusr2u4kVOE634bltmK53XB3tLlgIWA4cmtlB7K1JQpzcmJk
SkAt2QwMc7IqSF3w8Ps0TypQw0url7SSTy4Tg1e6LvRUCDLTzOLPGZmV+752
fkEvzS05GBgrUkwaQ5dFRoST2dPEmYLvC1vzpS3xAFnHdWY/YDFMhUxkaigJ
z09DYby6mBWZ4zM8EBNB/EjxOqwTpqf1MADAzSydlga6yo8542pi/8zzbSoW
1Mpx6HpJAvcGjxzgLb+vC+LpbWrv+IdbrWMN3b8l088MSWXXMO7ArFWxIrkU
Nd/kq7VZVMTiBVkJWn8iMk1rXvBqXYPFojNlcZsmVgcrRawQZ1Cs10VZb+Al
3NrWBTOL9vQ6JS+aZZVbrrOjbXKH0PAkrWaZIVhS/qnz57GwgNW+NDRIKYDp
PjgmglYp9KtP09mZTcQqFWTK8DDL65YYX2wqFm4BPaj6xAusc2kw8DJd4NnM
3tqMaHW2ISFPSwiFFSHXm6xOiV7sE0idbg/FPqxSst9Wka8jg1YWyWYmtqMx
Fw8Pzv/9mu3wx4+xsbioNZa7qSpiH8uko/HEu7wBlPNiUwIg5fD7rDcEwr6i
Kb79lvz8gFzcx4+69/AQ/tjvx7fJh0b3+a/WA3N4y+YJ92frEXbczSPuz33i
xjVETBZZ6CJjQFZjYWl7wCFpkyS0LAiB7EVCF+WpCljDyCrOczI+8CB2Pk9n
qQXze05diA3Te4LDvCNtQnZS7BiN3GARAJ/o1dM377ChYEejh/Zppjdk+m1J
QiQ2lqRFzsn0yVKvyCjps9h7NnSRl4MrpJHPzvs02cMDXDMEWlkrJoUukesl
/sD0rQi46KmZMdCmreEkTTOBiHfErel9ywjQVXaLBXla44xqm2H9aH/tkX98
T/dLmKA9UsEv4GluxVTJZjyDJ0llbAhIE3TXwO6V3vvu3dvrvb78V19e8e/v
z//t3cX352f4/fa3J69fhx/KPfH2t1fvXp81v5o3T6++++788kxepqu6dUnt
fXfyhz2xMHtXb64vri5PXu9BNHXLyFHoIoZdI0YoaS/UJCZDEZOtZgRZRZwv
T9/89OP4kNj9P+jn+JAYfre0uQxf5KQV8icZgXtFHLamxGvs4AzZJZIVe9pq
WdzlGsafFPirP4IVZHO+nc7W48NfugtYYeuiZ1LrIjNp+8rWy8K1HZd2TBPY
17reYW2b3pM/tP72jI4ufvurjJyhHoyf/+qXZKauSdFFV5JGV8RuQr2dwWJN
TzL8xKMPDw62E9+hv/dDZwDtgvaqD4AfvvBmSCk2bc6NVB0bxw4idS9Hxm6T
s3tNeEqCD4yO2XGIvXjn77t3K71ZQ3cm31ab9S+PDr99gv/+4z//a9wnm/kX
2pD1/drqEb166UcLryZQBHqZHm+/33p3vHNa4B5yrIyLyNOv0tpvVnKweqLh
Ldl8IcKEndpFwKcHOdgehPdzBldNxN0VwhjeP8Ucoe+MtJ2o3JsStZtVtccm
ifYaBZZkbzJVWlPJ+EvhKo2zNzVVOtsLVA3bAPYMkKyxKeq1g/qwiGev9xs1
Yc+KccG1St9saMCbvrrJ+b8s0Bv5CaLwYElDWdaEW5NtLBzFLTAJTGQsvL6K
xeFQaMrOXmDGqk/qVa3hhsif33+jb4gBMj//FBIUk0B/4q82EYGGmAQWJIvi
IJ7zGxnHa+pNWBm4J+MaPVsW6YyHdYSC2bpHMFSxjbMVIlSyWST9G6/nN+RS
T4SH6+CtrPdEPHAeNg3NUABATG19Z0n0DYvU6MmYieIFPDlAJFYAwUE7CCqz
a6TwBgQGRun2ohTbZCKkMiuRKNtOXA0cbK1bwID+LhJb2NczgFAgGSh/ks7n
ArzDyqD+bJuJNwn8ouP/0qZlAH3YBscqXa1sQhEFqd/e+OvR3n4zSm80HE4O
CCUQ3hvwpsEjY3qE7zx9SpiG9kxza0Kuie4cPX16QPcYZ/FNL+zFsua/h7yy
R/AD+Zc7c18BdIjkyL2UyOF5wB/LJRBbqQayO7luOiZGZuWkGc+TunAB2mTx
F+yGXZkccMUzlSTq9QGxX7yJmrllfTIOA5ifH6w1EL2tWLVAIr27ssbHMp/D
pJZZ5mhGLCa8t0d4NtDY8DMI2ocWuifPbJj8zBrcVX8jKOVwo9/iNP4i2kkV
bbNIT5u9csD6bXKTFQsKHkilL5Eb22L7npMUXt/zOd9j3h85xc5kh1JCpD7q
oXiKkE1wf5Bw5a1C8HBEDEVpfQQoadV6mEdVXe3ACxzI5B2n0lraaEurnI2l
IJ4MQHbftoBr8iywU0osuMPpYsmPDv9MW54GvtkcHdJufyvD+ld055XWGym9
Qa4p110+5ArzZ8UdUbQ02dzvmUB1tTYuX8yXCdS1HlRh9fzgUL1x5FSgR+yd
ZATYzAaimDks1lmxySD899gKWTOeN10NapHougUMvpFYB1vGIodSSgSkWFfm
CASQt5fcyPYi27QLKnb2ljYLBrmXgEoGcS5dyE4KqAsZVBm82iEMiGhFJqaE
yfd08hYAneKlwgsMRG4248nzmyc3Kf4jAlVMgLiancag42n+sqGNmqXv2Xcg
6iDuqs7rILht+mntCHc6A9P2+/0SoReFkalLGW4HypFeQ5JTZMIIA1A0lTDK
UcXahUYZsTG594CUPUxAu7Ay7nWfV6poimpOQKSoahUHbIJ7kQcmMBySzVqS
zR0cjHDbL6OLdmFrSpsZwSyakNk95g1LJI/kx15jbBVe5MyIbawrsaH0SVVi
IG61ZjGS3kdoqpAYwcbacEKSsN53sFmPvl7av25SEIpgFqRsyEVkopxuR4tO
iaHqkOyGEWwAQkoImeYTeOSU2Y2zMqQC7AQkx4ZRiHIzW1LsoraTgrvnIvGc
zAGPaUuaxKFLmydFOQiG2eWh+iLFKmSdbSvK6SsHPTJknvT4xfOnfTJBiRHT
pSej0XNvmvDX+IXuXZyf/vTj06cvxFtjr6RlWTB0x7g//Ugj7zu36efFs3ek
kZwwIW2V0Zd0507cEbJ48xp/ELaBa8ZwnoPe4k4lz3xL8J1Wnq5Ihrv5w55V
NSisw1jekEN1tQkAJkORwAPaAFv6krlKSDnYkVDYhKygiwCWpbXKZyeFtPFR
3/06mIh3l7+ODsnrDe2wH1syuaU6K/ADQho0mh/n6JCehzhnRZYVpK8ssvc5
ojvClGxze+MjfohwHhJCSOgcTPwVjoSLDTZ+zw22DwQ+4ywjeVQyAcFWOqV1
6+0yGfnGjWele8TUisAJDeFmDiP3yQ3P7LoOQAW2hpM/dWm4GkBQtmKMphx9
0bt3bFV4deEqdAmD0Po5C4aBEfwhXoPYOfaYLcXhI2WCpa/MPfafV7KBo9tK
VmXISSYf50O/2iZPEeBACObjC+Af855u93daPAPTU9mgXd7yqK7l4XQErZHU
e7ci83BJae5IQhe52JV1VJOy+W1aFvlKkr9L8r8EfHYTNSP5kJ9UlV2bkvc3
z/7IvL0gKp9YFzEiOp7a1NU3UHNLYVJ/R3vm7axMSc6+TNZ3C2MRLA3LOcBF
cn9Irb6C6LzFiv0Pg0QnM85Le48VdrJAGUdtbGI7uDL4TiN2hPSRTKVO5+K9
iTOKteiOjfcnpBB0LS/yQcgjKCRGQ/2RnKzUuOAmTs/O4zVBbpxlZWItKg7i
HVJGKoriaVvWSIG3laeZSvaolD3iCgtFN3NTCgakSAp+iji1oCGmUrsKtShU
AWjfoTzl1ACExaDFaw72TIcZd0WZJcJr9ZgOEpc2vEHm5rYouRyBzP68mG1c
5hyQboqNCbxRFuT5XBDD2xYDZk67VltJVGKBSwbHqXYvE87eNKiWk2t0OTRT
OKeHbDVWtUmrJfOfzHhTqOusmWt1NOqKE3NuBv/MIFaSY32iWxSInNMOvFaa
87XdMcTqE1JpBWMEKOebUqpDqStUceUK8V8fesItClnfLRa/v3Es40XOfFTt
xQLucyXIJ2hATWQwg7WO4kGxaHN7F7kHaJXSks6zW5rinQIPgl2Maf3FQLXS
DZz5CiW4T3L3Krd+RyAp6JJp//jP/7rwL8L2a92j6DoF3NzX/s6QLl954+mX
0G9mDCkcMSBmhooKreo2NZGklHar4yKGc36CS8bD0ZPRcNTM7ce+3wfYRKZW
ngB9UTDrnvlGTBF5hlnN1V7yr4RgK0b0FdtNDjJINkj/gVuX5pJicf3nbXXd
rP4cNA9sN14de/QO4QA2Y6xEjSmNHLqPvdIk/7LmfAMo4kE4uKI3NhnBdhoa
VSmYUs7XyVLA6RMMt2Kr31SNQbvBX+KtmW8tHEHUjoRHGOPaZW4BhHyN1iBi
BDG+8B+FTHH9lg2eoUFovf0gIoI7jLsAfOCZpIwaRAkus26hCQg+QXaIt6Vz
AoQ6pOVoZT2MZWCpWMIcEpa23pRgR8Fj00gQN0E1Wzv8xYXqEj1MDPyBwZo9
wjX+aFFMQrOsXqAHjRSpWeQFinj7XFG/CN6v2pRrUh0xoWg3mM2KkoOaumgB
f16p20WSueL2KWielSlCCjP2l+JkfAyPMSIisV6BuRiEhJYzXtonu9a79rkl
zsYZIqc2GZFmSxcgsgAMtCopiCY0BWB8bgxxfSO0eWdkohK7thKoidDSMoi2
EvOHJjIoIEFGooHxB5LItI5WIEQXabnsaas6OT4W1/hnoYq7DE6//noyIr5F
XUUfPw73OWnGVbcOYoYU0OsQQuekaBQYaQ426uxtyNQOF8O+Oi+BmITeUEj6
lC2sWikglynxk7DfdJHWLYIll3LhvQMBugeVWDloxSO+k3k/tfeFS0x1AvVo
60BU3DdxS6b2nfM0IZeIvo4ti3mTVrnJe/s3nFn0UDH1ZXBlqsgKigXinSkp
1vvUAomQTvyVJmO7Q7jgC9SxpYHlTBqF2kDBFetaQVwrVpiziAIUaGToQUCF
cBnGB2z4ecjBJheJ2FeS/Y7BoE/gNDDB5242vHnD5MH9MNv7DV9p3XU7cdSq
qPusRnKsXpJB8ibad7M4O+dVpQmHSB6Ye4C54/hc+dAJoPL0zTvS36u3//jf
/8c1xzyCB4ehQBp3FomrbXooSpBQ5DtppJ9oHWVQIoFHoFU6noKTcdoIW1pu
GNUUOu4kUAIfyFpEOAb5i5Q9oOXNEIFDzs3w2mjPlrf4EzY9NsrErMaMkhL+
1gdgLvXol80yvjM5dx5pZHvoMb0oCslZx30RUi0wLBju8LHSzxYBF96NjBUw
bLMYMdku4wyj6BAXWm0+ucdl9SQFe2uAsntvCRI/PICz0CmKaqakrHe8Kldd
bfx4U0mpyDC+6UrapCtf2GM7BPNWhxJIk531xJL4FDjFnt6LFlgFtl9iDIkW
HllOn6sGPhsBBOS1q+OsgjaxIZxvMra/LGraBsmGM1CRfRAb84X+3durS/TT
rGkUJ7KH400udNjkY1xQ4WeDwcldQWSLdsLDoE4MhVcaZ9vZk0ZQBP3t0Lsp
NnVogcNEqtt9IO0F3GdAUVg9KOaDKTfCSQGS5hIb62NrBkxGRZvV26gV6oTB
vkiE0YPlPjt73Xeh8w1bqhuHO1VMM0B1s1H2KZb6+9//Lg3C/NIAmI2sJlnf
X4jB0080/sRzSp1EJs5lBD1UTxIXlIsxD+ajx76VaEKbM1dx1Q1OENz0Oe1d
GwmMnXMUv8Da5vYyATZCPN6EkujfpigV3oCom9a4WsYVYCTJL6m+dqQhifpI
j7EtmeNNDHMvMHE7hLl3peLKhi4CYkCFNk+pAnqMxgo3i5WziQNa7oGWdLLV
pcnKUhdhG3iuxvZOBNkLWFoxwBVYvTb3JLxkn22w38RuyY53Dp7ncbUBqRMJ
ErZLH+IdGxJ4e7OoyEzwULqX2Xk9IByArGofB0XymSAVZBg5m9DUS/dbrSZh
PsHLXMEhEEkKGuulyQex3BoV5REliwXGi2WOxvdqOjWVHR+hP5x/Hh0OXD2B
V5MybOzWT9FBFxoh+rETQtQQL1nnFPVx3rxUEpABM/ekILzfjc2lA8SxLgL5
H6SF1CGpi5ZT7WZcHr4IrkGRHmXZI0C1rxu4BBGISWq2qcQJkg4fqhMH8Srp
d2YUEID9UJ2b5vSGJG0+N/fu4gcybfP0A8N+jOr3IEdhzhB09K8uCPAkVUja
i8KTWDy3ZB4jxXIkMenPPd0TNBsGq1yPBKlZVZm+JE8SW5NyVhwT1in8bzes
aTKjfjpnP0lGP+hX0jGu9Q/6rSONfp77J+WqI0n/QC94LtEt92/c/Hza/KTr
o+iFg8nOF57HL0wOoheI3zteGI/jF57SoOQ19Re1mQ4kDMZ5i1/svaRVkD4V
s2BvOrVHWXa1p0nzLrYwQNmtvWsLrXHd9a6843QfIlNstsBr7pUmwNC0rLSZ
rnuIDVCq2BeZZ9kAKq0iyQ9VHFN3aIlm1Y/Pqn5mVgZybM2ieX34FHaNcn0i
OtjmJg1cRm07zHkj7BbL71MgzpKjqFloDrLm92JXOlV2GDDXGNBHzhueVM4E
3IfTDKrBcTSEP4UV91qGKlLl8KXhBmgPEmU/qIAV0ckvbddA3b8PedbtN2VP
IbvDCdwttAnoEBPiI2ytL+btLiSiWmn/nkiv0xghmU7nQok4zoAWoZqp5aBK
hCgTJ2TH98gjIm+V1rwUMePI+cUUIW2BhrFAT1MuQdDGHTlIIkBlEGaA9CLj
Y3FDHc4eeAMjjexAnsSzFTNli1MuNwP4SWGTzTJuFOFaHrm0SmIx+2GZslJx
pisOvpDVO2dMxpii7V5AeVABX0EMe0mO9VU4y4FcjswESBNgShfZ+7xmGnJ6
NEYI0n4vWe28S0U4fDNDs3lZh7pI4yXbwXhTYxe0SYGUQfInd7mhcHIFhSWO
L5owe8rNL4HNDARaEc9jXWY945MkXDX6dGO/b+TfZ+SW+03bd0usHMjiMFDC
xqpxqylCwwrZpZyDfpfFafwT7Mqa+3RzfxZGbW8mL4U5Ctd3eP3O3Mu5iA9r
w8djCaw4T2ukEl9Kt7BQss9HxL5qo1JvR+WWxUiSpoLFHIjFDLbUbTA39I4n
ZJQ56lNotXbje+/JtlMgJHTbrb5ETESrOMWRUyOVlmgdfLrsn16IA6/255bi
R390La2B4sVw0TfQ/w05RTt779K7yE0Xt+6skSz2ThooM14/bR4xQnLO1oTy
kvQfoRAlOwEW5NGzKEmhePfaUvq4usO1SGnBs2gdysN8NF7S3vyyjqjcTaSP
5sQ01pIg8hWsdo+fcvFjgEDIziKJz5UADNHM7hjomnor1whXYUe0ckVcAAgd
WFI/aJxuZPzJoyG9fi8hW1jBnlebKnjpaPg98I0Lx3/dQAls2FtuglCqjxQS
+XH03bkhuV+ySeyzwSSRPzwQcYiCaEu7o3pNQC4wltYx2y7KdjJzSvIZ1TqV
ozA+ZQ3T2HLIksZpp93itXIZWF9xLuWTrWlyzgsr6JxUkyjDl+r5tOAhC+ip
y9xtBaLKNxw1gcVjzQJx9S3uc3EmX5pI4w49n+sduqNmTA+cBplozGI/SLfw
lI+gol2AL/ljVIgdHLoUhItEJ+fJpYPNqxzHkqXr7OKUegfLDdVL58HYmLcn
6rfZ5JozfWTV7HbVdlfMzdah7dAXyarljvvpg+EEs/6qfUAcgdGA5iWJcVt1
N8NFRKewV8GotWhstYtwjFWb1Zp7Nvy0R8Pxp6fNiOYqnLSUyh5PwnjIxfeh
NaSVTwhNPuBBcouvQhAcCwf141pCaE2Mj0T6jS+nKrh3e7TPjZnX0ut9wt8a
YAfeUns5uwjuys8qakth2ueuAzVxnyvwzWkmDBjrsoJh3RFaxZ280sjvs3PN
OW9+KKbDOHeCPEjCrrQ0oeIZjLBDDl1x97Y6vfu6e0FtVU7ixIeLozhN4k9s
SCFlgNjbsJmmqHDh/4TkDTdXyeEjdku+/cmDfQ8Y+ZprN2GVdBmcEqLFjmv1
WrBg+TBMhMZCJ4x7xtkR1FRw3yZ9tcPSmugsTdU+lFA6PCr+hexIOH6Dfro1
Em9N4GK2SVngFI/PxVmvMIoBfpcSOVwXncjFwM05uvBJj25d7toHU3BP/qEd
y2xtL6nK5a7bQD1+qr4SEjw2kTQfvdhYgfEIFr7jI4jk3vXV2dU+t0KfXJ5s
kc23jzk/rck9fvmlO3LuCnBcW2qagExyvy9Hq3FylgeNDtV/qU+BI8TcxB/4
cI7tf0lWgTNvjDg+KumwFfiB97Sl8Qravw8P/uyo+6BNJW0TglC2K04OGElx
pejGRZU79dTg945kmLuYoTmlZAlU1dwc0YmYXHKE88gd73OsBLlirszmi3rZ
6NxCztDiTIlrxHamRU4cPHXAfO5ibPo3T8uq1u4YlEn39kONOQC1Tldpr0kj
mlT/Qo8+jF/s92W0blOrf5gzje5hsx/32IZHZYBe0wfsn5/uu48haKn67Ny/
x4B1KxzSR20iHApqjlhp+YxBFFA0RDr2hSRD08fel3aDwK1w/oitb5iGTwnj
LYgTSQgtH28wUnVNfXN7OHHBL3goB/4OGmq4spHKVwiaREaM+/hYOX+VoCMa
F3F597AfCyWaoW3wHbVvfEtW67Ctb1jiqxza+bV2zu7wGJ2VdOcRveUg2o8S
1ajZPpPHc6ov4Xb7ixPYWD7qYsMUYmivIice4mWPt7wzAfyUy94FcmQMH0w0
QUd8jE/0NnSOF2VXCC4BFKnbzkDEU3zNHsZ9NoJTVhLvCeRtuVGORDmVdLm9
kd1afJXx0p06iA/wOVsQfVGhiRm9qjQBcM8n4vdbja8hPnKhkcsnyPu8EMF4
aNP82RXy7uq1+STbkANJbGrXDeTGDxxg0n3sC+ctEa0YETb43EXrGmGELiBs
sTpcG2P5SeYXsvEFNx6CAewdjjyz0kep3qgHpzlWdhe8F1rbvIp6aLPd1uNa
+PrSsdPZNoEkGSU6UjP6MH/x04/P7GiE1qrPczacdGVn4zDKZ3obn6yNDzhU
2+027UKW902/ba/Ije83PVqq1t5OfqXPWCYDCfy7tsq96j6REL38DZou/dZA
KLZxuw5pFqgVztxV0Np5k3rv1G99j0Bo2YcwgxEIAWm7UYdpvvCGYJtURu6O
yP5jC5JJHmGIxPXdm61If4dB4XVKUBp8Rztdwk3heOuNt3sPX/iUBaGzqKEp
dHJxQ6B8VeHp5LEck2vckio9pzAZVAT3KK9VvqW2QVi+vdQnn9PK5XsyOcPN
PaOyHXrjfYmdHDHjTj2yKdbENozPc8hnEHBr7/LkUrl9vOfgmvuTO7SCbVtv
yjWj37iFtMVswLgP5GjJ9d0t7121/46YJfjcV6Y1akZZ3ME7VNdxuST+Vp3P
xQm+nLtBmxKTdLFgw1eREwuVruDNWhBmqHpnTe0E7Y3bLUGljfFi69gbRh64
kePWwhU6eaeR/URTEyImE1qfYby7HW3Ss4pAC5q6vQgVFsEV8Mp1+T0WtdUI
HUCVJ8ctQ8l3ndpWKJT2mmofjo/4hLhfJF+r8KGJVtln9OHVi2fnZHmRNTWf
uRzdWk5YhWqvIg1DyDFVv8HYQe3CyrICJXaCCDt59up0hH/8NF14+ezVq1H8
ry8hJrJ5Lg+DA+2NdrlvpXHrr9tTwRgEHa24twdHHTnH9vjhFkkB0J4hD+wS
YCGJaWYIppreI3Xy5qLah36ucPA6ZNXwDTSYFdcPz1+qOG3wMFfHpDdW0wic
XfAZeuMwBJpFFRslyQj6Qxq07zCpy0iQmSdowgk41+rbre1eSzYSiuB769lz
uGRi9CxThmxa+HYRY5eOsxTq+Cz/1pn85hApOFEt03nNyqNWpnrPg2/yNcXF
bRG143nXmwK6Ov0pZ9JM4UJi96kuhmRlujJlKm6zXZ0OUW7BZ6vECDXfh5PK
AJMDj1W578LxY92W0xR5TnLDCrAHdox7dDaSZnAlrbiXM3bCeIorqB21iAOj
cIbN7ahQyfAVx8YeKWnVYyTAcEE6karWSfm4sM3umNGDG7WK+0bZMvpGUe5b
2TIBQQuRUCpWxJZEhNKoNMPpew/BVEsMbRzW0ShPSagIzJG1ICzDO75tkuJd
j0KVq063T0jWne5pfCXSiNYDUxbcHdhMqvyXH4M5SeddGpsg1koHiIPo4SQc
9KFelsVmsfSfz5A88q7tQ5T/xiHViE2pw19yAEjQhifzER+iim1KQ76Z/Rrr
W2PbO0Ll/H9QCQ403CmSrgNSPsoAo0xsXuIR5AQZsEU6S2vH+Ixz0rwjEnzM
wYazJWt37Dfyc51yPW2tkzV3TH3QZxjj+1enGgk8B4A6jxfzR72t0/MgY/dx
TAWCOScR1buYYk6hSqS9e8h+e0DvxX0YiQ2Dzan8qZpwdFXux98bdaVEVpvu
3mOsOFTxR2pDCj0UmDpKsPPMPXddF2U4q4eNwMnFonRH3znYEHcN3RMf3iSL
xZn8a3JTYq+8KQiaGe8/tK1uw4bYUwFokmWtPJTuNx0lE4f04XZEifUL94zv
FIMllvqEY7/LI6a7YPjwMVo64uQ9s5VCxINySm7eZEEGbLMmL1oSjvIAJ7vH
2TVhJ33zienGB49P59b3r09yOHlsktaR16bTIfXn0rTvcfDFYT5WXPseJlav
UnHekAcgg0OmVM41NuVzfD/ELjbkAfu8jyhk6u+0wJU0vTWdOBxv4nBTXzxK
xy6zsZdjcS2ExMXenc23n0BIu8BR3xXL0uaEdrnjOzFR0a2dQLyW7AiyqFy1
weEdjn/lI5GApN75be/5qB7ks2VbAH7YnHtJm/O+U1e/piXNN5kwRw5iBBvV
MNGHiU3ex50zIS+FHShfvOSxPeLOGxdoQr/VrqRz1xxFnSDzxzPv8Ea0+KRj
yuUwdPRJGzliyBPxcjm4MqjHkP/gxuxWQ4BHBf77re0DJhfNOZ8ts8kHdPBZ
m82642CiLGTTYIK8rlRY2bD5YYfqag0ZFptyZiMBxMc1cHoKXXm+7NCcMJIW
Q0WaUHOmdR4O2ERtYc1UAa5DBSt9LtjWFfwCyI/DdXeUEHDh6BCdwU3lhJMm
BxNcVKH8sr+9jfBdGfuBvdSSkZdtHbR9b12L187oZcjd7M7UN8oI0gQzKe5i
DrRL4b1pbWbb8Fjr3g/8GV5oy7/0D63Wow/P5vPncSQct1fTP6RUkVCVN/Rf
2YA3BQBO4Tb+nM34/9/E6OumyaY7Lp8atGVNbTzxtOkw8YkKEpj4Cf4+lj+Q
63U7TDqfzz69WnqCLo9HA+lLlNfjL4O0CyCfWvOOlR7w6FsrlctCP06BEzRA
N5kHIzs48PPs5X92e6U0ufG36fLkYHul4pyrCKN9rkzlXzOpW2n38uRwJ3s/
f5U7Jm2W1Jq0uYw92QIPpDb9f3baH1TMyWdOmx7bNo9sGcfUf2rLxJOKXB/X
Xjf+5ynx5046ZQFuKVK47CHlz8mUVj0eiQB2TYrzHDgr5VIY4UyHN/uf6gr1
MZggsL2PaI84meHzVplNFhy8d05Z/j/d9cBIomgAAA==

-->

</rfc>
