<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.11 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc symrefs="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-cbor-cddl-08" category="std">

  <front>
    <title abbrev="CDDL">Concise data definition language (CDDL): a notational convention to express CBOR and JSON data structures</title>

    <author initials="H." surname="Birkholz" fullname="Henk Birkholz">
      <organization abbrev="Fraunhofer SIT">Fraunhofer SIT</organization>
      <address>
        <postal>
          <street>Rheinstrasse 75</street>
          <city>Darmstadt</city>
          <code>64295</code>
          <country>Germany</country>
        </postal>
        <email>henk.birkholz@sit.fraunhofer.de</email>
      </address>
    </author>
    <author initials="C." surname="Vigano" fullname="Christoph Vigano">
      <organization abbrev="Universität Bremen">Universität Bremen</organization>
      <address>
        <email>christoph.vigano@uni-bremen.de</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universitaet Bremen TZI</organization>
      <address>
        <postal>
          <street>Bibliothekstr. 1</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="2019" month="March" day="24"/>

    <area>Applications</area>
    <workgroup>CBOR</workgroup>
    

    <abstract>


<t>This document proposes a notational convention to express CBOR data
structures (RFC 7049, Concise Binary Object Representation).
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>

  <middle>


<section anchor="introduction" title="Introduction">

<t>In this document,
a notational convention to express CBOR <xref target="RFC7049"/> data structures is defined.</t>

<t>The main goal for the convention is to provide a unified notation that can
be used when defining protocols that use CBOR.  We term the convention
“Concise data definition language”, or CDDL.</t>

<t>The CBOR notational convention has the following goals:</t>

<t><list style="format (G%d)">
  <t>Provide an unambiguous description of the overall structure of a CBOR data item.</t>
  <t>Be flexible in expressing the multiple ways in which data can be
represented in the CBOR data format.</t>
  <t>Be able to express common CBOR datatypes and structures.</t>
  <t>Provide a single format that is both readable and editable for
humans and processable by machine.</t>
  <t>Enable automatic checking of CBOR data items for data format compliance.</t>
  <t>Enable extraction of specific elements from CBOR data for further processing.</t>
</list></t>

<t>Not an original goal per se, but a convenient side effect of the JSON
generic data model being a subset of the CBOR generic data model, is
the fact that CDDL can also be used for describing JSON data
structures (see <xref target="sec-json"/>).</t>

<t>This document has the following structure:</t>

<t>The syntax of CDDL is defined in <xref target="syntax"/>.
Examples of CDDL and related CBOR data items (“instances”, which all
happen to be in JSON form) are given in
<xref target="examples"/>. <xref target="usage"/> discusses usage of CDDL. Examples are provided
early in the text to better illustrate concept definitions.
A formal definition of CDDL using ABNF grammar is provided in <xref target="abnf"/>.
Finally, a <spanx style="emph">prelude</spanx> of standard CDDL definitions that is
automatically prepended to and thus available in every
CBOR specification is listed in <xref target="prelude"/>.</t>

<section anchor="requirements-notation" title="Requirements notation">

<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>

</section>
<section anchor="terminology" title="Terminology">

<t>New terms are introduced in <spanx style="emph">cursive</spanx>, which is rendered in plain text
as the new term surrounded by underscores.
CDDL text in the running text is in <spanx style="verb">typewriter</spanx>, which is rendered in
plain text as the CDDL text in double quotes (double quotes are also
used in the usual English sense; the reader is expected to
disambiguate this by context).</t>

<t>In this specification, the term “byte” is used in its now customary
sense as a synonym for “octet”.</t>

</section>
</section>
<section anchor="the-style-of-data-structure-specification" title="The Style of Data Structure Specification">

<t>CDDL focuses on styles of specification that are in use in the
community employing the data model as pioneered by JSON and now
refined in CBOR.</t>

<t>There are a number of more or less atomic elements of a CBOR data
model, such as numbers, simple values (false, true, nil), text and
byte strings;
CDDL does not focus on specifying their structure.  CDDL of course
also allows adding a CBOR tag to a data item.</t>

<t>Beyond those atomic elements, further components of a
data structure definition language
are the data types used for composition: arrays and maps in CBOR
(called arrays and objects in JSON).  While these are only two
representation formats, they are used to specify four loosely
distinguishable styles of composition:</t>

<t><list style="symbols">
  <t>A <spanx style="emph">vector</spanx>, an array of elements that are mostly of the same
semantics.  The set of signatures associated with a signed data item
is a typical application of a vector.</t>
  <t>A <spanx style="emph">record</spanx>, an array the elements of which have different,
positionally defined semantics, as detailed in the data structure
definition.  A 2D point, specified as an array of an x coordinate
(which comes first) and a y coordinate (coming second) is an example
of a record, as is the pair of exponent (first) and mantissa
(second) in a CBOR decimal fraction.</t>
  <t>A <spanx style="emph">table</spanx>, a map from a domain of map keys to a domain of map
values, that are mostly of the same semantics.  A set of language
tags, each mapped to a text string translated to that specific language,
is an example of a table.  The key domain is usually not limited to
a specific set by the specification, but open for the
application, e.g., in a table mapping IP addresses to MAC addresses,
the specification does not attempt to foresee all possible IP
addresses.
In a language such as JavaScript, a <spanx style="verb">Map</spanx> (as opposed to a plain
<spanx style="verb">Object</spanx>) would often be employed to achieve the generality of the
key domain.</t>
  <t>A <spanx style="emph">struct</spanx>, a map from a domain of map keys as defined by the
specification to a domain of map values the semantics of each of
which is bound to a specific map key.  This is what many people have
in mind when they think about JSON objects; CBOR adds the ability to
use map keys that are not just text strings.  Structs can be used to
solve similar problems as records; the use of explicit map keys
facilitates optionality and extensibility.</t>
</list></t>

<t>Two important concepts provide the foundation for CDDL:</t>

<t><list style="numbers">
  <t>Instead of defining all four types of composition in CDDL separately,
or even defining one kind for arrays (vectors and records) and one
kind for maps (tables and structs), there is only one kind of
composition in CDDL: the <spanx style="emph">group</spanx> (<xref target="group"/>).</t>
  <t>The other important concept is that of a <spanx style="emph">type</spanx>.  The entire CDDL
specification defines a type (the one defined by its first <spanx style="emph">rule</spanx>),
which formally is the set of CBOR data items that are acceptable as
“instances” for
this specification.  CDDL predefines a number of basic types such as
<spanx style="verb">uint</spanx> (unsigned integer) or <spanx style="verb">tstr</spanx> (text string), often making use of
a simple formal notation for CBOR data items.  Each value that
can be expressed as a CBOR data item also is a type in its own right,
e.g. <spanx style="verb">1</spanx>.  A type can be built as a <spanx style="emph">choice</spanx> of other types, e.g., an
<spanx style="verb">int</spanx> is either a <spanx style="verb">uint</spanx> or a <spanx style="verb">nint</spanx> (negative integer).
Finally, a type can be built as an array or a map from a group.</t>
</list></t>

<t>The rest of this section introduces a number of basic concepts of
CDDL, and <xref target="syntax"/> defines additional syntax.
<xref target="matching"/> gives a concise summary of the semantics of CDDL.</t>

<section anchor="group" title="Groups and Composition in CDDL">

<t>CDDL Groups are lists of group <spanx style="emph">entries</spanx>, each of which can be a
name/value pair or a more complex group expression (which then in turn
stands for a sequence of name/value pairs).  A CDDL group is a
production in a grammar that matches certain sequences of name/value pairs but not others.
The grammar is based on the concepts of Parsing Expression Grammars
(see <xref target="sec-peg"/>).</t>

<t>In an array context, only the value of the name/value pair is represented; the name is
annotation only (and can be left off from the group specification if not needed).
In a map context, the names become the map keys (“member keys”).</t>

<t>In an array context, the actual sequence of elements in the group is
important, as that sequence is the information that allows associating actual
array elements with entries in the group.
In a map context, the sequence of entries in a group is not relevant
(but there is still a need to write down group entries in a sequence).</t>

<t>An array matches a specification given as a group when the group
matches a sequence of name/value pairs the value parts of which
exactly match the elements of the array in order.</t>

<t>A map matches a specification given as a group when the group
matches a sequence of name/value pairs such that all of these
name/value pairs are present in the map and the map has no name/value
pair that is not covered by the group.</t>

<t>A simple example of using a group directly in a map definition is:</t>

<figure title="Using a group directly in a map" anchor="group-in-map"><artwork type="CDDL" align="center"><![CDATA[
person = {
  age: int,
  name: tstr,
  employer: tstr,
}
]]></artwork></figure>

<t>The three entries of the group are written between the curly braces
that create the map:
Here, “age”, “name”, and “employer” are the names that turn into the
map key text strings, and “int” and “tstr” (text string) are the types
of the map values under these keys.</t>

<t>A group by itself (without creating a map around it) can be placed in
(round) parentheses, and given a name by using it in a rule:</t>

<figure title="A basic group" anchor="basic-group"><artwork type="CDDLx" align="center"><![CDATA[
pii = (
  age: int,
  name: tstr,
  employer: tstr,
)
]]></artwork></figure>

<t>This separate, named group definition allows us to rephrase <xref target="group-in-map"/> as:</t>

<figure title="Using a group by name" anchor="group-by-name"><artwork type="CDDLx" align="center"><![CDATA[
person = {
  pii
}
]]></artwork></figure>

<t>Note that the (curly) braces signify the creation of a map; the groups
themselves are neutral as to whether they will be used in a map or an array.</t>

<t>As shown in <xref target="group-in-map"/>, the parentheses for groups are optional
when there is some other set of brackets present.  Note that they can
still be used, leading to the not so realistic, but perfectly valid example:</t>

<figure title="Using a parenthesized group in a map" anchor="paren-group-in-map"><artwork type="CDDL" align="center"><![CDATA[
person = {(
  age: int,
  name: tstr,
  employer: tstr,
)}
]]></artwork></figure>

<t>Groups can be used to factor out common parts of structs, e.g.,
instead of writing copy/paste style specifications such as in
<xref target="group_redundancy"/>, one can factor out the common subgroup, choose a
name for it, and write only the specific parts into the individual
maps (<xref target="group_factorization"/>).</t>

<figure title="Maps with copy/paste" anchor="group_redundancy"><artwork type="CDDL" align="center"><![CDATA[
person = {
  age: int,
  name: tstr,
  employer: tstr,
}

dog = {
  age: int,
  name: tstr,
  leash-length: float,
}
]]></artwork></figure>

<figure title="Using a group for factorization" anchor="group_factorization"><artwork type="CDDL" align="center"><![CDATA[
person = {
  identity,
  employer: tstr,
}

dog = {
  identity,
  leash-length: float,
}

identity = (
  age: int,
  name: tstr,
)
]]></artwork></figure>

<t>Note that the lists inside the braces in the above definitions
constitute (anonymous) groups, while <spanx style="verb">identity</spanx> is a named group,
which can then be included as part of other groups (anonymous as in
the example, or themselves named).</t>

<section anchor="composition_usage" title="Usage">

<t>Groups are the instrument used in composing data structures with
CDDL. It is a matter of style in defining those structures whether to
define groups (anonymously) right in their contexts or whether to
define them in a separate rule and to reference them with their
respective name (possibly more than once).</t>

<t>With this, one is allowed to define all small parts of their data structures
and compose bigger protocol units with those or to have only one big
protocol data unit that has all definitions ad hoc where needed.</t>

</section>
<section anchor="composition_syntax" title="Syntax">

<t>The composition syntax is intended to be concise and easy to read:</t>

<t><list style="symbols">
  <t>The start and end of a group can be marked by ‘(‘ and ‘)’</t>
  <t>Definitions of entries inside of a group are noted as follows:
<spanx style="emph">keytype =&gt; valuetype,</spanx> (read “keytype maps to valuetype”).
The comma is actually optional (not just in the final entry), but it is
considered good style to set it.  The double arrow can be replaced by a colon
in the common case of directly using a text string or integer literal as a
key (see <xref target="structs"/>; this is also the common way of naming elements
of an array just for documentation, see <xref target="arrays"/>).</t>
</list></t>

<t>A basic entry consists of a <spanx style="emph">keytype</spanx> and a <spanx style="emph">valuetype</spanx>, both of which
are types (<xref target="types"/>); this entry matches any name-value pair the
name of which is in the keytype and the value of which is in the valuetype.</t>

<t>A group defined as a sequence of group entries matches any
sequence of name-value pairs that is composed by concatenation in
order of what the entries match.</t>

<t>A group definition can also contain choices between groups, see <xref target="choices"/>.</t>

</section>
</section>
<section anchor="types" title="Types">

<section anchor="values" title="Values">

<t>Values such as numbers and strings can be used in place of a type.
(For instance, this is a very common thing to do for a keytype, common
enough that CDDL provides additional convenience syntax for this.)</t>

<t>The value notation is based on the C language, but does not offer all
the syntactic variations (see <xref target="abnf"/> for details).  The value notation for numbers
inherits from C the distinction between integer values (no fractional
part or exponent given — NR1 <xref target="ISO6093"/>) and floating point values
(where a fractional part and/or an exponent is present — NR2 or NR3),
so the type <spanx style="verb">1</spanx> does not include any floating point numbers while the
types <spanx style="verb">1e3</spanx> and <spanx style="verb">1.5</spanx> are both floating point numbers and do not
include any integer numbers.</t>

</section>
<section anchor="choices" title="Choices">

<t>Many places that allow a type also allow a choice between types,
delimited by a “/” (slash).  The entire choice construct can be put
into parentheses if this is required to make the construction
unambiguous (please see <xref target="abnf"/> for the details).</t>

<t>Choices of values can be used to express enumerations:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
attire = "bow tie" / "necktie" / "Internet attire"
protocol = 6 / 17
]]></artwork></figure>

<t>Similarly as for types, CDDL also allows choices between groups,
delimited by a “//” (double slash).  Note that the “//” operator
binds much more weakly than the other CDDL operators, so each line
within <spanx style="verb">delivery</spanx> in
the following example is its own alternative in the group choice:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
address = { delivery }

delivery = (
street: tstr, ? number: uint, city //
po-box: uint, city //
per-pickup: true )

city = (
name: tstr, zip-code: uint
)
]]></artwork></figure>

<t>A group choice matches the union of the sets of name-value pair
sequences that the alternatives in the choice can.</t>

<t>Both for type choices and for group choices, additional alternatives
can be added to a rule later in separate rules by using “/=” and “//=”,
respectively, instead of “=”:</t>

<figure><artwork align="center"><![CDATA[
attire /= "swimwear"

delivery //= (
lat: float, long: float, drone-type: tstr
)
]]></artwork></figure>

<t>It is not an error if a name is first used with a “/=” or “//=”
(there is no need to “create it” with “=”).</t>

<section anchor="ranges" title="Ranges">

<t>Instead of naming all the values that make up a choice, CDDL allows
building a <spanx style="emph">range</spanx> out of two values that are in an ordering
relationship: A lower bound (first value) and an upper bound (second value).
A range can be inclusive of both bounds given (denoted by joining two
values by “..”), or include the lower bound and exclude the upper bound (denoted
by instead using “…”).
If the lower bound exceeds the upper bound, the resulting type is
the empty set (this behavior can be desirable when generics,
<xref target="generics"/>, are being used).</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
device-address = byte
max-byte = 255
byte = 0..max-byte ; inclusive range
first-non-byte = 256
byte1 = 0...first-non-byte ; byte1 is equivalent to byte
]]></artwork></figure>

<t>CDDL currently only allows ranges between integers (matching integer
values) or between floating point values (matching floating point
values).  If both are needed in a type, a type choice between the two
kinds of ranges can be (clumsily) used:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
int-range = 0..10 ; only integers match
float-range = 0.0..10.0 ; only floats match
BAD-range1 = 0..10.0 ; NOT DEFINED
BAD-range2 = 0.0..10 ; NOT DEFINED
numeric-range = int-range / float-range
]]></artwork></figure>

<t>(See also the control operators .lt/.ge and .le/.gt in <xref target="fortran"/>.)</t>

<t>Note that the dot is a valid name continuation character in CDDL, so</t>

<t><list style='empty'>
  <t>min..max</t>
</list></t>

<t>is not a range expression but a single name.  When using a
name as the left hand side of a range operator, use spacing as in</t>

<t><list style='empty'>
  <t>min .. max</t>
</list></t>

<t>to separate off the range operator.</t>

</section>
<section anchor="turning-a-group-into-a-choice" title="Turning a group into a choice">

<t>Some choices are built out of large numbers of values, often integers,
each of which is best given a semantic name in the specification.
Instead of naming each of these integers and then accumulating these
into a choice, CDDL allows building a choice from a group by prefixing
it with a “&amp;” character:</t>

<!-- color = [terminal-color, extended-color] -->
<figure><artwork type="CDDL" align="center"><![CDATA[
terminal-color = &basecolors
basecolors = (
  black: 0, red: 1,  green: 2,  yellow: 3,
  blue: 4,  magenta: 5,  cyan: 6,  white: 7,
)
extended-color = &(
  basecolors,
  orange: 8,  pink: 9,  purple: 10,  brown: 11,
)
]]></artwork></figure>

<t>As with the use of groups in arrays (<xref target="arrays"/>), the member names have
only documentary value (in particular, they might be used by a tool
when displaying integers that are taken from that choice).</t>

</section>
</section>
<section anchor="representation-types" title="Representation Types">

<t>CDDL allows the specification of a data item type by referring to the
CBOR representation (major types and additional information, Section 2 of <xref target="RFC7049"/>).  How this is used
should be evident from the prelude (<xref target="prelude"/>): a hash mark (<spanx style="verb">#</spanx>)
optionally followed by a number from 0 to 7 identifying the major
type, which then can be followed by a dot and a number specifying the
additional information.  This construction specifies the set of values that can be
serialized in CBOR (i.e., <spanx style="verb">any</spanx>), by the given major type if one is
given, or by the given major type with the additional information if
both are given.  Where a major type of 6 (Tag) is used, the type of
the tagged item can be specified by appending it in parentheses.</t>

<t>Note that although this notation is based on the CBOR
serialization, it is about a set of values at the data model level,
e.g. <spanx style="verb">#7.25</spanx> specifies the set of values that can be represented as
half-precision floats; it does not mandate that these values also do
have to be serialized as half-precision floats: CDDL does not provide
any language means to restrict the choice of serialization variants.
This also enables the use of CDDL with JSON, which uses a
fundamentally different way of serializing (some of) the same values.</t>

<t>It may be necessary to make use of representation types outside the
prelude, e.g., a specification could start by making use of an
existing tag in a more specific way, or define a new tag not defined
in the prelude:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
my_breakfast = #6.55799(breakfast)   ; cbor-any is too general!
breakfast = cereal / porridge
cereal = #6.998(tstr)
porridge = #6.999([liquid, solid])
liquid = milk / water
milk = 0
water = 1
solid = tstr
]]></artwork></figure>

</section>
<section anchor="root-type" title="Root type">

<t>There is no special syntax to identify the root of a CDDL data
structure definition: that role is simply taken by the first rule
defined in the file.</t>

<t>This is motivated by the usual top-down approach for defining data
structures, decomposing a big data structure unit into smaller parts;
however, except for the root type, there is no need to strictly follow
this sequence.</t>

<t>(Note that there is no way to use a group as a root – it must be a
type.)</t>

</section>
</section>
</section>
<section anchor="syntax" title="Syntax">

<t>In this section, the overall syntax of CDDL is shown, alongside some
examples just illustrating syntax.
(The definition will not attempt to be overly formal; refer to <xref target="abnf"/>
for the details.)</t>

<section anchor="general-conventions" title="General conventions">

<t>The basic syntax is inspired by ABNF <xref target="RFC5234"/>, with</t>

<t><list style="symbols">
  <t>rules, whether they define groups or types, are defined with a name,
followed by an equals sign “=” and the actual definition according
to the respective syntactic rules of that definition.</t>
  <t>A name can consist of any of the characters from the set
{‘A’ to ‘Z’, ‘a’ to ‘z’, ‘0’ to ‘9’, ‘_’, ‘-‘, ‘@’, ‘.’,
‘$’}, starting with
an alphabetic character (including ‘@’, ‘_’, ‘$’) and ending in
such a character or
or a digit.
  <list style="symbols">
      <t>Names are case sensitive.</t>
      <t>It is preferred style to start a name with a lower case letter.</t>
      <t>The hyphen is preferred over the underscore (except in a
“bareword” (<xref target="structs"/>), where the semantics may actually require an underscore).</t>
      <t>The period may be useful for larger specifications, to express
some module structure (as in <spanx style="verb">tcp.throughput</spanx>
vs. <spanx style="verb">udp.throughput</spanx>).</t>
      <t>A number of names are predefined in the CDDL prelude, as listed in <xref target="prelude"/>.</t>
      <t>Rule names (types or groups) do not appear in the actual CBOR encoding, but
names used as “barewords” in member keys do.</t>
    </list></t>
  <t>Comments are started by a ‘;’ (semicolon) character and finish at the end of a line
(LF or CRLF).</t>
  <t>outside strings, whitespace (spaces, newlines, and comments) is used
to separate syntactic elements for readability (and to separate
identifiers, range operators, or numbers that follow each other); it is otherwise
completely optional.</t>
  <t>Hexadecimal numbers are preceded by ‘0x’ (without quotes, lower case
x), and are case insensitive.  Similarly, binary numbers are preceded
by ‘0b’. <!-- ABNF borken here --></t>
  <t>Text strings are enclosed by double quotation ‘”’ characters.
They follow the conventions for strings as defined in section 7 of <xref target="RFC8259"/>.
(ABNF users may want to note that there is no support in CDDL for the
concept of case insensitivity in text strings; if necessary, regular
expressions can be used (<xref target="regexp"/>).)</t>
  <t>Byte strings are enclosed by single quotation “’” characters and may
be prefixed by “h” or “b64”.  If unprefixed, the string is interpreted
as with a text string, except that single quotes must be escaped and
that the UTF-8 bytes resulting are marked as a byte string (major type
2).
If prefixed as “h” or “b64”, the string is interpreted as a sequence
of pairs of hex digits (base16, Section 8 of <xref target="RFC4648"/>) or a
base64(url) string (Sections 4 or 5 of <xref target="RFC4648"/>),
respectively (as with the
diagnostic notation in section 6 of <xref target="RFC7049"/>; cf. <xref target="textbin"/>); any white space
present within the string (including comments) is ignored in the prefixed case.</t>
  <t>CDDL uses UTF-8 <xref target="RFC3629"/> for its encoding.  Processing of CDDL
does not involve Unicode normalization processes.</t>
</list></t>

<t>Example:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
; This is a comment
person = { g }

g = (
  "name": tstr,
  age: int,  ; "age" is a bareword
)
]]></artwork></figure>

</section>
<section anchor="occurrence" title="Occurrence">

<t>An optional <spanx style="emph">occurrence</spanx> indicator can be given in front of a
group entry.  It is either one of the characters ‘?’ (optional), ‘*’
(zero or more), or ‘+’ (one or more), or is of the form n*m, where n
and m are optional unsigned integers and n is the lower limit (default
0) and m is the upper limit (default no limit) of occurrences.</t>

<t>If no occurrence indicator is specified, the group entry is to occur exactly
once (as if 1*1 were specified).
A group entry with an occurrence indicator matches sequences of
name-value pairs that are composed by concatenating a number of sequences that the basic
group entry matches, where the number needs to be allowed by the
occurrence indicator.</t>

<t>Note that CDDL, outside any directives/annotations that could possibly
be defined, does not make any
prescription as to whether arrays or maps use the definite length or
indefinite length encoding.  I.e., there is no correlation between
leaving the size of an array “open” in the spec and the fact that it
is then interchanged with definite or indefinite length.</t>

<t>Please also note that CDDL can describe flexibility that the data
model of the target representation does not have.  This is rather
obvious for JSON, but also is relevant for CBOR:</t>

<figure><artwork type="CDDL"><![CDATA[
apartment = {
  kitchen: size,
  * bedroom: size,
}
size = float ; in m2
]]></artwork></figure>

<t>The previous specification does not mean that CBOR is changed to allow
to use the key “bedroom” more than once.  In other words, due to the
restrictions imposed by the data model, the third line pretty much turns
into:</t>

<figure><artwork type="CDDLx"><![CDATA[
  ? bedroom: size,
]]></artwork></figure>

<t>(Occurrence indicators beyond one still are useful in maps for groups
that allow a variety of keys.)</t>

</section>
<section anchor="predefined-names-for-types" title="Predefined names for types">

<t>CDDL predefines a number of names.
This subsection summarizes these names, but please see <xref target="prelude"/> for
the exact definitions.</t>

<t>The following keywords for primitive datatypes are defined:</t>

<t><list style="hanging">
  <t hangText='“bool”'>
  Boolean value (major type 7, additional information 20 or 21).</t>
  <t hangText='“uint”'>
  An unsigned integer (major type 0).</t>
  <t hangText='“nint”'>
  A negative integer (major type 1).</t>
  <t hangText='“int”'>
  An unsigned integer or a negative integer.</t>
  <t hangText='“float16”'>
  A number representable as an IEEE 754 half-precision float (major type 7, additional information 25).</t>
  <t hangText='“float32”'>
  A number representable as an IEEE 754 single-precision float (major type 7, additional information 26).</t>
  <t hangText='“float64”'>
  A number representable as an IEEE 754 double-precision float (major type 7, additional information 27).</t>
  <t hangText='“float”'>
  One of float16, float32, or float64.</t>
  <t hangText='“bstr” or “bytes”'>
  A byte string (major type 2).</t>
  <t hangText='“tstr” or “text”'>
  Text string (major type 3)</t>
</list></t>

<t>(Note that there are no predefined names for arrays or maps; these are
defined with the syntax given below.)</t>

<t>In addition, a number of types are defined in the prelude that are
associated with CBOR tags, such as <spanx style="verb">tdate</spanx>, <spanx style="verb">bigint</spanx>, <spanx style="verb">regexp</spanx> etc.</t>

</section>
<section anchor="arrays" title="Arrays">

<t>Array definitions surround a group with square brackets.</t>

<t>For each entry, an occurrence indicator as specified in <xref target="occurrence"/> is permitted.</t>

<t>For example:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
unlimited-people = [* person]
one-or-two-people = [1*2 person]
at-least-two-people = [2* person]
person = (
    name: tstr,
    age: uint,
)
]]></artwork></figure>

<t>The group <spanx style="verb">person</spanx> is defined in such a way that repeating it in the
array each time generates alternating names and ages, so these are four valid
values for a data item of type <spanx style="verb">unlimited-people</spanx>:</t>

<figure><artwork type="CBORdiag" align="center"><![CDATA[
["roundlet", 1047, "psychurgy", 2204, "extrarhythmical", 2231]
[]
["aluminize", 212, "climograph", 4124]
["penintime", 1513, "endocarditis", 4084, "impermeator", 1669,
 "coextension", 865]
]]></artwork></figure>

</section>
<section anchor="maps" title="Maps">

<t>The syntax for specifying maps merits special attention, as well as a
number of optimizations and conveniences, as it is likely to be the
focal point of many specifications employing CDDL.  While the syntax
does not strictly distinguish struct and table usage of maps, it
caters specifically to each of them.</t>

<t>But first, let’s reiterate a feature of CBOR that it has inherited
from JSON: The key/value pairs in CBOR maps have no fixed ordering.
(One could imagine situations where fixing the ordering may be of use.
For example, a decoder could look for values related with integer keys
1, 3 and 7.  If the order were fixed and the decoder encounters the
key 4 without having encountered key 3, it could conclude that key 3
is not available without doing more complicated bookkeeping.
Unfortunately, neither JSON nor CBOR support this, so no attempt was
made to support this in CDDL either.)</t>

<section anchor="structs" title="Structs">

<t>The “struct” usage of maps is similar to the way JSON objects are used
in many JSON applications.</t>

<t>A map is defined in the same way as defining an array (see <xref target="arrays"/>), except
for using curly braces “{}” instead of square brackets “[]”.</t>

<t>An occurrence indicator as specified in <xref target="occurrence"/> is permitted for each
group entry.</t>

<t>The following is an example of a record with a structure enbedded:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
Geography = [
  city           : tstr,
  gpsCoordinates : GpsCoordinates,
]

GpsCoordinates = {
  longitude      : uint,            ; degrees, scaled by 10^7
  latitude       : uint,            ; degreed, scaled by 10^7
}
]]></artwork></figure>

<t>When encoding, the Geography record is encoded using a CBOR array with
two members (the keys for the group entries are ignored), whereas the
GpsCoordinates structure is encoded as a CBOR map with two key/value
pairs.</t>

<t>Types used in a structure can be defined in separate rules or just in
place (potentially placed inside parentheses, such as for choices).
E.g.:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
located-samples = {
  sample-point: int,
  samples: [+ float],
}

]]></artwork></figure>

<t>where <spanx style="verb">located-samples</spanx> is the datatype to be used when referring to the struct,
and <spanx style="verb">sample-point</spanx> and <spanx style="verb">samples</spanx> are the keys to be used.
This is actually a complete example: an identifier that is followed by a
colon can be directly used as the text string for a member key (we speak of a
“bareword” member key), as can a double-quoted string or a number.
(When other types, in particular ones that contain more than one value, are used as
the types of keys, they are followed by a double arrow, see below.)</t>

<t>If a text string key does not match the syntax for an identifier (or
if the specifier just happens to prefer using double quotes), the text
string syntax can also be used in the member key position, followed by
a colon.  The above example could therefore have been written with
quoted strings in the member key positions.</t>

<t>More generally, types specified in other ways than the cases described
above can be used in a keytype position by following them with a
double arrow — in particular, the double arrow is necessary if a type
is named by an identifier (which, when followed by a colon, would
be interpreted as a “bareword” and turned into a text string).
A literal text string also gives rise to a type (which contains a single
value only — the given string), so another
form for this example is:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
located-samples = {
  "sample-point" => int,
  "samples" => [+ float],
}
]]></artwork></figure>

<t>See <xref target="cuts-in-maps"/> below for how the colon shortcut described here
also adds some implied semantics.</t>

<t>A better way to demonstrate the double-arrow use may be:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
located-samples = {
  sample-point: int,
  samples: [+ float],
  * equipment-type => equipment-tolerances,
}
equipment-type = [name: tstr, manufacturer: tstr]
equipment-tolerances = [+ [float, float]]
]]></artwork></figure>

<t>The example below defines a struct with optional entries: display name
(as a text string), the name components first name and family name (as
text strings), and age information (as an unsigned integer).</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
PersonalData = {
  ? displayName: tstr,
  NameComponents,
  ? age: uint,
}

NameComponents = (
  ? firstName: tstr,
  ? familyName: tstr,
)
]]></artwork></figure>

<t>Note that the group definition for NameComponents does not generate
another map; instead, all four keys are directly in the struct built
by PersonalData.</t>

<t>In this example, all key/value pairs are optional from the perspective of CDDL.
With no occurrence indicator, an entry is mandatory.</t>

<t>If the addition of more entries not specified by the current
specification is desired, one can add this possibility explicitly:</t>

<figure title="Personal Data: Example for extensibility" anchor="xmp-personaldata"><artwork type="CDDL" align="center"><![CDATA[
PersonalData = {
  ? displayName: tstr,
  NameComponents,
  ? age: uint,
  * tstr => any
}

NameComponents = (
  ? firstName: tstr,
  ? familyName: tstr,
)
]]></artwork></figure>

<t>The CDDL tool reported on in <xref target="tool"/> generated as one acceptable instance for this specification:</t>

<figure><artwork type="CBORdiag" align="center"><![CDATA[
{"familyName": "agust", "antiforeignism": "pretzel",
 "springbuck": "illuminatingly", "exuviae": "ephemeris",
 "kilometrage": "frogfish"}
]]></artwork></figure>

<t>(See <xref target="socketplug"/> for one way to explicitly identify an extension point.)</t>

</section>
<section anchor="tables" title="Tables">

<t>A table can be specified by defining a map with entries where the
keytype allows more than just a single value, e.g.:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
square-roots = {* x => y}
x = int
y = float
]]></artwork></figure>

<t>Here, the key in each key/value pair has datatype x (defined as int),
and the value has datatype y (defined as float).</t>

<t>If the specification does not need to restrict one of x or y (i.e., the application is free to
choose per entry), it can be replaced by the predefined name <spanx style="verb">any</spanx>.</t>

<t>As another example,
the following could be used as a conversion table converting from an integer
or float to a string:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
tostring = {* mynumber => tstr}
mynumber = int / float
]]></artwork></figure>

</section>
<section anchor="non-deterministic-order" title="Non-deterministic order">

<t>While the way arrays are matched is fully determined by the Parsing
Expression Grammar (PEG) formalism (see <xref target="sec-peg"/>), matching is more complicated for
maps, as maps do not have an inherent order.
For each candidate name/value pair that the PEG algorithm would try, a
matching member is picked out of the entire map.  For certain group expressions,
more than one member in the map may match.  Most often, this is
inconsequential, as the group expression tends to consume all matches:</t>

<figure><artwork type="CDDL"><![CDATA[
labeled-values = {
  ? fritz: number,
  * label => value
}
label = text
value = number
]]></artwork></figure>

<t>Here, if any member with the key <spanx style="verb">fritz</spanx> is present, this
will be picked by the first entry of the group; all remaining
text/number member will be picked by the second entry (and if anything
remains unpicked, the map does not match).</t>

<t>However, it is possible to construct group expressions where what is
actually picked is indeterminate, and does matter:</t>

<figure><artwork type="CDDL"><![CDATA[
do-not-do-this = {
  int => int,
  int => 6,
}
]]></artwork></figure>

<t>When this expression is matched against <spanx style="verb">{3: 5, 4: 6}</spanx>, the first
group entry might pick off the <spanx style="verb">3: 5</spanx>, leaving <spanx style="verb">4: 6</spanx> for matching the
second one.  Or it might pick off <spanx style="verb">4: 6</spanx>, leaving nothing for the
second entry.  This pathological non-determinism is caused by
specifying more general before more specific, and by having a general
rule that only consumes a subset of the map key/value pairs that it is able to
match — both tend not to occur in real-world specifications of maps.  At the time
of writing, CDDL tools cannot detect such cases automatically, and for
the present version of the CDDL specification, the
specification writer is simply urged to not write pathologically
non-deterministic specifications.</t>

<t>(The astute reader will be reminded of what was called “ambiguous
content models” in SGML and “non-deterministic content models” in XML.
That problem is related to the one described here, but the problem
here is specifically caused by the lack of order in maps, something
that the XML schema languages do not have to contend with.  Note that
Relax-NG’s <spanx style="verb">interleave</spanx> pattern handles lack of order explicitly on the
specification side, while the instances in XML always have determinate
order.)</t>

</section>
<section anchor="cuts-in-maps" title="Cuts in Maps">

<t>The extensibility idiom discussed above for structs has one problem:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
extensible-map-example = {
  ? "optional-key" => int,
  * tstr => any
}
]]></artwork></figure>

<t>In this example, there is one optional key “optional-key”, which, when
present, maps to an integer.  There is also a wild card for any future
additions.</t>

<t>Unfortunately, the data item</t>

<figure><artwork type="CBORdiag" align="center"><![CDATA[
{ "optional-key": "nonsense" }
]]></artwork></figure>

<t>does match this specification:  While the first entry of the group
does not match, the second one (the wildcard) does.  This may be very
well desirable (e.g., if a future extension is to be allowed to extend
the type of “optional-key”), but in many cases isn’t.</t>

<t>In anticipation of a more general potential feature called “cuts”,
CDDL allows inserting a cut “^” into the definition of the map entry:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
extensible-map-example = {
  ? "optional-key" ^ => int,
  * tstr => any
}
]]></artwork></figure>

<t>A cut in this position means that once the member key matches the name
part of an entry that carries a cut,
other potential matches for the key of the member that occur in
later entries in the group of the map are no longer allowed.
In other words, when a group entry would pick a key/value pair based
on just a matching key, it “locks in” the pick — this rule applies
independent of whether the value matches as well, so when it does not,
the entire map fails to match.
In summary, the
example above no longer matches the specification as modified with the cut.</t>

<t>Since the desire for this kind of exclusive matching is so frequent,
the “:” shortcut is actually defined to include the cut semantics.  So
the preceding example (including the cut) can be written more simply
as:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
extensible-map-example = {
  ? "optional-key": int,
  * tstr => any
}
]]></artwork></figure>

<t>or even shorter, using a bareword for the key:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
extensible-map-example = {
  ? optional-key: int,
  * tstr => any
}
]]></artwork></figure>

</section>
</section>
<section anchor="tagsec" title="Tags">

<t>A type can make use of a CBOR tag (major type 6) by using the
representation type notation, giving #6.nnn(type) where nnn is an
unsigned integer giving the tag number and <spanx style="verb">type</spanx> is the type of the
data item being tagged.</t>

<t>For example, the following line from the CDDL prelude (<xref target="prelude"/>) defines <spanx style="verb">biguint</spanx> as
a type name for a positive bignum N:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
biguint = #6.2(bstr)
]]></artwork></figure>

<t>The tags defined by <xref target="RFC7049"/> are included in the prelude.
Additional tags since registered need to be added to a CDDL
specification as needed; e.g., a binary UUID tag could be referenced
as <spanx style="verb">buuid</spanx> in a specification after defining</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
buuid = #6.37(bstr)
]]></artwork></figure>

<t>In the following example, usage of the tag 32 for URIs is optional:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
my_uri = #6.32(tstr) / tstr
]]></artwork></figure>

</section>
<section anchor="unwrapping" title="Unwrapping">

<t>The group that is used to define a map or an array can often be reused
in the definition of another map or array.  Similarly, a type defined
as a tag carries an internal data item that one would like to refer
to.
In these cases, it is expedient to simply use the name of the map,
array, or tag type as a handle for the group or type defined inside it.</t>

<t>The “unwrap” operator (written by preceding a name by a tilde
character “~”) can be used to strip the type defined for a name by one
layer, exposing the underlying group (for maps and arrays) or type
(for tags).</t>

<t>For example, an application might want to define a basic and an
advanced header.  Without unwrapping, this might be done as follows:</t>

<figure><artwork type="CDDL"><![CDATA[
basic-header-group = (
  field1: int,
  field2: text,
)

basic-header = [ basic-header-group ]

advanced-header = [
  basic-header-group,
  field3: bytes,
  field4: number, ; as in the tagged type "time"
]
]]></artwork></figure>

<t>Unwrapping simplifies this to:</t>

<figure><artwork type="CDDL"><![CDATA[
basic-header = [
  field1: int,
  field2: text,
]

advanced-header = [
  ~basic-header,
  field3: bytes,
  field4: ~time,
]
]]></artwork></figure>

<t>(Note that leaving out the first unwrap operator in the latter example
would lead to nesting the basic-header in its own array inside the
advanced-header, while, with the unwrapped basic-header, the
definition of the group inside basic-header is essentially repeated
inside advanced-header, leading to a single array.  This can be used for
various applications often solved by inheritance in programming
languages.  The effect of unwrapping can also be described as
“threading in” the group or type inside the referenced type, which
suggested the thread-like “~” character.)</t>

</section>
<section anchor="controls" title="Controls">

<t>A <spanx style="emph">control</spanx> allows to relate a <spanx style="emph">target</spanx> type with a <spanx style="emph">controller</spanx> type
via a <spanx style="emph">control operator</spanx>.</t>

<t>The syntax for a control type is <spanx style="verb">target .control-operator controller</spanx>,
where control operators are special identifiers prefixed by a dot.
(Note that <spanx style="emph">target</spanx> or <spanx style="emph">controller</spanx> might need to be parenthesized.)</t>

<t>A number of control operators are defined at this point.
Further control operators may be defined by new
versions of this specification or by registering them according to the
procedures in <xref target="sec-controlreg"/>.</t>

<section anchor="control-operator-size" title="Control operator .size">

<t>A <spanx style="verb">.size</spanx> control controls the size of the target in bytes by the
control type.  The control is defined for text and byte strings, where
it directly controls the number of bytes in the string.  It is also
defined for unsigned integers (see below).
<xref target="control-size"/> shows example usage for byte strings.</t>

<figure title="Control for size in bytes" anchor="control-size"><artwork type="CDDL" align="center"><![CDATA[
full-address = [[+ label], ip4, ip6]
ip4 = bstr .size 4
ip6 = bstr .size 16
label = bstr .size (1..63)
]]></artwork></figure>

<t>When applied to an unsigned integer, the <spanx style="verb">.size</spanx> control restricts
the range of that integer by giving a maximum number of bytes that
should be needed in a computer representation of that unsigned integer.
In other words, <spanx style="verb">uint .size N</spanx> is equivalent to <spanx style="verb">0...BYTES_N</spanx>, where
BYTES_N == 256**N.</t>

<figure title="Control for integer size in bytes" anchor="control-int-size"><artwork type="CDDL" align="center"><![CDATA[
audio_sample = uint .size 3 ; 24-bit, equivalent to 0...16777216
]]></artwork></figure>

<t>Note that, as with value restrictions in CDDL, this control is not
a representation constraint; a number that fits into fewer bytes can
still be represented in that form, and an inefficient implementation
could use a longer form (unless that is restricted by some format
constraints outside of CDDL, such as the rules in Section 3.9 of
<xref target="RFC7049"/>).</t>

</section>
<section anchor="control-operator-bits" title="Control operator .bits">

<t>A <spanx style="verb">.bits</spanx> control on a byte string indicates that, in the
target, only the bits numbered by a number in the control type are
allowed to be set.  (Bits are counted the usual way, bit number <spanx style="verb">n</spanx>
being set in <spanx style="verb">str</spanx> meaning that <spanx style="verb">(str[n &gt;&gt; 3] &amp; (1 &lt;&lt; (n &amp; 7))) != 0</spanx>.)
Similarly, a <spanx style="verb">.bits</spanx> control on an unsigned integer <spanx style="verb">i</spanx> indicates
that for all unsigned integers <spanx style="verb">n</spanx> where <spanx style="verb">(i &amp; (1 &lt;&lt; n)) != 0</spanx>, <spanx style="verb">n</spanx>
must be in the control type.</t>

<figure title="Control for what bits can be set" anchor="control-bits"><artwork type="CDDL" align="center"><![CDATA[
tcpflagbytes = bstr .bits flags
flags = &(
  fin: 8,
  syn: 9,
  rst: 10,
  psh: 11,
  ack: 12,
  urg: 13,
  ece: 14,
  cwr: 15,
  ns: 0,
) / (4..7) ; data offset bits

rwxbits = uint .bits rwx
rwx = &(r: 2, w: 1, x: 0)
]]></artwork></figure>

<t>The CDDL tool reported on in <xref target="tool"/> generates the following ten example instances for <spanx style="verb">tcpflagbytes</spanx>:</t>

<figure><artwork type="CBORdiags" align="center"><![CDATA[
h'906d' h'01fc' h'8145' h'01b7' h'013d' h'409f' h'018e' h'c05f'
h'01fa' h'01fe'
]]></artwork></figure>

<t>These examples do not illustrate that the above CDDL specification
does not explicitly specify a size of two bytes: A valid all clear
instance of flag bytes could be <spanx style="verb">h''</spanx> or <spanx style="verb">h'00'</spanx> or even <spanx style="verb">h'000000'</spanx>
as well.</t>

</section>
<section anchor="regexp" title="Control operator .regexp">

<t>A <spanx style="verb">.regexp</spanx> control indicates that the text string given as a target
needs to match the XSD regular expression given as a value in the
control type.
XSD regular expressions are defined in Appendix F of <xref target="W3C.REC-xmlschema-2-20041028"/>.</t>

<figure title="Control with an XSD regexp" anchor="control-regexp"><artwork type="CDDL" align="center"><![CDATA[
nai = tstr .regexp "[A-Za-z0-9]+@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)+"
]]></artwork></figure>

<t>An example matching this regular expression:</t>

<figure><artwork type="CBORdiag" align="center"><![CDATA[
"N1@CH57HF.4Znqe0.dYJRN.igjf"
]]></artwork></figure>

<section anchor="usage-considerations" title="Usage considerations">

<t>Note that XSD regular expressions do not support the usual \x or \u
escapes for hexadecimal expression of bytes or unicode code points.
However, in CDDL the XSD regular expressions are contained in text
strings, the literal notation for which provides \u escapes; this should
suffice for most applications that use regular expressions for text
strings.
(Note that this also means that there is one level of string escaping
before the XSD escaping rules are applied.)</t>

<t>XSD regular expressions support character class subtraction, a feature
often not found in regular expression libraries; specification writers
may want to use this feature sparingly.
Similar considerations apply to Unicode character classes; where these
are used, the specification that employs CDDL SHOULD identify which
Unicode versions are addressed.</t>

<t>Other surprises for infrequent users of XSD regular expressions may
include:</t>

<t><list style="symbols">
  <t>No direct support for case insensitivity.  While case insensitivity
has gone mostly out of fashion in protocol design, it is sometimes
needed and then needs to be expressed manually as in
<spanx style="verb">[Cc][Aa][Ss][Ee]</spanx>.</t>
  <t>The support for popular character classes such as \w and \d is based
on Unicode character properties, which is often not what is desired
in an ASCII-based protocol and thus might lead to surprises.  (\s
and \S do have their more conventional meanings, and <spanx style="verb">.</spanx> matches any
character but the line ending characters \r or \n.)</t>
</list></t>

</section>
<section anchor="discussion" title="Discussion">

<t>There are many flavors of regular expression in use in the programming
community.
For instance, perl-compatible regular expressions (PCRE) are widely
used and probably are more useful than XSD regular expressions.
However, there is no normative reference for PCRE that could be used
in the present document.
Instead, we opt for XSD regular expressions for now.
There is precedent for that choice in the IETF, e.g., in YANG <xref target="RFC7950"/>.</t>

<t>Note that CDDL uses controls as its main extension point.
This creates the opportunity to add further regular expression formats
in addition to the one referenced here if desired.
As an example, a control “.pcre” is defined in <xref target="I-D.bormann-cbor-cddl-freezer"/>.</t>

<!-- The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, \V, -->
<!-- \w, and \W may appear in a character class, and add the characters -->
<!-- that they match to the class. -->

</section>
</section>
<section anchor="control-operators-cbor-and-cborseq" title="Control operators .cbor and .cborseq">

<t>A <spanx style="verb">.cbor</spanx> control on a byte string indicates that
the byte string carries a CBOR encoded data item.  Decoded, the
data item matches the type given as the right-hand side argument
(type1 in the following example).</t>

<t><list style='empty'>
  <t><spanx style="verb">bytes .cbor type1</spanx></t>
</list></t>

<t>Similarly, a <spanx style="verb">.cborseq</spanx> control on a byte string indicates that
the byte string carries a sequence of CBOR encoded data items.
When the data items are taken as an array, the array matches the type
given as the right-hand side argument (type2 in the following example).</t>

<t><list style='empty'>
  <t><spanx style="verb">bytes .cborseq type2</spanx></t>
</list></t>

<t>(The conversion of the encoded sequence to an array can be effected
for instance by wrapping the byte string between the two bytes 0x9f
and 0xff and decoding the wrapped byte string as a CBOR encoded data
item.)</t>

</section>
<section anchor="control-operators-within-and-and" title="Control operators .within and .and">

<t>A <spanx style="verb">.and</spanx> control on a type indicates that the data item matches
both that left hand side type and the type given as the right hand side.
(Formally, the resulting type is the intersection of the two types
given.)</t>

<t><list style='empty'>
  <t><spanx style="verb">type1 .and type2</spanx></t>
</list></t>

<t>A variant of the <spanx style="verb">.and</spanx> control is the <spanx style="verb">.within</spanx> control, which
expresses an additional intent: the left hand side type is meant to be
a subset of the right-hand-side type.</t>

<t><list style='empty'>
  <t><spanx style="verb">type1 .within type2</spanx></t>
</list></t>

<t>While both forms have the identical formal semantics (intersection),
the intention of the <spanx style="verb">.within</spanx> form is that the right hand side gives
guidance to the types allowed on the left hand side, which typically
is a socket (<xref target="socketplug"/>):</t>

<figure><artwork type="CDDL"><![CDATA[
message = $message .within message-structure
message-structure = [message_type, *message_option]
message_type = 0..255
message_option = any

$message /= [3, dough: text, topping: [* text]]
$message /= [4, noodles: text, sauce: text, parmesan: bool]
]]></artwork></figure>

<t>For <spanx style="verb">.within</spanx>, a tool might flag an error if type1 allows data items
that are not allowed by type2.  In contrast, for <spanx style="verb">.and</spanx>, there is no
expectation that type1 already is a subset of type2.</t>

</section>
<section anchor="fortran" title="Control operators .lt, .le, .gt, .ge, .eq, .ne, and .default">

<t>The controls .lt, .le, .gt, .ge, .eq, .ne specify a constraint on
the left hand side type to be a value less than, less than or equal,
greater than, greater than or equal, equal, or not equal, to a
value given as a right hand side type (containing just that single value).
In the present specification, the first four controls (.lt, .le,
.gt, .ge) are defined only for numeric types, as these have a natural
ordering relationship.</t>

<figure><artwork type="CDDL"><![CDATA[
speed = number .ge 0  ; unit: m/s
]]></artwork></figure>

<t>.ne and .eq are defined both for numeric values and values of other types.
If one of the values is not of a numeric type, equality is determined as follows:
Text strings are equal (satisfy .eq/do not satisfy .ne) if
they are byte-wise identical; the same applies for byte strings.
Arrays are equal if they have the same number
of elements, all of which are equal pairwise in order between the arrays.
Maps are equal if they have the same number of key/value pairs, and there
is pairwise equality between the key/value pairs between the two maps.
Tagged values are equal if they both have the same tag and the values
are equal.
Values of simple types match if they are the same values.
Numeric types that occur within arrays, maps, or tagged values are
equal if their numeric value is equal and they are both integers or
both floating point values.
All other cases are not equal (e.g., comparing a text string with a
byte string).</t>

<t>A variant of the <spanx style="verb">.ne</spanx> control is the <spanx style="verb">.default</spanx> control, which
expresses an additional intent: the value specified by the
right-hand-side type is intended as a default value for the left hand
side type given, and the implied .ne control is there to prevent
this value from being sent over the wire.
This control is only meaningful when the control type is used in
an optional context; otherwise there would be no way to make use of
the default value.</t>

<figure><artwork type="CDDL"><![CDATA[
timer = {
  time: uint,
  ? displayed-step: (number .gt 0) .default 1
}
]]></artwork></figure>

</section>
</section>
<section anchor="socketplug" title="Socket/Plug">

<t>Both for type choices and group choices, a mechanism is defined that
facilitates starting out with empty choices and assembling them later,
potentially in separate files that are concatenated to build the full
specification.</t>

<t>Per convention, CDDL extension points are marked with a leading dollar
sign (types) or two leading dollar signs (groups).  Tools honor that
convention by not raising an error if such a type or group is not
defined at all; the symbol is then taken to be an empty type choice
(group choice), i.e., no choice is available.</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
tcp-header = {seq: uint, ack: uint, * $$tcp-option}

; later, in a different file

$$tcp-option //= (
sack: [+(left: uint, right: uint)]
)

; and, maybe in another file

$$tcp-option //= (
sack-permitted: true
)
]]></artwork></figure>

<t>Names that start with a single “$” are “type sockets”, starting out as
an empty type, and intended to be extended via “/=”.
Names that start with a double “$$” are “group sockets”, starting out
as an empty group choice, and intended to be extended via “//=”.
In either case, it is not an error if there is no
definition for a socket at all; this then means there is no way to
satisfy the rule (i.e., the choice is empty).</t>

<t>As a convention, all definitions (plugs) for socket names must be augmentations, i.e., they
must be using “/=” and “//=”, respectively.</t>

<t>To pick up the example illustrated in <xref target="xmp-personaldata"/>, the
socket/plug mechanism could be used as shown in
<xref target="xmp-personaldata-sp"/>:</t>

<figure title="Personal Data example: Using socket/plug extensibility" anchor="xmp-personaldata-sp"><artwork type="CDDL" align="center"><![CDATA[
PersonalData = {
  ? displayName: tstr,
  NameComponents,
  ? age: uint,
  * $$personaldata-extensions
}

NameComponents = (
  ? firstName: tstr,
  ? familyName: tstr,
)

; The above already works as is.
; But then, we can add later:

$$personaldata-extensions //= (
  favorite-salsa: tstr,
)

; and again, somewhere else:

$$personaldata-extensions //= (
  shoesize: uint,
)
]]></artwork></figure>

</section>
<section anchor="generics" title="Generics">

<t>Using angle brackets, the left hand side of a rule can add formal
parameters after the name being defined, as in:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
messages = message<"reboot", "now"> / message<"sleep", 1..100>
message<t, v> = {type: t, value: v}
]]></artwork></figure>

<t>When using a generic rule, the formal parameters are bound to the
actual arguments supplied (also using angle brackets), within the
scope of the generic rule (as if there were a rule of the form
parameter = argument).</t>

<t>Generic rules can be used for establishing names for both types and
groups.</t>

<t>(There are some limitations to nesting of generics in the tool
described in <xref target="tool"/> at this time.)</t>

</section>
<section anchor="operator-precedence" title="Operator Precedence">

<t>As with any language that has multiple syntactic features such as
prefix and infix operators, CDDL has operators that bind more tightly
than others.  This is becoming more complicated than, say, in ABNF, as
CDDL has both types and groups, with operators that are specific to
these concepts.  Type operators (such as “/” for type choice) operate on
types, while group operators (such as “//” for group choice) operate
on groups.  Types can simply be used in groups, but groups need to be
bracketed (as arrays or maps) to become types.  So, type operators
naturally bind closer than group operators.</t>

<t>For instance, in</t>

<figure><artwork><![CDATA[
t = [group1]
group1 = (a / b // c / d)
a = 1 b = 2 c = 3 d = 4
]]></artwork></figure>

<t>group1 is a group choice between the type choice of a and b and the
type choice of c and d.  This becomes more relevant once member keys
and/or occurrences are added in:</t>

<figure><artwork><![CDATA[
t = {group2}
group2 = (? ab: a / b // cd: c / d)
a = 1 b = 2 c = 3 d = 4
]]></artwork></figure>

<t>is a group choice between the optional member “ab” of type a or b and
the member “cd” of type c or d.  Note that the optionality is attached
to the first choice (“ab”), not to the second choice.</t>

<t>Similarly, in</t>

<figure><artwork><![CDATA[
t = [group3]
group3 = (+ a / b / c)
a = 1 b = 2 c = 3
]]></artwork></figure>

<t>group3 is a repetition of a type choice between a, b, and c;  if just
a is to be repeatable, a group choice is needed to focus the occurrence:</t>

<t>(A comment has been that this could be counter-intuitive.  The
specification writer is encouraged to use parentheses liberally to
guide readers that are not familiar with CDDL precedence rules.)</t>

<figure><artwork><![CDATA[
t = [group4]
group4 = (+ a // b / c)
a = 1 b = 2 c = 3
]]></artwork></figure>

<t>group4 is a group choice between a repeatable a and a single b or c.</t>

<t>In general, as with many other languages with operator precedence
rules, it is best not to rely on them, but to insert parentheses for
readability:</t>

<figure><artwork><![CDATA[
t = [group4a]
group4a = ((+ a) // (b / c))
a = 1 b = 2 c = 3
]]></artwork></figure>

<t>The operator precedences, in sequence of loose to tight binding, are
defined in <xref target="abnf"/> and summarized in <xref target="prec"/>.  (Arities given are 1
for unary prefix operators and 2 for binary infix operators.)</t>

<texttable title="Summary of operator precedences" anchor="prec">
      <ttcol align='center'>Operator</ttcol>
      <ttcol align='right'>Ar</ttcol>
      <ttcol align='left'>Operates on</ttcol>
      <ttcol align='right'>Prec</ttcol>
      <c>=</c>
      <c>2</c>
      <c>name = type, name = group</c>
      <c>1</c>
      <c>/=</c>
      <c>2</c>
      <c>name /= type</c>
      <c>1</c>
      <c>//=</c>
      <c>2</c>
      <c>name //= group</c>
      <c>1</c>
      <c>//</c>
      <c>2</c>
      <c>group // group</c>
      <c>2</c>
      <c>,</c>
      <c>2</c>
      <c>group, group</c>
      <c>3</c>
      <c>*</c>
      <c>1</c>
      <c>* group</c>
      <c>4</c>
      <c>N*M</c>
      <c>1</c>
      <c>N*M group</c>
      <c>4</c>
      <c>+</c>
      <c>1</c>
      <c>+ group</c>
      <c>4</c>
      <c>?</c>
      <c>1</c>
      <c>? group</c>
      <c>4</c>
      <c>=&gt;</c>
      <c>2</c>
      <c>type =&gt; type</c>
      <c>5</c>
      <c>:</c>
      <c>2</c>
      <c>name: type</c>
      <c>5</c>
      <c>/</c>
      <c>2</c>
      <c>type / type</c>
      <c>6</c>
      <c>..</c>
      <c>2</c>
      <c>type..type</c>
      <c>7</c>
      <c>…</c>
      <c>2</c>
      <c>type…type</c>
      <c>7</c>
      <c>.ctrl</c>
      <c>2</c>
      <c>type .ctrl type</c>
      <c>7</c>
      <c>&amp;</c>
      <c>1</c>
      <c>&amp;group</c>
      <c>8</c>
      <c>~</c>
      <c>1</c>
      <c>~type</c>
      <c>8</c>
</texttable>

</section>
</section>
<section anchor="usage" title="Making Use of CDDL">

<t>In this section, we discuss several potential ways to employ CDDL.</t>

<section anchor="as-a-guide-to-a-human-user" title="As a guide to a human user">

<t>CDDL can be used to efficiently define the layout of CBOR data,
such that a human implementer can easily see how data is supposed to be encoded.</t>

<t>Since CDDL maps parts of the CBOR data to human readable names,
tools could be built that use CDDL to provide a human friendly representation
of the CBOR data,
and allow them to edit such data while remaining compliant to its CDDL definition.</t>

</section>
<section anchor="for-automated-checking-of-cbor-data-structure" title="For automated checking of CBOR data structure">

<t>CDDL has been specified such that a machine can handle the CDDL definition
and related CBOR data (and, thus, also JSON data).
For example,
a machine could use CDDL to check whether or not CBOR data is compliant
to its definition.</t>

<t>The need for thoroughness of such compliance checking depends on the application.
For example,
an application may decide not to check the data structure at all,
and use the CDDL definition solely as a means to indicate the structure of
the data to the programmer.</t>

<t>On the other end,
the application may also implement a checking mechanism that goes as
far as checking that all mandatory map members are available.</t>

<t>The matter in how far the data description must be enforced by an application
is left to the designers and implementers of that application,
keeping in mind related security considerations.</t>

<t>In no case the intention is that a CDDL tool would be “writing code” for
an implementation.</t>

</section>
<section anchor="for-data-analysis-tools" title="For data analysis tools">

<t>In the long run,
it can be expected that more and more data will be stored using the CBOR
data format.</t>

<t>Where there is data, there is data analysis and the need to process such
data automatically.
CDDL can be used for such automated data processing,
allowing tools to verify data, clean it,
and extract particular parts of interest from it.</t>

<t>Since CBOR is designed with constrained devices in mind,
a likely use of it would be small sensors.
An interesting use would thus be automated analysis of sensor data.</t>

</section>
</section>
<section anchor="security-considerations" title="Security considerations">

<t>This document presents a content rules language for expressing CBOR data
structures.
As such,
it does not bring any security issues on itself,
although specifications of protocols that use CBOR naturally need security
analyses when defined.
General guidelines for writing security considerations are defined in</t>

<t>Security Considerations Guidelines <xref target="RFC3552"/> (BCP 72).
Specifications using CDDL to define CBOR structures in protocols need to
follow those guidelines.
Additional topics that could be considered in a security
considerations section for a specification that uses CDDL to define
CBOR structures include the following:</t>

<t><list style="symbols">
  <t>Where could the language maybe cause confusion in a way that will
enable security issues?</t>
  <t>Where a CDDL matcher is part of the implementation of a system, the
security of the system ought not depend on the correctness of the
CDDL specification or CDDL implementation without any further
defenses in place.</t>
  <t>Where the CDDL includes extension points, the impact of extensions
on the security of the system needs to be carefully considered.</t>
</list></t>

<t>Writers of CDDL specifications are strongly encouraged to value
clarity and transparency of the specification over its elegance.
Keep it as simple as possible while still expressing the needed
data model.</t>

<t>A related observation about formal description techniques in general
that is strongly recommended to be kept in mind by writers of CDDL
specifications: Just because CDDL makes it easier to handle complexity
in a specification, that does not make that complexity somehow less
bad (except maybe on the level of the humans having to grasp the
complex structure while reading the spec).</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<section anchor="sec-controlreg" title="CDDL control operator registry">

<t>IANA is requested to create a registry for control operators
<xref target="controls"/>.  The name of this registry is “CDDL Control Operators”.</t>

<t>Each entry in the subregistry must include the name of the control
operator (by convention given with the leading dot) and a reference to
its documentation.  Names must be composed of the leading dot followed
by a text string conforming to the production “id” in <xref target="abnf"/>.</t>

<t>Initial entries in this registry are as follows:</t>

<texttable>
      <ttcol align='left'>name</ttcol>
      <ttcol align='left'>documentation</ttcol>
      <c>.size</c>
      <c>[RFCthis]</c>
      <c>.bits</c>
      <c>[RFCthis]</c>
      <c>.regexp</c>
      <c>[RFCthis]</c>
      <c>.cbor</c>
      <c>[RFCthis]</c>
      <c>.cborseq</c>
      <c>[RFCthis]</c>
      <c>.within</c>
      <c>[RFCthis]</c>
      <c>.and</c>
      <c>[RFCthis]</c>
      <c>.lt</c>
      <c>[RFCthis]</c>
      <c>.le</c>
      <c>[RFCthis]</c>
      <c>.gt</c>
      <c>[RFCthis]</c>
      <c>.ge</c>
      <c>[RFCthis]</c>
      <c>.eq</c>
      <c>[RFCthis]</c>
      <c>.ne</c>
      <c>[RFCthis]</c>
      <c>.default</c>
      <c>[RFCthis]</c>
</texttable>

<t>All other control operator names are Unassigned.</t>

<t>The IANA policy for additions to this registry is “Specification
Required” as defined in <xref target="RFC8126"/> (which involves an Expert
Review) for names that do not include an internal dot, and “IETF
Review” for names that do include an internal dot.
The Expert is specifically instructed that other Standards Development
Organizations (SDOs) may want to define control operators that are
specific to their fields (e.g., based on a binary syntax already in
use at the SDO); the review process should strive to facilitate such
an undertaking.</t>

</section>
</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="RFC3552" target='https://www.rfc-editor.org/info/rfc3552'>
<front>
<title>Guidelines for Writing RFC Text on Security Considerations</title>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<author initials='B.' surname='Korver' fullname='B. Korver'><organization /></author>
<date year='2003' month='July' />
<abstract><t>All RFCs are required to have a Security Considerations section. Historically, such sections have been relatively weak.  This document provides guidelines to RFC authors on how to write a good Security Considerations section.   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='72'/>
<seriesInfo name='RFC' value='3552'/>
<seriesInfo name='DOI' value='10.17487/RFC3552'/>
</reference>



<reference  anchor="RFC3629" target='https://www.rfc-editor.org/info/rfc3629'>
<front>
<title>UTF-8, a transformation format of ISO 10646</title>
<author initials='F.' surname='Yergeau' fullname='F. Yergeau'><organization /></author>
<date year='2003' month='November' />
<abstract><t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems.  The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo.  UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values.  This memo obsoletes and replaces RFC 2279.</t></abstract>
</front>
<seriesInfo name='STD' value='63'/>
<seriesInfo name='RFC' value='3629'/>
<seriesInfo name='DOI' value='10.17487/RFC3629'/>
</reference>



<reference  anchor="RFC4648" target='https://www.rfc-editor.org/info/rfc4648'>
<front>
<title>The Base16, Base32, and Base64 Data Encodings</title>
<author initials='S.' surname='Josefsson' fullname='S. Josefsson'><organization /></author>
<date year='2006' month='October' />
<abstract><t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4648'/>
<seriesInfo name='DOI' value='10.17487/RFC4648'/>
</reference>



<reference  anchor="RFC5234" target='https://www.rfc-editor.org/info/rfc5234'>
<front>
<title>Augmented BNF for Syntax Specifications: ABNF</title>
<author initials='D.' surname='Crocker' fullname='D. Crocker' role='editor'><organization /></author>
<author initials='P.' surname='Overell' fullname='P. Overell'><organization /></author>
<date year='2008' month='January' />
<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>



<reference  anchor="RFC7049" target='https://www.rfc-editor.org/info/rfc7049'>
<front>
<title>Concise Binary Object Representation (CBOR)</title>
<author initials='C.' surname='Bormann' fullname='C. Bormann'><organization /></author>
<author initials='P.' surname='Hoffman' fullname='P. Hoffman'><organization /></author>
<date year='2013' month='October' />
<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></abstract>
</front>
<seriesInfo name='RFC' value='7049'/>
<seriesInfo name='DOI' value='10.17487/RFC7049'/>
</reference>



<reference  anchor="RFC8126" target='https://www.rfc-editor.org/info/rfc8126'>
<front>
<title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
<author initials='M.' surname='Cotton' fullname='M. Cotton'><organization /></author>
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<author initials='T.' surname='Narten' fullname='T. Narten'><organization /></author>
<date year='2017' month='June' />
<abstract><t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters.  To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper.  For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t><t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed.  This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t><t>This is the third edition of this document; it obsoletes RFC 5226.</t></abstract>
</front>
<seriesInfo name='BCP' value='26'/>
<seriesInfo name='RFC' value='8126'/>
<seriesInfo name='DOI' value='10.17487/RFC8126'/>
</reference>



<reference  anchor="RFC8259" target='https://www.rfc-editor.org/info/rfc8259'>
<front>
<title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
<author initials='T.' surname='Bray' fullname='T. Bray' role='editor'><organization /></author>
<date year='2017' month='December' />
<abstract><t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format.  It was derived from the ECMAScript Programming Language Standard.  JSON defines a small set of formatting rules for the portable representation of structured data.</t><t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t></abstract>
</front>
<seriesInfo name='STD' value='90'/>
<seriesInfo name='RFC' value='8259'/>
<seriesInfo name='DOI' value='10.17487/RFC8259'/>
</reference>



<reference  anchor="RFC7493" target='https://www.rfc-editor.org/info/rfc7493'>
<front>
<title>The I-JSON Message Format</title>
<author initials='T.' surname='Bray' fullname='T. Bray' role='editor'><organization /></author>
<date year='2015' month='March' />
<abstract><t>I-JSON (short for &quot;Internet JSON&quot;) is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t></abstract>
</front>
<seriesInfo name='RFC' value='7493'/>
<seriesInfo name='DOI' value='10.17487/RFC7493'/>
</reference>



<reference anchor="W3C.REC-xmlschema-2-20041028"
           target='http://www.w3.org/TR/2004/REC-xmlschema-2-20041028'>
<front>
<title>XML Schema Part 2: Datatypes Second Edition</title>

<author initials='P.' surname='Biron' fullname='Paul V. Biron'>
    <organization />
</author>

<author initials='A.' surname='Malhotra' fullname='Ashok Malhotra'>
    <organization />
</author>

<date month='October' day='28' year='2004' />
</front>

<seriesInfo name='World Wide Web Consortium Recommendation' value='REC-xmlschema-2-20041028' />
<format type='HTML' target='http://www.w3.org/TR/2004/REC-xmlschema-2-20041028' />
</reference>


<reference anchor="ISO6093" >
  <front>
    <title>Information processing -- Representation of numerical values in character strings for information interchange</title>
    <author >
      <organization>ISO</organization>
    </author>
    <date year="1985"/>
  </front>
  <seriesInfo name="ISO" value="6093"/>
</reference>




<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 initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<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 initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<date year='2017' month='May' />
<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>




    </references>

    <references title='Informative References'>

<reference anchor="RELAXNG" >
  <front>
    <title>Information technology — Document Schema Definition Language (DSDL) — Part 2: Regular-grammar-based validation — RELAX NG</title>
    <author >
      <organization>ISO/IEC</organization>
    </author>
    <date year="2008" month="December" day="15"/>
  </front>
  <seriesInfo name="ISO/IEC" value="19757-2"/>
</reference>




<reference  anchor="RFC7071" target='https://www.rfc-editor.org/info/rfc7071'>
<front>
<title>A Media Type for Reputation Interchange</title>
<author initials='N.' surname='Borenstein' fullname='N. Borenstein'><organization /></author>
<author initials='M.' surname='Kucherawy' fullname='M. Kucherawy'><organization /></author>
<date year='2013' month='November' />
<abstract><t>This document defines the format of reputation response data (&quot;reputons&quot;), the media type for packaging it, and definition of a registry for the names of reputation applications and response sets.</t></abstract>
</front>
<seriesInfo name='RFC' value='7071'/>
<seriesInfo name='DOI' value='10.17487/RFC7071'/>
</reference>



<reference  anchor="RFC8007" target='https://www.rfc-editor.org/info/rfc8007'>
<front>
<title>Content Delivery Network Interconnection (CDNI) Control Interface / Triggers</title>
<author initials='R.' surname='Murray' fullname='R. Murray'><organization /></author>
<author initials='B.' surname='Niven-Jenkins' fullname='B. Niven-Jenkins'><organization /></author>
<date year='2016' month='December' />
<abstract><t>This document describes the part of the Content Delivery Network Interconnection (CDNI) Control interface that allows a CDN to trigger activity in an interconnected CDN that is configured to deliver content on its behalf.  The upstream CDN can use this mechanism to request that the downstream CDN pre-position metadata or content or to request that it invalidate or purge metadata or content.  The upstream CDN can monitor the status of activity that it has triggered in the downstream CDN.</t></abstract>
</front>
<seriesInfo name='RFC' value='8007'/>
<seriesInfo name='DOI' value='10.17487/RFC8007'/>
</reference>



<reference anchor="I-D.newton-json-content-rules">
<front>
<title>A Language for Rules Describing JSON Content</title>

<author initials='A' surname='Newton' fullname='Andrew Newton'>
    <organization />
</author>

<author initials='P' surname='Cordell' fullname='Pete Cordell'>
    <organization />
</author>

<date month='September' day='28' year='2017' />

<abstract><t>This document describes a language for specifying and testing the expected content of JSON structures found in JSON-using protocols, software, and processes.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-newton-json-content-rules-09' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-newton-json-content-rules-09.txt' />
</reference>



<reference  anchor="RFC8152" target='https://www.rfc-editor.org/info/rfc8152'>
<front>
<title>CBOR Object Signing and Encryption (COSE)</title>
<author initials='J.' surname='Schaad' fullname='J. Schaad'><organization /></author>
<date year='2017' month='July' />
<abstract><t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size.  There is a need for the ability to have basic security services defined for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol.  This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization.  This specification additionally describes how to represent cryptographic keys using CBOR.</t></abstract>
</front>
<seriesInfo name='RFC' value='8152'/>
<seriesInfo name='DOI' value='10.17487/RFC8152'/>
</reference>



<reference anchor="I-D.ietf-anima-grasp">
<front>
<title>A Generic Autonomic Signaling Protocol (GRASP)</title>

<author initials='C' surname='Bormann' fullname='Carsten Bormann'>
    <organization />
</author>

<author initials='B' surname='Carpenter' fullname='Brian Carpenter'>
    <organization />
</author>

<author initials='B' surname='Liu' fullname='Bing Liu'>
    <organization />
</author>

<date month='July' day='13' year='2017' />

<abstract><t>This document specifies the GeneRic Autonomic Signaling Protocol (GRASP), which enables autonomic nodes and autonomic service agents to dynamically discover peers, to synchronize state with each other, and to negotiate parameter settings with each other.  GRASP depends on an external security environment that is described elsewhere.  The technical objectives and parameters for specific application scenarios are to be described in separate documents.  Appendices briefly discuss requirements for the protocol and existing protocols with comparable features.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-anima-grasp-15' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-anima-grasp-15.txt' />
</reference>



<reference  anchor="RFC8428" target='https://www.rfc-editor.org/info/rfc8428'>
<front>
<title>Sensor Measurement Lists (SenML)</title>
<author initials='C.' surname='Jennings' fullname='C. Jennings'><organization /></author>
<author initials='Z.' surname='Shelby' fullname='Z. Shelby'><organization /></author>
<author initials='J.' surname='Arkko' fullname='J. Arkko'><organization /></author>
<author initials='A.' surname='Keranen' fullname='A. Keranen'><organization /></author>
<author initials='C.' surname='Bormann' fullname='C. Bormann'><organization /></author>
<date year='2018' month='August' />
<abstract><t>This specification defines a format for representing simple sensor measurements and device parameters in Sensor Measurement Lists (SenML).  Representations are defined in JavaScript Object Notation (JSON), Concise Binary Object Representation (CBOR), Extensible Markup Language (XML), and Efficient XML Interchange (EXI), which share the common SenML data model.  A simple sensor, such as a temperature sensor, could use one of these media types in protocols such as HTTP or the Constrained Application Protocol (CoAP) to transport the measurements of the sensor or to be configured.</t></abstract>
</front>
<seriesInfo name='RFC' value='8428'/>
<seriesInfo name='DOI' value='10.17487/RFC8428'/>
</reference>



<reference anchor="I-D.bormann-cbor-cddl-freezer">
<front>
<title>A feature freezer for the Concise Data Definition Language (CDDL)</title>

<author initials='C' surname='Bormann' fullname='Carsten Bormann'>
    <organization />
</author>

<date month='August' day='9' year='2018' />

<abstract><t>In defining the Concise Data Definition Language (CDDL), some features have turned up that would be nice to have.  In the interest of completing this specification in a timely manner, the present document collects nice-to-have features that did not make it into the first RFC for CDDL.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-bormann-cbor-cddl-freezer-01' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-bormann-cbor-cddl-freezer-01.txt' />
</reference>

<reference anchor="PEG" >
  <front>
    <title>Parsing expression grammars</title>
    <author initials="B." surname="Ford" fullname="Bryan Ford">
      <organization></organization>
    </author>
    <date year="2004"/>
  </front>
  <seriesInfo name="Proceedings of the 31st ACM SIGPLAN-SIGACT symposium on Principles of programming languages - POPL" value="'04"/>
  <seriesInfo name="DOI" value="10.1145/964001.964011"/>
</reference>



<reference  anchor="RFC7950" target='https://www.rfc-editor.org/info/rfc7950'>
<front>
<title>The YANG 1.1 Data Modeling Language</title>
<author initials='M.' surname='Bjorklund' fullname='M. Bjorklund' role='editor'><organization /></author>
<date year='2016' month='August' />
<abstract><t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols.  This document describes the syntax and semantics of version 1.1 of the YANG language.  YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification.  There are a small number of backward incompatibilities from YANG version 1.  This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t></abstract>
</front>
<seriesInfo name='RFC' value='7950'/>
<seriesInfo name='DOI' value='10.17487/RFC7950'/>
</reference>




    </references>


<section anchor="sec-peg" title="Parsing Expression Grammars (PEG)">

<t>This appendix is normative.</t>

<t>Since the 1950s, many grammar notations are based on Backus-Naur Form
(BNF), a notation for context-free grammars (CFGs) within Chomsky’s
generative system of grammars.  ABNF <xref target="RFC5234"/>, the Augmented Backus-Naur Form
widely used in IETF specifications and also inspiring the syntax of
CDDL, is an example of this.</t>

<t>Generative grammars can express ambiguity well, but this very property
may make them hard to use in recognition systems, spawning a number of
subdialects that pose constraints on generative grammars to be used
with parser generators, which may be hard to manage for the
specification writer.</t>

<t>Parsing Expression Grammars <xref target="PEG"/> provide an alternative formal
foundation for describing grammars that emphasizes recognition over
generation, and resolves what would have been ambiguity in generative
systems by introducing the concept of “prioritized choice”.</t>

<t>The notation for Parsing Expression Grammars is quite close to BNF,
with the usual “Extended BNF” features such as repetition added.
However, where BNF uses the unordered (symmetrical) choice operator
<spanx style="verb">|</spanx> (incidentally notated as <spanx style="verb">/</spanx> in ABNF), PEG provides a prioritized
choice operator <spanx style="verb">/</spanx>.  The two alternatives listed are to be tested in
left-to-right order, locking in the first successful match and
disregarding any further potential matches within the choice (but not
disabling alternatives in choices containing this choice, as a “cut”
would – <xref target="cuts-in-maps"/>}.</t>

<t>For example, the ABNF expressions</t>

<figure><artwork><![CDATA[
A = "a" "b" / "a"    (1)
]]></artwork></figure>

<t>and</t>

<figure><artwork><![CDATA[
A = "a" / "a" "b"    (2)
]]></artwork></figure>

<t>are equivalent in ABNF’s original generative framework, but very different in
PEG: In (2), the second alternative will never match, as any input
string starting with an “a” will already succeed in the first
alternative, locking in the match.</t>

<t>Similarly, the occurrence indicators (<spanx style="verb">?</spanx>, <spanx style="verb">*</spanx>, <spanx style="verb">+</spanx>) are “greedy” in
PEG, i.e., they consume as much input as they match (and, as a
consequence, <spanx style="verb">a* a</spanx> in PEG notation or <spanx style="verb">*a a</spanx> in CDDL syntax
never can match anything as all input matching <spanx style="verb">a</spanx> is already consumed
by the initial <spanx style="verb">a*</spanx>, leaving nothing to match the second <spanx style="verb">a</spanx>).</t>

<t>Incidentally, the grammar of the CDDL language itself, as written in
ABNF in <xref target="abnf"/>, can be interpreted both in the generative framework
on which RFC 5234 is based, and as a PEG.  This was made possible by
ordering the choices in the grammar such that a successful match made
on the left hand side of a <spanx style="verb">/</spanx> operator is always the intended match,
instead of relying on the power of symmetrical choices (for example,
note the sequence of alternatives in the rule for <spanx style="verb">uint</spanx>, where the
lone zero is behind the longer match alternatives that start with a
zero).</t>

<t>The syntax used for expressing the PEG component of CDDL is based on
ABNF, interpreted in the obvious way with PEG semantics.  The ABNF
convention of notating occurrence indicators before the controlled
primary, and of allowing numeric values for minimum and maximum
occurrence around a <spanx style="verb">*</spanx> sign, is copied.  While PEG is only about
characters, CDDL has a richer set of elements, such as types and
groups.  Specifically, the following constructs map:</t>

<texttable>
      <ttcol align='left'>CDDL</ttcol>
      <ttcol align='left'>PEG</ttcol>
      <ttcol align='left'>Remark</ttcol>
      <c><spanx style="verb">=</spanx></c>
      <c><spanx style="verb">&lt;-</spanx></c>
      <c>/= and //= are abbreviations</c>
      <c><spanx style="verb">//</spanx></c>
      <c><spanx style="verb">/</spanx></c>
      <c>prioritized choice</c>
      <c><spanx style="verb">/</spanx></c>
      <c><spanx style="verb">/</spanx></c>
      <c>prioritized choice, limited to types only</c>
      <c><spanx style="verb">?</spanx> P</c>
      <c>P <spanx style="verb">?</spanx></c>
      <c>zero or one</c>
      <c><spanx style="verb">*</spanx> P</c>
      <c>P <spanx style="verb">*</spanx></c>
      <c>zero or more</c>
      <c><spanx style="verb">+</spanx> P</c>
      <c>P <spanx style="verb">+</spanx></c>
      <c>one or more</c>
      <c>A B</c>
      <c>A B</c>
      <c>sequence</c>
      <c>A, B</c>
      <c>A B</c>
      <c>sequence, comma is decoration only</c>
</texttable>

<t>The literal notation and the use of square brackets, curly braces,
tildes, ampersands, and hash marks is specific to CDDL and unrelated
to the conventional PEG notation.  The DOT (<spanx style="verb">.</spanx>) is replaced by the
unadorned <spanx style="verb">#</spanx> or its alias <spanx style="verb">any</spanx>.  Also, CDDL does not provide the
syntactic predicate operators NOT (<spanx style="verb">!</spanx>) or AND (<spanx style="verb">&amp;</spanx>) from PEG,
reducing expressiveness as well as complexity.</t>

<t>For more details about PEG’s theoretical foundation and interesting
properties of the operators such as associativity and distributivity,
the reader is referred to <xref target="PEG"/>.</t>

</section>
<section anchor="abnf" title="ABNF grammar">

<t>This appendix is normative.</t>

<t>The following is a formal definition of the CDDL syntax in Augmented
Backus-Naur Form (ABNF, <xref target="RFC5234"/>).  Note that, as is defined in
ABNF, the quote-delimited strings below are case-insensitive (while
string values and names are case-sensitive in CDDL).</t>

<figure title="CDDL ABNF" anchor="fig-abnf"><artwork type="ABNF" align="center"><![CDATA[
cddl = S 1*(rule S)
rule = typename [genericparm] S assignt S type
     / groupname [genericparm] S assigng S grpent

typename = id
groupname = id

assignt = "=" / "/="
assigng = "=" / "//="

genericparm = "<" S id S *("," S id S ) ">"
genericarg = "<" S type1 S *("," S type1 S ) ">"

type = type1 *(S "/" S type1)

type1 = type2 [S (rangeop / ctlop) S type2]
; space may be needed before the operator if type2 ends in a name

type2 = value
      / typename [genericarg]
      / "(" S type S ")"
      / "{" S group S "}"
      / "[" S group S "]"
      / "~" S typename [genericarg]
      / "&" S "(" S group S ")"
      / "&" S groupname [genericarg]
      / "#" "6" ["." uint] "(" S type S ")"
      / "#" DIGIT ["." uint]                ; major/ai
      / "#"                                 ; any

rangeop = "..." / ".."

ctlop = "." id

group = grpchoice *(S "//" S grpchoice)

grpchoice = *(grpent optcom)

grpent = [occur S] [memberkey S] type
       / [occur S] groupname [genericarg]  ; preempted by above
       / [occur S] "(" S group S ")"

memberkey = type1 S ["^" S] "=>"
          / bareword S ":"
          / value S ":"

bareword = id

optcom = S ["," S]

occur = [uint] "*" [uint]
      / "+"
      / "?"

uint = DIGIT1 *DIGIT
     / "0x" 1*HEXDIG
     / "0b" 1*BINDIG
     / "0"

value = number
      / text
      / bytes

int = ["-"] uint

; This is a float if it has fraction or exponent; int otherwise
number = hexfloat / (int ["." fraction] ["e" exponent ])
hexfloat = "0x" 1*HEXDIG ["." 1*HEXDIG] "p" exponent
fraction = 1*DIGIT
exponent = ["+"/"-"] 1*DIGIT

text = %x22 *SCHAR %x22
SCHAR = %x20-21 / %x23-5B / %x5D-7E / %x80-10FFFD / SESC
SESC = "\" (%x20-7E / %x80-10FFFD)

bytes = [bsqual] %x27 *BCHAR %x27
BCHAR = %x20-26 / %x28-5B / %x5D-10FFFD / SESC / CRLF
bsqual = "h" / "b64"

id = EALPHA *(*("-" / ".") (EALPHA / DIGIT))
ALPHA = %x41-5A / %x61-7A
EALPHA = ALPHA / "@" / "_" / "$"
DIGIT = %x30-39
DIGIT1 = %x31-39
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
BINDIG = %x30-31

S = *WS
WS = SP / NL
SP = %x20
NL = COMMENT / CRLF
COMMENT = ";" *PCHAR CRLF
PCHAR = %x20-7E / %x80-10FFFD
CRLF = %x0A / %x0D.0A
]]></artwork></figure>

<t>Note that this ABNF does not attempt to reflect the detailed rules of
what can be in a prefixed byte string.</t>

</section>
<section anchor="matching" title="Matching rules">

<t>This appendix is normative.</t>

<t>In this appendix, we go through the ABNF syntax rules defined in
<xref target="abnf"/> and briefly describe the matching semantics of each syntactic
feature.  In this context, an instance (data item) “matches” a CDDL specification
if it is allowed by the CDDL specification; this is then broken down
to parts of specifications (type and group expressions) and parts of
instances (data items).</t>

<figure><artwork type="abnf"><![CDATA[
cddl = S 1*(rule S)
]]></artwork></figure>

<t>A CDDL specification is a sequence of one or more rules.  Each rule
gives a name to a right hand side expression, either a CDDL type or a
CDDL group.  Rule names can be used in the rule itself and/or other
rules (and tools can output warnings if that is not the case).  The
order of the rules is significant only in two cases:</t>

<t><list style="numbers">
  <t>The first rule defines the semantics of the entire specification;
hence, there is no need to give that root rule a special name or
special syntax in the language (as, e.g., with “start” in
Relax-NG); its name can be therefore chosen to be descriptive.
(As with all other rule names, the name of the initial rule may be
used in itself or in other rules).</t>
  <t>Where a rule contributes to a type or group choice (using <spanx style="verb">/=</spanx> or
<spanx style="verb">//=</spanx>), that choice is populated in the order the rules are given;
see below.</t>
</list></t>

<figure><artwork type="abnf"><![CDATA[
rule = typename [genericparm] S assignt S type
     / groupname [genericparm] S assigng S grpent

typename = id
groupname = id
]]></artwork></figure>

<t>A rule defines a name for a type expression (production <spanx style="verb">type</spanx>) or for
a group expression (production <spanx style="verb">grpent</spanx>), with the intention that the
semantics does not change when the name is replaced by its
(parenthesized if needed) definition.  Note that whether the name
defined by a rule stands for a type or a group isn’t always determined
by syntax alone: e.g., <spanx style="verb">a = b</spanx> can make <spanx style="verb">a</spanx> a type if <spanx style="verb">b</spanx> is a type, or a
group if <spanx style="verb">b</spanx> is a group.  More subtly, in <spanx style="verb">a = (b)</spanx>, <spanx style="verb">a</spanx> may be used as a
type if <spanx style="verb">b</spanx> is a type, or as a group both when <spanx style="verb">b</spanx> is a group and when
<spanx style="verb">b</spanx> is a type (a good convention to make the latter case stand out to
the human reader is to write <spanx style="verb">a = (b,)</spanx>).  (Note that the same dual
meaning of parentheses applies within an expression, but often can be
resolved by the context of the parenthesized expression.  On the more
general point, it may not
be clear immediately either whether <spanx style="verb">b</spanx> stands for a group or a type —
this semantic processing may need to span several levels of rule
definitions before a determination can be made.)</t>

<figure><artwork type="abnf"><![CDATA[
assignt = "=" / "/="
assigng = "=" / "//="
]]></artwork></figure>

<t>A plain equals sign defines the rule name as the equivalent of the
expression to the right; it is an error if the name already was
defined with a different expression.  A <spanx style="verb">/=</spanx> or <spanx style="verb">//=</spanx> extends a named type or a
group by additional choices; a number of these could be replaced by
collecting all the right hand sides and creating a single rule with a
type choice or a group choice built from the right hand sides in the
order of the rules given.  (It is
not an error to extend a rule name that has not yet been defined; this
makes the right hand side the first entry in the choice being
created.)</t>

<figure><artwork type="abnf"><![CDATA[
genericparm = "<" S id S *("," S id S ) ">"
genericarg = "<" S type1 S *("," S type1 S ) ">"
]]></artwork></figure>

<t>Rule names can have generic parameters, which cause temporary
assignments within the right hand sides to the parameter names from
the arguments given when citing the rule name.</t>

<figure><artwork type="abnf"><![CDATA[
type = type1 *(S "/" S type1)
]]></artwork></figure>

<t>A type can be given as a choice between one or more types.  The choice
matches a data item if the data item matches any one of the types given
in the choice.  The choice uses Parsing Expression Grammar semantics
as discussed in <xref target="sec-peg"/>:
The first choice that matches wins.  (As a result, the order of rules
that contribute to a single rule name can very well matter.)</t>

<figure><artwork type="abnf"><![CDATA[
type1 = type2 [S (rangeop / ctlop) S type2]
]]></artwork></figure>

<t>Two types can be combined with a range operator (which see below) or a
control operator (see <xref target="controls"/>).</t>

<figure><artwork type="abnf"><![CDATA[
type2 = value
]]></artwork></figure>

<t>A type can be just a single value (such as 1 or “icecream” or
h’0815’), which matches only a data item with that specific value (no
conversions defined),</t>

<figure><artwork type="abnf"><![CDATA[
      / typename [genericarg]
]]></artwork></figure>

<t>or be defined by a rule giving a meaning to a name (possibly after
supplying generic arguments as required by the generic parameters),</t>

<figure><artwork type="abnf"><![CDATA[
      / "(" S type S ")"
]]></artwork></figure>

<t>or be defined in a parenthesized type expression (parentheses may be
necessary to override some operator precedence), or</t>

<figure><artwork type="abnf"><![CDATA[
      / "{" S group S "}"
]]></artwork></figure>

<t>a map expression, which matches a valid CBOR map the key/value pairs
of which can be ordered in such a way that the resulting sequence
matches the group expression, or</t>

<figure><artwork type="abnf"><![CDATA[
      / "[" S group S "]"
]]></artwork></figure>

<t>an array expression, which matches a CBOR array the elements of which,
when taken as values and complemented by a wildcard (matches anything)
key each, match the group, or</t>

<figure><artwork type="abnf"><![CDATA[
      / "~" S typename [genericarg]
]]></artwork></figure>

<t>an “unwrapped” group (see <xref target="unwrapping"/>), which matches the group
inside a type defined as a map or an array by wrapping the group, or</t>

<figure><artwork type="abnf"><![CDATA[
      / "&" S "(" S group S ")"
      / "&" S groupname [genericarg]
]]></artwork></figure>

<t>an enumeration expression, which matches any a value that is within
the set of values that the values of the group given can take, or</t>

<figure><artwork type="abnf"><![CDATA[
      / "#" "6" ["." uint] "(" S type S ")"
]]></artwork></figure>

<t>a tagged data item, tagged with the <spanx style="verb">uint</spanx> given and containing the
type given as the tagged value, or</t>

<figure><artwork type="abnf"><![CDATA[
      / "#" DIGIT ["." uint]                ; major/ai
]]></artwork></figure>

<t>a data item of a major type (given by the DIGIT), optionally
constrained to the additional information given by the uint, or</t>

<figure><artwork type="abnf"><![CDATA[
      / "#"                                 ; any
]]></artwork></figure>

<t>any data item.</t>

<figure><artwork type="abnf"><![CDATA[
rangeop = "..." / ".."
]]></artwork></figure>

<t>A range operator can be used to join two type expressions that stand
for either two integer values or two floating point values; it matches
any value that is between the two values, where the first value is
always included in the matching set and the second value is included
for <spanx style="verb">..</spanx> and excluded for <spanx style="verb">...</spanx>.</t>

<figure><artwork type="abnf"><![CDATA[
ctlop = "." id
]]></artwork></figure>

<t>A control operator ties a <spanx style="emph">target</spanx> type to a <spanx style="emph">controller</spanx> type as
defined in <xref target="controls"/>.  Note that control operators are an extension
point for CDDL; additional documents may want to define additional
control operators.</t>

<figure><artwork type="abnf"><![CDATA[
group = grpchoice *(S "//" S grpchoice)
]]></artwork></figure>

<t>A group matches any sequence of key/value pairs that matches any of
the choices given (again using Parsing Expression Grammar semantics).</t>

<figure><artwork type="abnf"><![CDATA[
grpchoice = *(grpent optcom)
]]></artwork></figure>

<t>Each of the component groups is given as a sequence of group entries.
For a match, the sequence of key/value pairs given needs to match the sequence of
group entries in the sequence given.</t>

<figure><artwork type="abnf"><![CDATA[
grpent = [occur S] [memberkey S] type
]]></artwork></figure>

<t>A group entry can be given by a value type, which needs to be matched by
the value part of a single element, and optionally a memberkey type, which
needs to be matched by the key part of the element, if the memberkey
is given.
If the memberkey is not given, the entry can only be used for matching
arrays, not for maps.
(See below how that is modified by the occurrence indicator.)</t>

<figure><artwork type="abnf"><![CDATA[
       / [occur S] groupname [genericarg]  ; preempted by above
]]></artwork></figure>

<t>A group entry can be built from a named group, or</t>

<figure><artwork type="abnf"><![CDATA[
       / [occur S] "(" S group S ")"
]]></artwork></figure>

<t>from a parenthesized group, again with a possible occurrence indicator.</t>

<figure><artwork type="abnf"><![CDATA[
memberkey = type1 S ["^" S] "=>"
          / bareword S ":"
          / value S ":"
]]></artwork></figure>

<t>Key types can be given by a type expression, a bareword (which stands
for a type that just contains a string value created from this bareword), or a value (which stands
for a type that just contains this value).  A key value matches its
key type if the key value is a member of the key type, unless a cut
preceding it in the group applies (see <xref target="cuts-in-maps"/> how map
matching is influenced by the presence of the cuts denoted by “^” or
“:” in previous entries).</t>

<figure><artwork type="abnf"><![CDATA[
bareword = id
]]></artwork></figure>

<t>A bareword is an alternative way to write a type with a single text
string value; it can only be used in the syntactic context given above.</t>

<figure><artwork type="abnf"><![CDATA[
optcom = S ["," S]
]]></artwork></figure>

<t>(Optional commas do not influence the matching.)</t>

<figure><artwork type="abnf"><![CDATA[
occur = [uint] "*" [uint]
      / "+"
      / "?"
]]></artwork></figure>

<t>An occurrence indicator modifies the group given to its right by
requiring the group to match the sequence to be matched exactly for a
certain number of times (see <xref target="occurrence"/>) in sequence, i.e. it acts
as a (possibly infinite) group choice that contains choices with the
group repeated each of the occurrences times.</t>

<t>The rest of the ABNF describes syntax for value notation that should
be familiar from programming languages, with the possible exception of
h’..’ and b64’..’ for byte strings, as well as syntactic elements such
as comments and line ends.</t>

<!-- # (Not used.) -->

</section>
<section anchor="prelude" title="Standard Prelude">

<t>This appendix is normative.</t>

<t>The following prelude is automatically added to each CDDL file.
(Note that technically, it is a postlude, as it does not disturb the
selection of the first rule as the root of the definition.)</t>

<figure title="CDDL Prelude" anchor="fig-prelude"><artwork type="CDDL" align="center"><![CDATA[
any = #

uint = #0
nint = #1
int = uint / nint

bstr = #2
bytes = bstr
tstr = #3
text = tstr

tdate = #6.0(tstr)
time = #6.1(number)
number = int / float
biguint = #6.2(bstr)
bignint = #6.3(bstr)
bigint = biguint / bignint
integer = int / bigint
unsigned = uint / biguint
decfrac = #6.4([e10: int, m: integer])
bigfloat = #6.5([e2: int, m: integer])
eb64url = #6.21(any)
eb64legacy = #6.22(any)
eb16 = #6.23(any)
encoded-cbor = #6.24(bstr)
uri = #6.32(tstr)
b64url = #6.33(tstr)
b64legacy = #6.34(tstr)
regexp = #6.35(tstr)
mime-message = #6.36(tstr)
cbor-any = #6.55799(any)

float16 = #7.25
float32 = #7.26
float64 = #7.27
float16-32 = float16 / float32
float32-64 = float32 / float64
float = float16-32 / float64

false = #7.20
true = #7.21
bool = false / true
nil = #7.22
null = nil
undefined = #7.23

]]></artwork></figure>

<t>Note that the prelude is deemed to be fixed.  This means, for instance,
that additional tags beyond <xref target="RFC7049"/>, as registered, need to be
defined in each CDDL file that is using them.</t>

<t>A common stumbling point is that the prelude does not define a type
<spanx style="verb">string</spanx>.  CBOR has byte strings (<spanx style="verb">bytes</spanx> in the prelude) and text
strings (<spanx style="verb">text</spanx>), so a type that is simply called <spanx style="verb">string</spanx> would be
ambiguous.</t>

<!-- The prelude as included here does not yet have a .regexp -->
<!--         control on tdate, but we probably do want to have one. -->

</section>
<section anchor="sec-json" title="Use with JSON">

<t>This appendix is normative.</t>

<t>The JSON generic data model (implicit in <xref target="RFC8259"/>) is a subset of the
generic data model of CBOR.  So one can use CDDL with JSON by limiting
oneself to what can be represented in JSON.  Roughly speaking, this
means leaving out byte strings, tags, and simple values other than
<spanx style="verb">false</spanx>, <spanx style="verb">true</spanx>, and <spanx style="verb">null</spanx>, leading to the following limited prelude:</t>

<figure title="JSON compatible subset of CDDL Prelude" anchor="fig-json-prelude"><artwork type="CDDL" align="center"><![CDATA[
any = #

uint = #0
nint = #1
int = uint / nint

tstr = #3
text = tstr

number = int / float

float16 = #7.25
float32 = #7.26
float64 = #7.27
float16-32 = float16 / float32
float32-64 = float32 / float64
float = float16-32 / float64

false = #7.20
true = #7.21
bool = false / true
nil = #7.22
null = nil

]]></artwork></figure>

<t>(The major types given here do not have a direct meaning in JSON, but
they can be interpreted as CBOR major types translated through Section
4 of <xref target="RFC7049"/>.)</t>

<t>There are a few fine points in using CDDL with JSON.  First, JSON does
not distinguish between integers and floating point numbers; there is
only one kind of number (which may happen to be integral).  In this
context, specifying a type as <spanx style="verb">uint</spanx>, <spanx style="verb">nint</spanx> or <spanx style="verb">int</spanx> then becomes a
predicate that the number be integral.  As an example, this means that
the following JSON numbers are all matching <spanx style="verb">uint</spanx>:</t>

<figure><artwork><![CDATA[
10 10.0 1e1 1.0e1 100e-1
]]></artwork></figure>

<t>(The fact that these are all integers may be surprising to users
accustomed to the long tradition in programming languages of using
decimal points or exponents in a number to indicate a floating point
literal.)</t>

<t>CDDL distinguishes the various CBOR number types, but there is only
one number type in JSON.  The effect of specifying a floating point
precision (float16/float32/float64) is only to restrict the set of
permissible values to those expressible with
binary16/binary32/binary64; this is unlikely to be very useful when
using CDDL for specifying JSON data structures.</t>

<t>Fundamentally, the number system of JSON itself is based on decimal
numbers and decimal fractions and does not have limits to its
precision or range.  In practice, JSON numbers are often parsed into a
number type that is called float64 here, creating a number of
limitations to the generic data model <xref target="RFC7493"/>.  In particular,
this means that integers can only be expressed with interoperable
exactness when they lie in the range [-(2**53)+1, (2**53)-1] — a
smaller range than that covered by CDDL <spanx style="verb">int</spanx>.</t>

<t>JSON applications that want to stay compatible with I-JSON (<xref target="RFC7493"/>,
“Internet JSON”) therefore
may want to define integer types with more limited ranges, such as in
<xref target="fig-json-types"/>.  Note that the types given here are not part of
the prelude; they need to be copied into the CDDL specification if
needed.</t>

<figure title="I-JSON types for CDDL (not part of prelude)" anchor="fig-json-types"><artwork type="CDDL" align="center"><![CDATA[
ij-uint = 0..9007199254740991
ij-nint = -9007199254740991..-1
ij-int = -9007199254740991..9007199254740991
]]></artwork></figure>

<t>JSON applications that do not need to stay compatible with I-JSON and
that actually may need to go beyond the 64-bit unsigned and negative
integers supported by <spanx style="verb">int</spanx> (= <spanx style="verb">uint</spanx>/<spanx style="verb">nint</spanx>) may want to use the
following additional types from the standard prelude, which are
expressed in terms of tags but can straightforwardly be mapped into
JSON (but not I-JSON) numbers:</t>

<figure><artwork type="CDDL"><![CDATA[
biguint = #6.2(bstr)
bignint = #6.3(bstr)
bigint = biguint / bignint
integer = int / bigint
unsigned = uint / biguint
]]></artwork></figure>

<t>CDDL at this point does not have a way to express the unlimited
floating point precision that is theoretically possible with JSON;
at the time of writing, this is rarely used in protocols in practice.</t>

<t>Note that a data model described in CDDL is always restricted by what
can be expressed in the serialization; e.g., floating point values
such as NaN (not a number) and the infinities cannot be represented in
JSON even if they are allowed in the CDDL generic data model.</t>

</section>
<section anchor="tool" title="A CDDL tool">

<t>This appendix is for information only.</t>

<t>A rough CDDL tool is available.  For CDDL specifications, it can check
the syntax, generate one or more instances
(expressed in CBOR diagnostic notation or in pretty-printed JSON), and
validate an existing instance against the specification:</t>

<figure title="CDDL tool usage" anchor="tool-usage"><artwork align="center"><![CDATA[
Usage:
cddl spec.cddl generate [n]
cddl spec.cddl json-generate [n]
cddl spec.cddl validate instance.cbor
cddl spec.cddl validate instance.json
]]></artwork></figure>

<t>Install on a system with a modern Ruby via:</t>

<figure title="CDDL tool installation" anchor="tool-install"><artwork type="shell" align="center"><![CDATA[
gem install cddl
]]></artwork></figure>

<t>The accompanying CBOR diagnostic tools (which are automatically
installed by the above) are described in
<eref target="https://github.com/cabo/cbor-diag">https://github.com/cabo/cbor-diag</eref>; they can be used to convert between
binary CBOR, a pretty-printed form of that, CBOR diagnostic notation,
JSON, and YAML.</t>

</section>
<section anchor="extended-diagnostic-notation" title="Extended Diagnostic Notation">

<t>This appendix is normative.</t>

<t>Section 6 of <xref target="RFC7049"/> defines a “diagnostic notation” in order to
be able to converse about CBOR data items without having to resort to
binary data.  Diagnostic notation is based on JSON, with extensions
for representing CBOR constructs such as binary data and tags.</t>

<t>(Standardizing this together with the actual interchange format does
not serve to create another interchange format, but enables the use of
a shared diagnostic notation in tools for and documents about CBOR.)</t>

<t>This section discusses a few extensions to the diagnostic notation
that have turned out to be useful since RFC 7049 was written.
We refer to the result as extended diagnostic notation (EDN).</t>

<section anchor="white-space-in-byte-string-notation" title="White space in byte string notation">

<t>Examples often benefit from some white space (spaces, line breaks) in
byte strings.  In extended diagnostic notation, white space is
ignored in prefixed byte strings; for instance, the following are
equivalent:</t>

<figure><artwork><![CDATA[
  h'48656c6c6f20776f726c64'
  h'48 65 6c 6c 6f 20 77 6f 72 6c 64'
  h'4 86 56c 6c6f
    20776 f726c64'
]]></artwork></figure>

</section>
<section anchor="textbin" title="Text in byte string notation">

<t>Diagnostic notation notates Byte strings in one of the <xref target="RFC4648"/>
base encodings,, enclosed in single quotes, prefixed by &gt;h&lt; for
base16, &gt;b32&lt; for base32, &gt;h32&lt; for base32hex, &gt;b64&lt; for base64 or
base64url.  Quite often, byte strings carry bytes that are
meaningfully interpreted as UTF-8 text.  Extended Diagnostic Notation
allows the use of single quotes without a prefix to express byte
strings with UTF-8 text; for instance, the following are equivalent:</t>

<figure><artwork><![CDATA[
'hello world'
h'68656c6c6f20776f726c64'
]]></artwork></figure>

<t>The escaping rules of JSON strings are applied equivalently for
text-based byte strings, e.g., \ stands for a single backslash and
' stands for a single quote.  White space is included literally,
i.e., the previous section does not apply to text-based byte strings.</t>

</section>
<section anchor="embedded-cbor-and-cbor-sequences-in-byte-strings" title="Embedded CBOR and CBOR sequences in byte strings">

<t>Where a byte string is to carry an embedded CBOR-encoded item, or more
generally a sequence of zero or more such items, the diagnostic
notation for these zero or more CBOR data items, separated by commata,
can be enclosed in « and » to notate the byte string resulting from
encoding the data items and concatenating the result.  For
instance, each pair of columns in the following are equivalent:</t>

<figure><artwork><![CDATA[
<<1>>              h'01'
<<1, 2>>           h'0102'
<<"foo", null>>    h'63666F6FF6'
<<>>               h''
]]></artwork></figure>

</section>
<section anchor="concatenated-strings" title="Concatenated Strings">

<t>While the ability to include white space enables line-breaking of
encoded byte strings, a mechanism is needed to be able to include
text strings as well as byte strings in direct UTF-8 representation
into line-based documents (such as RFCs and source code).</t>

<t>We extend the diagnostic notation by allowing multiple text strings or
multiple byte strings to be notated separated by white space, these
are then concatenated into a single text or byte string, respectively.
Text strings and byte strings do not mix within such a
concatenation, except that byte string notation can be used inside a
sequence of concatenated text string notation to encode characters
that may be better represented in an encoded way.  The following four
values are equivalent:</t>

<figure><artwork><![CDATA[
"Hello world"
"Hello " "world"
"Hello" h'20' "world"
"" h'48656c6c6f20776f726c64' ""
]]></artwork></figure>

<t>Similarly, the following byte string values are equivalent</t>

<figure><artwork><![CDATA[
'Hello world'
'Hello ' 'world'
'Hello ' h'776f726c64'
'Hello' h'20' 'world'
'' h'48656c6c6f20776f726c64' '' b64''
h'4 86 56c 6c6f' h' 20776 f726c64'
]]></artwork></figure>

<t>(Note that the approach of separating by whitespace, while familiar
from the C language, requires some attention – a single comma makes a
big difference here.)</t>

</section>
<section anchor="hexadecimal-octal-and-binary-numbers" title="Hexadecimal, octal, and binary numbers">

<t>In addition to JSON’s decimal numbers, EDN provides hexadecimal, octal
and binary numbers in the usual C-language notation (octal with 0o
prefix present only).</t>

<t>The following are equivalent:</t>

<figure><artwork><![CDATA[
4711
0x1267
0o11147
0b1001001100111
]]></artwork></figure>

<t>As are:</t>

<figure><artwork><![CDATA[
1.5
0x1.8p0
0x18p-4
]]></artwork></figure>

</section>
<section anchor="comments" title="Comments">

<t>Longer pieces of diagnostic notation may benefit from comments.
JSON famously does not provide for comments, and basic RFC 7049
diagnostic notation inherits this property.</t>

<t>In extended diagnostic notation, comments can be included, delimited
by slashes (“/”).  Any text within and including a pair of slashes is
considered a comment.</t>

<t>Comments are considered white space.  Hence, they are allowed in
prefixed byte strings; for instance, the following are equivalent:</t>

<figure><artwork><![CDATA[
h'68656c6c6f20776f726c64'
h'68 65 6c /doubled l!/ 6c 6f /hello/
  20 /space/
  77 6f 72 6c 64' /world/
]]></artwork></figure>

<t>This can be used to annotate a CBOR structure as in:</t>

<figure><artwork type="CBORdiag"><![CDATA[
/grasp-message/ [/M_DISCOVERY/ 1, /session-id/ 10584416,
                 /objective/ [/objective-name/ "opsonize",
                              /D, N, S/ 7, /loop-count/ 105]]
]]></artwork></figure>

<t>(There are currently no end-of-line comments.  If we want to add them,
“//” sounds like a reasonable delimiter given that we already use
slashes for comments, but we also could go e.g. for “#”.)</t>

<!--  LocalWords:  notational CBOR CDDL JSON valuetype datatype ABNF IP
 -->
<!--  LocalWords:  valuetypes datatypes processable tstr uint nint LF
 -->
<!--  LocalWords:  bstr keytype Struct ASN positionally struct Structs
 -->
<!--  LocalWords:  optionality extensibility structs predefines CRLF
 -->
<!--  LocalWords:  bareword barewords UTF bool IEEE reputon analysis
 -->
<!--  LocalWords:  wildcard validator IANA implementers prepended JCR
 -->

<!-- Examples  -->

</section>
</section>
<section anchor="examples" title="Examples">

<t>This appendix is for information only.</t>

<t>This section contains a few examples of structures defined using
CDDL.</t>

<t>The theme for the first example is taken from <xref target="RFC7071"/>, which
defines certain JSON structures in English.  For a similar example, it
may also be of interest to examine Appendix A of <xref target="RFC8007"/>, which
contains a CDDL definition for a JSON structure defined in the
main body of the RFC.</t>

<t>The second subsection in this appendix translates examples from
<xref target="I-D.newton-json-content-rules"/> into CDDL.</t>

<t>These examples all happen to describe data that is interchanged in
JSON.  Examples for CDDL definitions of data that is interchanged in
CBOR can be found in <xref target="RFC8152"/>, <xref target="I-D.ietf-anima-grasp"/>, or <xref target="RFC8428"/>.</t>

<section anchor="example-7071" title="RFC 7071">

<t><xref target="RFC7071"/> defines the Reputon structure for JSON using somewhat
formalized English text. Here is a (somewhat verbose) equivalent
definition using the same terms, but notated in CDDL:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
reputation-object = {
  reputation-context,
  reputon-list
}

reputation-context = (
  application: text
)

reputon-list = (
  reputons: reputon-array
)

reputon-array = [* reputon]

reputon = {
  rater-value,
  assertion-value,
  rated-value,
  rating-value,
  ? conf-value,
  ? normal-value,
  ? sample-value,
  ? gen-value,
  ? expire-value,
  * ext-value,
}

rater-value = ( rater: text )
assertion-value = ( assertion: text )
rated-value = ( rated: text )
rating-value = ( rating: float16 )
conf-value = ( confidence: float16 )
normal-value = ( normal-rating: float16 )
sample-value = ( sample-size: uint )
gen-value = ( generated: uint )
expire-value = ( expires: uint )
ext-value = ( text => any )
]]></artwork></figure>

<t>An equivalent, more compact form of this example would be:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
reputation-object = {
  application: text
  reputons: [* reputon]
}

reputon = {
  rater: text
  assertion: text
  rated: text
  rating: float16
  ? confidence: float16
  ? normal-rating: float16
  ? sample-size: uint
  ? generated: uint
  ? expires: uint
  * text => any
}
]]></artwork></figure>

<t>Note how this rather clearly delineates the structure somewhat
shrouded by so many words in section 6.2.2. of <xref target="RFC7071"/>.
Also, this definition makes it clear that several ext-values are
allowed (by definition with different member names); RFC 7071 could be
read to forbid the repetition of ext-value (“A specific
reputon-element MUST NOT appear more than once” is ambiguous.)</t>

<t>The CDDL tool reported on in <xref target="tool"/> generates as one example:</t>

<figure><artwork type="JSON" align="center"><![CDATA[
{
  "application": "conchometry",
  "reputons": [
    {
      "rater": "Ephthianura",
      "assertion": "codding",
      "rated": "sphaerolitic",
      "rating": 0.34133473256800795,
      "confidence": 0.9481983064298332,
      "expires": 1568,
      "unplaster": "grassy"
    },
    {
      "rater": "nonchargeable",
      "assertion": "raglan",
      "rated": "alienage",
      "rating": 0.5724646875815566,
      "sample-size": 3514,
      "Aldebaran": "unchurched",
      "puruloid": "impersonable",
      "uninfracted": "pericarpoidal",
      "schorl": "Caro"
    },
    {
      "rater": "precollectable",
      "assertion": "Merat",
      "rated": "thermonatrite",
      "rating": 0.19164006323936977,
      "confidence": 0.6065252103391268,
      "normal-rating": 0.5187773690879303,
      "generated": 899,
      "speedy": "solidungular",
      "noviceship": "medicine",
      "checkrow": "epidictic"
    }
  ]
}
]]></artwork></figure>

</section>
<section anchor="examples-from-json-content-rules" title="Examples from JSON Content Rules">

<t>Although <xref target="I-D.newton-json-content-rules">JSON Content Rules</xref> seems to
address a more general problem than CDDL, it is still a worthwhile
resource to explore for examples (beyond all the inspiration the
format itself has had for CDDL).</t>

<t>Figure 2 of the JCR I-D looks very similar, if slightly less noisy, in CDDL:</t>

<figure title="JCR, Figure 2, in CDDL" anchor="jcrfig2"><artwork type="CDDL" align="center"><![CDATA[
root = [2*2 {
  precision: text,
  Latitude: float,
  Longitude: float,
  Address: text,
  City: text,
  State: text,
  Zip: text,
  Country: text
}]
]]></artwork></figure>

<t>Apart from the lack of a need to quote the member names, text strings
are called <spanx style="verb">text</spanx> or <spanx style="verb">tstr</spanx> in CDDL (<spanx style="verb">string</spanx> would be ambiguous as
CBOR also provides byte strings).</t>

<t>The CDDL tool reported on in <xref target="tool"/> creates the below example instance for this:</t>

<figure><artwork type="CBORdiag" align="center"><![CDATA[
[{"precision": "pyrosphere", "Latitude": 0.5399712314350172,
  "Longitude": 0.5157523963028087, "Address": "resow",
  "City": "problemwise", "State": "martyrlike", "Zip": "preprove",
  "Country": "Pace"},
 {"precision": "unrigging", "Latitude": 0.10422704368372193,
  "Longitude": 0.6279808663725834, "Address": "picturedom",
  "City": "decipherability", "State": "autometry", "Zip": "pout",
  "Country": "wimple"}]
]]></artwork></figure>

<t>Figure 4 of the JCR I-D in CDDL:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
root = { image }

image = (
  Image: {
    size,
    Title: text,
    thumbnail,
    IDs: [* int]
  }
)

size = (
  Width: 0..1280
  Height: 0..1024
)

thumbnail = (
  Thumbnail: {
    size,
    Url: ~uri
  }
)
]]></artwork></figure>

<t>This shows how the group concept can be used to keep related elements
(here: width, height) together, and to emulate the JCR style of
specification.  (It also shows referencing a type by unwrapping a tag
from the prelude, <spanx style="verb">uri</spanx> – this could be done differently.)  The more
compact form of Figure 5 of the JCR I-D could be emulated like this:</t>

<figure><artwork type="CDDL" align="center"><![CDATA[
root = {
  Image: {
    size, Title: text,
    Thumbnail: { size, Url: ~uri },
    IDs: [* int]
  }
}

size = (
  Width: 0..1280,
  Height: 0..1024,
)
]]></artwork></figure>

<t>The CDDL tool reported on in <xref target="tool"/> creates the below example instance for this:</t>

<figure><artwork type="CBORdiag" align="center"><![CDATA[
{"Image": {"Width": 566, "Height": 516, "Title": "leisterer",
  "Thumbnail": {"Width": 1111, "Height": 176, "Url": 32("scrog")},
  "IDs": []}}
]]></artwork></figure>

</section>
</section>
<section numbered="no" anchor="contributors" title="Contributors">

<t>CDDL was originally conceived by Bert Greevenbosch, who also wrote the
original five versions of this document.</t>

</section>
<section numbered="no" anchor="acknowledgements" title="Acknowledgements">

<t>Inspiration was taken from the C and Pascal languages, MPEG’s
conventions for describing structures in the ISO base media file
format, Relax-NG and its compact syntax <xref target="RELAXNG"/>, and in particular
from Andrew Lee Newton’s <xref target="I-D.newton-json-content-rules">“JSON Content Rules”</xref>.</t>

<t>Lots of highly useful feedback came from members of the IETF CBOR WG,
in particular
Ari Keränen,
Brian Carpenter,
Burt Harris,
Jeffrey Yasskin,
Jim Hague,
Jim Schaad,
Joe Hildebrand,
Max Pritikin,
Michael Richardson,
Pete Cordell,
Sean Leonard,
and
Yaron Sheffer.
Also, Francesca Palombini and Joe volunteered to chair the WG when it
was created, providing the framework for generating and processing this
feedback; with Barry Leiba having taken over from Joe since.
Chris Lonvick and Ines Robles provided additional reviews during IESG
processing, and Alexey Melnikov steered the process as the responsible
area director.</t>

<t>The CDDL tool reported on in <xref target="tool"/> was written by Carsten Bormann,
building on previous work by Troy Heninger and Tom Lord.</t>

<!--  LocalWords:  representable precedences Arities unary Naur CFGs
 -->
<!--  LocalWords:  Chomsky's subdialects unordered
 -->

</section>


  </back>

<!-- ##markdown-source:
H4sIACGal1wAA9y96ZbbRpYu+j+eAk3VqSRlkjkoJVmpkl2pyVZfW/JVyj3J
ahEkkUmUSIAFgEqlVap1HuI8QP+4T9L3Tc6T3P3tISIAMlVyD+uudbRsiQSB
QAw7duzx26PRyNVNWszfpsuyyE6SptpkLl9X/Klujg4O7h0cuXk5K9IV/Tyv
0vNmlGfN+Wg2LavRbD5fjpZpk9WNm6XNSVI3c7fOT1ySNOXsJNm7yuo9+lJf
rarsvA4XZuVqnc6a1oVVVjT+liZvlvTCb+inR2Uxy+ssmadNmsyz87zIm7ws
kmVaXGzSiyzpP3r8+IcBXpomRdmk+DVdUpPFe2oStzZlkn1YV1ldJ48evniZ
0IiTvz978VzarGmss2ZDP7t0Oq2y9ycJWnRplaUnyel6vcxn3GjtLi9OuAVH
D1L3jg4O740Obo2Ojl26aRZldeJGSV7QKL4fJw/z6t2iXP5K/ZLZ+z4r3sVX
y4pae1qlm2JRnmdVcvbsFcagXdj6IVul+fIkWVAr46m28sc6b8bn/s7xPMNs
N1WW0dy+XGTUl6ZKa5q9u7d5lufUj707x0f3bvOs583VSfI4rVZEBfOG79gU
TUUXv8uqVVpc2XgejZN/yC/SovSjebSo8rop14vwAw/o5yJ/n1XUr//3/2mS
h1VGyxqNavevOrSZNTl+z03+cVPkoynfhJGFrjws0bki9CWt6iYrouvtrqSZ
vSx59S/PwhTRpxGtyHSZl80ie0dXx8mhnxffPZm2x6Ojr2/dvrdrkpJkveD9
89XxvdHx0eHo6PDr0Z1b944Oo8Gl0/KPza/5mLrmCnS0od6hCy+fPrp1+/YR
7Z5sRkRLqzXTq3eO7p0km+b8a/l+fOf465NkmtaZfL99dOv4hKa2OJfvdw+O
6X7sTPn+9eHRnZMkT4t0XS710tFtuuVPdVnoI8f3btEtI73yj7cejV8+eTT6
sFrWswX1fHQ0IiZwfHhwRG/+UM+P6KZnZy/uHNBj9JEWVuken0cy7fQ7f432
MP48K85l1LQh11U5o92YFxfJaJS8zLA3aa/Kj+V5UmxWWUW7bpm8T5ebrKaV
J+pIK+IZtB9onejJOqH26IfQal7Qr3RbcZHxO2tqI6txx4n14ezFSYLO83fZ
xIf3vr7tfDO6JE9+OP2n59+d/K1xNNlsUZTL8uIq+d//838lj8vZBmwsOePJ
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
pm2J3uQ/knVCN4MwO01r2muy2MqZ3GRD5y0xo02hcgSUwousGkDqnTS0JvRj
tB1odYQfrVK2Uglpu9SkXLUAeJsoU2F7fNTLJ2ALzDN4sE43lhrp9NTvPCfW
ntzPvCop0Cer/GJBMgmOgGRyOOFzj+/RdqebfNlIm29nizKfiT1ByILnw86P
tHATnhAoWDn/Tvxa5qjkz4XMV5FdsMfHz1fLbLH75V6MqdpMmAlWLbg0frWI
YXGzmTmnRBPetZ6eD9AyYPVFJw92qECxJP+rXVh+G7uPH0kMhjHygu6DKakW
ox5bnesNzDRBtoj5utqcSYH/Dp2XDfxoB/f4eEO2o2p8djcRN8wr3BbfkLyl
LQfH0tuhHRp6ZOg0pg7+2n0hGpHKeBqhoLEdNPugLZlFmXqhsmGzYBtZQlJn
IUELYkslqs3+vMlo/thx2G6/HjAdcbelYdCeW3uvhAgbZs1q5MCi2aRJnGXE
aOhna77e1T6LNDhymA5JesD6R8Yxcd+VhbkFbJXh9WNr2pMw0O/ksdpFFs51
diFcEDKJ0Z4aBYaqGi1UL7VF7s4x2zm8sf2+v4eNbYXf5dxYHzSgq7XMzkHG
50LiLKTwFHaMbOc8ftLR59kc7qhCN4bvpb2PZiODhC8+Aju4+71VxpsB33rX
DpVPf1I5QPjRenslR7UTW2TnD4qhWHMg/dpzyrlj17Gwa9WxVT3j45Vf6aQz
/mWstSmtt9583fBbXQ7PpYEoMYcVveA9ddn1QVX+ACW9lQ75lKcYMhebsUh2
I6apmyVu0V6FmTy1aTSaTjuLJ5ZnZqrSlIlk8tVFz31mk0UkSGJGpHE60ipm
UG24nS2tlNeU+wchtJpnFfrMs/ff3GE+OW3NtSt11uVOZlbnnWPrjN6JHVo+
w9dQlNErHG86czFhXWdwrHlR3B8Vp3beRrqXmNhtcHOSX3j+cqOqyC6Ti98P
bmyYXJrLsno3IsHzonjQm2GrVz3i2H+lPyICrYk/0WMPko/Qdy6yExxJQx9D
AzFhyOEqrKBUduUTN6EvSuQkGOXFCL3hyIgHvZ8/32l0A2yxWVRZ5olV11+e
wTyDrEVJai4zXdTZBp6MKSnfGRxIcJdVmdhHefZP3Pc0s8OkJ47UHoZi5nMb
SC8xw5UwIW4GpwjGX7JypMyopTJoK3RPTz5hOnptOcq3zPKH0yFFuhTbqdWW
Bf7Gqy5DFhkzW57TAUfsBJoPj02mkqmMDd5018A4MmmXYkl3ff5tgP1GE4r2
tcO6QYTBw1LOa5M3shoQZU8iovjg1nlOJNH/TSQxaJMEizAjGZVSxKnKNXxR
1p9FIdFChtz+3OglkLQy4A3r+HRmLSo6PhPVBpToSMhJ684YYsqmAe2m2enV
iCdlJ9HSTDHtfGKXaaZEsoDJCSQ4UBpkQx1Mi0ycvFxmkaOu3Q8Uze7OFS3v
e/UOFNmmqVK2aIOFLzKRW6H8XoK9m0rqdzpEG2XfoBpzu7Anqz0fQzVyeUpg
uegiSGmmkzpjlnqu4CwW+VmVGAzyXcbqKPM8Ep5as3HFkRFyHmmHhyQmpGyT
lr3EDK/G6qUQDvOZWH1oic6FK3Aok7G8k90M6jeSY2e5eSZGn2NUfq7yXz0Z
xtxKJdy2qYCd1zSxvFMlAsGfdqr2qgbi8qCog6vhpbNyfbW/TutGLc/tc83r
cuIFFj2YjgwYAorZFdYY+ik6FPVCZEruSb2Z8kPDhHQjNvzzYSYhco2wBpEb
vMzoDTcyCmOG9GGev8/nEHtEvbf+yJvzX7nHIpX+F5wubl5e/M3HiMbqxWiZ
FRfN4iQ5X5Zps/tkiibNFv1HDIIltrAGWOTrOp/PYThorv5md+Mbr+mgs3v+
Bo8d7BpKa753sy2O+4hv22ZgoqIRRZp5STmZijPptHwfu3tqhxBUetkG9vaU
fYTlph4oP2HfKVHvxAY2EW0+YuhmKAGxstLGXuoZXO9sEwC5Bc1d2VR4k26C
KIKQA6QidsrvGrDmeiP5mQMiPt6IjEpvJWzCb2M7pDkYWvznxmr1KZrRblgZ
CMZJkMWzRsa4SjmCgrf7lYQeeBuaeNvi543Dl0509+2R4lhhq4euRV6Z0lBj
xNstYA5MyJeTlA90EUfBctmxM9MbmeS5WUcdgp8Zpg7mCn01fl+J6k20AvVP
dIZ/lMfyWlgORo5TWVigdoSDxFZsRTcOKP3fiqeHNslzTHSXX1xkUXAhXL+1
9RI3YJVLcVJ5myE95PwT3DoeE+qG5I0+xEEkxHQX5Qxzx2cudFIllDOJ+GlT
itpXRD6N7ZIaH8TBA42PP5lm3rDCtl2EVvLEp3P2HLK7rwF9889s7vR7VU8T
0vDfiS6w19/j+/YGe/Ts42gULS2RN27Ujhq5ZTNJhBPJQzdJvGSL1YNvRPjE
l+HNpI/OJT37lTk6ddnfAo1bB79KebVZ48X0q9SQ9L1JXXnGOYeSoYdXAzne
c47cAefIJZ7ioiznuk3gkM1wi5plNXKCJBuEJsikkKwnoi1NC4xXy7JweREf
cLNU7O9euzBNKXZ5cTw4m/KI7TWZylupg2xvRhU5qT99ui/mOabvuoxfdSle
StopaNMUVieOS9FXeTY4WE0jctSBJe8QG7qckCYJ82wlPEO1hR3Ymt1UX+dN
vyo3hxKb6BVp5mFs9KXjmD9Q8zoEadprvoWIsqPIAgQdhze+N8jl/gAwyjCd
1puSujf6zkVKjBnM067G3TZMRH1zXb181DYkiNasPGOuITAkJGWFxfg7thRI
D/WMa72n2z3Z0D7UECw25XQC2JBrr27a+SZLqL9arNgr1u+Yj/wDa3bOyb/d
SBFzgnB+Qiw/SnTTzBysPI39p0yw4hAYBnpMENBm1AjXGAvX81LtnbpiQ73D
ZUW5uVBzhroO2JnUshb7KM+ZD34UJ2xejwfC/2QhvD2wa718FLzGvOe9g7VE
QAHHOTYWWTlDFOz7tMpVutXNJ8GBGuWJsAK2z+54N+7QGSU+QMw89zGvEoTA
wRxiwbUFtJ1vMTpF6b32JMqK1FGFGABRlJFN8fzlIfVNs1poW/EasgjHEd8I
ZtBGXV8OljRqWeQZemRfNDb/gtyrUfqWI7z/+ctbg6FThsMbb3I4CXOpghLv
4k4XjMIuLT7GCUOYHGa3JtznyeH49oTPB2Ye1zzPsfwl3ubit9n06W16aj6S
feDcj+zGXbLoGIyl5iYJIUpg3/xMsOOwb4ZkGIsXYB7f2+8RVSxJah603XX6
NEuhYNXe9rFBfxG8Hym6+bnfNZWEc/I5vUrfZWZxl1YQrxZHv/fXkNizZIsu
mbqMNp3T8WPXKl11lEKLSc84ZUnIvaXVktCIYT1IelOanSbPesl+0iuy2Tv7
/Ay2uiLjSAW6tRcEngfJHbrh8G6sHZCwcia+ajoEU9H11f0l8clRtNg1PG57
LbAYei77NWmrEXxPucYQy8pNc7hfVuB9LEFeZuk7VitF5lfZXuLY9Bmw1lLc
Qks6MxwEPwRmoi/gdxOT+kPQttlFscDqJUyXmCvz2kUWRBlqe+YlpgPaWmJv
SaDB2WfoZJYsyXpY8q2S/0my4RAmJAIm+/tuXY6m5Yetq1k1Wuezd5u1ZM4m
xEhnpuxF6l3ya74eSRIhGmhre5/CcaWkb6clRx0UUX5GnTX1jmPTBQ+VX65o
nvwBbjsrLRAlyBxCaccTSqp+/bg/MCyGcyRu2Fy+9LPFv7A+gqAjDh1uqSl1
MEf29h+oUXWfPg0j/QSu18h60nvQ0yW1fbRPG6m+zFdEcVUvWktqiCZ9iSRk
0b4TkiEv/Jd5RUx5hLHKmmytwTNvrQcPJ9m0AnNJzVGmsQCSESQxezwIBM9i
DK7vzWpwBqinpqfW6rzpyVM0HlVcbyQvkadYw93lh6siJ5QaL3HV5pUklgbp
X1fF73ZsdAf/tAaGvq3Q7ls2EIFuLstWOxqGm6rDhZ5xnM0AvrXIiZBPE2h7
lYb4SKSctKAheQV1Yx1ukJg5vQP5A/x+Y5N8wiDkm82LoDl+rNbjtz/PRJUh
0vhTqar0Zem0x3S1Nx73BkOR7OWwYqNG1EWJsgm/tXqn7TtY23WelQTHaHjs
np1vNUiN0frV3cbEzEqkiuwm9JMDGCSvBQFmV6zm9CVyOyM1NkdcrEwDCWN5
xTEgbILVDBnixB8/2mfY+PjozjQkY942sM2z97Tso8DUEGfsVumHEQccP0iO
bt92+vFgPPY/3I/WgJfG8ZKOirIIT97hJw/l0XHnhvuJ/AhVg85YWhvINFCH
0YP2NpK0nk2FI5pVeBxSchjxy+uuuEZHsYUv2CVdfY5esbt3imPRo+3frQU6
xZ4p2aXeHqDxhSxBpzH7a3meQIXv+JQjwtWu62L2aTpXdQ7zDZapdebkyFrl
DcBTeXhAs8eT4IfLXXbc3+hOvnfs7+af7d6Hp4/lzkNrlG9E8sjjJ0+fPX/y
ONxyFFrr3KIp1f6doaf7SdSbznr2z7IsVpARxLIMZ3oyXjb74wvRHsfLjD43
4qKgUwQBqKRADboWyXmpBjVxBTCHRct5sRHpP2R6awQKRAfnvkE+MjFIJm7n
jF0rw4kiRiSvTVP+0DxHlWeF2QxEF9YkD45yWLDa5g0t0qKNcsgBUvU6nfHT
bJ70nfn3fxuP//3fuENs6NADD2ETzC5aLRnrf7WpitiMy3KtcXaS7+CY8Udy
ZeFHytFJ8qMmTZr3gqnFdBmhDV07BIe5Ut14B6GFAukJV7R8AhKJtuNosjbF
pemJWo0HBaLdNqvNUvaiONVbg2sdW0l0bOkWjKOpwP7XSPL4gFMqb/zB+/te
IBHafX/4u9GIbUYVkfXrhpOR0uWIrwwlAJO2vXx/k4xG30T7tX03Pf976Lz8
hU5V/1HN91PSf96dJAdDOgbmJ8nhMKGeEsc4SY7o41WGUZ0kt4Z864ZEjWO6
vCKNmVTik+Q2fZldpXT3nSHH0iIx/y6M/+0+ohf8Nv/6ISNagJROkq+H8HEW
1I17+LSp4EZLDqlPybQiEZk+Hw63RUxvafWRrGqPzgsf8xlZruSw08gc8Ztz
8C5zJ2/0qq5Uce/n4gzLZwAv0JSMFdu2TVdiTaMpS/VCkgZP2uRVxPYjAaUh
YaewsCM4/Zk4zOTfgYtQ20xMV1ukLNs6hCEy16cescm8Ct5LySLsJJrQKfMn
U7JEBAricBRDNEzONNTvCK/7+JFhBmAFTJLvofqpoorZcPWCw8IRL/meXSkh
yErTFLEcPmNxcELdX5BixubjpD+5MRk4M9DivCjVRs+zrNGF3OIBRnZXfVU+
4SjhITk5BKP4Oj3h2s3Ny0YNlNpwO3nJ7Z4OiwOPVXCfEtIKnY3FU00PBz4F
HQ6/huwuIrFxNh4mk7S4msDqrLE0zM3CAkFoF7eF459YcrzuXr8jdo+A2nJe
duCH5RxhA1DUDA3hTtJ/lV4MbHmHwbpTnrOA2KQXFxgMiE8nOaTHYJYFI8OH
akRGjnF8fpL6tVBrX15/xlaHdCubRKXOXE5djrFPO3NvJ3PIvFtmpIxZOO6N
u+Oj25MvXb1Wan9au0W6PB/RlVnOp7PINvfRH2/2WiEpOJIRaq/8sOwxLx27
hcQFExFHCra0o/WTpJ13pxZRByOWT+xYZcjtZ/8NLLazJtaS4eWL50+smUXD
IZ7mNMgKiXyPuCq/lwkLeQy2uThDMnXncE0z5+R8K8vEMo+DvRBk0JfojPOB
zDXOaJmRMeuqK3piComWMQmqK2/10m50WJgmB2wa8wI7ZS0+ZrrDL2fMnsSX
xWgHUaA4AqyzD5JOxymIEjoBO5CPKaAR8dYzh6Ek8tK9WA31GpiHR7vSkqNX
V2+npDu/O09JZHmQ3Lgzvn377r17fX9xQOLXfcY6GrH1EgtZWhbN37n44VmG
YBQSc9cl8fo5ybh6hdu9d+/rPiwCA2c/2/V7/dfLnBSeOcRPklTfDJx8pxtW
+fIdtXgJS4fjLyR3O/5Knw4dP0Cf2NbQPor5CCtpGrAolrMqdgOePh/ajTU1
vi3CZFlqnoNQdwsYIXJ2nMg+Ikld4nwQZXilh6ryQlHrYZZxEfCB/LLMDFCB
/luVDWl8TYhelKzmplyPOAKVGFdVppIXEdzhHcyGIfLovKs9hVe34yoWty6L
iuxYhqMYruX7bkEH0fuMBTnO9zAjbWVTGKWaRKYX2dH+aNRECzWU0fj6LZ3E
P67AOCB072+FqsJvIzETiT/w/XEwO3txBkia9s5l71D22doiE8iJ4AFWttAn
OLiLtiGMVrxHsf2dh1AS76tBN3AKpEb/99mlGvxcHEzWSXubypt5MpDZcV/k
Hvxktm/XsX3zsG4k38l+ijBoavEViVMz9pLX61xjXBkggiF7AFAGuwYHU7ib
YgYctqPf2tERwZidViEfRwV/yKEQhVviSQGjBHFjDs2Dgc17MjVcPI4vnM04
l/SCAQrNnmOhEcFzJeZKVnPSGB+DEVqQUCA6a1qYQ1e4ok+z8NpJHcQ6Oi4Z
auvj3ukeXr73L3vDZC+Vz7/i84F8vofPv7zF3yP89Uf8Nd4b8tN7v9uj+WS+
DCrgiWUQMJjG14t0mgn+jCnQfbGa4V5pSBr+3d7AQhREAhdUMPZlRk8zBk4i
SRrz/CJvxvz9JiODPWetAMs0E09KgdiJ91l8zzNzg0HMzuKIAImSkInU5RUb
HDe2ZLCSuCUQ3eJqzUkgcYsgbLWUGyRE0ldWgXNJ4c3wpzelzgLWowfZ2gcC
DIYaLtK0EmRwwvpYCHUuCYaSvWfQ7R9p+Xk5t7OZeMj5RkCoWGWvOiF/w8h9
FPWSz32SwTbLKJ6IE00ZxmK2HjeLCiLgetNMoufe1ySobeatn1s9PI2yjgq/
dj7NLKAwafaZiAfptRgqoeWXm6UFV/dV0rDAroG6GpOAJxJtTRbsiSGXoEL2
KkcDkgY3mknmF69mOJQoZ4TeoPvykYKI8sCYwkyF2bu/B0v1KufQkkFE4uzx
oO1NqpUPJtCwHXZT9X94yvhcL394OtDXmBjlA8VZlYd9iNaJ/6FrJO/geY3K
NnhTryEIsGBkMArMJ2A80XsFnEqSXvsa52XPcBsqIOSMUtG2NtUsgZmhiFmZ
cE614oAHD+6rXsDfLvNaWpVkLOSL+jAgHfz3dCZZUrz3KAsdzTJFZ9k7+LAX
otoFImUYbW9+xYeBTI1nIHSEeBaSJN7HSWQh+He73sYt8Rune+OEDUF8+pBY
CGGHtzUMPtz1V1F0P7dClLe0KJMIz0Uk4L3eXsTHOUjKhAmzhdqRyCvlG25B
SVn23101CQhiFR3b3E2ihEo4zWUqJvVip1RSb9bIZvIJeZY+bzmwyPptTyHo
xdBsDIuEU7VMYYAJi5EmXTCctp3bxCPpFvoVJoyBTGHyMAI32ZpDtbiGOezt
9eKzUOAWrgCtJ3Y9eay3ED/a9M5xTyz2m8J+1/QpCe/SaDyFOwJEkJ4c0TC9
nCgpX6FHCA9SyS2rZykgE4DW4q3SP796OvqaXRp15ORheAaJ2GM5MAJ3ie1C
7khcSX5Y4FjRsD4zjHbsFKLMJBSKPiyyD3LsEl+Fen94J9iYvlaCwnXErOCM
ZoPlneP+ploOfCf1gTo5xj2324+1Xa98yphRxM3z9KIoazYReztDoOg70pIH
ZiRl7ByYZVgL2rEcngaRiJkjW89Z6eR4GPX9R3MSySktXkkyXVmFs8nPL8gd
6FPM9gWbjNZN1pA7BexcDenA/NkhQ/T1U8CeVQFccFJDCM57RgT4ucjhs08Y
q9ebARRdj/XwJzuSGO579IPURhKFlycXCEC4UHOypCuFKHcfHQ7VllOapB07
+rasuiShv5iJt22GIOjSf/nEyX8+hPNt+OUtB/jPcEDYdjf8OQirhciyLgTw
AdFB5DhNpoZ9bVvQ3fuWeL69cABJ8+ae6/+aVSXoDtYBcePufYX7iqx9NfcJ
YVBRkuKXmysTywqOIl61MlmSbqq7MJfCUjvlrOEgF/iAz1Pazu5AAV/sJvHt
tm8Ct+UrAw5R97PGZhdkukbXookMSfzGsqL5U9BRfjDRjEgHzi1S3Xly+MvN
w+QyqyKbIHvS4zaE0xW7X28RI3GqstsdXJlW2XXRlayaBxlxR1QJa30xadib
YxFaWyjEh87aZxr0NXCWXWNoWTnF52dyFriIhP0i6GQ/pCyb1ZFtVRbS7qZe
bxzGBsZ33BCzII972k7GUjeIwVrABtAE5RpKCbI7oBRRrzsXI/7yjO3U8fFN
yoLFWJiP2S2z9L0Z45GGlMThxT2A5PRip5xXagOCZt44IeQW8LUqy75/HDjR
6S3N9U8S/sZWzKI178wUDEZQUV4VdGURmYkFKc02bQMFp+laHf3sw3gb4cKQ
dEqz48rp+xyxeOcKH6yApIoQYcnQHn1C2KyGdsE4xJkckorzLgcZFic8lWCl
N2mi51VZruzSJ8ez/EAMxBwVkayO0KIYNKjj0ptrUIRgLNZJgtICx4bOd6Ph
dk7tRhpUTQe/9KDXSbIYM8CQRMixQkNkusnMAWW2aCbvPOzTtnleHQyLvJqz
moLuN7REHJGH3Naa3a7RlH2gSfm2Oyk8+v6LHdsRzmKGkQOn1gT0yuu0mDts
kZBn6FoxobCVZ4JkxFmvYkz6Kaiaotv50EX13l0DecI3q9md4WbVl8TQFjSO
Wj0GfJ+mG8bRnV5nVcSVTJhwG/eUiSCEHlK3BQBU8LBxIsBEFKENB/MUzXJv
WpbLnjuBhEyfQCvqGI38RHeH1zmajg6wT48OoWH2ECIoTZ0WW+dcq8EDvr8I
9yddRJPW7dL8Z1tnS0+3ETzFu+bwjn+PLE7Y7wJvAw727MmTJ8nd28c7HTNf
Oh+3B/6lt45+y0tF4P+PvvZOeC0J7b/htaI9/kdfeze8Vl76QiQsnfRhohPB
kpL2Dk9MOSOddQyoLdbha3SU5Ihf0/iHIKnLM5Fm3Hri1mCHoVzyj2LDUdjN
7SP0vm5MesK1TLk+T+CDyp7TjPYd2ATgM3SWhi0msLXrkrb3yEs3rouuaEiZ
dYD1nDTwNk6GyWQKXOwGn0TXnSRZM1NY21MeDAnSfCbHWWYGRhtQKPCi+s8b
DtbRJGpqBfkdbGthYWl4rfyWRuKj2NkiSf4TGzwRp9I0nM3Gre5QPTaFRnWP
FG7tQfL6ZiLKxxuH+NeyGjWXZfTz4c0jf0PajMA1m84tR6EJr8f0nRnogvKi
6gtHSG8pKq+8RDyRRiYdyG01PbP7hX1X2VqxEHJLOzMQFsxnk68MMo/hdy0o
me5X0yYW5yKToHNPhYKUxmFnFmIqKTUhMkRJLZl0Z3Pi55roCbqxe91jIlhm
Den3hwfHtMN76/pqtthUF1d06ejo4JguMZR7tbhqFitgefIPtw7fuNf0X486
sSKy+hWoFUeHtMN7M3pteVGl6wVdOj48OsZtJA7SvOYMbnF4+/AWmi3m5Syt
sFcANn588DVeRhIDUUoGqsKtd+7co7XpzUqFoSsLuvr1ndtvthVJpEm3sNHZ
qBUiPfjAX0kmjvkp4WMqdK/WpMEsNd8ubFsobCvVnWs1hfpEJAEYFfvjMn8H
C4ToC1jt8xLApxLuyQCFpAV0cuYDbLAk6gboWKtN4sU37w6MYGDVvC6iNXN1
j66OwSJiAlWtoFz6Fy+lj1EYHEPuksjBHlWgITR7EF45/bDhVKEstVoKwopE
eOf0Vc1tyuaO/USQgk8MdbMFRGNRMLwKHAuB9CY2hVgc95gkOWAEsDaUr9IL
yIV13mx0tkRDk2g68Ubqg+awYPiZbBzzF/BguG7njBiMhpdl+Y5JQ/ePQeEz
BzQxgnERD4fJLZ7bu2LU868UVVftZKrW2EugR22KRgzWGSduHidmSV6IyuTv
oedxwy2ObZHuQZ0NxwH/6gNFPWa8tTcvefQefQyEBWmbhvguy9Y8pz/joG42
hYAnkmwkNhAGqSwMF8/ss5I2zSqV979eprVbpXPxekX3eWOutCgy8g2DqZSd
2BMK7bUJU336DFepXkzwzRg308MhOxbVC0POjmqZeailNiP20SZo0mzZbBow
5bTfSXI1iyu7kCXCNobtSXofP/XinI7OMZn0fnn9pidgVf/Zw5EJE3uzZb7q
yvY7AG8F4dKjMXu3W1aQxjTvxHh/lwl/Rp7PayfVwoLbKglH4sW6fuTBi2v6
4bvWhaF741z7kqqziAKgjUtEoy1K3lH05z4tDEJPQW7ElURHPDz417t4Om2i
hz/39Hzr6U+dg4HDpoOHDtQRhq+zlqt5NbPcCkV9FHJhFzWyUMRlVwvaJjvu
LOagnSzMGSpi9jXXrIRqd+cqLFPUgwA6CdoWaZNe7vkpo3OxvhcAzAVSwbfm
czYiL04rj4m6renwTnJ6++uSD0KpWGEgTWy8agE0mfzJiOkS300y+ZPxxbhF
YMuSGdGo1ugPIQr5NuIT0YOI6C0nyeuvRDN4w7Aj7UUUzj/pNDsxO6gptXr4
hqpH3ehYnaMhG2QncX80/9S3bJAbBoKtzY59WJH3rKfe1+hlWuzO4NZMLCe8
FfXh2JHrlyqAAggJsHUkUmpEygtO46R/yXa19J1Yu6PQgHDTgMUTThw3BY8d
SfMIbsBUFDp8eau04EhbQdGwpHiDpaSgx3YhDe8bBiD7VFKLPK4v5jICu+/G
6AZQBclhDyrVeQclQWClvWHUkPkisa+9AH1YPM/joOpMN4DUtdGSWhxSJAyg
VRxjMPTL4bQH+qqt8j8GsRfWyQA5hvF4nUJEaOKwQNgYPxc5gFVVwH2LsDRF
Wo8BzDFHaq1k/Zk3g1f8iIY0thBSgMLvxqeS2vNSgaLWhMsUTilfksVJRzuo
AD6f378RKxpOq8ZjuaSuBZ2BpPLtsPs2vAZEHx8imhvyAEtEDNgjAVTxWnO8
6lD2f5vEeMqHgmfutirPIC8jbCIW6zaVmpY6yPTs2zB8jpgwmRYEwbYCxoo8
yAjNVh+AN07ts3ucolUgKwHzEcK8PdIxsqELXh3HriVDPYiyi7+A+fZibtcD
yIoyYP2h5mstJtzJ2RZYiU1TKyYZiU6yR7lHCx9VALZWL0hKnEFC9eV8QM9a
CQRg6BwlhLjOPC7YIHgjUuhJIxnn2YoD8A00URmZkIcgqEP4/688f2B9R7zU
Ggb6kYHSRFfKJS096380Td07k9dx5jQNbAOXB53LCsL1xu1qCc99lbzWbF/p
SVfJfbUIXEJmPlibVRXkfeadjCqRnFiyCm8a12dib8Nps99L8th8WRUJsZVU
MwQZpSSxXyn+Enh7FJphoTAXbVDavlgZt2C9W3mhP7E9JV1yqR5ZqW+tw89b
Fhp8e+T7N+QbI5sNkMNad6ih51sZSbutb3U88dWu0aed9beFyAKy77zQn0pm
2nG6dQVdUZWIYQC9l2IHVdYCHQ2SiiTOIfk3nqWollJQc6nFrs7dcjiH9Bxq
ySJGPYg2g2Zd4xxms593BEumQ8lqiSrFZvBk/a6sApwNGy7iLBHmEJJc20G0
ZyWuRgRuQAqkdmWU4hoVJ57VL1henfy3UBE2P27Floe/9b+WqpIbH1br0Vo7
K4WIBBfPBsAlq06sMJ4ohHEJBgOjldpeZbmEqbHkSMFS0TVxFVDqSoN8umFO
IyR/A+0Jp0lrObZMhR97YWC9E8R2kPgEwFrwbYgpgBWtV/gJJ+qv2bIHu129
BnuYbmbv8Aviv5GsCPvVEgbGXvZh8z5PucVsTXJCVsEWSA++y5d0QBDXv+Af
iXgvzvN60eueSn05luoSqvh6ubnQkBkMN9SIVYIJyQisPqtBUUx0Zr54xQkx
OIZkonblOgWTQtDRjOR9GIHzuFSS0hdkZZY8fXqvSs1ZV4cSK8MIcft8gN1M
PoAkrz65D5L87K7MGdyZE0EUNi8u6gvC2NdmDmy883rTBw4fMSAsansgKlJj
GA7t269at3MXBoEbXON/trwGn6ukUTgfoIVcWXYcs5OoVhTUJoAuN6VTXNA1
G9kEuS1vduGvqVMldu5I1p3A0BpHNtbZwWyZWV7jxpeAYItvxbSiRMEX2Fov
+b4+a9mZg0try/Dx2FrXplRhkdd0daWmZlpasItPLlxBm5bbviMF53lZjOaZ
5P8yUK0YJ2HyMCMym8C0VllluCxs7zjfSMEseTzMm6L6u21U/6T/05PvBpqA
QVs92QL5HyYBCKHetkrCdy1m6bQWM6BGVrOCw1O4kGwyRVL3zida43nO6XXd
ygD+cKa+0Ua7KElDWqy0ZJF4rJzvlOpGOE/yGQIiDWFk4bGbqFukk+HFVjyh
W82BDoy21mutBnD1leHVU1M/lpxb0UhZSjYdALSK2uHgJFhchqbvbxWOQE41
66a4f7MS2EoNWGrLuymJgyTvqknbjr9zmo1fT1TBl5ON7/QQi3S46QXRbmVm
H+gTQnPKTnLJD9HReicoOMyE3zOJ8MJkrM5woXW6W5lbIk/EGOr3eXhVhopO
IEH0aF/3gn/trgYVwEVa5Bhz6SwDzzlpEEjm8tTQr1PbhAAO9r2laolLx1fY
0iUQkWyLIpTnX1r5V7MMaS/ZUm47jcHDBcBM4P4EASBCSSlH1KUR/cPkokC9
iBPyGpt+u+N1NDFyqjzoqSev/YZPLzAFTTL5eIuz+I9PkjufJsOwHO2QOE57
R+89CsQEz00YKps9GBO0MNEKSrq9cObpUtC+INp/UXG2Wbs1eTK0BGZsBq6o
BYvbZHPbOm0WKM7KlQSLFtvjWMhZqgn6Lnb3RSYPohk2pbRSPGUdiIbUK5Pa
3Y4xoKQmE/Ry3X2sZbWKRSvq/v5WjKJlKjPpCANi7Z6TsbGrmex8SGVeMNr4
6LKskLPa9hGqzwRlYITVwYvqAjD3MEiCbOuT/NQGFbDZWis2nFZN4qHBZDk9
Kjmm2Y44HZyU3doq1doR26UibZSkuak0pAz9EMDuePmWV67YOrfaI0ZuI1vF
aoZw1lqztvVpO+eMZmvwmZds4uSynD0Pj+cYh5gGxcFmknFz9t2PUvy6t92D
Hbf/048/wNqbNlZRTWP6Qj1CK7kVWzgkekumlZ9yHqw+9sB6ipVg35Q3hzoX
NTZtyCYS4WH+mKNOJTVt6VUo79c+RoVTMYmBR8coeO4ldf7D6Pl3e3UyYdsX
9mA2wfog+oAxZGAtaXcnEp8lN79DAXASDAOmo9csap1E4upsVJTanYENCgqq
id2PNlICJzjxW0oPSe45yVlWRnyuJlNNW+GyeAtVcnTeW0zV2lpmMFyNzIZi
52TPlOQR7ebYNtbVBDuIa10d3IfMsmhrijeHUrbeoEn1YqR0/sw0aOMgTYp9
uMo8yG+KfYDkgUqL3QFlc8N1TE0Jx/7p+Hx96CVXZu1qdp3OnfD+4DrLvaQ7
ZDu1ZotdSmMcv3DdKe/ap+4wPsExbexcwyAxxgEfk3YMqJefi6VzqEYAJetr
4U0YiGU+Iv0u70Zxs1KIPeL9EwzV15oGw4VW77Nw0bwu9hor8ER8I1/H9TPi
A8f703z0hPEoWFBJxY3RXpD1VGn4OoymvX/tJb6aQbuMvR07PLH/CRr/1y+m
8lPuUl54S4z0RbEn5JCcZV3nQwwByUZHA833piTF26jEZYqXDJ0oZmHurBXz
s6JlmwR5l3RAT1EnuI276lrFc6fxf/BRC+wviIILX7VimtmDkLZzGCRQH7JM
2lWoGb7ElV6993IR3ccCZW9Zzt6hVz05H9CKmPxxsDAMPhTfrObofKCpZBI5
FGWbqzbu4aglZol9BNzdCJJE9Nqg1yTnSIsXmA0GmX5mEcjCISxXX1lrmKB4
KdusH3pcOReziNcIaCHHQHg1ohCrXrAzaRFNQTxkUL9Ya6yBeSyqkQygd9IL
3oTY72rqPTAmImBF3BbXHj4rTciZZfMYkzVK2NLnfJUi87OJuMhyjWuX7Plt
u+3ky3aa1TXl4WaM2qZoE+qWivfBb+lN3Jkv7Atbwi7q5OMNBJ5mM2YEvqBk
DNQSVXKPI2/vDAJaasNpAVt4Lj4rbwiXF268cWdcFAWnYA8seaooJN7FbcV6
60PMwwHMIqoi+/HRgg8PMAaPboQ4SYGpFFijdkyq6kXeIsT5Cd58HmeXtyGu
vDcGQblSrTMldVDHasVsUuWh77k2BHU6ed5aS31WMFyO+lNGdtn2A2FZ4nKv
USKjQqRqwZJ2lPHYnYYYbm6j5p1aZRdIkkdEmhnq2ri4O4rQAjSeASnvewwe
zXT++ednj3lNvDHNl/bgrNfJdLPJ5xONW2k3eg4WbhbW1sRsBLmGpuXW3Z3z
8qzorJxfUB9+ZsRy64gX4+eXzziaw3ZIF8JnU+X6xiPB2En2dyPiJD8Xl5XU
+o6DhS30w8C2PZpQp0AW7ypfYrvKLPJtWwCI/EmJxau3s82V4AyjSJx9WAs7
azXdChQQAcrJSZ7pGYdoVl+SxTXlWCe31qAAM5GQdkBsVeFUTQWsQ7W66Nwd
SvyzFMNJFX6WeyeKRyeayhhJiGLicCRAeEho4YZnPGB6J31fgO8q4vehkhxc
Lct55gJ2Qu+vvUHSwUOHdXYd+Ia9XrauNYUa0sv0SlB9FBUIjzC2xpLtDzKK
vi8yLVABsMUObGyOf8UuHHQ5UFq0zOBiRLEce09FAmIjoMakALyH3gU9FBoz
ook1THTjaVONkB7YcM5uoagKS7zfuCqeNKbF8cTzRef9cn7oDxL+enTCFkR4
u1oPwq2d7GjpjfP9je4UzMjOvf4dt04ku91fOPa2zeS+OC5sf7MNAsvX45hz
p550F3apEKuBwbGKcO3otWufHfe1A/pr3NJnx/JX9HXo+xrlrZixzGqmKZY3
DybQvw5/KVWelJSc7mfErsIqk9WGbNqa6iQqZG0VTT3UWmdgqu0PI0BOmVac
RPFg5cTd0l8MMpbbb3eCGEpd+0BEyaFgTih5tN1+RJX7vD/NOKJgN0Z7G/Yu
5PVxia4ojlj5bo2ceamcLjHtqTjBYVDgeshg7d7oYiUfzlEUkAPPA2XFUWHB
OoTa6SggmipgUW8Hr4uKnIUDM4lALl29IdpmNBumdG5vxMyaeFnIZodZBafS
I8E7Zn/mWwU/futBRku1ZwF0XRJg30a4kql/YplV8oN7n6fRdU96b8dbiRep
x1pWmHESyiTHdqw/jDzhhtdMhhrruQ3UnJrpFslnATOmBcTBUJ/jeOf4cdFr
WsMRFhjJOq2Sipi/GG5od3e8E7Qx5RiOZPd0U/ERvf2QWjAisa3ILp0aXhVA
oGtVUfxPE9B8RJ2HArPEWwZ2mHPtNo4CgGNOu1DBP2cFUTq9SsYYMYY74U8T
32/9VzU/TfEWBssLmReKNqJZ8fGC6/6wS1GIPh95CB0S63tAY9FQaeAk+2CY
VheimvP82hYAh8d4wM5z8cu2kRb6Prx0gOrzRo8YIknPQLILwXUiOZ7zIoS+
tgKY4EuNYO1fv/5K3GxvSEhaH+OvO28cfQLkPVQunubkmC7daV86vOPdcdHV
/uF4fOdWJ4ok7rNFkNjKslUU122BehYHLwaGuRoZuxMjek+XCsxfL8G8CtCk
wHKmiREBqDIGyfZDviKtprtabIIOqMExlD28xJumlaIazou02erotq1mwiqT
zNfzyTbQ/wRVAR7+86snZ2+fT4zQ9HvygAsI3Lz5vLWq6Wael29r06SjF9wi
aePoeDRFWdL2a/CWwzt37949oqXcuV4Arb9uzWw2t9bOszPJUgNzFjtQO9fe
oOYbRS22nYdCSWl3bsWfmdI774c0VYHYyq2Y6nnGNSV4+Vp1c2N83FxRBRAY
MLQCG7T5zomBsWLAJcJ9iTknKqHgU6qFicNa+5tiiQ1kKpONTZGZSlGfV0RE
oesBEVYD2UKGAhMrJzvA9aMZ97fG9wAsEunKg2u5Ii1vLVwRn8J+gI7aylDW
ODkl8aElewqTHIZytWhGJ9pOK512XygwOjA5ETjYqxk1GAUI+w9zzY6SHDIR
BATTlDFr6TXW7qSYODFz1MKuJ9TlCZtu5RihmZ706drrIvnmm+TWm+T3xG2S
P/wh6Rf08e5gMEj+7kFyMKHjsKVg7pqTHcn4k3wSZscZlbCbf5spU2fV5DPp
574jhXVhyKMxAKwdM9bavM1sfb5ML4R0jZvyAuBy7fhvg6mnowKo9AgGviqA
Sk+fSL5mTHrU464XAkmfJAyef3iEj5vqgj4yUj5pmvTxGB9nlxV9vM3VcWvg
7DtYDPrH4/HdAZKWoG6X5+dYDqGv6vIDd8sYDH+hi/iB+1cxNP8lY/V/oBav
OQf4uR08hV2k/KMFsmXNb48grDt2FcjLPvrc+/vwvkk881sZx7Vb7N07uDPf
SxZ7B4fnM/z79eHxbfk+vSv/3uLfjw/uncv3rzP8Ozu4fb7n+LlUn8/2tg1j
tQ+R9o5RDzsbBfOKkXvbxx3cU5HfU6MKWMdQKehSisfUKDckVUBA1TNSSCrn
YysZASG9MA5qR99ksbc3gVhHHw4O5CMbfvk7/uxNnJr2JZN/F3+SdP/k4w3F
uBNeZSAAnv23mJNIb1HCgtbSEBMR+JXzqEchr+afzh4b1l4cXxI9K6eRMr72
ptz98BYQwqnAx39Iniq+24d6fsQya9jURZorILUffe/16ehf0tGvB6N7b776
Y/yl/8sv4/j74Kve7p2jLXX2jqFVaffpjp4gkhnZR2EvfFh1R7gVQdt7fvjH
R9/fvvv90/HxvxR/zg7G83/++5fPx/nFn857W/ZEXxjaStKmil0cVJvrZlap
PqTq2vHwC4da/rJxAh8oG3YRwWFGi+vFNhagBUeO/2Idh+TfECqlWcDXU4od
V5z6ohJDyKWSlDCfTtOqoClJM74a6C8bRT6stXCsiJOkFEPYECl9hYC7lnov
ImSd7eyZaSPOC/YtuBDzu0fezpaTn4sMcE6w7CfuHgwFGnBkk2LXVSTBfKgs
Dk3zummzJQwGy9kyrRlDqNHyncOQn+/EjoG1P2dsDw4r2tq2y3xaAd2I5nBX
KA9yvQOap5hyES+qXuya1GSO3h6bRNChUB4Xx10b/GCn93ixD5KuM2fpgsMd
DkaecAFJqIXKzr5/8fMPj0Mgt1hF7FVek+YJFo2MvTsvWFmoN9UaeVm1itvm
aVQYU1rG61YCoJ/qUeE62c9L1VH9GnFG7BaEqYd02P6JRASErFxwDCkRLeJr
JB71PK0XilUZKodnkJfM6s6RQfkqA+yyKlK+gFEMW6dDyOachiTpqlz9KUkm
rx/N3rw+Td+8PqvfvH6SvZmMfQHwaEjrcs2TsbWIXtD+5ZLf/cvc1/BArZ9i
x/LTYNaIcxC0PS3pFIhW4yctDYQDHcGCT88ePXs2kuogfj5kuBszZZt5068w
JOVfMD3ctzMwRYmP4irvGpts+LeINBCZWNGOJ+NJq+RzEo3C4rvYK6jw4xGK
5C+MQfVLoYFNN5LHErME2UJLJUgoNtfHTd+XQng7Nmpe8Pbz/rtghQQsJ8oN
XEmMdCjATNOLQlArhKUgLGYXKfd/evTyyYA7cUnbaHnlJNC94NmdptOlpOfy
HClcGgc7X7M3oqPAs0aUMZAksPeRJZMJCm9PItTDaYB5iIMRrUKTL+FFJMMx
VdzIdduUqy6Xl+NQk0Jxlgsru+BrMdm8Pnvy6qnVEKFL/3z6/DsSP76Fgnjv
9gFLIG1YRwFq9YapVEq7IsZ4K6VEksWlhKaI0CXvLF47NsLM58m5Wgt3UIDo
u4gHCSlWUeRhZCKW4Z7b3hlLnkMMgmJSWW+8pg71OqAZJHAhzeLXrOIRMw41
2+882cvBG2Fq/kJL8stj+n9B/39P/6/p/5/of9pDv5zR/+/p/38YMno1t/fL
pWyuX/5RoOk9nnra5S5DK1IlSl7YXL4tO4mvTEzV8n54eiyA2buk5joZo+CK
FPvDJxqOyM348sU6PlvC4p9DGFMAhKeJ9d5V4kaPGR9mPuxEIcTBNaz3e6ma
DRhgbqNQ249EdN4VjkMkDo2GtxzesGp8k0xEgpMh8wMT0ia6mrxOw3/F4I04
PFLQ1kQQt9BY9SgisY5KpknCqDqKWVFjZ1R3mtwXTZOA+R/9hmmiEXD7RxMN
Qo5Sf3ymiIzJD1aMqcGNPzW3EECRIvYMk4/3EXUnsVO5U4Xvgw/3zjkR6+DD
+bmkDWSCZMI3eqdb1FC6kwodU+Hg2l2heNa8LwAqznuCPnSoQp1UWyrlFj1L
2TH1XbbKU4pxS3PLrqH4cDuJ40854cjCWLeq1/JVjmcwWE1zUtAsCjanVD4b
8FrLvhlzB3SdT60ylj3ZGbm+Y6KT5H8wl5wJWUK5MUIiwhhPRFjYMQnww2cq
Z09JDu4kFwSiHvlnxvEYDINchyFy5lSrYq9qL++osIzcCUneimqE9OOZG0jE
nfQ7mskwcjbU5tHCd5ZLsA/cxSafp7o1bJlrH32rFd7aU+KL+F2tNU2AgcMl
r5OrnUQZnoN2mA7QIbjo1e/so82Nfh95aBy3dQUOG734VhytN+2rBAW9cfHP
UsAWlYrbd9F1CIrOd2Gf2r0F/ObNxUJjBFBzCpv/BKiGuPLmTfv+4yFJL+Wc
4QjkiTrdwLgoX0j1ortRfhNgrRYmAAnQr9BQS1SqWMzWp7gcuJCO+n8DA3Ye
WZtxxiKwaxCX4P0y1adAiGM7H++RlsiHjUCEFGlu9jY4qa8ECT6icW76Wo60
pBeNIbqML/DpAp+yP9NfhSZQjQ3w/OMNK9UrZk0vmn2ujcimF9wJRJruut2q
AXFq6jJPRTEMH9mMh0pOQ3fBIl+ld8Tfwk32D4usjX3DYaJpeJF9rbvNBFJE
LSpghhxzHBeMsGrmz9pi9XY+j8aSMBiBn7m+nzpnUzdoWeykxnPJxVlQlNnX
vDIoY8npTApYDdKl80h9can2lnGPepbNfeoh3pgcAOcLsvJJstqvldyxdrz8
dFLHPTLG53tk5RettDurWRG6EZe7iCoB6E2KtceBrfHgdL04F6WOE2fj6Knt
Ai14JunXNOaaiI06vW/mObtU0NTmXGNT9C4c5iPUsQl8+76YRhiIQ0LEdzik
T0Oer7xVEI+uwjnADWhqJwKwtUyPYEf4MsuhAYS1S0cKzQWKpRSJZRu7Hzm4
7YveqiBQcb7c0GSBikF9/Cv9ZMev7ObadYUmzpNzryT8y9Z/q2dMKe3uNcwm
o3z32vnnxu4fPPlwzJidZ6J5WKsGGNYqdPk83h1JlKtg8hbP4VDzvSQWsN13
F/c971C3+rlTM4cYBZUByRIGXBHGdhagJ7LB2ku4iiQK6iGglCuKMZsURLxs
uQ8U1SkixMF4p0BVZDvkKWXg/yGBSsbfxRZxu4QmK1dTeHQ9OzmkEQs79Vzf
hUe1BK/RhuEVjYusM5wqUwwxmJSkVqO2jrhxc8JiSqzc2yUp6mYhCE0xY1Vj
FCwvl6YtdaOpFH3LpVGRFM78+9DcD7WwtGuXPurCF4iMQvj5zGvNSduXmq84
mBG5BPgcgFI8wAqglppsfZL0PftukoNBOKMPfaoyEEJZlNv/iWQ55x4a35bk
AqsZTxMuoXF6Zcjod6hYoDm/Pv0DKul5OkOaoIIqamlBWFMFmmO1JkYSNw0L
5mq69LFUnDc0dDEIYgyaiIqireojVnFEffMoAi9n6Wa5bAfJo1KFhIK9N6Bh
wUxtm4oMn4HrNFk1QQ0VnNPpklaOq0NKdToJICaG176FC0jS4a2F6xCCxUnB
i7JQ25cL/eDgM9rnJPjUio7qpUTFspa8icriNSWQJIp5o3nSk+lqNfU7oVBN
XgWmQqc/Wl7Xj5cWMB4M/YE6I2qaqwPWbdetH4JrP5IGbtCg7JiXjzeT3/0O
98muIJnwvi6vmJpCzWKsKgns0c3J/j4inGtu7fVXfXAEa5Y5i3wZvEGUM4pD
zcG6ryQewQLzP9vsyCO9EhurNtk25BSDf4skxxUmDdFVxLre73pMKT2eTtGJ
AJ7dInokncTTLvzLs0BzDehXhHT29h/0xte+WwH5er+zl8vy7X67EwuOvD1e
5y/pBXeDRFbFKMaJZC4PVkxiTSZSPDqYXF5tDDRqpGl+vG69XGfimIUNxXg0
gSp5VAOFkWlt6nQZ12mlTQhNtR5ILJ70RnDdffHdzYWPiaptC+AI9zEukjuF
pZGsdczOMCr3umRg4FISCTeSsuCDMnzIg5p3u6hTKGqLA1P6to/eRvx1CwOH
q/viuNluaVSvP30ihfy/C4vrd79rvc0zzvq/ApmLq51ZNIgpqpdl9U4M+yQf
3U8eisOnYA+EwZIxSznBPr+md7rpE3rte6DSZKM6XdZp69UCmUcqnOT6i1c0
W9bZFzVMa8LByjtLFmzjjNE67YQaC6i1PzPBxRSxBTzmSyrns9q5n/XkAGcy
NOzhLnuXQFRvlmH+xBKFrGBaD6mteN6oZCRJNiwy+TpY7LaMCyip3QRrrh//
0KuyaVkyKllRXva+SfbDT/Uyy9YoKDAeHx4cfGOP/4E4+/tvQKNglLQ4QxGA
TpL3LLB0cKQtIfNCpoCHZNmCbFmLx8OS+KYwsAjFhfHGaXHvszjZ5xiDzY7Z
HAyjUoOunpU+k7HVB6vDptIeOxnlh6gmXZhsGKu0F2Bm30UtbaVMJFkNzKu8
5mCXUChFDLxi2CORWWQOhe5QHyfHbHINCovECPkn1C8dQEjbIWHFhXyJOA7N
YjEgflpqwwuLhPpJXXyzjPmyRu5ceYAMOdHga1/BdAz2GGrValyDd2c7SSfQ
swqfomK0LLkxzoS3UzUSX4eqfBzvASlheeXE1IPlqKOyYVPUkN+J2C+GohpO
DwRDPXz+FCTv/Avbs60lq4aG9tnqjM+TOIfiydnPtcis2brh3rBY5x/qmyO/
t9/rCuIDvS9jy5iYeATpQ/NWdrWizbRkPGsH+fFKKtIRoTdNHIxAhW2E8LZr
ZfWQq+F0e/DWqTs1ewZyzwzEJ4YeJIEPVZq1Dju1TOGtWD2uAasmus7YNDUv
eNnpGGTegBzd13zz4RvZAIc4gVLiO1Pi0smMPswHDkfgIV15kBzRpQfJrQR2
rmOpXaaPsW00nrG2bSOsiLBSTp0wrdR1fpaEwLnRnUyF4rH5mnSM2RDVoIaX
aR+4iaFgpAXR8IKchCF/5H4efZK+H2HIdGhPT5IwcJJuv2Twnx+1V2u1m710
2vPVbVJOi9ECuH4kvdk83AI8PJ6GNoyrNauWvLQhTrDI5k59FWIO1e708c7B
0NCaWNcRqBK5Ydzypm7TxS2li1uYpK9sgpLZjnmJyOGWkAOy35qQ99uiApun
lHaIFui+n+AEgCGYGveQJ5JCB0Vq2J3r3NK3cet5OdtoiIKnAFrz/qnVgBU2
JGtj7NiLiVrOBNkNG6t//eozWFFcAAXYnnMLMouqDCBCTXDKwb7gSzIQqIjD
cZQbBLo8VTQ6y8vXs0BOMxwW7SU51iU59kvyRWty/JktmkazrJvTK2xTEOFM
IGMUGyYkcXAQkGiNAc2pxdOjATEqmc+7nmaAZhayrDKPzbRS/KlSMWVa84oE
yKgc+8nW1KQ2N5iJPmZngOnpy/xcO0GvFtmuDkv9gDgmYMkAnthIkn+cF1KU
Iy6vxsd+Oi3OcexDfrQiifoT2v/0CeFdp8A/o2Gpn4SI4lAquDAEgZ7jUcIe
NSZJ/wpS0DneQSp/CVLFX5JT/CXfYf0tkvafv7DgkfyFHnoQrtEr/iIC7APV
vfWLUM5fcNchP7T/YMdD+/JU903hIXuq9dC+NX/dQ+03yb10dfdDR/zQMNnx
0HD7EX3oFj90M7pG705+ubnrAf/QMT/0/OaPrYfwffdT0UNfdd701XUvih/6
tvPQt1/y0C8PvmlNhMHBX7NOt/mhk+iardPJjkdaD+13HuLb93c9xQ/d4YfG
4+2HxuNr33RXHxrveGjXU/FDs6ZadrsnFzsPRg/9PrqGKf/9dTMuD33ND/21
89Bfdw2n/dDHk+QGWAPqD9QPeqTMJMuk6pnGeyZAR1LQbZtTQbVFAbl3EM5/
rn06WfLxBud/RmBvGivBxgCFo6Nr7zugX1JGo9TYZcVY55KMfIrwmcZJ64vN
KuU4z0pLyHbQKHwanUc8Ev06vdJgYQ71gX4/dCyCywmp7frUu0xKpWdpDQh/
pL+iXoMEAGiceR2MchI45FGcuF+MYQEQL1/n3L8Zj8n75HRZWiVbp6CUJiYw
mH3i4/E1/8ji+32vzysa8Fzy/6OURdd9r2BUS8leNuNjvua54l5yz0RZ8Ziy
qnNp0A3iNrkPwXAniwRxXwEzM4h62eyd6qxhzCGkJNLSIA0En1S8HqsU2SJi
/1C4k8ZSsMLreUCGMRne1WdLM8Kdh5KOwLXQ8NOgXezORS/yaZY2zTwODyam
YQfhJSzP6ew4nZ3WxOCYZx1MHGZlhdCWAtEPpboM7PlZFiZNkMxqi/qJMjO6
Xe8gnnDF0hnoQsUc6b8PNwsRPGLmFWow7JnOxALdIZPo99SMwKWPZBPB3rdn
HjEl7SaKvuZawi9UP+F5pMFJ2FS381IG3DYgB7nqlAQ7KxPHRclIbu485VJx
/jYrSB0qLgi6tFYhY+0s8pJgeQRPGIIStjca9AOZR1XjzcKcASZy5qvoRCOA
asY2PA9CyOmaKkZFbKX2SdrR00On1QcZPjGPaJq456aC5tVOGhH5GA6gtDYU
UQtCs3CzNMpX9P7MnoLgcm4S2x1czPbS9p7miUhJ97uqWUFiYAyNkEEqMukM
1PcAKi8BTepkFAU6NUuPsBfNh64bFHsLaGe8rSTKV2K4x2xArMwfm0vw1bD9
NXTN/M1m8mBoh1qMVNJsC893vH10sN+BTTKej/Fz2hLEbkkvFgCJUpAB6RhD
TJT0bcZVwHOtlsZFYGdNXA/MnwYcRAiFhJ3decD/s0rzSj7q2vQBV+hU9j5X
rFgQCjiYFlJVeDlaDb/aNQJB4Uav2SxzWvg3YxR4QIHfkRjCPhYbu59ZsCp+
ngdJHR2NRsk0nb2DAKDg98k2+H2t6PcfbxjcvRPXfWp5i+xN0pSHFv7h4b3b
BxziUcAfJlD6luSmVmJObaGXPaR+bOrR83RTgV5Xrv/w+dMBl5GOs+LUzc8R
+9YkdfDR0+/qgZmLHy3KVf3uaq92msOLTIz6qtYKwfYUUKXpHYIed/vo1rH6
hZJTcU9Rv7Y6JVkj3lKHBIouZrWcyzVroevcMEsMHob4q+Tq5906lpCwzCAt
XfbDY/FF1iURmGewEUG/lJQchFxkrPlxmtGVExz+d5kIBwtg5qq1gTPjZuWF
HQ48L0BcXqeXWtjDRyyRWDWdk0zHVUmZEUBWiqIG+Wy72NHlUDbQMd3TfoGN
UW9li7KEXCksjPWQSMUwR5prjCgIK/gMsX78SNRKCrSXrIpQYfq9OSscZwkG
slLTu2CX2RA0AY+kG1LB69asIZLFU1epUTLUFeAo1YrNzdsxFLALC5fHU+Z0
AQR8qanK+WbmcTnFcM0AvesqhyuNjQFig+mZXBLvj8/NDBHJnzcAJWeDL2Yb
tnYXkKw4U7b3xPzS9Gtvy0kQm+bYQBrlQIkTD3uK84S4zYKj52Ctrq9WqGoD
tj3wJltVSNzkLxNGJeW4P7Z/8bDEAzvZn5hrgDgCyl34tFhwdT8xrtMqHlQw
HkSMRGQAQxsjSaWVhbc2Ai0FJF06/EdNOZLIU+7/MAGArZ7qwVRKc4ITBcFK
EhEHmyxpRlV2kQo+kYBUS5bTNrZv8G95qyv2M8ea5HUqUTqtbtPdFswThcCK
RdJCDbic32zT9BT/jLh8t3jdp12on8wNo5Qyx4XhT5MHSS/tJb1pjxRyfKI/
/cOBc5wsEd+y72/ELUe4RSIJDSZGF3EPDov8IoeBO2Ie53DRwQEtXI0ZWghZ
oYWhlT9BODY13cLOjvc3iyUF6NFAtjkoA5trvQk1LC1qw3Ld0XF+1BzhvLQB
QlQqRUQv2qIIRRaOjeJtk3Lii4rRgTX5FqgeN/HXV5OBhZbQC696OtI4LiIU
QYEjD5GXGIxGHFsemGhKXMLd11gBPUzSm0nKGwg7x3MLbI+bqf4iYBBSdl0m
T6Buhaalmgg3vVzquz0GwCSdCPSUzJv2dO4U35+VEFpn6sWOyhctrAVdTWqQ
KypFzECm0iSIuEiDd3SSypYtz8W+rFCYNI9M0pFZdWiCYlz/UmNGg2e5Q45w
3MlhRYJCAknBp/tqth52HE2uuZ0uucgPAwZoEZXpVQgDD7s9gumWkcVa8xZv
QYtuZwKJ+EjAJQMeYm21B7xGMedUaGwJFxX0hgGdFXwNli8vJVY54ta+t/3z
WGktStMeIzN3l1n5mCJOnGBg4GFIgXdLBKH/mlWl2PUXuQr/Mfx2u82tEC2H
xwdtEL7gwFduptOODeCLPHpDly0mHL3ifo6pQwdRTt8zeuKlVsXmtmKw7VfK
QeM4Q3qD7DdM8E5GEGEleIS+uaMzTbDJU8EL99pKJ8CfQR9ohwFzjLUzwR9z
0bvSiuMwUjCbRPPocXasgb9gGfoYiwXgplNEsoXE08j1j2SMGYMJSBpLiKL3
yFPdoIgkOYtqf3TRpX1hIS6KdQInBL8MDgbqEv59mSEydKcBtGsPpacnDyb8
1OQPown+3X/A8wIvAdsMptOKlC6V1Lef3t/np7CT8O+2zPXZd+tT1z89lIgQ
raEipaEx5fz0t5PkJ4ybP/1FNoUW8/uCcd/0T9+Mn2Z1/W8//ZV/+is8zZkh
X/IwP32aPOTx2r+eHfzNP/z0EI9tP82B96tUNOhZWemhhenyT/OW3wJPMQOC
KtFSSzCK0aKtgcgH+s5mWsAiw7a4QsAYPatpGUTvCw5KruMCNlg4qV4Be1uh
ph3zn7dQFeLDVtnD4xev6OQf03nPsDmtqn1uU6TzkosuT24wLBJjnS1zyL9c
wI/kLFIrdTt6qCZTc1hb8qE9KAEo5r3gBHzOb/+7CUdQnz5/TF9+T1/YbgF5
w9EzonsY16TBsMopcExsoONy7x8YfoEFSLEHZQ3XV2DWgbb2+Nihnyz10itb
FgerhgsXcDHsWA8dNqaS1nU5w6YFdIgEeOSQ40hI5Etig6w8jC5jA1Syy1Qb
hB1M5Fs7aj/eYIngb5gyXrXYFbvBNdptG9o3kqFY0DUrgutaEZK+nDKR4WEQ
h2pIxF+MUaDHEt7Cpc9H88w4iWVcSU1kDtGns2wU4Fak/vYyM9E3yg2TiDb/
THhCJUKcqhLaKgcbYisfJGfJ4c0+n+lnAykXJo5b9se+1sg25Gu+oVtp7ejM
aegTp67zxlXn62fuv6BPF9Ua6STON/0gyfVYCV+dtU8KyANWQPYf9Jw1Ei7i
qotehZ/+0KO35HP662a/N/RfBknvm57dm1YX/lbJ6Ax323d5wGmGrFy92T/j
mDK9ayA/H+rvR8nrs6TPcKLlGvEFzbJcD/TmozcO6ETpzKp7W6RKJCoEMU9z
SRP2M3CQP1eccXL1gZY6THTet5aJxvfG/9rrW4fpn96gF3742OMFgfeSfvkU
/fK69cub6Je/WmOfeeHvcY+81rcRv/f3/pfPNHKDVM47veR1b9zjaOA3nxkI
3fv42XfPXsV3d/7cT7iSx36atx77W3/uSw60LSoRzXg8ZuKjf5zjJearPaZb
w5QnKlfJQkhmX0asFwe40W54QLfIpkAcF3Fi+TVj6n8tuXVnb5DRDesdygXR
t7DrMJBw1+5JxTCI9SPUXz0jCA7f9fz2ornw3gd+b7xGOSfc/uAbWwVpyZd1
OUOVm9ZPkjsm152/T7a7DJyZ0GvehW+cCLuYAl38mz39GNbvq4gEvqVWtcgI
kwJtVv7XeFPv4EOPONz3T/6JLoeLU1x8+Ox56yI11Skb6ncacNX8YAFo4Zy8
9HVv1HvDpCcR+BIem2rl3Jyt/hC2zxXlLBE1hlUWVFFvQoab89VyF9kHeX6f
YQ2EvK0Foole1vONJG8Gzt//oD1eedC+0WSuw3PO9+gB3SFz5tvEuL4ijoex
2Y9cxZR++R8fjo6Sm2ePvj99yZ+dfOQfDkZHh9Rp+nRrdPshf7r9eHT3CX/6
+mB0ePD06dPH9O3sydkjh7/Q5V96SZ8f7t6ICgyKe/p6Cslv+QZt301uPrTX
33UPW6+/I6//Onp966X0z6OXPzx10hzevuBtPb1zTMvPVVmenP7w0/entD3p
aBjJnu8Nkr5e3hc6GwycfMeLjw9Ht0/5dXcOR3dP3RP7yR7p/ZHbect//67n
hGvh0VsHo1v3nJIuXzjEBV0/JWo8dcrPPuS/H/Hfj/nvJ/z3054TavaNHjp3
Bibzj2fuH/Hh7Ce67/kPjv6VuXLPf6BPj178+OOT569sWuwrzcv9XnLzJ55b
/uWneJq7C+VwC/94IPNw8Hh8cNrO4jjPL0YQ0jw+JQQsSCItXGgxfrJs54Vi
uIKJh2kRF7gv1JMLOZU4m0T7l+fuUgqxqUmIrckeUd/n9Y4lQEbtXfLsxxtm
APtbIqQFz9jvHD1zAYWBgwiC5VVFR2k/kv1aIYHTKqcBXfnaCsH0KFm2Bm4C
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
/w1I3C9dl3YBAA==

-->

</rfc>

