<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.38 (Ruby 3.2.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-14" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="OneDM SDF">Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-14"/>
    <author initials="M." surname="Koster" fullname="Michael Koster" role="editor">
      <organization>PassiveLogic</organization>
      <address>
        <postal>
          <street>524 H Street</street>
          <city>Antioch, CA</city>
          <code>94509</code>
          <country>USA</country>
        </postal>
        <phone>+1-707-502-5136</phone>
        <email>michaeljohnkoster@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor">
      <organization ascii="Universitaet Bremen TZI">Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2023" month="July" day="11"/>
    <area>Applications</area>
    <workgroup>ASDF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 122?>

<t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models in
the Internet of Things. An SDF specification describes definitions of
SDF Objects and their associated interactions (Events, Actions,
Properties), as well as the Data types for the information exchanged
in those interactions. Tools convert this format to database formats
and other serializations as needed.</t>
      <t><cref anchor="status">A JSON format representation of SDF 1.0 was defined in
version (-00) of this document; version (-05) was designated as an
<em>implementation draft</em>, labeled SDF 1.1, at the IETF110 meeting of
the ASDF WG (2021-03-11).
The present version (-14) collects smaller changes up to 2023-07-10.</cref></t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        A Semantic Definition Format for Data and Interactions of Things (ASDF) Working Group mailing list (<eref target="mailto:asdf@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/asdf/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/asdf/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-asdf/SDF"/>.</t>
    </note>
  </front>
  <middle>
    <?line 143?>

<section anchor="introduction">
      <name>Introduction</name>
      <!-- Just copying the abstract, for now... -->

<t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models in
the Internet of Things. An SDF specification describes definitions of
SDF Objects and their associated interactions (Events, Actions,
Properties), as well as the Data types for the information exchanged
in those interactions. Tools convert this format to database formats
and other serializations as needed.</t>
      <t><cref anchor="status_1">A JSON format representation of SDF 1.0 was defined in
version (-00) of this document; version (-05) was designated as an
<em>implementation draft</em>, labeled SDF 1.1, at the IETF110 meeting of
the ASDF WG (2021-03-11).
The present version (-14) collects smaller changes up to 2023-07-10.</cref></t>
      <section anchor="terminology-and-conventions">
        <name>Terminology and Conventions</name>
        <dl>
          <dt>Thing:</dt>
          <dd>
            <t>A physical item that is also made available in the Internet of
Things.  The term is used here for Things that are notable for their
interaction with the physical world beyond interaction with humans;
a temperature sensor or a light might be a Thing, but a router that
employs both temperature sensors and indicator lights might exhibit
less Thingness, as the effects of its functioning are mostly on the
digital side.</t>
          </dd>
          <dt>Affordance:</dt>
          <dd>
            <t>An element of an interface offered for interaction, defining its
possible uses or making clear how it can or should be used.  The
term is used here for the digital interfaces of a Thing only; it
might also have physical affordances such as buttons, dials, and
displays.</t>
          </dd>
          <dt>Quality:</dt>
          <dd>
            <t>A metadata item in a definition or declaration which says something
about that definition or declaration.  A quality is represented in
SDF as an entry in a JSON map (object) that serves as a definition
or declaration.</t>
          </dd>
          <dt>Entry:</dt>
          <dd>
            <t>A key-value pair in a map. (In JSON maps, sometimes also called "member".)</t>
          </dd>
          <dt>Block:</dt>
          <dd>
            <t>One or more entries in a JSON map that is part of an SDF
specification; these entries together serve a specific function.</t>
          </dd>
          <dt>Group:</dt>
          <dd>
            <t>An entry in the main SDF map and in certain nested definitions that
has a Class Name Keyword as its key and a map of definition
entries (Definition Group) as a value.</t>
          </dd>
          <dt>Class Name Keyword:</dt>
          <dd>
            <t>One of sdfThing, sdfObject, sdfProperty, sdfAction,
sdfEvent, or sdfData; the Classes for these type keywords are
capitalized and prefixed with <tt>sdf</tt>.</t>
          </dd>
          <dt>Class:</dt>
          <dd>
            <t>Abstract term for the information that is contained in groups
identified by a Class Name Keyword.</t>
          </dd>
          <dt>Property:</dt>
          <dd>
            <t>An affordance that can potentially be used to read, write, and/or
observe state on an Object.  (Note that Entries are often called
properties in other environments; in this document, the term
Property is specifically reserved for affordances, even if the map
key "properties" might be imported from a data definition language
with the other semantics.)</t>
          </dd>
          <dt>Action:</dt>
          <dd>
            <t>An affordance that can potentially be used to perform a named operation on an Object.</t>
          </dd>
          <dt>Event:</dt>
          <dd>
            <t>An affordance that can potentially be used to obtain information about what happened to an Object.</t>
          </dd>
          <dt>Object:</dt>
          <dd>
            <t>A grouping of Property, Action, and Event definitions; the main
"atom" of reusable semantics for model construction. Objects are
similar to Things but do not allow nesting, i.e., they cannot contain
other Objects or Things. (Note that
JSON maps are often called JSON objects due to JSON's JavaScript
heritage; in this document, the
term Object is specifically reserved for the above grouping, even if
the type name "object" might be imported from a data definition
language with the other semantics.)</t>
          </dd>
          <dt>Element:</dt>
          <dd>
            <t>A part or an aspect of something abstract; used here in its usual English definition.
(Occasionally, also used specifically for the elements of JSON arrays.)</t>
          </dd>
          <dt>Definition:</dt>
          <dd>
            <t>An entry in a Definition Group; the entry creates a new semantic
term for use in SDF models and associates it with a set of
qualities.</t>
          </dd>
          <dt>Declaration:</dt>
          <dd>
            <t>A definition within an enclosing
definition, intended to create component instances within that
enclosing definition.  Every declaration can also be used as a
definition for reference in a different place.</t>
          </dd>
          <dt>Protocol Binding:</dt>
          <dd>
            <t>A companion document to an SDF specification that defines how to map
the abstract concepts in the specification into the protocols in use
in a specific ecosystem.  Might supply URL components, numeric IDs,
and similar details.  Protocol Bindings are one case of an
Augmentation Mechanism.</t>
          </dd>
          <dt>Augmentation Mechanism:</dt>
          <dd>
            <t>A companion document to a base SDF specification that provides additional
information ("augments" the base specification), possibly for use in
a specific ecosystem or with a specific protocol ("Protocol Binding").
No specific Augmentation Mechanisms are defined in this version of SDF.
A simple mechanism for such augmentations has been discussed as a
"mapping file" <xref target="I-D.bormann-asdf-sdf-mapping"/>.</t>
          </dd>
        </dl>
        <t>The term "byte" is used in its now-customary sense as a synonym for
"octet".</t>
        <t>Conventions:</t>
        <ul spacing="normal">
          <li>The singular form is chosen as the preferred one for the keywords defined here.</li>
        </ul>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <section anchor="example-definition">
        <name>Example Definition</name>
        <t>We start with an example for the SDF definition of a simple Object called "Switch" (<xref target="example1"/>).</t>
        <figure anchor="example1">
          <name>A simple example of an SDF definition file</name>
          <sourcecode type="json"><![CDATA[
{
  "info": {
    "title": "Example file for OneDM Semantic Definition Format",
    "version": "2019-04-24",
    "copyright": "Copyright 2019 Example Corp. All rights reserved.",
    "license": "https://example.com/license"
  },
  "namespace": {
    "cap": "https://example.com/capability/cap"
  },
  "defaultNamespace": "cap",
  "sdfObject": {
    "Switch": {
      "sdfProperty": {
        "value": {
          "description":
"The state of the switch; false for off and true for on.",
          "type": "boolean"
        }
      },
      "sdfAction": {
        "on": {
          "description":
"Turn the switch on; equivalent to setting value to true."
        },
        "off": {
          "description":
"Turn the switch off; equivalent to setting value to false."
        },
        "toggle": {
          "description":
"Toggle the switch; equivalent to setting value to its complement."
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>This is a model of a switch.
The state <tt>value</tt> declared in the <tt>sdfProperty</tt> group, represented by a Boolean, will be true for "on" and will be false for "off".
The actions <tt>on</tt> or <tt>off</tt> declared in the <tt>sdfAction</tt> group are redundant with setting the <tt>value</tt> and are in the example to illustrate that there are often different ways of achieving the same effect.
The action <tt>toggle</tt> will invert the value of the sdfProperty value, so that 2-way switches can be created; having such action will avoid the need for first retrieving the current value and then applying/setting the inverted value.</t>
        <t>The <tt>sdfObject</tt> group lists the affordances of instances of this object.
The <tt>sdfProperty</tt> group lists the property affordances described by the model; these represent various perspectives on the state of the object.
Properties can have additional qualities to describe the state more precisely.
Properties can be annotated to be read, write or read/write; how this is actually done by the underlying transfer protocols is not described in the SDF model but left to companion protocol bindings.
Properties are often used with RESTful paradigms <xref target="I-D.irtf-t2trg-rest-iot"/>, describing state.
The <tt>sdfAction</tt> group is the mechanism to describe other interactions in terms of their names, input, and output data (no data are used in the example), as in a POST method in REST or in a remote procedure call.
The example <tt>toggle</tt> is an Action that
changes the state based on the current state of the Property named <tt>value</tt>.
(The third type of affordance is Events, which are not described in this example.)</t>
        <t>In the JSON representation, note how (with the exception of the <tt>info</tt>
group) maps that have keys taken from the SDF vocabulary (<tt>info</tt>,
<tt>namespace</tt>, <tt>sdfObject</tt>) alternate in nesting with maps that have keys
that are freely defined by the model writer (<tt>Switch</tt>, <tt>value</tt>, <tt>on</tt>,
etc.); the latter usually use the <tt>named&lt;&gt;</tt> production in the <xref target="syntax">formal
syntax of SDF</xref>, while the former SDF-defined vocabulary items
are often, but not always, called <em>qualities</em>.</t>
      </section>
      <section anchor="elements-of-an-sdf-model">
        <name>Elements of an SDF model</name>
        <t>The SDF language uses six predefined Class Name Keywords for modeling connected
Things which are illustrated in <xref target="fig-class-2"/>.</t>
        <figure anchor="fig-class-2">
          <name>Main classes used in SDF models</name>
          <artset>
            <artwork type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="437px" preserveAspectRatio="none" version="1.1" viewBox="0 0 542 437" width="542px">
                <defs/>
                <g>
                  <!--class sdfThing-->
    <g id="elem_sdfThing">
                    <rect fill="white" height="48" id="sdfThing" rx="2.5" ry="2.5" width="93" x="136.13" y="7" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="151.13" cy="23" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M153.6031,29.1431 Q153.0221,29.4419 152.3829,29.5913 Q151.7438,29.7407 151.0382,29.7407 Q148.5314,29.7407 147.2115,28.0889 Q145.8917,26.437 145.8917,23.3159 Q145.8917,20.1865 147.2115,18.5347 Q148.5314,16.8828 151.0382,16.8828 Q151.7438,16.8828 152.3912,17.0322 Q153.0387,17.1816 153.6031,17.4805 L153.6031,20.2031 Q152.9723,19.6221 152.3788,19.3523 Q151.7853,19.0825 151.1544,19.0825 Q149.8097,19.0825 149.1249,20.1492 Q148.4401,21.2158 148.4401,23.3159 Q148.4401,25.4077 149.1249,26.4744 Q149.8097,27.541 151.1544,27.541 Q151.7853,27.541 152.3788,27.2712 Q152.9723,27.0015 153.6031,26.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="165.13" y="28.291">sdfThing</text>
                    <line x1="137.13" x2="228.13" y1="39" y2="39" stroke="black" stroke-width="0.5"/>
                    <line x1="137.13" x2="228.13" y1="47" y2="47" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfObject-->
    <g id="elem_sdfObject">
                    <rect fill="white" height="48" id="sdfObject" rx="2.5" ry="2.5" width="97" x="205.13" y="132" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="220.13" cy="148" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M222.6031,154.1431 Q222.0221,154.4419 221.3829,154.5913 Q220.7438,154.7407 220.0382,154.7407 Q217.5314,154.7407 216.2115,153.0889 Q214.8917,151.437 214.8917,148.3159 Q214.8917,145.1865 216.2115,143.5347 Q217.5314,141.8828 220.0382,141.8828 Q220.7438,141.8828 221.3912,142.0322 Q222.0387,142.1816 222.6031,142.4805 L222.6031,145.2031 Q221.9723,144.6221 221.3788,144.3523 Q220.7853,144.0825 220.1544,144.0825 Q218.8097,144.0825 218.1249,145.1492 Q217.4401,146.2158 217.4401,148.3159 Q217.4401,150.4077 218.1249,151.4744 Q218.8097,152.541 220.1544,152.541 Q220.7853,152.541 221.3788,152.2712 Q221.9723,152.0015 222.6031,151.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="234.13" y="153.291">sdfObject</text>
                    <line x1="206.13" x2="301.13" y1="164" y2="164" stroke="black" stroke-width="0.5"/>
                    <line x1="206.13" x2="301.13" y1="172" y2="172" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfProperty-->
    <g id="elem_sdfProperty">
                    <rect fill="white" height="48" id="sdfProperty" rx="2.5" ry="2.5" width="111" x="29.13" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="44.13" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M46.6031,279.1431 Q46.0221,279.4419 45.3829,279.5913 Q44.7438,279.7407 44.0382,279.7407 Q41.5314,279.7407 40.2115,278.0889 Q38.8917,276.437 38.8917,273.3159 Q38.8917,270.1865 40.2115,268.5347 Q41.5314,266.8828 44.0382,266.8828 Q44.7438,266.8828 45.3912,267.0322 Q46.0387,267.1816 46.6031,267.4805 L46.6031,270.2031 Q45.9723,269.6221 45.3788,269.3523 Q44.7853,269.0825 44.1544,269.0825 Q42.8097,269.0825 42.1249,270.1492 Q41.4401,271.2158 41.4401,273.3159 Q41.4401,275.4077 42.1249,276.4744 Q42.8097,277.541 44.1544,277.541 Q44.7853,277.541 45.3788,277.2712 Q45.9723,277.0015 46.6031,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="58.13" y="278.291">sdfProperty</text>
                    <line x1="30.13" x2="139.13" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="30.13" x2="139.13" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfAction-->
    <g id="elem_sdfAction">
                    <rect fill="white" height="48" id="sdfAction" rx="2.5" ry="2.5" width="97" x="363.13" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="378.13" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M380.6031,279.1431 Q380.0221,279.4419 379.3829,279.5913 Q378.7438,279.7407 378.0382,279.7407 Q375.5314,279.7407 374.2115,278.0889 Q372.8917,276.437 372.8917,273.3159 Q372.8917,270.1865 374.2115,268.5347 Q375.5314,266.8828 378.0382,266.8828 Q378.7438,266.8828 379.3912,267.0322 Q380.0387,267.1816 380.6031,267.4805 L380.6031,270.2031 Q379.9723,269.6221 379.3788,269.3523 Q378.7853,269.0825 378.1544,269.0825 Q376.8097,269.0825 376.1249,270.1492 Q375.4401,271.2158 375.4401,273.3159 Q375.4401,275.4077 376.1249,276.4744 Q376.8097,277.541 378.1544,277.541 Q378.7853,277.541 379.3788,277.2712 Q379.9723,277.0015 380.6031,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="392.13" y="278.291">sdfAction</text>
                    <line x1="364.13" x2="459.13" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="364.13" x2="459.13" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfEvent-->
    <g id="elem_sdfEvent">
                    <rect fill="white" height="48" id="sdfEvent" rx="2.5" ry="2.5" width="90" x="175.63" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="190.63" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M193.1031,279.1431 Q192.5221,279.4419 191.8829,279.5913 Q191.2438,279.7407 190.5382,279.7407 Q188.0314,279.7407 186.7115,278.0889 Q185.3917,276.437 185.3917,273.3159 Q185.3917,270.1865 186.7115,268.5347 Q188.0314,266.8828 190.5382,266.8828 Q191.2438,266.8828 191.8912,267.0322 Q192.5387,267.1816 193.1031,267.4805 L193.1031,270.2031 Q192.4723,269.6221 191.8788,269.3523 Q191.2853,269.0825 190.6544,269.0825 Q189.3097,269.0825 188.6249,270.1492 Q187.9401,271.2158 187.9401,273.3159 Q187.9401,275.4077 188.6249,276.4744 Q189.3097,277.541 190.6544,277.541 Q191.2853,277.541 191.8788,277.2712 Q192.4723,277.0015 193.1031,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="204.63" y="278.291">sdfEvent</text>
                    <line x1="176.63" x2="264.63" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="176.63" x2="264.63" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfData-->
    <g id="elem_sdfData">
                    <rect fill="white" height="48" id="sdfData" rx="2.5" ry="2.5" width="84" x="236.63" y="382" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="251.63" cy="398" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M254.1031,404.1431 Q253.5221,404.4419 252.8829,404.5913 Q252.2438,404.7407 251.5382,404.7407 Q249.0314,404.7407 247.7115,403.0889 Q246.3917,401.437 246.3917,398.3159 Q246.3917,395.1865 247.7115,393.5347 Q249.0314,391.8828 251.5382,391.8828 Q252.2438,391.8828 252.8912,392.0322 Q253.5387,392.1816 254.1031,392.4805 L254.1031,395.2031 Q253.4723,394.6221 252.8788,394.3523 Q252.2853,394.0825 251.6544,394.0825 Q250.3097,394.0825 249.6249,395.1492 Q248.9401,396.2158 248.9401,398.3159 Q248.9401,400.4077 249.6249,401.4744 Q250.3097,402.541 251.6544,402.541 Q252.2853,402.541 252.8788,402.2712 Q253.4723,402.0015 254.1031,401.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="265.63" y="403.291">sdfData</text>
                    <line x1="237.63" x2="319.63" y1="414" y2="414" stroke="black" stroke-width="0.5"/>
                    <line x1="237.63" x2="319.63" y1="422" y2="422" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--link sdfThing to sdfObject-->
    <g id="link_sdfThing_sdfObject">
                    <path d="M196.16,55.42 C207.75,75.52 224.51,104.54 236.94,126.08 " fill="none" id="sdfThing-to-sdfObject" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="239.41,130.35,238.3726,120.5559,236.9093,126.0203,231.445,124.557,239.41,130.35" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="222.63" y="98.5684">hasObject</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="216.4021" y="121.1091">0+</text>
                  </g>
                  <!--link sdfThing to sdfThing-->
    <g id="link_sdfThing_sdfThing">
                    <path d="M229.53,19.35 C248.35,18.69 264.13,22.58 264.13,31 C264.13,38.44 251.83,42.33 236,42.69 " fill="none" id="sdfThing-to-sdfThing" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="231.05,42.66,240.027,46.7114,236.0499,42.6886,240.0727,38.7115,231.05,42.66" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="270.13" y="36.0684">hasThing</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="237.0416" y="40.7969">0+</text>
                  </g>
                  <!--link sdfThing to sdfProperty-->
    <g id="link_sdfThing_sdfProperty">
                    <path d="M136,47.85 C99.23,63.1 50.46,90.1 27.63,132 C6,171.7 35.57,221.37 59.56,251.88 " fill="none" id="sdfThing-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="62.41,255.43,59.8985,245.9068,59.2813,251.5298,53.6582,250.9127,62.41,255.43" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="28.63" y="161.0684">hasProperty</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="37.9817" y="246.443">0+</text>
                  </g>
                  <!--link sdfThing to sdfAction-->
    <g id="link_sdfThing_sdfAction">
                    <path d="M229.41,49.61 C250.34,58.6 274.73,70.67 294.63,85 C357.14,129.99 385.89,138.55 414.63,210 C419.75,222.7 419.78,237.77 418.22,250.67 " fill="none" id="sdfThing-to-sdfAction" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="417.55,255.31,422.7961,246.9746,418.2651,250.3614,414.8783,245.8304,417.55,255.31" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="400.63" y="161.0684">hasAction</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="398.4969" y="246.285">0+</text>
                  </g>
                  <!--link sdfThing to sdfEvent-->
    <g id="link_sdfThing_sdfEvent">
                    <path d="M164.06,55.38 C136.18,93.53 90.16,170.57 123.63,227 C129.23,236.43 149.15,248 169.5,257.92 " fill="none" id="sdfThing-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="173.87,260.02,167.4833,252.5226,169.3613,257.8587,164.0252,259.7366,173.87,260.02" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="121.63" y="161.0684">hasEvent</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="149.5914" y="254.3466">0+</text>
                  </g>
                  <!--link sdfObject to sdfProperty-->
    <g id="link_sdfObject_sdfProperty">
                    <path d="M204.71,177.95 C186.9,186.64 167.11,197.61 150.63,210 C134.71,221.98 119.28,238.01 107.36,251.7 " fill="none" id="sdfObject-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="104.12,255.48,113.0049,251.2306,107.3657,251.6767,106.9196,246.0374,104.12,255.48" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="151.63" y="223.5684">hasProperty</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="87.5644" y="246.0715">0+</text>
                  </g>
                  <!--link sdfObject to sdfAction-->
    <g id="link_sdfObject_sdfAction">
                    <path d="M283.72,180.42 C310.19,201.03 348.73,231.03 376.58,252.71 " fill="none" id="sdfObject-to-sdfAction" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="380.46,255.73,375.8181,247.0436,376.5155,252.6573,370.9019,253.3548,380.46,255.73" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="342.63" y="223.5684">hasAction</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="353.6739" y="246.1091">0+</text>
                  </g>
                  <!--link sdfObject to sdfEvent-->
    <g id="link_sdfObject_sdfEvent">
                    <path d="M247.35,180.42 C242,200.34 234.3,229.05 228.54,250.53 " fill="none" id="sdfObject-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="227.29,255.2,233.4711,247.5323,228.5765,250.3684,225.7404,245.4738,227.29,255.2" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="239.63" y="223.5684">hasEvent</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="208.2004" y="246.1091">0+</text>
                  </g>
                  <!--link sdfAction to sdfData-->
    <g id="link_sdfAction_sdfData">
                    <path d="M380.17,305.36 C368.69,314.29 355.78,324.78 344.63,335 C330.27,348.17 315.29,363.87 303.24,377.07 " fill="none" id="sdfAction-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="299.96,380.69,308.97,376.7126,303.3198,376.9871,303.0453,371.3369,299.96,380.69" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="345.63" y="348.5684">hasInputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="283.8382" y="371.2976">0+</text>
                  </g>
                  <!--link sdfAction to sdfData-->
    <g id="link_sdfAction_sdfData">
                    <path d="M429.32,305.37 C437.95,319.82 444.54,338.17 434.63,352 C410.38,385.85 363.27,398.34 327.13,402.82 " fill="none" id="sdfAction-to-sdfData-1" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="322.48,403.35,331.8779,406.2961,327.4473,402.779,330.9644,398.3484,322.48,403.35" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="439.63" y="348.5684">hasOutputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="328.522" y="399.6454">0+</text>
                  </g>
                  <!--link sdfEvent to sdfData-->
    <g id="link_sdfEvent_sdfData">
                    <path d="M209.17,305.42 C203.95,319.53 200.38,337.53 207.63,352 C213.04,362.77 221.78,371.92 231.32,379.42 " fill="none" id="sdfEvent-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="235.15,382.28,230.3303,373.691,231.1431,379.2892,225.545,380.102,235.15,382.28" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="208.63" y="348.5684">hasOutputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="210.5093" y="376.1409">0+</text>
                  </g>
                  <!--link sdfProperty to sdfData-->
    <g id="link_sdfProperty_sdfData">
                    <path d="M89.02,305.4 C93.01,320.6 100.38,339.79 113.63,352 C145.64,381.48 194.15,394.57 230.3,400.38 " fill="none" id="sdfProperty-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="234.94,401.08,226.6344,395.7868,229.9955,400.3369,225.4455,403.698,234.94,401.08" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="114.63" y="348.5684">isInstanceOf</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="220.5011" y="396.8099">1</text>
                  </g>
                  <!--SRC=[ZP7D2i8m48Jl-nIXLoderOCWwC5JFVW2CKrjHTBItGeYlhisc_u45knjTlYIcMKnBovbvMugJNSgMQyIXNcHNU_MaDggKYDhG8bZnsDUojIvhHlRqel1OPBPlQ6gTaoobhdZqxfGq4k0gVQoR06MmmLGJ0-lvzn1asRiv9gE-l4lcNKqe316BKB7NJszcSFLhm2ITiPc1O1vQCJfVc_upBomRcoENyTsM2GskN7i-HgzzGK0]-->
  </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[                  ,--------.           
                  |sdfThing|           
                  |--------|           
                  `--------'           
                                       
                                       
            ,---------.                
            |sdfObject|                
            |---------|                
            `---------'                
                                       
,-----------.  ,---------.   ,--------.
|sdfProperty|  |sdfAction|   |sdfEvent|
|-----------|  |---------|   |--------|
`-----------'  `---------'   `--------'
                    |                  
                                       
                ,-------.              
                |sdfData|              
                |-------|              
                `-------'              
]]></artwork>
          </artset>
        </figure>
        <t>The six main Class Name Keywords are discussed below.</t>
        <section anchor="sdfobject">
          <name>sdfObject</name>
          <t>Objects, the items listed in an <tt>sdfObject</tt> group, are the main "atom" of reusable semantics for model construction.
It aligns in scope with common definition items from many IoT modeling
systems, for example ZigBee Clusters <xref target="ZCL"/>, OMA SpecWorks LwM2M
Objects <xref target="OMA"/>, and
OCF Resource Types <xref target="OCF"/>.</t>
          <t>An <tt>sdfObject</tt> contains a set of <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and
<tt>sdfEvent</tt> definitions that describe the interaction affordances
associated with some scope of functionality.</t>
          <t>For the granularity of definition, <tt>sdfObject</tt> definitions are meant
to be kept narrow enough in scope to enable broad reuse and
interoperability.
For example, defining a light bulb using separate <tt>sdfObject</tt>
definitions for on/off control, dimming, and color control affordances
will enable interoperable functionality to be configured for diverse
product types.
An <tt>sdfObject</tt> definition for a common on/off control may be used to
control may different kinds of Things that require on/off control.</t>
          <t>The presence of one or both of the optional qualities "minItems" and
"maxItems" defines the sdfObject as an array.
(Note: Setting "minItems" to zero and leaving out "maxItems" puts the
minimum constraints on that array.)</t>
        </section>
        <section anchor="sdfproperty">
          <name>sdfProperty</name>
          <t><tt>sdfProperty</tt> is used to model elements of state within <tt>sdfObject</tt> instances.</t>
          <t>An instance of <tt>sdfProperty</tt> may be associated with some protocol
affordance to enable the application to obtain the state variable and,
optionally, modify the state variable.
Additionally, some protocols provide for in-time reporting of state
changes.
(These three aspects are described by the qualities <tt>readable</tt>,
<tt>writable</tt>, and <tt>observable</tt> defined for an <tt>sdfProperty</tt>.)</t>
          <t>Definitions in <tt>sdfProperty</tt> groups include the definitions from <tt>sdfData</tt> groups, however, they actually also declare a Property with the given qualities to be potentially present in the containing Object.</t>
          <t>For definitions in <tt>sdfProperty</tt> and <tt>sdfData</tt>, SDF provides qualities that can
constrain the structure and values of data allowed in an instance of
these data, as well as qualities that associate semantics to these
data, for engineering units and unit scaling information.</t>
          <t>For the data definition within <tt>sdfProperty</tt> or <tt>sdfData</tt>, SDF borrows
some vocabulary proposed for the drafts 4 and 7 of the
json-schema.org "JSON Schema"
format (collectively called JSO here), enhanced by qualities that are specific to SDF.
Details about the former are in <xref target="jso-inspired"/>.
For the current version of SDF, data are constrained to be of
simple types (number, string, Boolean),
JSON maps composed of named data ("objects"), and arrays of these types.
Syntax extension points are provided that can be used to provide
richer types in future versions of this specification (possibly more
of which can be borrowed from json-schema.org).</t>
          <t>Note that <tt>sdfProperty</tt> definitions (and <tt>sdfData</tt> definitions in
general) are not intended to constrain the formats of data used for
communication over network interfaces.
Where needed, data definitions for payloads of protocol messages are
expected to be part of the protocol binding.</t>
        </section>
        <section anchor="sdfaction-overview">
          <name>sdfAction</name>
          <t>The <tt>sdfAction</tt> group contains declarations of Actions, model affordances that, when triggered,
have more effect than just reading, updating, or observing Thing
state, often resulting in some outward physical effect (which, itself,
cannot be modeled in SDF).  From a programmer's perspective, they
might be considered to be roughly analogous to method calls.</t>
          <t>Actions may have data parameters; these are modeled as a single item of input
data and output data, each.  (Where multiple parameters need to be
modeled, an "object" type can be used to combine these parameters into one.)
<!-- (using `sdfData` definitions, i.e., the same entries as for `sdfProperty` declarations). -->
Actions may be long-running, that is to say that the effects may not
take place immediately as would be expected for an update to an
<tt>sdfProperty</tt>; the effects may play out over time and emit action
results.
Actions may also not always complete and may result in application
errors, such as an item blocking the closing of an automatic door.</t>
          <t>Actions may have (or lack) qualities of idempotency and side-effect safety.</t>
          <t>The current version of SDF only provides data constraint modeling and semantics for the input and output data of definitions in <tt>sdfAction</tt> groups.
Again, data definitions for payloads of protocol messages, and
detailed protocol settings for invoking the action, are expected to be
part of the protocol binding.</t>
        </section>
        <section anchor="sdfevent-overview">
          <name>sdfEvent</name>
          <t>The <tt>sdfEvent</tt> group contains declarations of Events, which can model
affordances that inform about "happenings" associated with an instance
of an Object; these may result in a signal being stored or emitted as
a result.</t>
          <t>Note that there is a trivial overlap with sdfProperty state changes,
which may also be defined as events but are not generally required to
be defined as such.
However, Events may exhibit certain ordering, consistency, and
reliability requirements that are expected to be supported in various
implementations of <tt>sdfEvent</tt> that do distinguish sdfEvent from
sdfProperty.
For instance, while a state change may simply be superseded by another
state change, some events are "precious" and need to be preserved even
if further events follow.</t>
          <t>The current version of SDF only provides data constraint modeling and
semantics for the output data of Event affordances.
Again, data definitions for payloads of protocol messages, and
detailed protocol settings for invoking the action, are expected to be
part of the protocol binding.</t>
        </section>
        <section anchor="sdfdata">
          <name>sdfData</name>
          <t>Definitions in <tt>sdfData</tt> groups do not themselves specify affordances.
These definitions
are provided separately from those in
<tt>sdfProperty</tt> groups to enable common
modeling patterns, data constraints, and semantic anchor concepts to
be factored out for data items that make up <tt>sdfProperty</tt> items and
serve as input and output data for <tt>sdfAction</tt> and <tt>sdfEvent</tt> items.
The <tt>sdfData</tt> definitions only spring to life by being referenced in
one of these contexts (directly or indirectly via some other <tt>sdfData</tt>
definitions).</t>
          <t>It is a common use case for such a data definition to be shared
between an <tt>sdfProperty</tt> item and input or output parameters of an
<tt>sdfAction</tt> or output data provided by an <tt>sdfEvent</tt>.
<tt>sdfData</tt> definitions also enable factoring out extended application
data types such as mode and machine state enumerations to be reused
across multiple definitions that have similar basic characteristics
and requirements.</t>
        </section>
        <section anchor="sdfthing">
          <name>sdfThing</name>
          <t>Back at the top level, the <tt>sdfThing</tt> groups enables definition of models for
complex devices that will use one or more <tt>sdfObject</tt> definitions.
<tt>sdfThing</tt> groups, however, also allow for including interaction
affordances, <tt>sdfData</tt>, as well as <tt>minItems</tt> and <tt>maxItems</tt> qualities.
Therefore, they can be seen as a superset of <tt>sdfObject</tt> groups, additionally
allowing for composition.</t>
          <t>A definition in an <tt>sdfThing</tt> group can refine the metadata of the definitions it
is composed of: other definitions in <tt>sdfThing</tt> groups definitions in <tt>sdfObject</tt> groups.</t>
        </section>
      </section>
      <section anchor="member-names-given-names-and-quality-names">
        <name>Member names: Given Names and Quality Names</name>
        <t>SDF models are JSON objects (maps) that mostly employ JSON objects as
member values, which in turn mostly employ JSON objects as their
member values, and so on.
This nested structure of JSON objects creates a tree, where the edges
are the member names (map keys) used in these JSON objects.
(In certain cases, where member names are not needed, JSON arrays may
be interspersed in this tree.)</t>
        <section anchor="given-names-and-quality-names">
          <name>Given Names and Quality Names</name>
          <t>For any particular JSON object in an SDF model, the set of member
names that are used is either of:</t>
          <ul spacing="normal">
            <li>A set of "<em>Quality Names</em>", where the entries in the object are
Qualities.  Quality Names are defined by the present specification
and its extensions, together with specific semantics to be
associated with the member value given with a certain Quality Name.</li>
            <li>A set of "<em>Given Names</em>", where the entries in the object are separate
entities (definitions, declarations, etc.) that each have names that
are chosen by the SDF model author in order that these names can be
employed by a user of that model.</li>
          </ul>
          <t>In a path from the root of the tree to any leaf, Quality Names and
Given Names roughly alternate (with the information block,
<xref target="information-block"/>, as a prominent exception).</t>
          <t>The meaning of the JSON object that is the member value associated
with a Given Name is derived from the Quality Name that was used as
the member name associated to the parent.
In the CDDL grammar given in <xref target="syntax"/>, JSON objects with member names that are
Given Names are defined using the CDDL generic rule reference <tt>named&lt;objectmembers&gt;</tt>,
where <tt>objectmembers</tt> is in turn the structure of the members of the
JSON object that is the value of the member named by the Given Name.
As quality-named objects and given-named objects roughly alternate in
a path down the tree, <tt>objectmembers</tt> is usually an object built from
Quality Names.</t>
        </section>
        <section anchor="hierarchical-names">
          <name>Hierarchical Names</name>
          <t>From the outside of a specification, Given Names are usually used as
part of a hierarchical name that looks like a JSON pointer <xref target="RFC6901"/>,
itself generally rooted in (used as the fragment identifier in) an
outer namespace that looks like an <tt>https://</tt> URL (see <xref target="names-and-namespaces"/>).</t>
          <t>As Quality Names and Given Names roughly alternate in a path into the
model, the JSON pointer part of the hierarchical name also alternates
between Quality Names and Given Names.</t>
        </section>
        <section anchor="gnqn">
          <name>Extensibility of Given Names and Quality Names</name>
          <t>In SDF, both Quality Names and Given Names are <em>extension points</em>.
This is more obvious for Quality Names: Extending SDF is mostly done
by defining additional qualities.  To enable non-conflicting third
party extensions to SDF, qualified names (names with an embedded
colon) can be used as Quality Names.</t>
          <t>A nonqualified Quality Name is composed of ASCII letters, digits, and
<tt>$</tt> signs, starting with a lower case letter or a <tt>$</tt> sign (i.e.,
using a pattern of "⁠<tt>[a-z$][A-Za-z$0-9]*</tt>").
Names with <tt>$</tt> signs are intended to be used for functions separate
from most other names; for instance, in this specification <tt>$comment</tt>
is used for the comment quality (the presence or absence of a
<tt>$comment</tt> quality does not change the meaning of the SDF model).
Names that are composed of multiple English words can use the
"lowerCamelCase" convention <xref target="CamelCase"/> for indicating the word
boundaries; no other use is intended for upper case letters in quality
names.</t>
          <t>A qualified Quality Name is composed of a Quality Name Prefix, a <tt>:</tt>
(colon) character, and a nonqualified Quality Name.
Quality Name Prefixes are registered in the "Quality Name Prefixes"
sub-registry in the "SDF Parameters" registry (<xref target="qnp"/>); they are
composed of lower case ASCII letters and digits, starting with a lower
case ASCII letter (i.e., using a pattern of "⁠<tt>[a-z][a-z0-9]*</tt>").</t>
          <t>Given Names are not restricted by the current formal SDF syntax.
To enable non-surprising name translations in tools, combinations of
ASCII alphanumeric characters and <tt>-</tt> (ASCII hyphen/minus) are preferred,
typically employing KebabCase for names constructed out of multiple
words <xref target="KebabCase"/>.  ASCII hyphen/minus can then unambiguously be
translated to an ASCII <tt>_</tt> underscore character and back depending on
the programming environment.
Some styles also allow a dot <tt>.</tt> in given names.
Given Names are often sufficiently self-explanatory that they can be
used in place of the <tt>label</tt> quality if that is not given.
In turn, if a given name turns out too complicated, a more elaborate
<tt>label</tt> can be given and the given name kept simple.
The current version of SDF does not address internationalization of
given names.</t>
          <t>Further, to enable Given Names to have a more powerful role in building
global hierarchical names, an extension is planned that makes use of
qualified names for Given Names.
So, until that extension is defined, Given Names with (one or more)
embedded colons are reserved and <bcp14>MUST NOT</bcp14> be used in an SDF model.</t>
          <t>All names in SDF are case-sensitive.</t>
        </section>
      </section>
    </section>
    <section anchor="sdf-structure">
      <name>SDF structure</name>
      <t>SDF definitions are contained in SDF files.  One or more SDF files can
work together to provide the definitions and declarations that are the
payload of the SDF format.</t>
      <t>An SDF definition file contains a single JSON map (JSON object).
This object has three blocks: the information block, the namespaces block, and the definitions block.</t>
      <section anchor="information-block">
        <name>Information block</name>
        <t>The information block contains generic meta data for the file itself and all included definitions.
To enable tool integration, the information block is optional in the grammar
of SDF; most processes for working with SDF files will have policies
that only SDF models with an info block can be processed.
It is therefore <bcp14>RECOMMENDED</bcp14> that SDF validator tools emit a warning
when no information block is found.</t>
        <t>The keyword (map key) that defines an information block is "info". Its
value is a JSON map in turn, with a set of entries that represent qualities that apply to the included definition.</t>
        <t>Qualities of the information block are shown in <xref target="infoblockqual"/>.</t>
        <table anchor="infoblockqual">
          <name>Qualities of the Information Block</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">title</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">A short summary to be displayed in search results, etc.</td>
            </tr>
            <tr>
              <td align="left">version</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">The incremental version of the definition</td>
            </tr>
            <tr>
              <td align="left">modified</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Time of the latest modification</td>
            </tr>
            <tr>
              <td align="left">copyright</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Link to text or embedded text containing a copyright notice</td>
            </tr>
            <tr>
              <td align="left">license</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Link to text or embedded text containing license terms</td>
            </tr>
            <tr>
              <td align="left">features</td>
              <td align="left">array of strings</td>
              <td align="left">no</td>
              <td align="left">List of extension features used</td>
            </tr>
            <tr>
              <td align="left">$comment</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Source code comments only, no semantics</td>
            </tr>
          </tbody>
        </table>
        <t>The version quality is used to indicate version information about the set of definitions in the file.
The version is <bcp14>RECOMMENDED</bcp14> to be lexicographically increasing over the life of a model: a newer model always has a version string that string-compares higher than all previous versions.
This is easily achieved by following the convention to start the version with an <xref target="RFC3339"/> <tt>date-time</tt> or, if new versions are generated less frequently than once a day, just the <tt>full-date</tt> (i.e., YYYY-MM-DD); in many cases, that will be all that is needed (see <xref target="example1"/> for an example).
This specification does not give a strict definition for the format of the version string but each using system or organization should define internal structure and semantics to the level needed for their use.
If no further details are provided, a <tt>date-time</tt> or <tt>full-date</tt> in this field can be assumed to indicate the latest update time of the definitions in the file.</t>
        <t>The modified quality can be used with a value using <xref target="RFC3339"/> <tt>date-time</tt> (with <tt>Z</tt> for time-zone) or <tt>full-date</tt> format to express time of the latest revision of the definitions.</t>
        <t>The license string is preferably either a URI that points to a web page with an unambiguous definition of the license, or an <xref target="SPDX"/> license identifier.
(For models to be handled by the One Data Model liaison group, this will typically be "BSD-3-Clause".)</t>
        <t>The <tt>features</tt> quality can be used to list names of critical (i.e., cannot be safely ignored) SDF extension features that need to be understood for the definitions to be properly processed.
Extension feature names will be specified in extension documents.</t>
      </section>
      <section anchor="namespaces-block">
        <name>Namespaces block</name>
        <t>The namespaces block contains the namespace map and the defaultNamespace setting.</t>
        <t>The namespace map is a map from short names for URIs to the namespace URIs
themselves.</t>
        <t>The defaultNamespace setting selects one of the entries in the
namespace map by giving its short name.  The associated URI (value of
this entry) becomes the default namespace for the SDF definition file.</t>
        <table anchor="nssec">
          <name>Namespaces Block</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">namespace</td>
              <td align="left">map</td>
              <td align="left">no</td>
              <td align="left">Defines short names mapped to namespace URIs, to be used as identifier prefixes</td>
            </tr>
            <tr>
              <td align="left">defaultNamespace</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Identifies one of the prefixes in the namespace map to be used as a default in resolving identifiers</td>
            </tr>
          </tbody>
        </table>
        <t>The following example declares a set of namespaces and defines <tt>cap</tt>
as the default namespace.
By convention, the values in the namespace map contain full URIs
without a fragment identifier, and the fragment identifier is then
added, if needed, where the namespace entry is used.</t>
        <sourcecode type="json"><![CDATA[
"namespace": {
  "cap": "https://example.com/capability/cap",
  "zcl": "https://zcl.example.com/sdf"
},
"defaultNamespace": "cap"
]]></sourcecode>
        <t>If no defaultNamespace setting is given, the SDF definition file does not
contribute to a global namespace.  As the defaultNamespace is set by giving a
namespace short name, its presence requires a namespace map that contains a
mapping for that namespace short name.</t>
        <t>If no namespace map is given, no short names for namespace URIs are
set up, and no defaultNamespace can be given.</t>
      </section>
      <section anchor="definitions-block">
        <name>Definitions block</name>
        <t>The Definitions block contains one or more groups, each identified by a Class Name Keyword (there can only be one group per keyword; the actual grouping is just a shortcut and does not carry any specific semantics).
The value of each group is a JSON map (object), the keys of which serve for naming the individual definitions in this group, and the corresponding values provide a set of qualities (name-value pairs) for the individual definition.
(In short, we speak of the map entries as "named sets of qualities".)</t>
        <t>Each group may contain zero or more definitions.
Each identifier defined creates a new type and term in the target namespace.
Declarations have a scope of the current definition block. <!-- what exactly does this mean? -->
        </t>
        <t>A definition may in turn contain other definitions. Each definition is a named set of qualities, i.e., it consists of the newly defined identifier and a set of key-value pairs that represent the defined qualities and contained definitions.</t>
        <t>An example for an Object definition is given in <xref target="exobject"/>:</t>
        <figure anchor="exobject">
          <name>Example Object definition</name>
          <sourcecode type="json"><![CDATA[
"sdfObject": {
  "foo": {
    "sdfProperty": {
      "bar": {
        "type": "boolean"
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>This example defines an Object "foo" that is defined in the default namespace (full address: <tt>#/sdfObject/foo</tt>), containing a property that can be addressed as
<tt>#/sdfObject/foo/sdfProperty/bar</tt>, with data of type boolean.
<!-- we could define a URN-style namespace that looks exactly that way -->
        </t>
        <t>Some of the definitions are also declarations: the definition of the entry "bar" in the property "foo" means that each instance of a "foo" can have zero or one instance of a "bar".  Entries within <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and <tt>sdfEvent</tt>, within <tt>sdfObject</tt> entries, are declarations.  Similarly, entries within an <tt>sdfThing</tt> describe instances of <tt>sdfObject</tt> (or nested <tt>sdfThing</tt>) that form part of instances of the Thing.</t>
      </section>
    </section>
    <section anchor="names-and-namespaces">
      <name>Names and namespaces</name>
      <t>SDF definition files may contribute to a global namespace, and may
reference elements from that global namespace.
(An SDF definition file that does not set a defaultNamespace does not
contribute to a global namespace.)</t>
      <section anchor="structure">
        <name>Structure</name>
        <t>Global names look exactly like <tt>https://</tt> URIs with attached fragment identifiers.</t>
        <t>There is no intention to require that these URIs can be dereferenced.
<!-- Looking things up there is a convenience -->
(However, as future versions of SDF might find a use for dereferencing
global names, the URI should be chosen in such a way that this may
become possible in the future.)</t>
        <t>The absolute URI of a global name should be a URI as per <xref section="3" sectionFormat="of" target="RFC3986"/>, with a scheme of "https" and a path (<tt>hier-part</tt> in <xref target="RFC3986"/>).
For the present version of this specification, the query part should
not be used (it might be used in later versions).</t>
        <t>The fragment identifier is constructed as per <xref section="6" sectionFormat="of" target="RFC6901"/>.</t>
      </section>
      <section anchor="contributing-global-names">
        <name>Contributing global names</name>
        <t>The fragment identifier part of a global name defined in an SDF
definition file is constructed from a JSON pointer that selects the
element defined for this name in the SDF definition file.</t>
        <t>The absolute URI part is a copy of the default namespace, i.e., the
default namespace is always the target namespace for a name for which
a definition is contributed.
When emphasizing that name definitions are contributed to the default namespace,
we therefore also call it the "target namespace" of the SDF definition file.</t>
        <t>E.g., in <xref target="example1"/>, definitions for the following global names are contributed:</t>
        <ul spacing="normal">
          <li>https://example.com/capability/cap#/sdfObject/Switch</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfProperty/value</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/on</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/off</li>
        </ul>
        <t>Note the <tt>#</tt>, which separates the absolute-URI part (<xref section="4.3" sectionFormat="of" target="RFC3986"/>) from the fragment identifier part.</t>
      </section>
      <section anchor="referencing-global-names">
        <name>Referencing global names</name>
        <t>A name reference takes the form of the production <tt>curie</tt> in
<xref target="W3C.NOTE-curie-20101216"/> (note that this excludes the production <tt>safe-curie</tt>),
but also limiting the IRIs involved in that production to URIs as per <xref target="RFC3986"/>
and the prefixes to ASCII characters <xref target="RFC0020"/>.</t>
        <t>A name that is contributed by the current SDF definition file can be
referenced by a Same-Document Reference as per <xref section="4.4" sectionFormat="of" target="RFC3986"/>.
As there is little point in referencing the entire SDF definition
file, this will be a <tt>#</tt> followed by a JSON pointer.
This is the only kind of name reference to itself that is possible in an SDF
definition file that does not set a default namespace.</t>
        <t>Name references that point outside the current SDF definition file
need to contain curie prefixes.  These then reference namespace
declarations in the namespaces block.</t>
        <t>For example, if a namespace prefix is defined:</t>
        <sourcecode type="json"><![CDATA[
"namespace": {
  "foo": "https://example.com/"
}
]]></sourcecode>
        <t>Then this reference to that namespace:</t>
        <sourcecode type="json"><![CDATA[
{ "sdfRef": "foo:#/sdfData/temperatureData" }
]]></sourcecode>
        <t>references the global name:</t>
        <sourcecode type="json"><![CDATA[
"https://example.com/#/sdfData/temperatureData"
]]></sourcecode>
        <t>Note that there is no way to provide a URI scheme name in a curie, so
all references outside of the document need to go through the
namespace map.</t>
        <t>Name references occur only in specific elements of the syntax of SDF:</t>
        <ul spacing="normal">
          <li>copying elements via sdfRef values</li>
          <li>pointing to elements via sdfRequired value elements</li>
        </ul>
      </section>
      <section anchor="sdfref">
        <name>sdfRef</name>
        <t>In a JSON map establishing a definition, the keyword "sdfRef" is used
to copy all of the qualities and enclosed definitions of the referenced definition, indicated
by the included name reference, into the newly formed definition.
(This can be compared to the processing of the "$ref" keyword in <xref target="I-D.handrews-json-schema-validation-01"/>.)</t>
        <t>For example, this reference:</t>
        <sourcecode type="json"><![CDATA[
"temperatureProperty": {
  "sdfRef": "#/sdfData/temperatureData"
}
]]></sourcecode>
        <t>creates a new definition "temperatureProperty" that contains all of the qualities defined in the definition at /sdfData/temperatureData.</t>
        <t>The sdfRef member need not be the only member of a map.
Additional members may be present with the intention to override parts
of the referenced map or to add new qualities or definitions.</t>
        <t>When processing sdfRef, if the target definition contains also sdfRef (i.e., is based on yet another definition), that <bcp14>MUST</bcp14> be processed as well.</t>
        <t>More formally, for a JSON map that contains an
sdfRef member, the semantics is defined to be as if the following steps were performed:</t>
        <ol spacing="normal" type="1"><li>The JSON map that contains the sdfRef member is copied into a
variable named "patch".</li>
          <li>The sdfRef member of the copy in "patch" is removed.</li>
          <li>the JSON pointer that is the value of the sdfRef member is
dereferenced and the result is copied into a variable named "original".</li>
          <li>The JSON Merge Patch algorithm <xref target="RFC7396"/> is applied to patch
the contents of "original" with the contents of "patch".</li>
          <li>The result of the Merge Patch is used in place of the value of the
original JSON map.</li>
        </ol>
        <t>TODO: Make sure that the grammar in <xref target="syntax"/> allows specifying the
null values that are necessary to remove members in a merge-patch.</t>
        <section anchor="resolved-models">
          <name>Resolved models</name>
          <t>A model where all sdfRef references are processed as described in <xref target="sdfref"/> is called a resolved model.</t>
          <t>For example, given the following sdfData definitions:</t>
          <sourcecode type="json"><![CDATA[
"sdfData": {
  "Coordinate" : {
    "type": "number", "unit": "m"
  },
  "X-Coordinate" : {
    "sdfRef" : "#/sdfData/Coordinate",
    "description":
"Distance from the base of the Thing along the X axis."
  },
  "Non-neg-X-Coordinate" : {
    "sdfRef": "#/sdfData/X-Coordinate",
    "minimum": 0
  }
}
]]></sourcecode>
          <t>After resolving the definitions would look as follows:</t>
          <sourcecode type="json"><![CDATA[
"sdfData": {
  "Coordinate" : {
    "type": "number", "unit": "m"
  },
  "X-Coordinate" : {
    "description":
"Distance from the base of the Thing along the X axis.",
    "type": "number", "unit": "m"
  },
  "Non-neg-X-Coordinate" : {
    "description":
"Distance from the base of the Thing along the X axis.",
    "minimum": 0, "type": "number", "unit": "m"
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="sdfrequired">
        <name>sdfRequired</name>
        <t>The keyword "sdfRequired" is provided to apply a constraint that
defines for which declarations corresponding data are mandatory in an
instance conforming the current definition.</t>
        <t>The value of "sdfRequired" is an array of name references (JSON pointers), each
indicating one declaration that is mandatory to be represented.</t>
        <t>The example in <xref target="example-req"/> shows two required elements in the sdfObject definition for "temperatureWithAlarm", the sdfProperty "currentTemperature", and the sdfEvent "overTemperatureEvent". The example also shows the use of JSON pointer with "sdfRef" to use a pre-existing definition in this definition, for the "alarmType" data (sdfOutputData) produced by the sdfEvent "overTemperatureEvent".</t>
        <figure anchor="example-req">
          <name>Using sdfRequired</name>
          <sourcecode type="json"><![CDATA[
{
  "sdfObject": {
    "temperatureWithAlarm": {
      "sdfRequired": [
"#/sdfObject/temperatureWithAlarm/sdfProperty/currentTemperature",
"#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent"
      ],
      "sdfData":{
        "temperatureData": {
          "type": "number"
        }
      },
      "sdfProperty": {
        "currentTemperature": {
"sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData"
        }
      },
      "sdfEvent": {
        "overTemperatureEvent": {
          "sdfOutputData": {
            "type": "object",
            "properties": {
              "alarmType": {
                "sdfRef": "cap:#/sdfData/alarmTypes/quantityAlarms",
                "const": "OverTemperatureAlarm"
              },
              "temperature": {
"sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData"
              }
            }
          }
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="common-qualities">
        <name>Common Qualities</name>
        <t>Definitions in SDF share a number of qualities that provide metadata for
them.  These are listed in <xref target="tbl-common-qualities"/>.  None of these
qualities are required or have default values that are assumed if the
quality is absent.
If a label is required for an application and no label is given in the SDF model, the
last part (<tt>reference-token</tt>, <xref section="3" sectionFormat="of" target="RFC6901"/>) of the JSON
pointer to the definition can be used.</t>
        <table anchor="tbl-common-qualities">
          <name>Common Qualities</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">description</td>
              <td align="left">text</td>
              <td align="left">long text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">label</td>
              <td align="left">text</td>
              <td align="left">short text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">$comment</td>
              <td align="left">text</td>
              <td align="left">source code comments only, no semantics</td>
            </tr>
            <tr>
              <td align="left">sdfRef</td>
              <td align="left">sdf-pointer</td>
              <td align="left">(see <xref target="sdfref"/>)</td>
            </tr>
            <tr>
              <td align="left">sdfRequired</td>
              <td align="left">pointer-list</td>
              <td align="left">(see <xref target="sdfrequired"/>, applies to qualities of properties, of data)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="data-qualities">
        <name>Data Qualities</name>
        <t>Data qualities are used in <tt>sdfData</tt> and <tt>sdfProperty</tt> definitions,
which are named sets of data qualities (abbreviated as <tt>named-sdq</tt>).</t>
        <t><xref target="jso-inspired"/> lists data qualities inspired by the various
proposals at json-schema.org; the
intention is that these (information model level) qualities are
compatible with the (data model) semantics from the
versions of the json-schema.org proposal they were imported from.</t>
        <t><xref target="sdfdataqual2"/> lists data qualities defined specifically for the
present specification.</t>
        <table anchor="sdfdataqual2">
          <name>SDF-defined Qualities of sdfData</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">unit</td>
              <td align="left">string</td>
              <td align="left">unit name (note 1)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">scaleMinimum</td>
              <td align="left">number</td>
              <td align="left">lower limit of value in units given by unit (note 2)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">scaleMaximum</td>
              <td align="left">number</td>
              <td align="left">upper limit of value in units given by unit (note 2)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">nullable</td>
              <td align="left">boolean</td>
              <td align="left">indicates a null value is available for this type</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">contentFormat</td>
              <td align="left">string</td>
              <td align="left">content type (IANA media type string plus parameters), encoding (note 3)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">sdfType</td>
              <td align="left">string (<xref target="sdftype"/>)</td>
              <td align="left">sdfType enumeration (extensible)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">sdfChoice</td>
              <td align="left">named set of data qualities (<xref target="sdfchoice"/>)</td>
              <td align="left">named alternatives</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">enum</td>
              <td align="left">array of strings</td>
              <td align="left">abbreviation for string-valued named alternatives</td>
              <td align="left">N/A</td>
            </tr>
          </tbody>
        </table>
        <ol spacing="normal" type="1"><li>
            <t>Note that the quality <tt>unit</tt> was called <tt>units</tt> in SDF 1.0.
The unit name <bcp14>SHOULD</bcp14> be as
per the <xref section="SenML Units" relative="#senml-units" sectionFormat="bare" target="RFC8428"/> Registry
or the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="RFC8798"/> Registry in <xref target="IANA.senml"/>
as specified by
Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>, respectively.  </t>
            <t>
Exceptionally, if a registration in these registries cannot be
obtained or would be inappropriate, the unit name can also be a URI
that is pointing to a definition of the unit.  Note that SDF
processors are not expected to (and normally <bcp14>SHOULD NOT</bcp14>)
dereference these URIs; they may be useful to humans, though.
A URI unit name is distinguished from a registered unit name by the
presence of a colon; registered unit names that contain a colon (at
the time of writing, none) can therefore not be used in SDF.  </t>
            <t>
For use by translators into ecosystems that require URIs for unit
names, the URN sub-namespace "urn:ietf:params:unit" is provided
(<xref target="unit-urn"/>); URNs from this sub-namespace <bcp14>MUST NOT</bcp14> be used in a
<tt>unit</tt> quality, in favor of simply notating the unit name (e.g.,
<tt>kg</tt> instead of <tt>urn:ietf:params:unit:kg</tt>).</t>
          </li>
          <li>these qualities were included in SDF 1.0, but were not fully
 defined; they are not included in SDF 1.1.  In 1.next, they will
 be replaced by qualities to express scaling that are more aligned
 with the processes that combine ecosystem and instance specific
 information with an SDF model.</li>
          <li>The <tt>contentFormat</tt> quality follows the Content-Format-Spec as defined in
<xref section="6" sectionFormat="of" target="RFC9193"/>, allowing for expressing both numeric and string
based Content-Formats.</li>
        </ol>
        <section anchor="sdftype">
          <name>sdfType</name>
          <t>SDF defines a number of basic types beyond those provided by JSON or
JSO.  These types are identified by the <tt>sdfType</tt> quality, which
is a text string from a set of type names defined by the  "<tt>sdfType</tt>
values" sub-registry in the "SDF Parameters" registry
(<xref target="sdftype-values"/>).
The <tt>sdfType</tt> name is composed of lower case ASCII letters, digits,
and <tt>-</tt> (ASCII hyphen/minus) characters, starting
with a lower case ASCII letter (i.e., using a pattern of
"⁠<tt>[a-z][-a-z0-9]*</tt>"), typically employing KebabCase for
names constructed out of multiple words <xref target="KebabCase"/>.</t>
          <t>To aid interworking with <xref target="I-D.handrews-json-schema-validation-01"/> implementations, it is <bcp14>RECOMMENDED</bcp14>
that <tt>sdfType</tt> is always used in conjunction with the <tt>type</tt> quality
inherited from <xref target="I-D.handrews-json-schema-validation-01"/>, in such a way as to yield a common
representation of the type's values in JSON.</t>
          <t>Values for <tt>sdfType</tt> that are defined in this specification are shown in
<xref target="sdftype1"/>.
This table also gives a description of the semantics of the sdfType,
the conventional value for <tt>type</tt> to be used with the <tt>sdfType</tt> value,
and a conventional JSON representation for values of the type.</t>
          <table anchor="sdftype1">
            <name>Values defined in SDF 1.1 for sdfType quality</name>
            <thead>
              <tr>
                <th align="left">sdfType</th>
                <th align="left">Description</th>
                <th align="left">type</th>
                <th align="left">JSON Representation</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">byte-string</td>
                <td align="left">A sequence of zero or more bytes</td>
                <td align="left">string</td>
                <td align="left">base64url without padding (<xref section="3.4.5.2" sectionFormat="of" target="RFC8949"/>)</td>
              </tr>
              <tr>
                <td align="left">unix-time</td>
                <td align="left">A point in civil time (note 1)</td>
                <td align="left">number</td>
                <td align="left">POSIX time (<xref section="3.4.2" sectionFormat="of" target="RFC8949"/>)</td>
              </tr>
            </tbody>
          </table>
          <t>(1) Note that the definition of <tt>unix-time</tt> does not imply the
capability to represent points in time that fall on leap seconds.
More date/time-related sdfTypes are likely to be added in the sdfType
value registry.</t>
          <t>In SDF 1.0, a similar concept was called <tt>subtype</tt>.</t>
        </section>
        <section anchor="sdfchoice">
          <name>sdfChoice</name>
          <t>Data can be a choice of named alternatives, called <tt>sdfChoice</tt>.
Each alternative is identified by a name (string, key in the JSON
object used to represent the choice) and a set of dataqualities
(object, the value in the JSON object used to represent the choice).
Dataqualities that are specified at the same level as the sdfChoice
apply to all choices in the sdfChoice, except those specific choices
where the dataquality is overridden at the choice level.</t>
          <t>sdfChoice merges the functions of two constructs found in <xref target="I-D.handrews-json-schema-validation-01"/>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>enum</tt>  </t>
              <t>
What would have been  </t>
              <sourcecode type="json"><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></sourcecode>
              <t>
in SDF 1.0, is often best represented as:  </t>
              <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "foo": { "description": "This is a foonly"},
  "bar": { "description":
"As defined in the second world congress"},
  "baz": { "description": "From zigbee foobaz"}
}
]]></sourcecode>
              <t>
This allows the placement of other dataqualities such as
<tt>description</tt> in the example.  </t>
              <t>
If an enum needs to use a data type different from text string,
e.g. what would have been  </t>
              <sourcecode type="json"><![CDATA[
"type": "number",
"enum": [1, 2, 3]
]]></sourcecode>
              <t>
in SDF 1.0, is represented as:  </t>
              <sourcecode type="json"><![CDATA[
"type": "number",
"sdfChoice": {
  "a-better-name-for-alternative-1": { "const": 1 },
  "alternative-2": { "const": 2 },
  "the-third-alternative": { "const": 3 }
}
]]></sourcecode>
              <t>
where the string names obviously would be chosen in a way that is
descriptive for what these numbers actually stand for; sdfChoice
also makes it easy to add number ranges into the mix.  </t>
              <t>
(Note that <tt>const</tt> can also be used for strings as in the previous
example, e.g., if the actual string value is indeed a crucial
element for the data model.)</t>
            </li>
            <li>
              <t>anyOf  </t>
              <t><xref target="I-D.handrews-json-schema-validation-01"/> provides a type union called <tt>anyOf</tt>, which provides a
choice between anonymous alternatives.  </t>
              <t>
What could have been  </t>
              <sourcecode type="json"><![CDATA[
"anyOf": [
  {"type": "array", "minItems": 3, "maxItems": "3",
   "items": {"$ref": "#/sdfData/rgbVal"}},
  {"type": "array", "minItems": 4, "maxItems": "4",
   "items": {"$ref": "#/sdfData/cmykVal"}}
]
]]></sourcecode>
              <t>
in <xref target="I-D.handrews-json-schema-validation-01"/> can be more descriptively notated in SDF as:  </t>
              <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "rgb": {"type": "array", "minItems": 3, "maxItems": "3",
          "items": {"sdfRef": "#/sdfData/rgbVal"}},
  "cmyk": {"type": "array", "minItems": 4, "maxItems": "4",
           "items": {"sdfRef": "#/sdfData/cmykVal"}}
}
]]></sourcecode>
            </li>
          </ul>
          <t>Note that there is no need in SDF for the type intersection construct
<tt>allOf</tt> or the peculiar type-xor construct <tt>oneOf</tt> found in <xref target="I-D.handrews-json-schema-validation-01"/>.</t>
          <t>As a simplification for readers of SDF specifications accustomed to
the <xref target="I-D.handrews-json-schema-validation-01"/> enum keyword, this is retained, but limited to a choice
of text string values, such that</t>
          <sourcecode type="json"><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></sourcecode>
          <t>is syntactic sugar for</t>
          <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "foo": { "const": "foo"},
  "bar": { "const": "bar"},
  "baz": { "const": "baz"}
}
]]></sourcecode>
          <t>In a single definition, the keyword <tt>enum</tt> cannot be used at the same
time as the keyword <tt>sdfChoice</tt>, as the former is just syntactic
sugar for the latter.</t>
        </section>
      </section>
    </section>
    <section anchor="keywords-for-definition-groups">
      <name>Keywords for definition groups</name>
      <t>The following SDF keywords are used to create definition groups in the target namespace.
All these definitions share some common qualities as discussed in <xref target="common-qualities"/>.</t>
      <section anchor="sdfobject-1">
        <name>sdfObject</name>
        <t>The sdfObject keyword denotes a group of zero or more Object definitions.
Object definitions may contain or include definitions of Properties, Actions, Events declared for the object, as well as data types (sdfData group) to be used in this or other Objects.</t>
        <t>The qualities of an sdfObject include the common qualities, additional qualities are shown in <xref target="sdfobjqual"/>.
None of these
qualities are required or have default values that are assumed if the
quality is absent.</t>
        <table anchor="sdfobjqual">
          <name>Qualities of sdfObject</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfProperty</td>
              <td align="left">property</td>
              <td align="left">zero or more named property definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfAction</td>
              <td align="left">action</td>
              <td align="left">zero or more named action definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfEvent</td>
              <td align="left">event</td>
              <td align="left">zero or more named event definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
            <tr>
              <td align="left">minItems</td>
              <td align="left">number</td>
              <td align="left">(array) Minimum number of sdfObject instances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of sdfObject instances in array</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfproperty-1">
        <name>sdfProperty</name>
        <t>The sdfProperty keyword denotes a group of zero or more Property definitions.</t>
        <t>Properties are used to model elements of state.</t>
        <t>The qualities of a Property definition include the data qualities (and
thus the common qualities), see <xref target="data-qualities"/>, additional qualities are shown in <xref target="sdfpropqual"/>.</t>
        <table anchor="sdfpropqual">
          <name>Qualities of sdfProperty</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(data)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="data-qualities"/></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">readable</td>
              <td align="left">boolean</td>
              <td align="left">Reads are allowed</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">writable</td>
              <td align="left">boolean</td>
              <td align="left">Writes are allowed</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">observable</td>
              <td align="left">boolean</td>
              <td align="left">flag to indicate asynchronous notification is available</td>
              <td align="left">true</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfaction">
        <name>sdfAction</name>
        <t>The sdfAction keyword denotes a group of zero or more Action definitions.</t>
        <t>Actions are used to model commands and methods which are invoked. Actions have parameter data that are supplied upon invocation.</t>
        <t>The qualities of an Action definition include the common qualities, additional qualities are shown in <xref target="sdfactqual"/>.</t>
        <table anchor="sdfactqual">
          <name>Qualities of sdfAction</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfInputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the input data for an Action</td>
            </tr>
            <tr>
              <td align="left">sdfOutputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the output data for an Action</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t><tt>sdfInputData</tt> defines the input data of the action.  <tt>sdfOutputData</tt>
defines the output data of the action.
As discussed in <xref target="sdfaction-overview"/>, a set of data qualities with
type "object" can be used to substructure either data item, with
optionality indicated by the data quality <tt>required</tt>.</t>
      </section>
      <section anchor="sdfevent">
        <name>sdfEvent</name>
        <t>The sdfEvent keyword denotes zero or more Event definitions.</t>
        <t>Events are used to model asynchronous occurrences that may be communicated proactively. Events have data elements which are communicated upon the occurrence of the event.</t>
        <t>The qualities of sdfEvent include the common qualities, additional qualities are shown in <xref target="sdfevqual"/>.</t>
        <table anchor="sdfevqual">
          <name>Qualities of sdfEvent</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfOutputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the output data for an Event</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t><tt>sdfOutputData</tt> defines the output data of the action.
As discussed in <xref target="sdfevent-overview"/>, a set of data qualities with
type "object" can be used to substructure the output data item, with
optionality indicated by the data quality <tt>required</tt>.</t>
      </section>
      <section anchor="sdfdata-1">
        <name>sdfData</name>
        <t>The sdfData keyword denotes a group of zero or more named data type
definitions (named-sdq).</t>
        <t>An sdfData definition provides a reusable semantic identifier for a
type of data item and describes the constraints on the defined type.
It is not itself a declaration, i.e., it does not cause any of these
data items to be included in an affordance definition.</t>
        <t>The qualities of sdfData include the data qualities (and thus the common qualities), see <xref target="data-qualities"/>.</t>
      </section>
    </section>
    <section anchor="high-level-composition">
      <name>High Level Composition</name>
      <t>The requirements for high level composition include the following:</t>
      <ul spacing="normal">
        <li>The ability to represent products, standardized product types, and modular products while maintaining the atomicity of Objects.</li>
        <li>The ability to compose a reusable definition block from Objects, for example a single plug unit of an outlet strip with on/off control, energy monitor, and optional dimmer objects, while retaining the atomicity of the individual objects.</li>
        <li>The ability to compose Objects and other definition blocks into a higher level thing that represents a product, while retaining the atomicity of objects.</li>
        <li>The ability to enrich and refine a base definition to have product-specific qualities and quality values, e.g. unit, range, and scale settings.</li>
        <li>The ability to reference items in one part of a complex definition from another part of the same definition, for example to summarize the energy readings from all plugs in an outlet strip.</li>
      </ul>
      <section anchor="paths-in-the-model-namespaces">
        <name>Paths in the model namespaces</name>
        <t>The model namespace is organized according to terms that are defined in the definition files that are present in the namespace. For example, definitions that originate from an organization or vendor are expected to be in a namespace that is specific to that organization or vendor. There is expected to be an SDF namespace for common SDF definitions used in OneDM.</t>
        <t>The structure of a path in a namespace is defined by the JSON Pointers to the definitions in the files in that namespace. For example, if there is a file defining an object "Switch" with an action "on", then the reference to the action would be "ns:/sdfObject/Switch/sdfAction/on" where <tt>ns</tt> is the namespace prefix (short name for the namespace).</t>
      </section>
      <section anchor="modular-composition">
        <name>Modular Composition</name>
        <t>Modular composition of definitions enables an existing definition (could be in the same file or another file) to become part of a new definition by including a reference to the existing definition within the model namespace.</t>
        <section anchor="use-of-the-sdfref-keyword-to-re-use-a-definition">
          <name>Use of the "sdfRef" keyword to re-use a definition</name>
          <t>An existing definition may be used as a template for a new definition, that is, a new definition is created in the target namespace which uses the defined qualities of some existing definition. This pattern will use the keyword "sdfRef" as a quality of a new definition with a value consisting of a reference to the existing definition that is to be used as a template.</t>
          <t>In the definition that uses "sdfRef", new qualities may be added
and existing qualities from the referenced definition may be
overridden.  (Note that JSON maps (objects) do not have a defined
order, so the SDF processor may see these overrides before seeing the
<tt>sdfRef</tt>.)</t>
          <t>As a convention, overrides are intended to be used only for further restricting
the set of data values, as shown in <xref target="exa-sdfref"/>:  any value for a
<tt>cable-length</tt> also is a valid value for a <tt>length</tt>, with the
additional restriction that the length cannot be smaller than 5 cm.
(This is labeled as a convention as it cannot be checked in the
general case; a quality of implementation consideration for a tool
might be to provide at least some form of checking.)
Note that a description is provided that overrides the description of
the referenced definition; as this quality is intended for human
consumption there is no conflict with the intended goal.</t>
          <figure anchor="exa-sdfref">
            <artwork><![CDATA[
"sdfData":
  "length" : {
    "type": "number",
    "minimum": 0,
    "unit": "m"
    "description": "There can be no negative lengths."
  }
...
  "cable-length" : {
    "sdfRef": "#/sdfData/length"
    "minimum": 5e-2,
    "description": "Cables must be at least 5 cm."
  }
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="sdfthing-1">
        <name>sdfThing</name>
        <t>An sdfThing is a set of declarations and qualities that may be part of a more complex model. For example, the object declarations that make up the definition of a single socket of an outlet strip could be encapsulated in an sdfThing, and the socket-thing itself could be used in a declaration in the sdfThing definition for the outlet strip
(see <xref target="exa-sdfthing-outlet-strip"/> in {outlet-strip-example}} for an example SDF model).</t>
        <t>sdfThing definitions carry semantic meaning, such as a defined refrigerator compartment and a defined freezer compartment, making up a combination refrigerator-freezer product.
An <tt>sdfThing</tt> can also contain Interaction Affordances and sdfData itself, such
as a status (on/off) for the refrigerator-freezer as a whole (see
<xref target="exa-sdfthing-fridge-freezer"/> in <xref target="fridge-freezer-example"/> for an example SDF
model illustrating these aspects).</t>
        <t>An sdfThing may be composed of sdfObjects and other sdfThings.</t>
        <t>The qualities of sdfThing are shown in <xref target="sdfthingqual"/>.</t>
        <table anchor="sdfthingqual">
          <name>Qualities of sdfThing</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfThing</td>
              <td align="left">thing</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">sdfObject</td>
              <td align="left">object</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">sdfProperty</td>
              <td align="left">property</td>
              <td align="left">zero or more named property definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfAction</td>
              <td align="left">action</td>
              <td align="left">zero or more named action definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfEvent</td>
              <td align="left">event</td>
              <td align="left">zero or more named event definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
            <tr>
              <td align="left">minItems</td>
              <td align="left">number</td>
              <td align="left">(array) Minimum number of sdfThing instances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of sdfThing instances in array</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t><cref anchor="replace-xxxx">RFC Ed.: throughout this section, please replace RFC XXXX with this RFC number, and remove this note.</cref></t>
      <section anchor="media-type">
        <name>Media Type</name>
        <t>IANA is requested to add the following Media-Type to the "Media Types" registry.</t>
        <table align="left">
          <name>Media Type Registration for SDF</name>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Template</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">sdf+json</td>
              <td align="left">application/sdf+json</td>
              <td align="left">RFC XXXX, <xref target="media-type"/></td>
            </tr>
          </tbody>
        </table>
        <dl spacing="compact">
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>sdf+json</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary (JSON is UTF-8-encoded text)</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t><xref target="seccons"/> of RFC XXXX</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="media-type"/> of RFC XXXX</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Tools for data and interaction modeling in the Internet of Things</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>A JSON Pointer fragment identifier may be used, as defined in
<xref section="6" sectionFormat="of" target="RFC6901"/>.</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl>
              <dt>Magic number(s):</dt>
              <dd>
                <t>n/a</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>.sdf.json</t>
              </dd>
              <dt>Windows Clipboard Name:</dt>
              <dd>
                <t>"Semantic Definition Format (SDF) for Data and Interactions of Things"</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>n/a</t>
              </dd>
              <dt>Macintosh Universal Type Identifier code:</dt>
              <dd>
                <t>org.ietf.sdf-json<br/>
conforms to public.text</t>
              </dd>
            </dl>
          </dd>
          <dt>Person &amp; email address to contact for further information:</dt>
          <dd>
            <t>ASDF WG mailing list (asdf@ietf.org),
or IETF Applications and Real-Time Area (art@ietf.org)</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Author/Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Provisional registration:</dt>
          <dd>
            <t>no</t>
          </dd>
        </dl>
      </section>
      <section anchor="unit-urn">
        <name>IETF URN Sub-namespace for Unit Names (urn:ietf:params:unit)</name>
        <t>IANA is requested to register the following value in the "<xref section="IETF URN Sub-namespace for Registered Protocol Parameter Identifiers" relative="#params-1" sectionFormat="bare" target="IANA.params"/>" registry, following the template in
<xref target="RFC3553"/>:</t>
        <dl>
          <dt>Registry name:</dt>
          <dd>
            <t>unit</t>
          </dd>
          <dt>Specification:</dt>
          <dd>
            <t>RFC XXXX</t>
          </dd>
          <dt>Repository:</dt>
          <dd>
            <t>combining the symbol values from the <xref section="SenML Units" relative="#senml-units" sectionFormat="bare" target="IANA.senml"/> Registry and the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="IANA.senml"/> Registry in <xref target="IANA.senml"/> as specified by Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>,
respectively (which by the registration policy are guaranteed to be
non-overlapping).</t>
          </dd>
          <dt>Index value:</dt>
          <dd>
            <t>Percent-encoding (<xref section="2.1" sectionFormat="of" target="RFC3986"/>) is required of
any characters in unit names as required by ABNF rule "pchar" in
<xref section="3.3" sectionFormat="of" target="RFC3986"/>, specifically at the time of writing for the
unit names "%" (deprecated in favor of "/"), "%RH", "%EL".</t>
          </dd>
        </dl>
      </section>
      <section anchor="registries">
        <name>Registries</name>
        <t>IANA is requested to create an "SDF Parameters" registry, with the
sub-registries defined in this Section.</t>
        <section anchor="qnp">
          <name>Quality Name Prefixes</name>
          <t>IANA is requested to create a "Quality Name Prefixes" sub-registry in
the "SDF Parameters" registry, with the following template:</t>
          <dl>
            <dt>Prefix:</dt>
            <dd>
              <t>A name composed of lower case ASCII letters and digits, starting
with a lower case ASCII letter (i.e., using a pattern of "⁠<tt>[a-z][a-z0-9]*</tt>").</t>
            </dd>
            <dt>Contact:</dt>
            <dd>
              <t>A contact point for the organization that assigns quality names with
this prefix.</t>
            </dd>
          </dl>
          <t>Quality Name Prefixes are intended to be registered by organizations
that intend to define quality names constructed with an
organization-specifix prefix (<xref target="gnqn"/>).</t>
          <t>The registration policy is Expert Review as per <xref section="4.5" sectionFormat="of" target="RFC8126"/>.
The instructions to the Expert are to ascertain that the organization
will handle quality names constructed using their prefix in a way that
roughly achieves the objectives for an IANA registry that support
interoperability of SDF models employing these quality names,
including:</t>
          <ul spacing="normal">
            <li>Stability, "stable and permanent";</li>
            <li>Transparency, "readily available", "in sufficient detail" (<xref section="4.6" sectionFormat="of" target="RFC8126"/>).</li>
          </ul>
          <t>The Expert will take into account that other organizations operate in
different ways than the IETF, and that as a result some of these
overall objectives will be achieved in a different way and to a
different level of comfort.</t>
          <t>The "Quality Name Prefixes" sub-registry starts out empty.</t>
        </section>
        <section anchor="sdftype-values">
          <name>sdfType Values</name>
          <t>IANA is requested to create a "sdfType values" sub-registry in
the "SDF Parameters" registry, with the following template:</t>
          <dl>
            <dt>Name:</dt>
            <dd>
              <t>A name composed of lower case ASCII letters, digits and <tt>-</tt> (ASCII
hyphen/minus) characters, starting with a lower case ASCII letter
(i.e., using a pattern of "⁠<tt>[a-z][-a-z0-9]*</tt>").</t>
            </dd>
            <dt>Description:</dt>
            <dd>
              <t>A short description of the information model level structure and semantics</t>
            </dd>
            <dt>type:</dt>
            <dd>
              <t>The value of the quality "type" to be used with this sdfType</t>
            </dd>
            <dt>JSON Representation</dt>
            <dd>
              <t>A short description of a JSON representation that can be used for
this sdfType.  This <bcp14>MUST</bcp14> be consistent with the type.</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>A more detailed specification of meaning and use of sdfType.</t>
            </dd>
          </dl>
          <t>sdfType values are intended to be registered to enable modeling additional
SDF-specific types (see <xref target="sdftype"/>).</t>
          <t>The registration policy is Specification Required as per <xref section="4.6" sectionFormat="of" target="RFC8126"/>.  The instructions to the Expert are to ascertain that the
specification provides enough detail to enable interoperability
between implementations of the sdfType being registered, and that
names are chosen with enough specificity that ecosystem-specific
sdfTypes will not be confused with more generally applicable ones.</t>
          <t>The initial set of registrations is described in <xref target="sdftype-r"/>.</t>
          <table anchor="sdftype-r">
            <name>Initial set of sdfType values</name>
            <thead>
              <tr>
                <th align="left">Name</th>
                <th align="left">Description</th>
                <th align="left">type</th>
                <th align="left">JSON Representation</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">byte-string</td>
                <td align="left">A sequence of zero or more bytes</td>
                <td align="left">string</td>
                <td align="left">base64url without padding</td>
                <td align="left">
                  <xref section="3.4.5.2" sectionFormat="of" target="RFC8949"/></td>
              </tr>
              <tr>
                <td align="left">unix-time</td>
                <td align="left">A point in civil time</td>
                <td align="left">number</td>
                <td align="left">POSIX time</td>
                <td align="left">
                  <xref section="3.4.2" sectionFormat="of" target="RFC8949"/></td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section anchor="seccons">
      <name>Security Considerations</name>
      <t>Some wider issues are discussed in <xref target="RFC8576"/>.</t>
      <t>(Specifics: TBD.)</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC8126" to="BCP26"/>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="IANA.senml" target="https://www.iana.org/assignments/senml">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.params" target="https://www.iana.org/assignments/params">
          <front>
            <title>Uniform Resource Name (URN) Namespace for IETF Use</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC8428">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="J. Arkko" initials="J." surname="Arkko"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="August" year="2018"/>
            <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="RFC8798">
          <front>
            <title>Additional Units for Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>The Sensor Measurement Lists (SenML) media type supports the indication of units for a quantity represented. This short document registers a number of additional unit names in the IANA registry for units in SenML. It also defines a registry for secondary units that cannot be in SenML's main registry, as they are derived by linear transformation from units already in that registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8798"/>
          <seriesInfo name="DOI" value="10.17487/RFC8798"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC4122">
          <front>
            <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="R. Salz" initials="R." surname="Salz"/>
            <date month="July" year="2005"/>
            <abstract>
              <t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier). A UUID is 128 bits long, and can guarantee uniqueness across space and time. UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group). Information from earlier versions of the DCE specification have been incorporated into this document. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4122"/>
          <seriesInfo name="DOI" value="10.17487/RFC4122"/>
        </reference>
        <reference anchor="RFC6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
            <author fullname="K. Zyp" initials="K." surname="Zyp"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </reference>
        <reference anchor="RFC7396">
          <front>
            <title>JSON Merge Patch</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="J. Snell" initials="J." surname="Snell"/>
            <date month="October" year="2014"/>
            <abstract>
              <t>This specification defines the JSON merge patch format and processing rules. The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7396"/>
          <seriesInfo name="DOI" value="10.17487/RFC7396"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC9193">
          <front>
            <title>Sensor Measurement Lists (SenML) Fields for Indicating Data Value Content-Format</title>
            <author fullname="A. Keränen" initials="A." surname="Keränen"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Sensor Measurement Lists (SenML) media types support multiple types of values, from numbers to text strings and arbitrary binary Data Values. In order to facilitate processing of binary Data Values, this document specifies a pair of new SenML fields for indicating the content format of those binary Data Values, i.e., their Internet media type, including parameters as well as any content codings applied.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9193"/>
          <seriesInfo name="DOI" value="10.17487/RFC9193"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <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="W3C.NOTE-curie-20101216" target="https://www.w3.org/TR/2010/NOTE-curie-20101216/">
          <front>
            <title>CURIE Syntax 1.0</title>
            <author fullname="Mark Birbeck" role="editor"/>
            <author fullname="Shane McCarron" role="editor"/>
            <date day="16" month="December" year="2010"/>
          </front>
          <seriesInfo name="W3C NOTE" value="NOTE-curie-20101216"/>
          <seriesInfo name="W3C" value="NOTE-curie-20101216"/>
        </reference>
        <reference anchor="RFC0020">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="SPDX" target="https://spdx.org/licenses/">
          <front>
            <title>SPDX License List</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC9165">
          <front>
            <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="December" year="2021"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point.</t>
              <t>The present document defines a number of control operators that were not yet ready at the time RFC 8610 was completed:,, and for the construction of constants; / for including ABNF (RFC 5234 and RFC 7405) in CDDL specifications; and for indicating the use of a non-basic feature in an instance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9165"/>
          <seriesInfo name="DOI" value="10.17487/RFC9165"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items. The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources. 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="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.handrews-json-schema-validation-01">
          <front>
            <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title>
            <author fullname="Austin Wright" initials="A." surname="Wright">
         </author>
            <author fullname="Henry Andrews" initials="H." surname="Andrews">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Geraint Luff" initials="G." surname="Luff">
         </author>
            <date day="19" month="March" year="2018"/>
            <abstract>
              <t>   JSON Schema (application/schema+json) has several purposes, one of
   which is JSON instance validation.  This document specifies a
   vocabulary for JSON Schema to describe the meaning of JSON documents,
   provide hints for user interfaces working with JSON data, and to make
   assertions about what a valid document must look like.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-handrews-json-schema-validation-01"/>
        </reference>
        <reference anchor="I-D.wright-json-schema">
          <front>
            <title>JSON Schema: A Media Type for Describing JSON Documents</title>
            <author fullname="Austin Wright" initials="A." surname="Wright">
         </author>
            <author fullname="Henry Andrews" initials="H." surname="Andrews">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="16" month="April" year="2017"/>
            <abstract>
              <t>   JSON Schema defines the media type "application/schema+json", a JSON-
   based format for describing the structure of JSON data.  JSON Schema
   asserts what a JSON document must look like, ways to extract
   information from it, and how to interact with it, ideal for
   annotating existing JSON APIs that would not otherwise have
   hypermedia controls or be machine-readable.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-wright-json-schema-01"/>
        </reference>
        <reference anchor="I-D.irtf-t2trg-rest-iot">
          <front>
            <title>Guidance on RESTful Design for Internet of Things Systems</title>
            <author fullname="Ari Keränen" initials="A." surname="Keränen">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Matthias Kovatsch" initials="M." surname="Kovatsch">
              <organization>Siemens</organization>
            </author>
            <author fullname="Klaus Hartke" initials="K." surname="Hartke">
         </author>
            <date day="11" month="January" year="2023"/>
            <abstract>
              <t>   This document gives guidance for designing Internet of Things (IoT)
   systems that follow the principles of the Representational State
   Transfer (REST) architectural style.  This document is a product of
   the IRTF Thing-to-Thing Research Group (T2TRG).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-t2trg-rest-iot-11"/>
        </reference>
        <reference anchor="ZCL">
          <front>
            <title>The ZigBee Cluster Library</title>
            <author>
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <seriesInfo name="Zigbee Wireless Networking" value="pp. 239-271"/>
          <seriesInfo name="DOI" value="10.1016/b978-0-7506-8597-9.00006-9"/>
          <refcontent>Elsevier</refcontent>
        </reference>
        <reference anchor="OMA" target="http://www.openmobilealliance.org/wp/omna/lwm2m/lwm2mregistry.html">
          <front>
            <title>OMA LightweightM2M (LwM2M) Object and Resource Registry</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="OCF" target="https://openconnectivity.org/specs/OCF_Resource_Type_Specification.pdf">
          <front>
            <title>OCF Resource Type Specification</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC8576">
          <front>
            <title>Internet of Things (IoT) Security: State of the Art and Challenges</title>
            <author fullname="O. Garcia-Morchon" initials="O." surname="Garcia-Morchon"/>
            <author fullname="S. Kumar" initials="S." surname="Kumar"/>
            <author fullname="M. Sethi" initials="M." surname="Sethi"/>
            <date month="April" year="2019"/>
            <abstract>
              <t>The Internet of Things (IoT) concept refers to the usage of standard Internet protocols to allow for human-to-thing and thing-to-thing communication. The security needs for IoT systems are well recognized, and many standardization steps to provide security have been taken -- for example, the specification of the Constrained Application Protocol (CoAP) secured with Datagram Transport Layer Security (DTLS). However, security challenges still exist, not only because there are some use cases that lack a suitable solution, but also because many IoT devices and systems have been designed and deployed with very limited security capabilities. In this document, we first discuss the various stages in the lifecycle of a thing. Next, we document the security threats to a thing and the challenges that one might face to protect against these threats. Lastly, we discuss the next steps needed to facilitate the deployment of secure IoT systems. This document can be used by implementers and authors of IoT specifications as a reference for details about security considerations while documenting their specific security challenges, threat models, and mitigations.</t>
              <t>This document is a product of the IRTF Thing-to-Thing Research Group (T2TRG).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8576"/>
          <seriesInfo name="DOI" value="10.17487/RFC8576"/>
        </reference>
        <reference anchor="ECMA-262" target="https://www.ecma-international.org/wp-content/uploads/ECMA-262.pdf">
          <front>
            <title>ECMAScript 2020 Language Specification</title>
            <author>
              <organization>Ecma International</organization>
            </author>
            <date year="2020" month="June"/>
          </front>
          <seriesInfo name="ECMA" value="Standard ECMA-262, 11th Edition"/>
        </reference>
        <reference anchor="CamelCase" target="http://wiki.c2.com/?CamelCase">
          <front>
            <title>Camel Case</title>
            <author>
              <organization/>
            </author>
            <date year="2014" month="December"/>
          </front>
        </reference>
        <reference anchor="KebabCase" target="http://wiki.c2.com/?KebabCase">
          <front>
            <title>Kebab Case</title>
            <author>
              <organization/>
            </author>
            <date year="2014" month="August"/>
          </front>
        </reference>
        <reference anchor="I-D.bormann-asdf-sdf-mapping">
          <front>
            <title>Semantic Definition Format (SDF): Mapping files</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Jan Romann" initials="J." surname="Romann">
              <organization>Universität Bremen</organization>
            </author>
            <date day="26" month="April" year="2023"/>
            <abstract>
              <t>   The Semantic Definition Format (SDF) is a format for domain experts
   to use in the creation and maintenance of data and interaction models
   in the Internet of Things.  It was created as a common language for
   use in the development of the One Data Model liaison organization
   (OneDM) definitions.  Tools convert this format to database formats
   and other serializations as needed.

   An SDF specification often needs to be augmented by additional
   information that is specific to its use in a particular ecosystem or
   application.  SDF mapping files provide a mechanism to represent this
   augmentation.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-asdf-sdf-mapping-02"/>
        </reference>
        <reference anchor="I-D.ietf-jsonpath-iregexp">
          <front>
            <title>I-Regexp: An Interoperable Regexp Format</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Tim Bray" initials="T." surname="Bray">
              <organization>Textuality</organization>
            </author>
            <date day="29" month="June" year="2023"/>
            <abstract>
              <t>   This document specifies I-Regexp, a flavor of regular expressions
   that is limited in scope with the goal of interoperation across many
   different regular-expression libraries.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-iregexp-08"/>
        </reference>
      </references>
    </references>
    <?line 1615?>

<section anchor="syntax">
      <name>Formal Syntax of SDF</name>
      <t>This appendix describes the syntax of SDF using CDDL <xref target="RFC8610"/>.  Note
that this appendix was derived from <contact fullname="Ari Keränen"/>'s "alt-schema" and
<contact fullname="Michael Koster"/>'s "schema", with a view of covering the syntax that
was in use at the time of writing in the One Data Model <tt>playground</tt>
repository.</t>
      <t>This appendix shows the framework syntax only, i.e., a syntax with liberal extension points.
Since this syntax is nearly useless in finding typos in an SDF
specification, a second syntax, the validation syntax, is defined that
does not include the extension points.
The validation syntax can be generated from the framework syntax by
leaving out all lines containing the string <tt>EXTENSION-POINT</tt>; as this
is trivial, the result is not shown here.</t>
      <t>This appendix makes use of CDDL "features" as defined in <xref section="4" sectionFormat="of" target="RFC9165"/>.
A feature named "1.0" is used to indicate parts of the syntax being
deprecated towards SDF 1.1, and a feature named "1.1" is used to
indicate new syntax intended for SDF 1.1.
Features whose names end in "-ext" indicate extension points for
further evolution.</t>
      <sourcecode type="cddl"><![CDATA[
start = sdf-syntax

sdf-syntax = {
 ; info will be required in most process policies
 ? info: sdfinfo
 ? namespace: named<text>
 ? defaultNamespace: text
 ; Thing is a composition of objects that work together in some way
 ? sdfThing: named<thingqualities>
 ; Object is a set of Properties, Actions, and Events that together
 ; perform a particular function
 ? sdfObject: named<objectqualities>
 ; Includes Properties, Actions, and Events as well as sdfData
 paedataqualities
 EXTENSION-POINT<"top-ext">
}

sdfinfo = {
 ? title: text
 ? version: text
 ? copyright: text
 ? license: text
 ? modified: modified-date-time
 ? features: [
               * (any .feature "feature-name") ; EXTENSION-POINT
             ]
 optional-comment
 EXTENSION-POINT<"info-ext">
}

; Shortcut for a map that gives names to instances of X
; (has keys of type text and values of type X)
named<X> = { * text => X }

; EXTENSION-POINT is only used in framework syntax
EXTENSION-POINT<f> = ( * (quality-name .feature f) => any )
quality-name = text .regexp                   ; for EXTENSION-POINT
       "([a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*"; for EXTENSION-POINT

sdf-pointer = text ; .regexp curie-regexp -- TO DO!
; per se no point in having an empty list, but used for sdfRequired
; in odmobject-multiple_axis_joystick.sdf.json
pointer-list = [* sdf-pointer]

optional-comment = (
 ? $comment: text       ; source code comments only, no semantics
)

commonqualities = (
 ? description: text    ; long text (no constraints)
 ? label: text          ; short text (no constraints); default to key
 optional-comment
 ? sdfRef: sdf-pointer
 ; applies to qualities of properties, of data:
 ? sdfRequired: pointer-list
)

arraydefinitionqualities = (
 ? ("minItems" .feature "1.2") => uint
 ? ("maxItems" .feature "1.2") => uint
)

paedataqualities = (
 ; Property represents the state of an instance of an object
 ? sdfProperty: named<propertyqualities>
 ; Action invokes an application layer verb associated with an object
 ? sdfAction: named<actionqualities>
 ; Event represents an occurrence of event associated with an object
 ? sdfEvent: named<eventqualities>
 ; Data represents a piece of information that can be the state of a
 ; property or a parameter to an action or a signal in an event
 ? sdfData: named<dataqualities>

)

; for building hierarchy
thingqualities = {
 commonqualities
 ? sdfObject: named<objectqualities>
 ? sdfThing: named<thingqualities>
 paedataqualities
 arraydefinitionqualities
 EXTENSION-POINT<"thing-ext">
}

; for single objects, or for arrays of objects (1.2)
objectqualities = {
 commonqualities
 paedataqualities
 arraydefinitionqualities
 EXTENSION-POINT<"object-ext">
}

parameter-list =
  pointer-list .feature (["1.0", "pointerlist-as-parameter"]) /
  dataqualities .feature (["1.1", "dataqualities-as-parameter"])

actionqualities = {
 commonqualities
 ? sdfInputData: parameter-list   ; sdfRequiredInputData applies here
 ? ("sdfRequiredInputData" .feature "1.0") => pointer-list
 ? sdfOutputData: parameter-list  ; sdfRequired applies here
 ; zero or more named data type definitions that might be used above
 ? sdfData: named<dataqualities>
 EXTENSION-POINT<"action-ext">
}

eventqualities = {
 commonqualities
 ? sdfOutputData: parameter-list  ; sdfRequired applies here
 ; zero or more named data type definitions that might be used above
 ? sdfData: named<dataqualities>
 EXTENSION-POINT<"event-ext">
}

sdftype-name = text .regexp "[a-z][-a-z0-9]*"       ; EXTENSION-POINT

dataqualities = {
 commonqualities
 jsonschema
 ? ("units" .feature "1.0") => text
 ? ("unit" .feature "1.1") => text
 ? ("scaleMinimum" .feature "1.0") => number
 ? ("scaleMaximum" .feature "1.0") => number
 ? nullable: bool
 ? ("subtype" .feature "1.0") => "byte-string" / "unix-time"
            / (text .feature "subtype-ext")         ; EXTENSION-POINT
 ? ("sdfType" .feature "1.1") => "byte-string" / "unix-time"
            / (sdftype-name .feature "sdftype-ext") ; EXTENSION-POINT
 ? contentFormat: text
 EXTENSION-POINT<"data-ext">
}

propertyqualities = {
 ? observable: bool
 ? readable: bool
 ? writable: bool
 ~dataqualities
}

allowed-types = number / text / bool / null
              / [* number] / [* text] / [* bool]
              / {* text => any}
              / (any .feature "allowed-ext")        ; EXTENSION-POINT

compound-type = (
  "type" => ("object" .feature "1.1")
  ? required: [+text]
  ? properties: named<dataqualities>
)

jsonschema = (
 ? (("type" => "number" / "string" / "boolean" / "integer" / "array")
    // compound-type
    // (type: text .feature "type-ext")             ; EXTENSION-POINT
   )
 ; if present, all other qualities apply to all choices:
 ? ((("sdfChoice" .feature "1.1") => named<dataqualities>)
  // ("enum" => [+ text])) ; limited to text strings in SDF 1.1
 ; the next three should validate against type:
 ? ("enum" .feature "1.0") => [+ allowed-types]
 ? const: allowed-types
 ? default: allowed-types
 ; number/integer constraints
 ? minimum: number
 ? maximum: number
 ? exclusiveMinimum: number
 ? exclusiveMaximum: number
 ? multipleOf: number                   ; ISSUE: Do we need this?
 ; text string constraints
 ? minLength: uint
 ? maxLength: uint
 ? pattern: text                ; regexp
 ? format: "date-time" / "date" / "time"
           / "uri" / "uri-reference" / "uuid"
           / (text .feature "format-ext")           ; EXTENSION-POINT
 ; array constraints
 ? minItems: uint
 ? maxItems: uint
 ? uniqueItems: bool
 ? items: { ;;; ultimately, this will be mostly recursive, but,
            ;;; for now let's find out what we actually need
     ? sdfRef: sdf-pointer ; import limited to subset allowed here...
     ? description: text   ; long text (no constraints)
     optional-comment
     ; leave commonqualities out for non-complex data types,
     ; but need the above three.
     ; no further nesting: no "array"
     ? ((type: "number" / "string" / "boolean" / "integer")
        // compound-type
        // (type: text .feature "itemtype-ext")     ; EXTENSION-POINT
       )
     ; if present, all other qualities apply to all choices
     ? ((("sdfChoice" .feature "1.1") => named<dataqualities>)
     // ("enum" => [+ text])) ; limited to text strings in SDF 1.1
     ; jso subset
     ? minimum: number
     ? maximum: number
     ? format: text
     ? minLength: uint
     ? maxLength: uint
     EXTENSION-POINT<"items-ext">
   }
)

modified-date-time = text .abnf modified-dt-abnf
modified-dt-abnf = "modified-dt" .det rfc3339z

; RFC 3339 sans time-numoffset, slightly condensed
rfc3339z = '
   date-fullyear   = 4DIGIT
   date-month      = 2DIGIT  ; 01-12
   date-mday       = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on
                             ; month/year
   time-hour       = 2DIGIT  ; 00-23
   time-minute     = 2DIGIT  ; 00-59
   time-second     = 2DIGIT  ; 00-58, 00-59, 00-60 based on leap sec
                             ; rules
   time-secfrac    = "." 1*DIGIT
   DIGIT           =  %x30-39 ; 0-9

   partial-time    = time-hour ":" time-minute ":" time-second
                     [time-secfrac]
   full-date       = date-fullyear "-" date-month "-" date-mday

   modified-dt     = full-date ["T" partial-time "Z"]
'
]]></sourcecode>
    </section>
    <section anchor="json-schemaorg-rendition-of-sdf-syntax">
      <name>json-schema.org Rendition of SDF Syntax</name>
      <t>This appendix describes the syntax of SDF defined in <xref target="syntax"/>, but
using a version of the description techniques advertised on
json-schema.org <xref target="I-D.handrews-json-schema-validation-01"/>.</t>
      <t>The appendix shows both the validation and the framework syntax.
Since most of the lines are the same between these two files, those lines are shown only once, with a leading space, in the form of a unified diff.
Lines leading with a <tt>-</tt> are part of the validation syntax, and lines leading with a <tt>+</tt> are part of the framework syntax.</t>
      <sourcecode type="jso.json"><![CDATA[
 {
-  "title": "sdf-validation.cddl -- Generated: 2023-07-10T22:16:34Z",
+  "title": "sdf-framework.cddl -- Generated: 2023-07-10T22:16:37Z",
   "$schema": "http://json-schema.org/draft-07/schema#",
   "$ref": "#/definitions/sdf-syntax",
   "definitions": {
     "sdf-syntax": {
       "type": "object",
       "properties": {
         "sdfProperty": {
           "$ref": "#/definitions/sdfProperty-"
         },
         "sdfAction": {
           "$ref": "#/definitions/sdfAction-"
         },
         "sdfEvent": {
           "$ref": "#/definitions/sdfEvent-"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         },
         "info": {
           "$ref": "#/definitions/sdfinfo"
         },
         "namespace": {
           "type": "object",
           "additionalProperties": {
             "type": "string"
           }
         },
         "defaultNamespace": {
           "type": "string"
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdfinfo": {
       "type": "object",
       "properties": {
         "$comment": {
           "type": "string"
         },
         "title": {
           "type": "string"
         },
         "version": {
           "type": "string"
         },
         "copyright": {
           "type": "string"
         },
         "license": {
           "type": "string"
         },
         "modified": {
           "$ref": "#/definitions/modified-date-time"
         },
         "features": {
-          "type": "array",
-          "maxItems": 0
+          "type": "array"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "modified-date-time": {
       "type": "string"
     },
     "thingqualities": {
       "type": "object",
       "properties": {
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         },
         "sdfProperty": {
           "$ref": "#/definitions/sdfProperty-"
         },
         "sdfAction": {
           "$ref": "#/definitions/sdfAction-"
         },
         "sdfEvent": {
           "$ref": "#/definitions/sdfEvent-"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         },
         "$comment": {
           "type": "string"
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdf-pointer": {
       "type": "string"
     },
     "pointer-list": {
       "type": "array",
       "items": {
         "$ref": "#/definitions/sdf-pointer"
       }
     },
     "objectqualities": {
       "type": "object",
       "properties": {
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         },
         "sdfProperty": {
           "$ref": "#/definitions/sdfProperty-"
         },
         "sdfAction": {
           "$ref": "#/definitions/sdfAction-"
         },
         "sdfEvent": {
           "$ref": "#/definitions/sdfEvent-"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         },
         "$comment": {
           "type": "string"
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "propertyqualities": {
       "anyOf": [
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
               "$ref": "#/definitions/type-"
             },
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/enum-"
             },
             "type": {
               "$ref": "#/definitions/type-"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/enum-"
             },
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
-        }
-      ]
-    },
-    "dataqualities": {
-      "anyOf": [
+          "additionalProperties": {
+          }
+        },
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
-              "$ref": "#/definitions/type-"
+              "type": "string"
+            },
+            "enum": {
+              "$ref": "#/definitions/enum-"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/enum-"
             },
             "type": {
-              "$ref": "#/definitions/type-"
+              "type": "string"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
             }
           },
-          "additionalProperties": false
-        },
+          "additionalProperties": {
+          }
+        }
+      ]
+    },
+    "dataqualities": {
+      "anyOf": [
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
-              "type": "string",
-              "const": "object"
-            },
-            "required": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/type-"
             },
-            "properties": {
-              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            "enum": {
+              "$ref": "#/definitions/enum-"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/enum-"
+            },
+            "type": {
+              "$ref": "#/definitions/type-"
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "$ref": "#/definitions/format-"
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "$ref": "#/definitions/items-"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "sdfChoice": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
-        }
-      ]
-    },
-    "allowed-types": {
-      "anyOf": [
-        {
-          "type": "number"
+          "additionalProperties": {
+          }
         },
         {
-          "type": "string"
+          "type": "object",
+          "properties": {
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
+            "type": {
+              "type": "string",
+              "const": "object"
+            },
+            "required": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "properties": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "$ref": "#/definitions/format-"
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "$ref": "#/definitions/items-"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "sdfChoice": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            },
+            "type": {
+              "type": "string"
+            },
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "$ref": "#/definitions/format-"
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "$ref": "#/definitions/items-"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
+            "type": {
+              "type": "string"
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "$ref": "#/definitions/format-"
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "$ref": "#/definitions/items-"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
+        }
+      ]
+    },
+    "allowed-types": {
+      "anyOf": [
+        {
+          "type": "number"
+        },
+        {
+          "type": "string"
         },
         {
           "type": "boolean"
         },
         {
           "type": "null"
         },
         {
           "type": "array",
           "items": {
             "type": "number"
           }
         },
         {
           "type": "array",
           "items": {
             "type": "string"
           }
         },
         {
           "type": "array",
           "items": {
             "type": "boolean"
           }
         },
         {
           "type": "object",
           "additionalProperties": {
           }
+        },
+        {
         }
       ]
     },
     "uint": {
       "type": "integer",
       "minimum": 0
     },
+    "sdftype-name": {
+      "type": "string",
+      "pattern": "^[a-z][\\-a-z0-9]*$"
+    },
     "actionqualities": {
       "type": "object",
       "properties": {
         "$comment": {
           "type": "string"
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfInputData": {
           "$ref": "#/definitions/parameter-list"
         },
+        "sdfRequiredInputData": {
+          "$ref": "#/definitions/pointer-list"
+        },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "parameter-list": {
-      "$ref": "#/definitions/dataqualities"
+      "anyOf": [
+        {
+          "$ref": "#/definitions/pointer-list"
+        },
+        {
+          "$ref": "#/definitions/dataqualities"
+        }
+      ]
     },
     "eventqualities": {
       "type": "object",
       "properties": {
         "$comment": {
           "type": "string"
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "items-": {
       "type": "object",
       "properties": {
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "description": {
           "type": "string"
         },
         "minimum": {
           "type": "number"
         },
         "maximum": {
           "type": "number"
         },
         "format": {
           "type": "string"
         },
         "minLength": {
           "$ref": "#/definitions/uint"
         },
         "maxLength": {
           "$ref": "#/definitions/uint"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "format-": {
-      "type": "string",
-      "enum": [
-        "date-time",
-        "date",
-        "time",
-        "uri",
-        "uri-reference",
-        "uuid"
+      "anyOf": [
+        {
+          "type": "string",
+          "const": "date-time"
+        },
+        {
+          "type": "string",
+          "const": "date"
+        },
+        {
+          "type": "string",
+          "const": "time"
+        },
+        {
+          "type": "string",
+          "const": "uri"
+        },
+        {
+          "type": "string",
+          "const": "uri-reference"
+        },
+        {
+          "type": "string",
+          "const": "uuid"
+        },
+        {
+          "type": "string"
+        }
       ]
     },
+    "sdfType-": {
+      "anyOf": [
+        {
+          "type": "string",
+          "const": "byte-string"
+        },
+        {
+          "type": "string",
+          "const": "unix-time"
+        },
+        {
+          "$ref": "#/definitions/sdftype-name"
+        }
+      ]
+    },
+    "subtype-": {
+      "anyOf": [
+        {
+          "type": "string",
+          "const": "byte-string"
+        },
+        {
+          "type": "string",
+          "const": "unix-time"
+        },
+        {
+          "type": "string"
+        }
+      ]
+    },
+    "enum-": {
+      "type": "array",
+      "items": {
+        "$ref": "#/definitions/allowed-types"
+      },
+      "minItems": 1
+    },
     "sdfData-sdfChoice-properties-": {
       "type": "object",
       "additionalProperties": {
         "$ref": "#/definitions/dataqualities"
       }
     },
     "type-": {
       "type": "string",
       "enum": [
         "number",
         "string",
         "boolean",
         "integer",
         "array"
       ]
     },
     "sdfEvent-": {
       "type": "object",
       "additionalProperties": {
         "$ref": "#/definitions/eventqualities"
       }
     },
     "sdfAction-": {
       "type": "object",
       "additionalProperties": {
         "$ref": "#/definitions/actionqualities"
       }
     },
     "sdfProperty-": {
       "type": "object",
       "additionalProperties": {
         "$ref": "#/definitions/propertyqualities"
       }
-    },
-    "sdfType-": {
-      "type": "string",
-      "enum": [
-        "byte-string",
-        "unix-time"
-      ]
     }
   }
 }
]]></sourcecode>
    </section>
    <section anchor="jso-inspired">
      <name>Data Qualities inspired by json-schema.org</name>
      <t>Data qualities define data used in SDF affordances at an information
model level.
A popular way to describe JSON data at a data model level is proposed
by a number of drafts on json-schema.org (which collectively are
abbreviated JSO here)); for reference to a popular version we will
point here to <xref target="I-D.handrews-json-schema-validation-01"/>.
As the vocabulary used by JSO is familiar to many JSON modelers, the
present specification borrows some of the terms and ports their
semantics to the information model level needed for SDF.</t>
      <t>The main data quality imported is the "<tt>type</tt>".
In SDF, this can take one of six (text string) values, which are
discussed in the following subsections (note that the JSO type
"<tt>null</tt>" is not supported as a value of this data quality in SDF).</t>
      <t>The additional quality "<tt>const</tt>" restricts the data to one specific
value (given as the value of the <tt>const</tt> quality).</t>
      <t>Similarly, the additional quality "<tt>default</tt>" provides data that can
be used in the absence of the data (given as the value of the <tt>const</tt>
quality); this is mainly documentary and not very well-defined for SDF
as no process is defined that would add default values to an instance
of something.</t>
      <section anchor="type-number-type-integer">
        <name>type "<tt>number</tt>", type "<tt>integer</tt>"</name>
        <t>The types "<tt>number</tt>" and "<tt>integer</tt>" are associated with floating point
and integer numbers, as they are available in JSON.
A type value of <tt>integer</tt> means that only integer values of JSON
numbers can be used (note that <tt>10.0</tt> is an integer value, even if it
is in a notation that would also allow non-zero decimal fractions).</t>
        <t>The additional data qualities "<tt>minimum</tt>", "<tt>maximum</tt>",
"<tt>exclusiveMinimum</tt>", "<tt>exclusiveMaximum</tt>" provide number values that
serve as inclusive/exclusive lower/upper bounds for the number.
(Note that the Boolean form of
"<tt>exclusiveMinimum</tt>"/"<tt>exclusiveMaximum</tt>" found in earlier JSO drafts
is not used.)</t>
        <t>The data quality "<tt>multipleOf</tt>" gives a positive number that
constrains the data value to be an integer multiple of the number
given.
(Type "<tt>integer</tt>" can also be expressed as a "<tt>multipleOf</tt>" quality of
value 1, unless another "<tt>multipleOf</tt>" quality is present.)</t>
      </section>
      <section anchor="type-string">
        <name>type "<tt>string</tt>"</name>
        <t>The type "<tt>string</tt>" is associated with Unicode text string values as
they are available in JSON.</t>
        <t>The length (as measured in characters) can be constrained by the
additional data qualities "<tt>minLength</tt>" and "<tt>maxLength</tt>", which are
inclusive bounds.
Note that the previous version of the present document explained
text string length values in bytes, which however is not meaningful
unless bound to a specific encoding (which could be UTF-8, if this
unusual behavior is to be restored).</t>
        <t>The data quality "<tt>pattern</tt>" takes a string value that is interpreted
as an <xref target="ECMA-262"/> regular expression in Unicode mode that constrain the
string (note that these are not anchored by default, so unless <tt>^</tt> and
<tt>$</tt> anchors are employed, ECMA-262 regular expressions match any string that <em>contains</em> a match).
The JSO proposals acknowledge that regular expression support is
rather diverse in various platforms, so the suggestion is to limit
them to:</t>
        <ul spacing="compact">
          <li>characters;</li>
          <li>character classes in square brackets, including ranges; their complements;</li>
          <li>simple quantifiers <tt>*</tt>, <tt>+</tt>, <tt>?</tt>, and range quantifiers <tt>{n}</tt>,
<tt>{n,m}</tt>, and <tt>{n,}</tt>;</li>
          <li>grouping parentheses;</li>
          <li>the choice operator <tt>|</tt>;</li>
          <li>and anchors (beginning-of-input <tt>^</tt> and end-of-input <tt>$</tt>).</li>
        </ul>
        <t>Note that this subset is somewhat similar to the subset introduced by
iregexps <xref target="I-D.ietf-jsonpath-iregexp"/>, which however are anchored
regular expressions, and which include certain backslash escapes for
characters and character classes.</t>
        <t>The additional data quality "<tt>format</tt>" can take one of the following
values.  Note that, at an information model level, the presence of
this data quality changes the type from being a simple text string to
the abstract meaning of the format given (i.e., the format "date-time"
is less about the specific syntax employed in <xref target="RFC3339"/> than about the usage
as an absolute point in civil time).</t>
        <ul spacing="compact">
          <li>"<tt>date-time</tt>", "<tt>date</tt>", "<tt>time</tt>":
An <xref target="RFC3339"/> <tt>date-time</tt>, <tt>full-date</tt>, or <tt>full-time</tt>, respectively.</li>
          <li>"<tt>uri</tt>", "<tt>uri-reference</tt>":
An <xref target="RFC3986"/> URI or URI Reference, respectively.</li>
          <li>"<tt>uuid</tt>": An <xref target="RFC4122"/> UUID.</li>
        </ul>
      </section>
      <section anchor="type-boolean">
        <name>type "<tt>boolean</tt>"</name>
        <t>The type "<tt>boolean</tt>" can take the values "<tt>true</tt>" or "<tt>false</tt>".</t>
      </section>
      <section anchor="type-array">
        <name>type "<tt>array</tt>"</name>
        <t>The type "<tt>array</tt>" is associated with arrays as they are available in
JSON.</t>
        <t>The additional quality "<tt>items</tt>" gives the type that each of the
elements of the array must match.</t>
        <t>The number of elements in the array can be constrained by the additional
data qualities "<tt>minItems</tt>" and "<tt>maxItems</tt>", which are inclusive
bounds.</t>
        <t>The additional data quality "<tt>uniqueItems</tt>" gives a Boolean value
that, if true, requires the elements to be all different.</t>
      </section>
      <section anchor="type-object">
        <name>type "<tt>object</tt>"</name>
        <t>The type "<tt>object</tt>" is associated with maps, from strings to values, as
they are available in JSON ("objects").</t>
        <t>The additional quality "<tt>properties</tt>" is a map the entries of which
describe entries in the specified JSON object: The key gives an
allowable map key for the specified JSON object, and the value is a
map with a named set of data qualities giving the type for the
corresponding value in the specified JSON object.</t>
        <t>All entries specified this way are optional, unless they are listed in
the value of the additional quality "<tt>required</tt>", which is an array of
string values that give the key names of required entries.</t>
        <t>Note that the term "properties" as an additional quality for
defining map entries is unrelated to sdfProperty.</t>
      </section>
      <section anchor="implementation-notes">
        <name>Implementation notes</name>
        <t>JSO-based keywords are also used in the specification techniques of a
number of ecosystems, but some adjustments may be required.</t>
        <t>E.g., <xref target="OCF"/> is based on Swagger 2.0 which appears to be based on
"draft-4" <xref target="I-D.wright-json-schema"/> (also called draft-5, but semantically intended to
be equivalent to draft-4).
The "<tt>exclusiveMinimum</tt>" and "<tt>exclusiveMaximum</tt>" keywords use the
Boolean form there, so on import to SDF their values have to be
replaced by the values of the respective "<tt>minimum</tt>"/"<tt>maximum</tt>"
keyword, which are themselves then removed; the reverse transformation
applies on export.</t>
        <t>TBD: add any useful implementation notes we can find for other
ecosystems that use JSO.</t>
      </section>
    </section>
    <section anchor="composition-examples">
      <name>Composition Examples</name>
      <t>This appendix contains two examples illustrating different composition approaches
using the <tt>sdfThing</tt> quality.</t>
      <section anchor="outlet-strip-example">
        <name>Outlet Strip Example</name>
        <figure anchor="exa-sdfthing-outlet-strip">
          <artwork><![CDATA[
{
  "sdfThing": {
    "outlet-strip" : {
      "label": "Outlet strip",
      "description": "Contains a number of Sockets",
      "sdfObject": {
        "socket": {
          "description": "An array of sockets in the outlet strip",
          "minItems": 2,
          "maxItems": 10
        }
      }
    }
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="fridge-freezer-example">
        <name>Refrigerator-Freezer Example</name>
        <figure anchor="exa-sdfthing-fridge-freezer">
          <artwork><![CDATA[
{
  "sdfThing": {
    "refrigerator-freezer" : {
      "description": "A refrigerator combined with a freezer",
      "sdfProperty": {
        "status": {
          "type": "boolean",
          "description":
"Indicates if the refrigerator-freezer is powered"
        }
      },
      "sdfObject": {
        "refrigerator": {
          "description": "A refrigerator compartment",
          "sdfProperty": {
            "temperature": {
              "sdfRef": "#/sdfProproperty/temperature",
              "maximum": 8
            }
          }
        },
        "freezer": {
          "label": "A freezer compartment",
          "sdfProperty": {
            "temperature": {
              "sdfRef": "#/sdfProproperty/temperature",
              "maximum": -6
            }
          }
        }
      }
    }
  },
  "sdfProperty": {
    "temperature": {
      "description": "The temperature for this compartment",
      "type": "number",
      "unit": "Cel"
    }
  }
}
]]></artwork>
        </figure>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This draft is based on <tt>sdf.md</tt> and <tt>sdf-schema.json</tt> in the old
one-data-model <tt>language</tt> repository, as well as <contact fullname="Ari Keränen"/>'s
"alt-schema" from the Ericsson Research <tt>ipso-odm</tt> repository (which
is now under subdirectory <tt>sdflint</tt> in the one-data model <tt>tools</tt>
repository).</t>
      <!--  LocalWords:  SDF namespace defaultNamespace instantiation OMA
 -->
<!--  LocalWords:  affordances ZigBee LWM OCF sdfObject sdfThing
 -->
<!--  LocalWords:  idempotency Thingness sdfProperty sdfEvent sdfRef
 -->
<!--  LocalWords:  namespaces sdfRequired Optionality sdfAction
 -->
<!--  LocalWords:  dereferenced dereferencing atomicity
 -->
<!--  LocalWords:  interworking
 -->

</section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="A." surname="Keränen" fullname="Ari Keränen">
        <organization>Ericsson</organization>
        <address>
          <postal>
            <street/>
            <city>Jorvas</city>
            <code>02420</code>
            <country>Finland</country>
          </postal>
          <email>ari.keranen@ericsson.com</email>
        </address>
      </contact>
      <contact initials="J." surname="Romann" fullname="Jan Romann">
        <organization>Universität Bremen</organization>
        <address>
          <email>jan.romann@uni-bremen.de</email>
        </address>
      </contact>
      <contact initials="W." surname="van der Beek" fullname="Wouter van der Beek">
        <organization>Cascoda Ltd.</organization>
        <address>
          <postal>
            <street>Threefield House</street>
            <street>Threefield Lane</street>
            <city>Southampton</city>
            <country>United Kingdom</country>
          </postal>
          <email>w.vanderbeek@cascoda.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y96Xojx5Eo+r+eIgfyHIESAC7dWpptSaZ6sWn3ouluXXms
02MUgAJZbqAKriqQTVH09903mR/zJGfe5D7JjTWXqgIINinPeA742WqgkBUZ
GRkZGVtG9vv96OzQ3IvG+STNTg7Nspr2v4yiKq1myaH5OjLmdTKPsyodm8fJ
NM3SKs0z8zQv5nFluq8fP90x07wwj+MqNnE2McdZlRTxGFuVJp+aN6cAtozi
0ahIoKOXWfL4uYHXokk+zuI59DEp4mnVTxPoOC4n0z7+fxZXSVlFY/jnJC8u
Dk1ZTQDFrEyyclkemqpYJlG5HM3TsoSeqosFADp+8uZpFMVFEh+ao8VilsLr
iEZ0nhfvTop8uYDn2PW75AIeTQ4Z2Syp+o8Rhyg6S7JlcghjNkbbrxv+BgM3
Xexxh0DO43R2aHCMv8HRDvLihLtKq9Pl6NAQCc5PiAq7iGcUL6vTvECE+oaJ
9Twdn8bJzPwhL6E7eh3AHJrvYiDEWfIsP0nH9LSsiiSpDs1nB/fN78xr+kY/
jNMK6HkEQ8rHpz3z6Iif5hOA/vGD+5/tPfhYniyzCkn//WtusjjNM2jT+XS/
/8XeF/3P9g76n+3f+7xDPyY8uDmj95f8NHtHGP7mBH8YjPM5NSty5KpkklZ5
4Y3qUVxA48x8i3TNMjes7zMYVFGm1X/+R2W+LZI5NHrzp2NtEJfjNPVaxUmj
ldLhO0BnGo9Pzb17e/fv73mk4Bc8KjzuH3x577MHIRV+myBqFz4lPr3/oH//
YL9/sP9l//N7Dw72fUqM41H+m+qn1M5yMHRg5apIR8sqnN2jIjV/SIr//I8s
8YjwpEjHZZlnwXg+/tgbwu/z4iwu/YncO7h/sFebyKdpNgNO9bGMi3TwDtgW
+vtNIt3IZClOv48z8yq/dlp8qH+Js0FBr/xmmaX9ETUYTBIP6g/5ErjD/GzO
APwEPn2bJO9cB49gZvNJbJ5Vk4E/bPrch7UF36ZpMpuY3+XLMmk+fgZD8gj0
Gro7jeeLKs9qzA0rOpmYP8BanQiPyiDOB4AaYDYCxH4zZnyINFFGqx8ogOgc
H704GoBYmsMrMNiq1GeLuIjnIKr4X3j66umje/fuPQCBV/G3L+8ffAmSDd+V
B1880Ad9gtU/kPcefPk5gC9S/np//+AAvi7TCX///MHePnSUpxnLBHj0xb0H
8MY8KU6S/iKuxqfSw+f7e8Cbk4n2+OA+IDQe5fLag/0H9wBBkGn9sWK5f/C5
0P3QFAkz8yQtF7MYF8+j7w4+h0c/3Hs0ePHyzZP+GLBM+gd7+3v7B/uAAn1n
SHt7B3so/2DN4rby3eM/MlzZa/CBeZaOQcQn8G/J4qqKYQjA76dVtSgPd3fL
xeQ9rqndGbcsdxkh2CkOzTSelYmO5PPPoHdcZ/ksSrNpMGn9x4NTmN0iOS/7
fwGe75fjU5j3/lk8Sye0a/SRpPBT9JHp7x18VCYk2ftfDO6Zft8wtFJAnRfp
yWnlA6JX78vPaQFyvTqoipN+AbtaP80rpCR/gjZ/evQMhM7L48H+Hvxv//Pd
bx988WV/r//FZ3uf97/87MEX/QeDPfj7vI8y6eXzo4Bs8B2oBf2fJ/jf5wfP
TffZOfyzY16O/gJo0+70KinzZTFO4MMJkLa4aKFaSGyg9fn5+SBfADvmo3SW
xLNZGmfjhKh/vtjN51m8OzufH8z5v4VAHpxWxNAvHz0NEX301KHxBnZs83qR
jNOpbNMNhD4yZweD/cF9c7Q8WZaVOdgTCVtnCUQRJjrDKTqD5U4IlgC73IU+
/6x9/hn7/HPQ52AxmQqXf/bF57j0xqhkwKMnj54f9Q8+Pzhs7REJk4yBX2jF
ZQQrnglh+sh0SVbtLhezPJ6UuwpLerMEweevx0W6oLHtocw6WcYnbXRxigDK
Od4VoH9RYKR/j4IIr7/3OYtOEOxJiSuA3+fBwXqrgDHiYmLH2jP7+9WpeTJJ
pd9HIKpnIIqTJhWQCOm7dDA+QJm4+41t6g+QHhr7lFH7GGTD/f7+QX//S9yf
/pCM4tFmfdimfh/0sL2PvS/7B6TM4CIcsWrhVMx5vFigxhtFMFe4SQhxQDI9
efYU9JwfgS36f4S/t50o6sOij0fA3qDhRdGP/5aiXOm/9T7y+29Ok+sV5rQ0
sYgQ0iFh54nTzCTvF0lRlabKCRTsawaeVgBxDDotgcGljG2Bv3Apop45UQU0
dQqomYMWMCvhEZMKQKiq61TTASiBqImb0mc32IxL4MlRUsInRR8VWoKEzVmq
lNQnQE4LEOllPk5j3EhTXwvuPgGFuip75ogf9AjGd0WO4wSe3OnBq+Y8mc3w
X8SStGnU5ksiDD6yojtHCoF6mZ0krMMQcXKikut0YN7kOQwdFiGoKBW0SEul
dZUTtUbALJ4ENzSSHPoqaK3AFvATGw6IVZYkkwSUEJjosoqrZfnW+4j2we9f
v3yhHRTJAuQ6jJnRBVIjwfYHe+Y8FnoSjahX0qCgVbe/t7eDbQlVMIuWoC1V
D/3fP9sRAGV6khGdY6Q/gfkknS9mqGBJp2ROfdIzs3iUzKAlY7APpK6YEcBK
2t/fA90gqYANdGbxJzRVzA+/NV0Utf29e/39/Z2BZWsZmofX/v0doPNsRuxQ
zmGDABLyDJVmuUB6A6R7fbAWYGvjRTRPQflIogjE+zEunMmS5i2Kfv1P8Ovv
UdCP88UFYoYo6ZrrET9k+flgMIAN+OvaGrRT89FH5g1o6mmWz/KTC5rZR8gJ
GVuCEbH+YYQTtzi9KIHpZwY0wDl0BvTBhTkrc1hiE+j6DPTAeDSzq9BbQpGx
i4hoAz/M8W1YsxMDjET8pSYggQazFNCvCJ6wdopKl79qz8EQpJ4samCmgjI7
Si7y2gKnpqdLEDTlQ4ACiyaZw6oCKkA/aCVDF/C/2MxQKQCq439HMChGqmfA
9oAvBavhiGGEmi/sWBelGeWIRwNgKWJmgqICgBPoUmAn70/TUYpQZklZci8Z
fOrp0k6mU+ITYHTQbM10mdFIcKKRNnOwz2YXJidSR6hhglkMFCjTSQKsczQF
ok1Q5tHkgShgnkdwYEEQacC8Q4k4BfJPiMYewXoizaA31tEXORjMOBkwZSWS
ah6/w1/HoOgU5jQ/h3ZgxGX4U3maL2kaaH55ygFE+6TjWBV5ixYNW2gPY5xd
PDREK6Yd8dxpfOZNfGzHCytrCWYrUBGmrEIpCuDhjZ5hW05U8RKI9C9LkF24
kyF7z5Mqpr2B2BtYOPYEOo5qkoxnYJswO52C4W5KAGPKHN5EPJGtRsAfzL8r
3wVyHJm/cs9IDSsDVdKhUCFxZRK0uRgVkpqwBZtuTtvJDvcC8vcsIbnrYxuZ
ep9R9ITsNxrpu+QCFfclkC9OC4YPoAeme5zZjoBeNLJ0nsgiH6O8mpjOPJmP
kqIz2Imib2f5+B0CfZklxBM5TCpiDZtVDW+VF2DeKROiy8aEu+lDZIfSwahy
0G5koznD1ait7XqAof2WXE/C5koyZCvSEpCciACvRTOGTQ4fw1pDivt7tqzq
U6Lmoxns0uYFaGSgMpH7C6mMKxHIR8CIaKRR+IRXzLueMkMI7vAsEeEB6SZ8
S8epAX1LxA58Yv2BPooqcEFfWElAHQG+kObQo8U3maJWQJTkUTjlACiLyoIR
h16JkgTeH8cLXH7pT7hRwsiAIafpe/hCUnMIEIeKMZFZ9hhe0G16h042avax
7OHsIURRAhIKtpdpCo9HF62kht50qDKvbn0zcJQ0ixzNBljbIAdF1uAWCrrf
pGfAxqwSWvO7ZKznI2Yh3PkSQ6qhaGawILsvABQDfiLzhzI2n6KTjfkeRaBV
xHA4rAAl2Vla5BmK1vIh852nlPSIMkimyOpxtOgt0yPuuPwBNZbBniDrmQRm
1aRTYeYFAEHm6zhEOm6nArUmL5Clp0U+R3GAssyTQjOxlgCI3TdViWP9u8Ql
zVx1c6oDQjj/0DE6rEA/pM2QxJ9PaxBEyKk3h5+PaNn6XMbS9hxfPAXjJMm4
pd8Zf2CxR/zHGpxxC0lWEfE9oeaLhIdWjADVOrCJzzv4dpEsS1JMLOVo6siI
QJ6H5cFa2sAp/7TQynQOKlKBWIqug2rFJEdNB4TsDHZRlEu08tNBMiD+uUCy
YANZTcjMNG8K22pOA4+RoZUV5Q1m5p9yeX8COwFghM8+Ls3vQY9jKxtlIej3
FTDNCtbWTV0cJ2sZm7XTHJagToTl74jVaRJNyD2mw6htzt2oRqk3YB13P2Et
SBRa2ooKZJgY8aZ9yW7nVpV+6CksyIEVajCwf4OoOJml5amHBir/3ZfjcVyS
g2EG/EVbJwEISKMUEbWM9B2alLgoUDkBXN0GUt/bYlPfXJhRuQEZvyjBgJfO
7fB1qrBjsZRpZ2TDl/YztUpxm2Mqwn6r6jtrLCByBoiZ1SyYkp6YwffSjLWX
8SwvWTFyDXqk5GUTXquMK3A2TG+Giy+FxcNanABSVVuB+dQ2uGJhxL5mhiKE
aK6yA3fdAAMiAexwMJ8oeFjTS0kNBgRANxwnvP9UORhr5ltU4NUGQkTjjMxG
WQcicZp+AacFwmBQP65ykeG+nYaLepwsqlJ1lhAI0CpnC0fQoXbswSfErT6U
jPPyAlSaOVDlOa2acrlYAKd9/+qZoy/sKRmgXcALx4/Jv4Azr2JpAipwOkMb
rT56ESGgnYzRGUD6G7x8tDxxhvTzBE3ZtJyj+dH6w1oaGnIzrKAjDP8M1AZA
Y8LeNvLe+ZtBtxNzn7AnIsEIWgBpp6dGzIW3CsgYbFIR5YIuAf1R5wD6qtOn
Q3b/i9w1bqcA09E5NlimqoeA/R8I6QjnZAE7zFzfJJTZsvEgl6StjhIQo2DX
jJelx/Ed8diZaTpLOubycp1b7+pqgMa+WOad0UUFr6itJlIvy8/70AXsgjEs
upLiDqTTlhdZnl0QilEnH1dJ1UF90fkRDqOoT3Y/ruAlshrpCqghokMqU5t3
QcsSzVFkNZWRVltVuqEoFnRRH+IfO8+/f/2m0+N/zYuX9PnVk3/5/vjVk8f4
+fXvjp49sx8iafH6dy+/f/bYfXJvPnr5/PmTF4/5ZXhqgkdR5/nRv3ZYb+i8
/O7N8csXR886jW2S5rsiaUTGLYyQ3VGR+g2JvN8++u7//Pv+fZikf3r19NHB
/v6Dqyv58uX+F/fhy/lpIloKmsPyFbWDCFWfmM242Ux1efYjgCF+nim5PvkR
KfP20Px6NF7s3/9aHuCAg4dKs+Ah0az5pPEyE7HlUUs3lprB8xqlQ3yP/jX4
rnT3Hv76mxnwiOnvf/nN1+Q1ewmr6yxNzsnX9eR9TMvK7Z9R9AMZBYVueeg1
5UbKfyiTfHMePROyPEXxUdP4NYAYn3ZM9/JSgOxfXYFoiP72t79hhCuLLnFh
otzqHJpLchV2yDEPXzuKHK5X6lySP1a6xzvsIO6I/EAYB3v7D/p79/sH9/VH
9A5SvA1/fqRfDDa05HiUF2D+HwH7FOyjUs1toFAkeogwNKgjI6RYg/4Mja/w
jQ6qceUCtlI3TuDMVa/DT/EoRY8IfnRQgOrxcla98IARGPrRmsauC6G/fudG
qut7j5FmaIcHj6i/kjRfImbUIYnF9iLbYCXBf8gBN5qifDplx36xlAeZ0kxg
olaLeI/yfJbEWcf+diWfrnoesmyOhKjWvrfguSwyDz+DfpTkr8sUxii7K6hx
5Lxmtw/qFIDvwMOl53U3nd60v+n02g6JZCt6rPKTk9m1k0GNgmm4pkvcs1DZ
YBV70EL5SP97FV3hGo0uD81HunI5YvZVx+7FKhes9ypQKnGTvSKHeckBKzYH
WVoQwoPIMdSQsByK6qq6QELOFmXYIVtKvcBFSB6Tb5mXeiCyYM3C3mLZD5mF
GFJ/caxKE8s4aMBpmGdD1HSG8FM7LsyPggltZtBgmYHNLvJSqU4vyKDImihs
HEDphlMymy1R8VVvS0VWlTNPnR5+jr5VJN74NE3OtIcSrUP2jPsjMUNmoSEP
O9VQViLMoMvX0ZZ/QB8nI3LQhw5lnkDNRCtiJHHEZPIQnc2IAutfGlHAMNxZ
nlJUj+JeROZpWpQY2UI3ksV7vCxoVIyORAJhw0YNHdrs+lRk7AGaugrfyFyw
tNO5ANOzYq3J931jtMCaUBojy8Ud8qadwTxQCyWPD9NpKsB85BBBzlZXrWVO
wLdI82WJriAyp1N0TeciKXwxqvi4yCYRnDz6TsF3JicFIgUJDxp5m6HzcVom
s4sGOIzeoN+E4n+sgnmuQUNGYDzZpW8P2ULTtTuulmSlT1ANlUEvMblpxoG2
Is5K4FPfKivJhxModao7sCBAT88smZKociaQtSlGYmgFw3ALg/RwWnCvnrx+
M13OKE9qkp6ASXF5afNkrq56igPxKw7ezXu4mFOecmdh+FRm30kQncYRgXEg
bIVxbNrk0aBfLCvRTZfVAj1a6J3pZrkE24vE2hGePOBoNlmx370EPRT9Ljk1
wiGaXCITRTJHnxYQagySp0hI2eIxqWCxqz+lsAkPkz0HGl11XIOG4UTZUtdl
wJ5WRrAnU6TaIOqSfXSaFhN2VaF0cg5M6FvD9xwdkghmnSegnao+O1F0zHiQ
6yeMhvfw5YT4smtdWsl7dBaIFkoiF3XJYXTCEQZy9lXsED0j4wi+xu+Af8ht
pgx5lo/jEZphF6bLAHrR0Gpsw54vbXbAquCcGZLn4p5kVmzpLrLB22mRJLiE
xGbzRQevwAI6Z4UNe2Qi92hL6kVJNR7ssFNrFlfYllxuAA+tdho4Tc6vvx4i
Z0hQXBnsR3ILzCKwS6v4vZjVb7sf8fcdmiBRJbAlQIff+4qpRx0MBZaRXYUc
BWZfLe5PPVX8P7Gi6pMB2xmeWy/2PG0szPGrdVdSPLVM36MkUxSaERHPw0xR
V07fSiaR+JEdy7ktlhju8nKanvTHCLB/QFY+2iIL6L5aYtpk9b6KNNyEiQKm
s/dpx4WdzCF6GPhzezt+Qs3oY3sru6aooX5rbyvrl1ry5/Z27K6nZvQxihza
m/Xd0ri985aGrb3L2347StGhZscoJ/HrtS1fkhilppHtaqOmdqzUet9vnAIC
rBm8nEYRcYSbv0tQgN0zGW740IIOH8tAwoeMcfiM0Lj0FG2PMVXXfo4xnrEE
LXXPcH5qVrATWi4U3G1bKORhs86wUTLLz2lRfuRGpoGhkgN0tMxJC+IOYcU2
9K0ee3I0qvwhwaDoGAVHesJ7aQmGuQQrQB2YUyaZtSYYIxLamEVvjvM3dvFH
7KEsOcVH98A/pSffJhjwXeIxAlQK/vToGaoDmO+KCZI/5MW70lCmq44eGsGv
2AhTIxr5pvT7o6ckNI5CkkgoqrQRglCv7PnqBkMfKlcMGzH3ULfzs3Y8LTTy
kubY8Mhh0pmI0L2mA1BaBeD7VHw3J6CqoSzHZIsgVB9scgFKlF0D1lUVsdL4
DnZcUAWKAnbiJMuXJ6du+qBFktHsj4o8nhAzkH4f0TAoCMqOjQGhJLPlZddo
xhHsOCPgeNLaEtTtqkDpj3wM2c+wi74HSdjGHJf5nGJqqIaBQglN5LeAimS1
CMoeiuhw8iko+jJAgEW61PygCZ1iSCLZcTnxcFDnjVqkJVb2DjEGvvbju5H/
2FmB70Ar9k8HEbsUaPdTOMIHKIYSq1Cc6plzVgqlZ6npsWgYFx2g2zEuKDKc
o848fi9fNXojtqOmh5OSSXE60Akx4HpoXov95sECCv4E5KX5AGOdTEGMV3vw
QXAT8AjeSufLuYgLzFcVw4l0Kexox0owu39FoSmnznoMM5Hs8UOLrN9KSM2f
LGss8hrXr40VrdPVugrViIn8eL5dGWSiuuNlXjDfKeVoOlJjoFYv0knC+CmM
JZ1etDQFvrOmIjYMMCk1YiR5bX3MY0IFOy8kiZOhqX3Ayj2plqC2SjhYgzU1
69dxzhANSMQF9WfUafkzTfmQE07oiVWCpxxtDigbhnppa2ix0fH5eLacMDkD
YYCbxFD2V23dQ7shgdUqGQTWoqXQqDh60PDSPd1aGCcpxuQD0xum3U/KUHNf
c615K0Cq2rSLp5R+tmZMRCHFuUc7vA3xeX1LTkhk14XwAe6oaAoiGDIcSpfZ
jVkUdhv3+DlidwU2CtKoa91ZBvf2c47BguDjl2nbzU5gRpMCh01HjwgX/AQ7
Q0w6uhed9DakelqOtyYdedAlF1JnlOP+U0bE5Z6Fgg6bvPRSLCiduTT3CZ8v
ROxF3lEbPHVhOmRwvqYHnUiysbuSmwwcMLvwMkUogARWU5KdIi1pIdSpVrhg
K5KLwpiPOZxssyKttSW+wctLQKsPU7QAaT5BNUOJZN1lQWC059wJliGsawcm
WNy0nA7fzZaYpthDbqF9UXymO73I5cVQXJzcAVMx9tlzIfknZWenJ87MQtyR
LokOZMZrti+T97A4CE86UsZiQ9h54hKb/GQp/jEqwGjDdGLCGCgyXRJby7Cd
Ay+MiHdtGBs9YBE0YutPOmFW0VSZ2sxjMMolu4Vc56/YbrBCa4s5Okky0Bpm
O9bHEeR0BItVzg3Y9bkUZo1QK4D1ImPKYcwmSyo8euylAQ+iH8hDzKcKevXV
w6rQIr6gg0PYh/WnzZOyjE/YhxbhSZGxcwNqDqqfWKEOOGcqqGHzEXxmfbSf
SyzxKlrhU7N6sZeSQnjpiQ7Zm333Ks5EjwK6Blj15ATTsXsReVQ4n5bc3dgs
M39Zkm85nhBLLxd49g4/oUJI+w0KHjHDcX/rifsQRPZyVrFU4p0SluQ5Hmay
GdTSTZd4qYfBk2Q27UWSezYS1421yHYGxjzlXCwgIajZc1jZHwfOX4lP2xwu
ZAzg+sK5Y1GZxk0JtvD8BF3HqLywGxDFDykl4n1E/YNoQixAh0QTNHTUDc05
8YwhJyXAaGds27FXHLStyB7+8RyVINji8SlmgTKvzZFSKEhcJ+zdJ6Qj6QQF
g8tTI39gbZEDg48wFM34ecAoqQd0U9j56RBHl9X+1tXm5QFK8EPzU5n36yvY
cd0On/vw6QfIzfLspF8ss4zYRvN0MXoWX9iQjD17gC/B7EfoQ+TMKANmRjLB
/RHnDXZRzfS3S0x0HOLNhLOjQk31YaMLzMcn3ZikAKlqOEfJHHZTXnkRMzAa
G954SJlx7jgJ9lWJHPu6ELYnXcApoFEC8rHA/HY5JxCzvW1GmM1uIzaSbsYO
vHiJWS8YhJ/kedHGll084BGP3+14WyOy3SSZk/I0vpBUq0nSl6VWxtOEjNU3
K7c8TvawqhGxrzMSnD+QQAf+BzalkcfrfvnADLa6WSDHkM4n0MOHCFw29zmV
LJm43yXEVYpGfpZbUuuJE1zCoaSONpPU4m1CQY0ZpVWbnBbfwzViOvTg44Jm
t21dXotyJ6pNh9OPcXSdhoXkaaERMxOrySq4anxq6Mgahm45gJNTNlRBi0Ey
h2JpH2zlHEmlwDMIiDNQ1Wk1zeKFGGqeA48NKTF9ehEP1i6okUtQg8VBBOU8
Zd3sZfenBF+yxMmAD1/DtTWIfqdGCNOV+pCDT/YgBtA1YQ2N9oeS1gozUQHM
Le4T7YotWqtz1jZ2THnkNGEALOHIKDzvV6ppKwzBDqgcPYbInktM6LUshRqU
71VlDVWnU+MIcUBQGiSpoheCEvpMJhK6zyiwFvkviOkqhMZRdSioCbhzKN9t
Pmx7UUo1No9SdHwVfBCBX5/mM/Z33olMiZoypSZJmE7e8vgHkRwqOthx3mJ/
+9a0ZugDrDloRRjWZo38Ihw5uxC8MUeBJaB+Pcw/5XAcH8aNWu1950Bh/1lk
J2ZBETE62BbOHVPQbgTwZXzKfkBOMeZVisosS5WlHKfWU2+ysOa424OUrPmX
qAEzBZ3FKlfsL6qW6I6iloQsOILjYtJN+4LYs1yQaQ1EmKVTisGzQLR523RY
Ls8SZ5RRGYH3MMzuBATFmE5HFnT8Ur6BUBTdl1aM7d33raJ9dMwHW9VviR7d
sRyBFp2hYcWL+DnF9BmgcXWOGbl1Tw9rGXwODamFSjvTzVMOObXap59rxqqv
shOJE4+yg6idniTUhZV47tUVSYYrgvK1o4k7Uq4KEnKe6FTjU1RpWXwllEou
UlUTLFD7jeJxASaq06QbHn9SmTTtfBSDBYLCEN3+sBeUKHAi7M8X+m67Z/sm
+ha0LT2kXeULMwMROOvZzCVqZVcTj98/o4+UltMPYo4Cpu+hwVlqd3nyluP8
5975xhVxAyZ/0KvnhaNJ4BM+LMXQmcf2mA13RMHZL88B5HmrhupglnWlzuSh
f0DjDeoCACpx54eIPRPOtI51U7KBmyDShVLE86xGhDXlkZMsQY+JHHaJgpMf
LnDmE4E6L0gxkHQTOWYrsjlQRasoDZwyh7JUW/TVcHpbGoRj4rD8czq6ynkr
h+a35Oqk5FIiphwH5idR5B+PKZLwyFQX3UdyBldOYvNh8LAZKGt8Wla8lKpY
om8EcyjXvspJNnUAJODRfBxwqqGcY3U+UT1IpIDccSAsCUWOBglkJpOThLco
nhhHGxof5XPs+Jk7ZUiFQYQHhlWPQxFZKvgAmOqN6sTxzjmhshRpbnzJmpJN
k0F8NfBxzVw9JaPzgjw76ZhOGHiYCmvaCRVzmvmfUY0YVatY8qhBbqTEgMCK
UfQJHsvglzqfBAh80gno6g5Au2w3OQH4L3aVmnAMwcEQiTSop72s1behLaQq
neMR49h6Upq1ffXFBk7sEWJQt0+8uefsRI4AyOEXnV0f10GNFN7cbEgIqwrx
gWm2lruB28O3zHqG8oF4dtBZw/uHmzIcFnqF+TCJUM+l3nE1IKPGhjWYSoXB
AtJWdNA0W2CCguVULHrxgDK20P8E1LE5VUWeW10TmZa9HhcY9pv26tMMCpTP
zNYHZrOsXLaXf76JnBO96PLSe9inhxS/L9kPB7sDMoxNE9sRSwDj2eLNsOlm
Mh3WB1TnA8cokTCDwxtfQLPtTN3M+LY/UNk/41IP4UU1GePzoZ5xi9FaGWhO
3KPHj58ZcizCamampKABZ3HhqAM5xxlpvtzRxRzQ219m7HdzfaFdC2umWM4S
74CgZJpxP9xB+fUQzWbk82HwnMKwKt3DWJWQXhpqYGbVTAR5y96orGxwYwKL
S6NYF305fO2VHCLK1Z43mQ6UaeHqCR4ZUk7utY1PU/Gw2AdjPlqmM7GWA24X
ne13Kag4BaiO6GdWia1cA4ooOsUkUd6XdD1TnzgvCZB4yhaTMKd+F5llwFme
v8PMnneJ1qKQqn/AR1IIEBgpYme379iAFc07UVcPkVIwo4jp7J0rYYBSZQc1
di4MY5Mom92DVqJHX4Z0KLML+higQa/0Yab69uWSDw3BtDZkh1kvO1IrnPTk
aOTteAEBfAO5ST3RVwVuaW2atQjJdD/hbUkcN9DF2s3bXH50kv01uyLJSlE+
ytdYP3Jkhk/qcbdPBvb0BSnq+eiM8tFRbw3AHTKKpH/jLkEvkCaGCd/R6MJL
z2lJR8eCNtaiykAMY5oM2E+SwZ8WE2LMC29/lphoj4FQ6QtRtPgfe/QMVtkE
lKQIM3iAsfyQQlxjB9K/oXsHMhDAoSZtjl4/Oj6GHQldB1QS5yQVf0E0/NWQ
vI7oEseDcDa/NzYYSy/Y+uVXuUiSvmG6FJ2IWJDG6pkgteD/+3//ffhj3P/p
V29/POr/CT/s9R+8/WSIR2VfuEHbziUq7OKIOm46VCHJSaXTHDg5DqZNbAQi
5EOxrtRBp6pkGEAd/gpNe7SZI82aUfeW/GAL9HSdHjYmEzAe2fSiOHKA7AuT
POGjAOINrJq7r1VMLCWs2unPmLWetc4ApzciS0gSdNSh+bG1BDtcxS3juOWl
fX51JWShSlS65yG4aJTjYR7U0h4C1kJKOhldusmg09KLRcgJtM/JqFl7Jobc
jBvj8NfvqOBMDznrcBh1lfnVIyBB+NXMPohawImY4DKbiXeuqdPauIP1sfta
lNO2xcn6zrpnOsY26F5e/jVbgKR+KCk2oGj4Q/SWTrD2aCy6/FrXW9R4SdaZ
WbfO3uJ/3BJrKD3Ik3hMBDScyqkR6iLmjHk+fk/6FcjSQMaVy2JRpNQ/b694
BmYWu6MhWEWwJ0FP62mPeBTxbAGrQQoP2GllUgz7Qyz6jc1OLxanSbYLSuyy
3JEsCjkQ3ouqi4XUzmAlHTGxFS652h3r8ppyKx5ObyVFvIIuL+17V1dYjqvR
OS2yCiPySwA6Sk+WsI+QPz/ScdtaM/z28M9DPiFUjnOyRGSMNMQReqomyUK2
HLDhxCtN2i0+8soIDaLXlNlaXcy08hb7jWKQLZUZDoZUTIlmV5Zdfao55l8u
pyDxUgCJ/lTQb/rJe8z7x1p0Ltar3qFI7XwO8+rxEqqK6KRbOrVaKkWCsGNW
2EHh7eHPsYcaPS1pFoA9ODyLEoii55LcAB3kJM+1K9nyGIqclPNhUjoup/oM
1kU5rCCGLbzAEntB7VkpWYksGpAyesrxlJ7nf/fJW0nhOUF/gesVT2NhtXKk
HmrCOMnRySwfwYJqaFa053opQ1gSDSYl00whdL6X7HOcRnVtAbk80Lde5yAU
QN7PxDb2wYqVE2rRJGe6njtzJ1Kdg7KGMxWaEmbCCdAqAXZHrrlTUO7PZHSa
r0+bGSywPpaJSDEbBJVDli9qErGLrZ56HdQMwwZ4shZ1Lr/GnH1O6YGUNGQd
IC6/quFgJNHrh3ztxou7qQSn/G2aTW3OjW058BvkwXO+iSvU55l2O6KZirl0
SuYEOgrIgMf7GVqtfXrsrAJ9qovCHxn9xE7O4zocdgE0wDvk1fBF36yL4ZDB
k1IKDVlHtAfT6VpKRJ2Ezm+3W+BOQIvtpBAzrnV0yKI2G1t2W7H2I17CD1m9
o5N/toodzrXdMB0bkKeeS0LmM5R6chKNgkmeJ9eF5Ke5koEFjnYzGUgAqFIv
ul+OgjmGDtFx6XMkFBXQ5WwVcx4XqOtFlM8FGlXruKeodbkKJlRdUF2u4ubS
3PM4awfBRSQG5rgqI3YWUMzKsl+qMjko5OQKK5765Xcb6ZxUOUjcMi3zbWtn
pnrKuG2CydFHFUjIb4MN6AfsjA6V/GyVOGN+5hLn/t/P5pXmF/xsHrtqAOam
fz9HP/fdn/+5+ajl1xv8QU98lEkGwMmnwZiAJ/TjEZKnwEpNcyqpw0aPFChl
AVgmuHtIwoc4QnVMdse7vicWAGMOpcF68/bKUJK0U4+z8HEfur4nzN4SsHwr
jbwsttc182RsuZJre3qWZu+IR2HX4wwZ2cfogZeWHntAQSFIQb3BnqRmyQbU
27gnBcnnpO2YpgmVBS4RFsU9+PxBQUkNtZ5KXqZ2I7fv0s57HfXUHr1+TK/5
nBdef6JGL4fe8dyxFzZo7wmP7wXrWQ/wNcSCvxtRuVg9w6cs6JXC1cxJMVRd
m2bVRy+AU4v96bY1CHoB6IEUp5U2S96nY1TCF6diWtAaiTnxj3IRkYsxAYFs
VtpDDrmwXqJH/CT3kKvGandCe67RS5/7dOYfJ/IUGJGDEFyxCWQw+6k07du5
sRAV9O9RDQw22jjBx2YpOnsfczipjFHlDVu3O/J24m0qV1dmiImZdCAGcwtI
acdCgTbpHMU2e0LRyKHq1FMMxLMhQWhjQgllQQC3UEoy2QqgB8/6CHyo9uq/
wl//+fP+48c7VEGSzjJKoNAF2PFY0WzmDAsKE6p71NVR0sxSLR8gZKpV41et
H7V6ysxCe7d+Js0lpiub1iYO090o0CQn8mxNOLxEKVPjQepc81at9sWsdj6l
foyE8xR0lLa0OTI/aB5TXH2a0zXRAxReFhE5SYIZDAivDi++1UfLYJSww9SW
liefNVXXk9wr1xRHk3Q30LXruylF32CdhMm3ivs40jX805DJAM/6P4FpslMf
lLuOACxYsuWq5i6Dq6h9TysFbZXOMsdoeZF7IcajFBLojc33r46ZFeUwB9Um
PE9GZmGLi8aBX6CWU1K5nnpSXfTyEu/qgcErBi58MIi6T/W0sCbR4E07M+ei
QbuHzk4/J3kzS+O0zDM9lUyzTcvIOUgARufb14/79/qPZjFMCtXqpoQr3U2G
rVNH2VZlJZYcjAU0roosV1nP7jAA5i6jvDzJMJVshzTilk2LCOnlL7KLBBRm
78CSnxskSY6YMMU5iqqSP6nDNuo4ZwEiUoCVJoeIluGT/I8XNVuKqVK3sJxh
FNhftoq4YB1UJtMkxUENJOvipRQLJ58163zOoAeGs7LBvYdPI5dwKHBXdYv+
Ha4FbDPiatH3KEQJeAskpJT391CS+xm84Cyuh66GIyOuX4J1ZneA7LCnyfFY
QcwbwIrqeSJGfNXf6iRiAdyZ3r/xX2gg1C2BO7MONv5DVc5R0tIHJ87U9LjH
Yif6XIU1PXnJhfzU88MqmL/popgLdZmvok+T9ayGGeBzrDADXrTgZTMJmTHE
KrbMlNLBpXzGfGqRLUUBzUA0jFXx9JZ2oGY6fUkrJcjpV692gScA2EPEJB2O
48Uwilcw+CD69sLTv3oubL9ilCJVDG5svLxxM8npXpGWwLLz87RGnQmrLIon
pBOQDsfZVS79xnUvlaNZw/bLUTbqNN6gSiMVYfxpPPObw9eB/0o5mXaiq160
spIjFQMRtWelcAPEyUnbWyVQrNrnLorkJBwjblg3a8Ycle0SHHVJ4AcnGWNP
ZrrlRUfjXEhQUlRLKXzvMTWd+7T+wchW480lAakN+EBp0dhAhABom9X2j3CN
UxwKx0ElS/D0QAthfR87J8N7xUWDvbHx2A3Jz4nVxFHSma+/34HCqgXjQR66
EafYcsYoBhrFK8Znxfj0uivgD+QgqyNmWowlCd2FXsHIvqAMrGYe3I7YhZpf
QxjbgmgtF60w01EpLXvSljPghfiubt8E+GaCmDbUZ5xAqSIji3qcF8A1i5xD
QiI31G9tJZPzy1GigHdtS7njHfNq6ZiTM4k+IBNIQYrf2YQiGJ93kLDD2UHQ
Zxl0SnrjE0cgPNmiUoxqW+j0B7r2k4AHCpttFdalpxOTRAy6FUhSjug2O1/G
Pva99RJ5sUVf/ACmJxHYF27obOU5h0XiMWd3kLaC6R5JnH3D92IFOcw4Qk3f
0pE2UpAHhobopz7r8p80Jk4PcKaVnm+yrhEgg1cgzaMYR7sFUnhbT8Nza1Vo
a46lso25QEpoCh2FFY7tgbTagLyMu+Q9r4Wrq0N/76gX4O1Mc6+scXvl3c4o
LsLqtivq466qzaq5crzrawHjxghsKVa361t/ujQmdK3XIajJ3qbPdmnflmDi
oRl+tGvHvwuQhju90OdoS2n6BQDkdc5eq4PY9Ui2C3QaivPepsvjkhEyDfjo
8DkKEs8Hgebriz7Fjttz0XQpSHrmBa8Biji3mP5UJMRVDOFleFh3GXv2xgVP
sFLR0oBpjatOGJg3Cq/aTCxtbCFQFTA5uVaChtgFXv4gEqythEazApV3UqbX
VglH5GFPMkTdeKGn13xSBZ2jSdhpeOLBFrIKarD6veAxYUnZd+9JyIdOlGpa
Xq2Ka8Kn+imI6lLinOJaj6VKWEwl9jqVqKfHpSOX82prB0lyL2DX0KSi7oqg
qByplM0YxVjcVEE219joBADeyK5R4996LYitLVdTpmWQZnmsIb+qAo6jbOWG
Mi3GNR+fpZBd5XyqWmzKyxknqLKgsZyBnkiTNfks1wOK5N/Hex3d2Vw2GFIi
Mi69rj0iiwf6m+U/KHRJkQug8YRz0vnQnu3YyzaQBANkFzTb3T18khmPASU+
wHbujvunegpjTBWU9J4/dfsRTupAikdgjuFUIXhajF7PXn/sRoupHAS6v/g2
aHMPXQj9ZZFi9rYGJrE2Ca1stiI6sv1RFmt3iAkUfVwUQ96L+O0dVyumfs1m
a80Upslfl3hbDK0wRjUSbxaZnt3Uu/dR8xzQuVjYGdF0+hUWmZ961Bj75zR2
yb6l8Cdw9SNlfmQYfxJX9+Nynn3Se9uX3KxXX5U1/OQepSAlWK4UZE8S+oz0
0ki/fhURl/r0Shw3HTwNbiG8ZQ0sLrzdJtxnvYIXUXMTpgtHKd7Spi5KvTlC
jnIFUFmP4ppi4wTOhMrLYNbt4jQu059syMaRtJaYIu+pu66JfXSeeIkD9t5E
VP8onbCOcsfPNmlS8cngZNBTJUwDIb0ANRfPUEeHz0d1zOkY0/XGva+ZcI3e
D3wt0GlIjb0FIN7Od0H3vD2M6dRWT4At46Nhz5p2nF8spdWFg/uWg7tuRd8f
ePJsx52DWbVqecm/cmK7tuKPmO/cLlxRLpgGq7zT7FrveAjWT0pRnwgkI325
usLC264qBKnAlMBRNt5GJz6/BdprRCUekGFnoO3YLOFj3Ozw0P3sTLVjvo9J
ocBSYL+DCjymR6SGrnX9QUPOlfQSQKF1XI7TlGuMegc3wnVaz1ZtTcXiNEbv
gDg5H16j2fxYb+N5ZWnbkM/3B/fdbNKZGrttA0dhSgeJSXZKuikUzTct6ks4
Qqz8+Axti8BpslIVQV8Cu8gvgiXPCFbAVB+lzxq5pmXZi1W9jXvFFrBGMfP1
OkpKd32VXjjMnta5ZjYijfmoEU1cZnmBowycxJ55o7JIREGWXt2d6tLdgpqq
lH3qNgPuzLPtDtc6Ptl4bXV8dsQCxU1NvDnBTITuPL+bS7KDgesQNPRwSEIJ
o3m73n3R+L1jpI+A7okvIgL82/BcDZxBt1SLAXWXVMHc8z2R6shame7zMU8g
lirB8+A+c3jnt2hL1KWmHHCC9KGTSs0wVAuv5WPoiVkftVV7MZtXzJRyP/zS
7rSp6S3otiWVeyDii3sNGhETS2GJZkMJOrG3RX9m96gAohpDgO2VnAO13kIw
6eIRntJg49+vM1x5SX7KDeqLj2iJLC4oAUKGFnpx+OLD0ImjLT1ZF16wyDH+
SSRi02bwhUKkZw+JiSuKyjOGeX5dEkh6HQqnsLgDmxyf9Y62dH5V4Oh0uKyx
A8OCRN2prdZwGQW87XFvzYXkraY1zC4rKXQ4ehKqtYO6w75tQppOIgUJr67C
R5Rh4SA9y4mrQ6wPK+vlN841wtXhKtzac6NSx02tHu+ssGe0Yu5SgYsS1Y4y
arIL3VxNqdLxZELk8aqWhc7OiHVkb655JD29mFhUWo8YHhFBnZCBSwoBTLq9
geMCd6Cs7l/dkdwgSjv3E3O1Dgag9DwvJIOHav+y3h/eNe6QoAr+jvZ6+l/T
cjznHwciMTI6renUZZUssHfMxOGbjmk/2R9QuHxFz1Vj2kmtWXCaAhIfnZy2
9jE7kDtg+I5PO4PogGGHANTrjTIDy9BzY75Hfp7jjW3RvQE1aVp2bUeL6+gh
Qr5Pw8YrtERZbQAN7PMiPUmBYWEA9z3iPE+AScx3iC1wxQm0qk7nKBzm+EOf
hgGqK9p3WIuG54KeIkY8ZOJwEn6uF7cAgt+Vhp8xCoK8jNnHxbviMjj44hMJ
MdAO7VTjqn75+OWheY7Vksql5yKyh9aD4+p8isdWjhLdMcrQqyzhH3saIUuQ
4yUlmCfWCgDajT2qyaHbVxQox6VNqUSoTctdK3zFFvQic+1ttpJY5pZXcFcN
4M6bHc2L1AOOJSSvPdWVMA4b1BaPXP7giZV6IIEEt8j4RznsHXiIDKxjd0ui
hAm4rC9eyYnFlvHJ3N0X+Md+67u66Qa7htdS7jisXTj3OBWnszXsRnL3rXXH
AllzsQH+aOL3aTlwuLzIs36WnPTX4xSgFDQVpKQ0PDTc82Ih0dEUl7XLjqh7
7rkuJzlHY60K9/cl+p1Qs3cDPK4h+F3i401K73rsdM5UjWQ1Mzz90fF+6XBq
otaPzuU4RlClj6qeaEzL+rrCw01hiNnWzoZ9b8JnAMlSjGxwBY+xw8Zmc4sb
kVXRZKxsbCCt9yI0DdZSzkPJhlTucK5A5J1JxkCPf5O37lkOX60xZm9DFIQ0
xuf7yfpF8lcQXHj+BATruXXkT5zer+Xk7c0OtSxhX038AbaZI0Bt3unpS7ac
Zkco9cY177hAvy0m2UGtzGtDTzu8QekIWGFinE8TOQYYbuW04VmRVtHl8hRu
TPrJey5iWavKxRcSewaCugw7MY4Is+46UvgcaWEvFNoRN4/zv1w3lvpFt/UI
sVlB0/DCVstSh+bHqOO78dpeDjyMbTOxGQgawW7rsAS1t/49rSw6/TB2zQip
XWZakxHrL4Ftv7G2ZWz4e30nuWac7RbTWnSYCuGVtG10qg054KXajx5FpIR2
L/x1YS9BbLxpfL5t/hjsreN44blc7GvlLpg7WHfqguhS1npncqOwRRgvw7Ey
x9baX9UB+Pxw99MUTlbz21VzQtdddYuyUjMqvncmnqzCK4lUUTFMe76nUTSV
jvae8rUizOVhApP6jcnJZKsAYulFkCxz6xFEAO4mrsvLajTrcyHOvoVFp/Zf
+MU/I89pUiRO1oOg46Lx4uWsK9p6MoLtvcg7i0R1Pio6kREbOprORpYAlswZ
/14bSbazbW0CjYZ3XCWeaBaXlcQThnaP7Ff5uwSzFcKAqXFBwx2/gFdkjbu8
pv75Sf2NXOvaQcs7ybCu50/X0qTvJGuac5Adqj/z6Ts3DlbW8BnePOpVxd25
yThk/hRorQ/OvbxVJ+ExvbY+bnEyz+tDrD0FOpkqG+FXOVyl9t3mFGrpw6bq
C/w+nSEJ++A2VKmOzHuKBgWF8p3A7xm5K2RH8rzbRICKq7pYEmlF5qYvq/B7
KCPU7HdFczVJqPVGFC2THhfq6tB0yUkIuxuPRngWKZYsAC4f1y8nfx1i+kD9
0hu5fLkGRH9XxUtrmfN1PzGeCavqV7tQrmzk/IBp6SetdP0zlOwZoINoOyFZ
qIQNNEKPjnWtdAk7LlnkXzMgllMU3leT1BEzijX+eMFOtHQuhdoRCJEFCI/d
IDYHq8iifjqb2zFjrzVh0Vots+WoSctJ83VsfncnUOiwBm1DzfMmn95IFt6s
9YagcEF3eZ3tKMI3G97lZXOn/kBK2U+AFN2q5f3WONi8FhK9TcYox8X3P0TY
MagXu0cWKbzlK3ku9/bhERhWeTaExMWhKNCOi0YKOGRylRhrDrD0CXdG+6Ad
7Tak4vcfhhSX+LpzpNDDSR5i+U0yWDdESoNZFMaxvlLS0M7ilAHbtKRqzcKG
fbZYJoqUeIuf8snSm/KUvM39dY+PXhwZuhWHHwisxWxZepXd6QI12NTxJ6be
vZ369E2mnmiySHVJOCLoNTu1e9sry266chQSqHQDLaiO1KPTPB1rSYsgzb2+
9xGmY2qOuGprLSSZnq06YXZDpHCM/m+NqgprIdkdWj09ckSfWGtyA5x9pFBT
8fcw1VD8q8WD6gjqRQCNBeNIQXDeHs8d4mobUiFdccDTk3KoJtf+YG+Ath16
kZyoe/27l98/e8zBLPx1IbUMYH6SDK/9piXdfZ1kz5+Z7/HLzq9fPX305f2D
L0Fkv5Iadxz4sC8C10/i4sK9LA98AF888AFoyib+fkUmaFx6R3VH1IO1dkpz
f/DZYJ/0sP0D+IC2D+GL0RN4WEskhXf73nDwevMeusQXeochbP7Q5okWQ+ZY
IWWJSBW/2LnIUEeSpymXleLoLNFgJAcpqP6QpLimGaiyoNgUKd2zVgX0H1Nt
B75MhxIqOIqlmTouCSFIThT1CcGQgasMgbk8OIkcqckLV9DPv/SkywYox0SV
A168fLNTi+kZl8UspQvdVbxYygxLnC1Bx6NEYszbIP46orQQN0J0Kborc1xC
qVdu0TVmLZbH4K7njbni2MPWd/T2T8kfkrYwyEoDgloDAC9epfuDMqodIKX7
JAPTT/DlFcNMgTErdJwiZlLRL9er2YCv5YptE9w3TGluVAsTkEQgQbr1C4P1
I116S2dZZIdpUk0PaQ8oDyko4Lv2EQRITHzeh8ZUShLgWMUak5gDkK2F2BCK
SAkRGpQwOo3PcvLAyFVEQAhX+tPTiRLMMCUY7074OuCES6AN2/A/hEZoxRwM
hIuc7Ge1XjNNnHTqUTEN+hUnA0/R0LJXZd6Vz5SbJOsQQDaa4ww+ZLCZyY0W
mFBHQDgegJHb+rWkrliEXshqvT5zzs1NTzKeBGfpuFpjwn18hZ/lCLm9RQIm
amkQDN++0ioRfom8e+zpHwaah6vDICE6wuIRN+lzmz7e3s7BWc0+CcQmZZYb
EL4P9h/cIxPbv7BDiEBFTbCuslbhpNIktO0hME7JCPv1b1wBvcI7YSLKmPr4
+P4WvjJmlFzkFPjAq438q2q4Gl6BBc9d9h+9QnV/gyOjlJIr3XpczencfMUZ
ukxEPRLBIxoJaWAsQGq3KZiOhckV08qOuVHJ18gpYqwqcJ3uNwG2Khw3KQVr
yzBHawuhunxZVzA28gvGNkGvLhgbeQVj+17F2J65tsBqdG2BVdNWYDXC2oBx
OuECOUH9Pk0OM7U72ui4ZFiyKbIX1jKd3UkAlYSA11+kTLRb0MPK56EozWBn
SO35B+2/VzsZE5P8uKAaOnoPVGTjjrG/WSP8j0vv4D8yOoz5/+EHehkWI20l
UJBI1ihi5BfOiyzP7SMtKR2v4qvSUb84IfU0DjyjmtpjHTUu1wfR6EWSLiOV
C2K1qQhXppdXkcGR0g6DmjPTxiEgWuU1QiFYd0m30owcM77Bs4Gj5Wc18H7m
jl6FHW34d42zuu2vrRTIzf/QcBldVEnf1s3AS1SwsBbrQ8GRamxY+jU2UER/
fn9ZzIyWjVhgcXq2D61ePEAV+kA2hC8f3H9AZhg7Ud5T2SXDlQdtMvs4PcPy
sWnoILG+g5/Ndy9fH/9RGoQ91ftpIbVYRcS/ahHJ0vDWgGz0bIsJT8iSRfOo
CyiF5lGoNA/t4IYuvZ3VHlQ73bEQTqdSR6EUeMI1mOq5gynlfWZ4dcvCsMkD
+yClG2Itql0qUlUkXABaUC0laPUumWmOApXl8BIMaAPlVaa7yUAvPGAlKbbX
ocl1fYHNB/sULUy3JbNNLp5tPV1s2PTW9IvQiO05aPr6UE7re82o8HutgANr
inqR+rvEbpUUhpIT2VpBKjyazgjthEfa1UZm57wUWvAKqPjgzSbgB0SG1XfS
IyWkZiAOhSuwxTZBU2hpq54iDzBkP0mEW/Xkch1RcWyCurSPXPkVN0oKKEpO
7iTJFBeZLMIGJtY5Wii7Tw7+2IsPUHae5273lSqyfo415cEP0TcyRCPnBzrj
TfYqBUFHSZLhc5ujASoRNsY8Czr+0OOj1fTPT5233BTf8LV5HArVFx9x1TWb
jAMEPayDt2NyCSBSJKCWkGU6evIFY8IY7epITF0rBtQzuOCXo0ZGNq9YVENm
VADhBHVfD9JPrV3TXTQ/pSdAIOwcm3Gk3BKAkIudhk4WB0XwYFokgTngQLk6
EV4dep0NFU89tYGwj+lSYPJoYVZ46XJ67FWMoCdOyXqvxDZ06i8ODW04rnRx
zWzXM9V8DtjvmYOeubd61q+Z6jbYLdMf90ekoZJZ2weB3/eET3+f50dzL/Y1
saLjNzoIGx3YRkDZPt2/4sMMG98ztZl161V2Wil+x3fHgDw4b56h9o5PU8a0
neEzPXfq7hdbctYul7CZ0d3LGaUPPPQkj2Fljmu/p1gdobywyfm8Dxd0WbM7
sTFP3xP3dN3GOKRBDgPnk73cRB2jsRVpWncUGUizdxM+b8pqmpTdEbpYv3ua
TRJKBB6DGEpjtMP1nLCt6WfjhXjs4xMsxfNyithahd9ePywMDjs45S3wBkXt
7ZFM1xYgiNB0d6zm2cUcqzD6W93Air/x+gVBHVGeGTLQpWVi8iejINTrNpF1
8Ktct4lt7mnWUCeVR5d8/CXI6S1ORqDvdK6ER9d3cb/Wxf2NuhjPL95xH9A4
XL+W3qIhSLUey67qGHJq2GZCHEZFyHwQveTPG1NbMnSNcB0c5bV9riTghp0G
pLRSov3cHB3h0TsKhPGJlznDVfRku19HQ2Bu4Gr1qIPisJyloO+RP+E939PM
Tc0wzxJs2tjh+VawmJ16zmDE7osknsjFcpSK5VuUKH/Gy7LKuQpsxB59YQ3a
eSQPWY5lkbRnnze77ygoKMnIsgTpVJHnhtELSmnno/RkL9l8rZpBNEYjGE9K
jPHi6nJ5AoRBl0OYsB6wodMkbKoePuFkcKs02N/wif72U+M33PElTZsO9slt
DqvO8bGS5dVD5eKFTseMyKQQFdO+5RTvnr1SDo8SFbakmaVBZGlAzWbkwKHy
L1JDrZQyINYQ4hps9aqHyAvv9A2b94LHDul0XBPA6lpcR1SkuXbFueT80b3a
cmG2l1BCQQLgvFLT+VpS+TQxnjMi7WE5yclW2oHenHMUmGuR1e3lRgo3bALN
Z0EJM3sPczgggPydl4zEBQPgAyW5llo+0hWwVfPFu6XZu0O7q4dfCO0d37Oi
zh/005MK+VLv1SUaBOlRIL4dTRRr9uOENO+1XllXv4sBYAHaehHD3ymVck0i
4l1m2dTcO5+u+HzLv3q2jJ8rc5eZMOwls2cNfnY1teBzsALY4rc/N2uEuAto
VnXDvE4jiPVjezfy8406sd3wGQICnejH9m745xv2ot3QsmPQNgevvRvP0Krf
VN+oCESa8QhP5NHFGKJ7SDc23waYg/STHaM5Qi5e4i9kLfKV6smZ9tGoTrOm
G8n6uUU34qsTwdB6o4M70HFlz8Urb1rJbZl1U9n9XQvPgrhwUjjYuDh50S8I
UKIG2yo120AH4rORvJlNQDtalq2ydQe0G8ppxbf8pb2x0MXV2Xr9DU/mXQjE
TbMMP1wWOqgkBDlV1/buY9Kk1KZjcFz5M2m27QlkWCk8nmidQi6qsmkPfjYY
phCs6uEHjBd9QBdhD/kIa8ZqH2EP01l8EtzNANZ/Nj4t8gztWryxxir6Qdqb
34OsXeWvVYvXniy60tXLIt+uXdkBNl25R41tAC2UsSuaFS5aXFCwwriyxTyp
TnP47PKqsczQu2QyUJ1LLvTSUKyIaevbXcpJ8eWCFvVZblN+29SnBqp3o0bB
RvgLL+gmZ/1C67q50NdmBN+9lnOcyWkxr9g9dVST0vbGMWju7qtzc3xtR+5c
2kYd5dT8Rj3VVZBfUAmRpS+MuGrlM8K47oc+pYc2o6NG0dz6AHFJGS5iask2
jPzXfPqE76G3omYBMqrwYx8jImdpck7754qMUox1RkQUPShYv7GkXI7chTty
iwsBQU8PV5mM9J5BMki0Oo7mhXg9Xpih2jtDa5eStmoFJOuudfkYTOeTutKK
hfzYeGyKxEDWU/Ejv+iWZObhMltmgjbI+FgTHNUoZcsMB2L1IidWg7dJWNKk
2b5sAd8zNtMa0tMO+04kZnK2FZh3JDBvL8esKba+o7+jHGP2WCXG+KSxSDFP
HpnbyCNi/F9CHNWRuSuRhEO2EonmZlOFrTZFkT9FXTuxO1wmvlm3xY/bFMmy
JD1UE438epfEXkwppWKq+ZNaZEaNLHuG0uReXS0kJ+UJHdvrpvUiWr9MhFdf
37v/geKn2YVzalkM9JIpP88U42VTwHhCWZ2Nehd1WUg0ucaINDc3Ism5+ztY
IeYZ5Sc8ogzC1KnnwgdSmBv9cdiYkxnGrnGAmnUEH0ZRn692ak2F4XqenGCI
Sf2T9CfeavAxuzKlTjg8wSwVfQP3mRkWFUlt7Xtab1U+T8fYD9DM+TUbKEia
pM9O9ZscOOQtMHqS1CrlMtRPv5gtTzirmZV9WHSzhEMTC85g45qvXFQ0n+FZ
nKQ4uYDhwEu5XLZjryOepHN0yufaJ4+RQyKtI2TlyV7DkV8/YBkP91uFFdDk
WmgtsSUXRvJEU1VxzUuX6Sv5ugGcjw1wXYNckhWkNABOhV4oQGVxPNz0BnTp
sG8zYMK6hSq9NCxEOQo4Qz0OZTPF6cCa3vPTipI7tsCrF/32WeJVwaZb5ZP3
QfEWygiWwnLa0mb/1CuhKDOR8Ma6XcD6rA8xi6D7gULnDBZv7ARuK0Vw+JzG
8vm7uDq1URRW8vw6/W+aTymnhi+WJNfqmMoXnfCVs8Xcc7KvLkDI9f5tQ13Y
9dKpAxNU62rs0FLnrEqUiOGNl5jKmWQTFO6obXunT0ZSJ7R264SX22orpbZD
pPR4Dq7W4EoifVjmW8Rq/QZ5VSxeZsnj51p50e7HxDBUWL6Ga9rIFqfcs++k
WlGzxEJwLWZp6yKvojMHRfQSAL6yimBhdnamvuwOl6nu2PMD4mXvgOFG8Ufu
slZ7VpUbl6nSycrD9QW0O5L3MszKodYFbFTO7bqbpmywyzbaYWZ/LttBsFnp
Q39TysOLevmu+JLvc21WLeqO3TErt3KJbqS38tLG7xJR47sLrFCoFfwcXcim
yNnwDQK2oSAXfLQsYknC/N6VC7PlmFQNI8HVlywuVxKa795p9uUOYMkNeFj5
ZUarkCvaB8Pp6dLqNUeKJw8osGtlRKNIPhuGyzIpHU8nk5qWg+RswXTAmXB6
nIDqWi+5jnOzxi2NRPeBtmkJroqV25GkmOyGk2TrWubt9OMk25qopJdo/Ipq
r1YCVeaDsngpzd327drYunGtVXgFROSyPgdBrpaWkSz1nrFyB/RX0l7lliuZ
lwhIijVLSyYCyjt7DpA6QWWSo/Ja9RVP4dDhN/hJy0wOeaRDzMc6cheRMDu5
F9kLW4FAttJ3ycVapdCCXk0M2wvdrIxHUTjx0plLuuXHpW/5gyzsa72RQ0Pa
uTt2EEfDMQqE/izJTqrTIeevkbCERunEb2qG0qhnzyZEnuvBYqYzTekT9IZ/
fy2ektRbuD/7P/8+nmutY6z3jiVglJW8K7ZjSs5zQManyfidXWkRX5o9o9M4
D0PWD8+3MK9P9JA2j6rK81lkDWS/IHeF2eiYG5LP3U0A1DfeCLTjpSeF50CC
KoK08dp55hXhHxmJVrLyQ05VAWheTN8yCdkheFwUL/IB/WkhhHd5UlhWcIaX
cIe1ivHlkzyecdE4rx4lpujwfK2pRNmsw8hPgsqL9aqPmGSs1w6OEs7hOuGs
d+5Q6ndGgwGeee34LHlN6U5pVEfrs6R/0FZd1HQe8f43x6SfkTfJnxlgRcbC
q9KlK0cdAFSfUm10LlaZeheaBmUgnTae1tyKbr8k34Bq0py4GSowLtElBC7g
3iVyz1HtZIY10EowaJJW68zu9MB3IA+XM928Yjc4r5oiwemzFST+AAvBnokN
6kh6pzBOa9uHTeHxEIrcxfNIdeqpzw3o4M4Cj6uBQPMf9YVOjUvq3QnQHc7w
r6NQymWV1oeCd6TRiCWD3O0EuDpBO0epwfovTh+l3fLhCntJT5EkPyVBix5O
EXYMkxTLqVYmjg+zr2+KaTdA/vJuN7N5xZpAdYzKsSifR9aBwhxn/SQ0Rzyc
iIaD0fol7ntkkbtrLFtRoTfOT/NZQvWkotq8wBuTk0Rby8xchk/XTk7Euh3o
MUuuB8D7JSpuVEegdK4wnjrnkbfHO62m7Vvz+kJrNpeF1vSO07hWOMj/Tu7x
n1d8vmPn+C/rGmf6EuhKP96woNEm3bzULKSfvYSku+/mrvK/HClau7mb/K9V
ndxt/tfqXv4B8r9ky94kL+s2+V8360bPaqoEWhWDIaiUAEaVjx75ymxpLj9K
4yy+ir5q/sEbP/6blGvov4e/t40Hh3ie1DyZDPCWUbo1Bk+68hlpzqjvmQVq
SrbuA73wR/hT/RLPjcMjJkRPnJlUQp+vrsvJLHxO9ZroXKYno2RIUumT7+mU
cziBN93Q630Sx2KedhxEr2YAyXC644an640a9gHpvXupVvDyp5gDj8vSFRzd
9R4rDbB2KFWi6nO5KJlWqnXxFWjV06qjs+rQ1XI9zhqBjRHn9/KQdIhxdRW9
0bIKh9Ghj0QUveajqfZHxSqKbGlIVwQLG2CZlih6qb72th+faKGswFCiBqi5
gL7E1cRhnr5/87T/ZZ8qa+FcJe8rsHBfJ3hdUXXR8j4VMsLHQBw+vUyEQz8B
4ICyU53PzXcZue+WdNGPX4YQWzDwgPgB/CNHtNK6IIzcRq21wxDIGzAEJbmf
SrZnUjlBRC4pLLysie8I74x1a9Y4ouhpyw10zeEcBU7O1mvrPMdUr1GCpFmB
5PMHe/t8SMXZ415dFOz0eXwCWi4vzm65g9YeEHY3xkNHT9G/JxXL8sz+OgCW
GjBLGfNDmk3wFOajWboY5XExodXFDTuvVYt2tYmNlHjrAk+zrvlYqeqpr6Wj
Xgd7eR6PMfhSnsrFacjgyGF1jF2777MUy2DCgGmpHPuEnwh+eXEywIo6OCA8
fJP9elR8TdahlN4nR9YC+Ws8QFYGZgOYMIj/ZWBkqb1+2t6sNq4Cr0yN1kdo
ffzwWwzOEcdQYdZuDL3/htAAfHbQOgUIx0/ePDUBiyKFXiXxrP8GT7IcFUmM
e03l3uQlQ3b8soxPiHexXMfLF7j0rROGorq2AS+ho2V1mhe7j04xEqQxuVlS
YAvEhHJ/z9JSPTpOPDEM3HoQYay69DookYTUwHJkcklyt62I0Q7sUbboUrRS
X/X/VuwLWriqtjkEh9g7l5fcd38/6q7B+pUrggWDr/JxPnNVaCLHT+XOrxGX
AQO9unJ7Tc9DgTy/utdQFZF/gvV577PP7tExcVugTaU2lbSKXtcFmhNfrxJy
5efFBT4XG1J7Ki/mo9xeY2M9o23V5pDdpV4cDUPru1mM1NJfV3HuWiBB3bl6
0Tmv4hwCulHRuWbFOQThF50zXXawSxwpqDS3yGF9ca2rkyXMH6wf9bNSPTFJ
ipvBBguk3SHv9SR5z4RFuoM4GGOuiqsk6dBT5OU6Ur9aORXLQ4+rd/WmFPbU
a2K91oD50bcvnppiCaKvs8B3OnWJf29wz3XWCwvyis+1Vp/N1uk1fr+df+6Y
7gQD2WP1+9jKZZ1dLEvU+edXv8Ozgv/85BleMPHK1uiLrl2ecsQNLP6VNZ08
H7JXC6px1xtAlpFL8EfNclLtvtMrTi8/+mu2uLoGG9NpfblRjIo8shsg7q96
WfGHKEARLG/zXJJwg4JUnJ7DNalcqSljPrTYlPGKTXm1poCGj3j3Yvx0K+Oa
NNYp54eJ2b1dlqDHOj80sxClUxmeJI5cAvz2+WkJb3i1B4Hv/T5LLjnF7bE1
c0Std78aloRtIx+K5ke8t1HVy8uT7K8ZlQ6TtJ6mhIChPHmPdjyINMxJa7uu
9jNagPA214VKyM4rlrLpilUiUHDgaMeUY/gWp15kxMc1ongebMqT2bph8jzD
y2lhL1n1iyJEZLehIBifpsmZJuWRe4TKVYkbjlaJZXi+fHy5wLrgVMU8UMbl
VDNfbuYVKKu8KoSCay+ysV4qiPK6EiAgREopnQUTCsBBWcRswofQ6A0WgcTL
LbMxtqOcDxyBHrZACUQ1wqYg5VJ2SgAhZx1PAke4l3zuZkUnWOaAiItXOkte
D1ghS7nJSXyGAfcZGj7v3q78h9x9HovuD+qE+sZpffD1bHj4h4JFNv0NdxWq
bOQmwd5JzJOkjnO/J4aM1xS6x5yFhAGofA7zqPnCG8k0kih0YyzOYHURFhg0
XBfqWumpzVfU8Lud2Hwh+tANhKZW8TNhET/ghuvL+F0jWbG+xyaytR8KV88z
zGPhRI6WGnErLgXwUmbIl6+V5KLIGqmntYskdQlypK6lgBx6cLSSZEv1ttV4
xq1V5bg+p5d7i9UCTNDPQOr26EWikmEQXJsqpeheuXtoEQ8pk4ELvG7mU7lD
jtEQbeSKLu2SgzyOPa/ZcijnjkSSNetdKBsLbrr0Oj1OrpdqSD3w9ZtIoNAb
65Bp2U1QbkWym3A16Q/ZTqKQVjZbOMnoAmgmqTfqupyPtK5LrSBkrYQhUBFJ
5QjphKAUqaRzD1ywh+ZaEFD0KLkQcbaVXS2hdQJFQmqoHwx0x83EHxLux12C
7WYcEJi3GvEhBwTWz2HfjD9Dculs/a5NqgRSSODHOg3N3dVGXOdoNOuPzq/4
+7TxYV2j9r9fqi7iz2Z9YcSN6yIGZG6ri9iYi3V1EgNfO824umSPQ46pbXRX
nl+z4XNXp2ab251d769RITjHl4D5ShVNtcMQfescBR7sqvQoQd5/+xhTh9Dm
AoqP32GuOnnWZua1fxU7osIX3kZcqxTWBsi+9H0t6z+4v112t0ePHz9DHMaT
yUyu+KqSSESLD+qcPJFFeubquF4eFan5Q1L853+ASnd1dfVxSTXD5BaaDoqH
CFo9B8s8hv3tD3lJF2pRO2nTs/loqHCThgNak3NxEMIkYs65iBal97XbuuL7
eQnmArkbn9PeOgQt4wLPZWSTIZaTFYfKoE4qdwHkFDUYLJlrCUb3QLFOEOtD
wnsGtMXsI+s/lfqWg+h1ylXftcTOe0rMSeICRBeMYYYORbS7U74oFHgy1+xm
jJAHIp2PxlCRPYZlyzamE5Y0+ti/VpsuK7WFOb3jCU1k37RB042eRa4t39tK
odFFNEtiuhQXhQFqvTM6GSRZC3ZCWYAMn/zxzZMXr49fvuh/9/L4xZuhTXfC
kkTQ5gxWZE9cOXoFNg6Dw/aYT9SYP67jJpoBcXVnmtA1fmUn9KL7WzAZDuIL
xfV3ZOQlvVp7f7DXsRdW++fFF6xWT31GpR0y8jwrVX4eYw0gqbXak6yRRh/7
fh+R7QMTJJV7/NwvrdEePZURYrZGqSW4Ey5f1enDRHccwvVpJ+VNndjJWT5b
iqsFqz+hOIhIYTZf0T1mjAZpWvIZfriMzENSZ61hY/1ZKeq2ZaV5k6weoQPJ
fENvUMwKP+AD65Q9ZJL8Gv3wX+MvUvjmhWtALnro1kvAqqU8S24n6xrEpVV+
koivnm00sLMQusZVbbcahaXI69fYjVbz8BK9WgsV4cTKuVAWntIlwpDL68mS
gPfGlKetRUYFD+5HEeEhhJgc8xIur+3fq4mkx9ag4yQsAGtqS/DXnSpfEMd8
HV3RNNO80hx/w3ul0v4bI3ePuQfjfHFRYNDePYLpBnbzXgJlm5zBh/ZTH6v7
kh6Av+tq1cKA3t8neLzrwgx03ejKJm9+ZweIUxtNCOBtZE8Z9eVyv5bx43gd
AR6a12gXjZeVpIriSU+aWa7+Lddl5F6gH1jjj/Be9xQI/y65KG1lfKrYhhPk
VeTG53/ciXi6//g1EhqGSS2/+tr80RAKNRzpyErGGwh7bWtyOKoPaoqAu0g/
MRWJYo6Q0x3sDWm7EwUtvmJUBqBAJ+8Xpvn3kMiyguydbuh+PNz5Bj//6u2P
R/0/4Qd62mmHQSJGr00UPB5aTFAXw2LQ9AX0ojcvzeOX/xTRIjMl5ZdabfKU
dyRMPkPPB4XiuLSeq9Dp3Q3+kM45Tea8+PpaX//PeAv5n/+Sg8WSjt+5uGhw
8+JX5sdP/Pse30ZRneVwJpDP9R7KQ/8Oyoeb3kAZgULISVsuuU0Aeya8g/1w
zRWdtEwx7fowvA4TsVl95+ZDW40MuB/4vG1xfSM3YR76NEEhdoObKA8tGJ6f
w+CuS6QDpdW45KEGQbquSqUnO/YHBx1i+2XKqHZd9cqVzaC3ugjlXh66akfe
0UDWdXDX5eRbe3uJ5OJy1T0en76vsl+TyULpL1liXK2lrF+DCypugme6ihH6
6/MxX4SpJ5qC7hiQdsaR+LArzhTzDzpmtcIFnCF2XU8ERzuiV8J+SEkPz1Om
CXfgu8h8p1NIV9pblfokpF3ZGvSU2LNc9BuGMSg1ggTCmeNTxEPRDGb46wjn
naXUaJnOSFM/TUEbLsanF1GoLfBWWVuaG27uG2gizQ18Ffe3be2Ut+vtbST6
OEncnrfN5QA5gi19PaoLS2EnqmG9Yri3QlMEr8XTzqbIWNheAqFrF2v3R9LT
e6Yjv+PP/bjsWwidtztmF6tGBys4BLCPAIIGdRAgcsZ1SbNy0m25l0NTGwgJ
WCfYXAUelY5o4LBkamsWSqk9llKBbBSus5UamhgECNT6fXirbE1K07x+ZTVn
XwrU2NkPJcba5fWPNVCufOGr2uSRatO7OrVQQ8du0A2tqb43tVEL9RZ2vDB3
UUJFKzup0s5twib79Sb+tayt0Nh95zfmxNlrGuslpodUuU1e58zH1jc7nkOz
Y3bpYBL7GTuBQbBrukxlC0Kg0qTseGpQQ7+VNfmmgcL+jVEI5t1DRR4zKq0o
BLeZqYHVYDMqdeFkaV2rUNPOFclzZNbif+6JFuvTJ38LpTx0IHX6+hwy+Upd
trvM0Lv0HvyDc1oz73ZRd+bmb/kLviIf8bW3jRcunakExstV4/eauai4BdPb
sobIkbDMeBCs32lsDXrq2vIztYmHVt9YzweYr58S/vTU6bUrxAPsKW5VWsW1
63rV03fITB5fSS1D+oyS/0SacIF2un7S7O6aYET6sEsBRVNbAy0LYMUiMGAt
ouNnqhUP6Po7iad7FSlarnY55OF1vcLibcuojVQ4JkSe65pjqx8/ZU7ZwXXi
VUv3KqSX7kKNfcSZjtPjz9VpkdAxIDzGJr7PxMQnMarqkhZMq517a5E20HvA
829laZbVYfiD58dq/PJQGH9X5tC3tMhpwlL10JOKc5ad/qPk/Xi2LNMzFcLt
vzXfUxP35fRw9bXVD83x69ffPzk0j3NznnAFfnTVfkP09IrRN1F/Rgc0D62l
BajXH0lsvW6Bate8D5J7SKRdxzqNiN/xG31oyFgUvkXakX/79pgtP1mmk1rr
+p7AHTZWRMt6eCgHPJoEIKsyGH/tCWwPf10m8lCFbcpfL83Dhw8NThHgkaAj
gMIJ6mpF9+oMrU6wzHB+ybMR3ryA76NOn+XnmNzwcUnxBnLR8801ibsjBeeV
X2413nG9zzFNyF9oWHcrqWyJVvLL0ylegtLmj1jvjsC/pjOBqY7xhaSu0tBQ
eIRZ3xalsYXge/oy+nyEcfUgEQmAgTYAVNQVniVUdQBTnlWc6oi6IjlvIJN3
7IS0SuO1Ehn5oCaVV3o6d3QkHyKV3fg+VDCbW8tmxh72QuEqxakhAeVxXZrx
42mgE1kIodSxEJqPm15hXIuiRhk8IA4bdtN/bfX2eJRNPf82GKHwIKo/gOYd
7xlQegLLqJiO79279+AnNNAxBxy/mDJG6wMvwIOB5tMpUKZnyhlaIjOSOBP0
sk8ifRlAf4yIEmp0728So1T/ytx/fPzb4zf2N1hG1SnzzlfmgH7DCdjb7+8f
uEYTe26t1ujgyx7984D+ubfH/+zLpbaUl7fm76Gh7ncROWxJA4S9WPefoLO9
/sE92wjzuuQkV63RZw9sIwmWtjVCtLEt/fP5nsXXXj54HeKYoF36PU2LeMw9
dQYds/+JJbP0a/++Muaf39/b68OsAi79B3QnNkWEQNppSsNXHi06h51g0PY7
j68d0x99vEhzRi4gVrV4hMzR6Xd8lnBfYfIJR49VBYAD+WPnTSccROdPnbfR
x3ytS/QR2ZySEYAnWMwrDNdqqA5X/2uJLG6euRCEciXz4Yq2v0hT9iRCpfFZ
P7utSsantOtCb5MzVM6FY+uYevf/UH20MFOALnauheH1GEU9LqPpABQRFZQ4
Ph7rPWh0Y7vkYXF+LV48SIWu6Er40n+Dw+AUCsJ7K20SxYyrphkKlfZstSyp
XhKjtkHHMTCzdBA9I3j6joDAXEqqZeZVcGtJNMCRzlrf/7T5fpMcesMQR1LA
EO2joYVBRizTgWqH63OAsWgM9fxWExEOzcHewb3+3hf9/b03BweH+58f3rv/
p04v+rQOxfa8GZAv/sRFTjq/kvQUAHNaVYvD3d0ac+xOinhawdu7/OwjfdFe
FOZ5j3Zd0FyaeT/a+70YY2lmH3plWMT6tCpexxmXfnsGZIvOB7+sw1Df6Ht6
8VUvhCoFrTeGye3XQeTashsDpObr4HE5m03BYeu+1Xj6jqAru8DIxObwqfUK
SDbpoQFu1YTTjy5V9bsV0x/AEPXU//VqBUL1XIuVeDVg1ieBD6v/EsNqp3QY
LdlosDYq83dEsxZCWYmnfgSE++v7ncazMkGxtx65TwPASoeOMujthI3Gsz+Q
XVRef8i7sst/4Ns2aeUD35cMlw98W5WqDYVJ0+ZYBdhmvR3yvtrAS+5wDH7z
7m/cU3Zpeem/gElbBt7GrwGx7cs1wXA7RveuvNxkxtCoXDn5jty3BbXd63+x
vf6Wki0sPvdBEgaTcz58G+aCeRuSRx19a+FxiGNDoH5Ieg3U/7bb8D+GUvN3
VBYsi2wugAMeaHtNNyN9njbF4g14to50faq3G8B2A9huAP/VG8DfS2Q1ch6C
9R9eQ09/NxDtq4SEkqp2eftGM7ARg9bnxUd1074oqNSE+Wnwqlwffhk+XgkT
mwPMT2sww1f18u9NEQ2i5dcRQfwXvxR4V2C4Cb5WKfk6SJL9dHtI9cD/nYK8
MyxdmsFdANNo3g3mubZ9tsPVcOAdw5UEh7Ujb3HStUDi2OYN0JMMhg0o2qqL
3HLgq1ScW4L1MibW0lSD8deAa9E316LI8eDroK5SHAIMN5v1NUrEB0BrVSg+
AE67csFjv4GCsRp2u6KxpoMVyob0EG5tnPfatrfVqbB+O5PC9zcnZohOkD+7
DiuVkHWs2sB50vum4MLWmoX7Yauthppk726uVmhm7nVYalLujTjyTbseFL4d
ZNvewdJxCbd3Ib80VfcuYGmS74fA8r9ehb7lTXT7dQ0DVlnhoLkrzd0qvX0T
/rDGeU6/u32k9ksLf9RaXDWheVvy/s307zrkVkxuaSeEr251erPV6W8JbKvT
b3X6rU7/gdC2Or3Z6vRbnX6r07fB2ur0/4288TWm6jUaqC6to7yWUdaI1BUR
Vvv7yl3yOu5vIlK3WNZjvW6y7mpCtqGMdeC3Zs8Hj3dr9mzNnrsCuzV7bgNt
a/aYrdmzNXu2Zk8brK3Z839tKGNrZJm/k5EVgtwaRGZrEN0S2NYg2hpEW4Po
A6FtDSKzNYi2BtHWIGqD9V9hEPUdBPn4lj8okLDarm9yeKczbm5W2S//s6JJ
dctqbc7WTYXfXQRM1o9jax+YrX1wS2Bb+2BrH2ztgw+EtrUPzNY+2NoHv6x9
sH56avbBqsmxFF0PLbAPbgkrsA+uhRX8vA2Y/GMFTO7Ujljf51bnN1ud/5bA
tjr/Vuff6vwfCG2r85utzr/V+bc6fxus/wqdv++9dBvPvn58yx8UWktEwVaP
+p9Y72mVqWKTn+oNGslPQYO6ORImP/3D2UVV+3oPh1ib2c2so2tmbxtNWQd+
a1l98Hi3ltXWsrorsFvL6jbQtpaV2VpWW8vq75lt9aE2xzbOcLdxhvWL5oZs
uYInQ5hO290MaE0dXQ/c13Z/AfDzOxNH81tIoppF0qbt3hXIO8Oypu3eElig
7W42z6xFXTspvwhcX9u9XTKfp+1uhp7Vdq+lqFMe75SgvwTYurZ7S99ZekMU
VdtdDzXQdm8363Vt93bQnLZ7Ozietruh1uJruxvA9rTdzToItd1reegDtd0m
nLsg5n8zbTcEF2i7t1xtd6ntNpjmzQ0hW233Wp2lpu3ebLYDjfR2znLv7aBN
U4n1f1yshG3qLu+NKbctqvQPfN73Lrza623PrVfbmK1X+3bAtl7trVd769X+
QGhbr7a5lZ4ftt56tbde7Wtn+0O92tefrg3VF89v7OXCWCjtdwW3sMDtXOht
nbQspltYJnejl27o024YH/UGDeNjfUfFOgdG3fio/77SJ3Wd4GoiUjc+rvFV
rpmPDzU+rjWutwGBbUDgVsC2AYFtQGAbEPhAaNuAgLmVodCEcxfE/G9mKITg
tgGBbUDgDlXATXXy69SUX8Bc2GqnZqudbrXT+si32ulWO10FaqudbrXTrXa6
1U5rb9+Vdvpf6RTeKotbZXGrLPpvbpXFrbLYjuFWWVwDe6sstoDbKourIf/f
oCzqx3ohkGbyw6faQ7O0eLua2eCF6zXTRopHmP3QRqFmasz17yD/3eiFlnzl
Valt6/Itb3Qy8kP6bEmR+cX7bMtNuv0R0JV8HPSygrWaeLyNAmQ6pBZ44Cwy
KPFPYNosNp6SvmeB8BqB5U6CJIvngZRYmdbiaW6df/sx7v/09sf//b/78O9e
/8HbT37VsWtQaDBGCoTleK4j3spM9pVJk5stvnWJkhtCaE2O3PDd9oTIGyVD
NuG1J0HeLAGyDvU4WywrjMpsCjYugHvaAX/qA1Z0ww4+vb6DdiWmjvfLZXV3
iAeQbwBz0wMVdlm7hL+NjrBfuzte1cREbZB+DmD7CML6WZvvmTeduxuBaUcq
2PzDYSdnICe2cucfSe5s168H2DKymNb/pQx81yx0+wWx4qjVas01fLv94NKG
b7efstkc8fZDRJsdeKkP41aw/l4srB43f+9p6Jf6g/jpvbx0rOiY9KsUNNRe
7WnwoNFiWaT1730gTFIk2bjWcplObrDVrcv5dvneDu0PsB/XwLxDcHeMHRL8
TqF503WHcP3JvolJ72kd8sFpHdacYu/JB3kb1qM9ugB2aqJyW2Jk6fvNmXSl
xHdG5AaOGeu9+h9KpTV8s4IiHG1ss79rJz3aPPM3CuM5rFuOd1iJvV4L2kgX
ud77sZmqb0lnAgwdA62cSf3B7iiuZ9ngAx2nUTzAuoX8Zw3nitE5WuWnARo+
QWPkl6ZbzeJZRThA54icMr80PnXXzxqEBPLFL42SMPFFG1LhwblAkH+IzuLL
oUDTcJLEntlzZIH/XEV/+9vfougjgwvQ/ItiatKsXKDNZUYX5i8lTF85Pk3m
8SAvTszlR/Ckry2uoojetaM0RIPE4MoyyxJgpJl5/fipiaegmk1i2F5LE1cm
zuAHVtaAXNE8nyQzMwO+mg2iI7PIF8tZXJjz+MJUuWEdfpSY379++YJBIwj+
5L1q0tIg3XPoNwLcY8OLz+RTMyniaVWaPGuMqHt+mo5PzTifzWDuU4ADbxZJ
FI9GRXKWghY0wY7NKWgHOzsPDWBtrK6A6MUW37OkKGE45jwx5+lsFpFtQi9i
u8vLPvR9dQUjLE11mpizfByP8MULJhWgjB3BKKbxPJ2lABFem8N2xSOnoUIX
PXw7WhRJCcvQlItknE7TMVHSjPKiyM9LU+bzBMeN/YB5NAeqZxNAtKio77SI
SiBAVqXjEjvBZt6EBFTNkmQC2OG4YSYHUfQGGs9jmNiJm/sLk84ROs44j64z
RCYedgbRMbEAYg0/jWHqq/gdIJcRgmX63nSr5D0MhFh4x5zFs2UCg+R5wamY
pOV4WQo3IexpjjsOtDawwZcJLf/SdLO8gtGeAnNgI6QlohB1hhjCGHYQM2gC
7ywE1RjIwv0xraBBOCbCfEfG7ISBbdAZ0sYNsGE2AP8xk5ehAF1xkDpBEXfU
PQEey7Br4gHXeWIEmELHfl+nwAlxMbugSW9HQfJuAAng/rN0ksgoiBJA7wiW
ztKjXgwkQ96VXqnt9VhFitVDJhT8D5kAVsskHy/R5EdGRi5DGsNSuIB1MJv1
WSJY/olinATEFEQBQdEGhO55vpxNcJhGRiXsQAsNhUZZoRCJkHOAxQGT7ATI
FH30Ec21wbnGNT/s9PSB7KPDDs8iKSleO0LZa4UcB3Qo8zGv/fO0OjXTWQ4L
A/iNlnSEr8gLImOAX5l2F/z+WZxS0BZpjosXxRrhY0lrezRz2PlLHn6O9FTI
MnJoixAi6YhWkM6ox/LD/b3B3hAJSnTyQPQMbtgmnZq0inDmMhSNecVL3Sf7
rAQq49KCn7P+T0mBwneczoHdpgXvsmXLapiEe0BnKD4TnAT4wi4Q+AIrsZ4w
xU3qOU+OlVWEKxcAshFecYFTBAOR13YtAIOaaLELKxxeGuXLbFIS5yEjM6hB
1H0RyIlvWffCZnMgdiuSu604ThE+kjOBFZpChyhyeKeJRNbgLA12mGKBaAG6
2KwsAIXLr6StpExxE9Jx04BpARaw2DzhwnwEqwJYwZtwBaqLl8FEtLph5G9q
S4KYiaYdwCTvcU8pVS7WMFTEgULc937PLLMZLuIYRgq73Ko3aFumzQop4S1V
lvj+wvQeEifXluH3WTqGncl4+4VyRlxG61Yf9TAjF5bpwvBgzZXLgmXi+DRG
5oa1taOLy1Kct2Xcb6/hd3aPWXFiHWbI4G4nsxwrvDmIQl5coMqRL0urSsg0
6mavohbnakboRT4tZIBCEhga6oZ2Kz2FpQFwdRtEsQMvTZezSOaRcGKVRjct
AztFPkHYVk9CSQEk+v7N0/6XPZQquB0AiGUJFIFfTmMYAvXC3Ik7Yw6kVsFR
WwYS5QXKoVqAjOdPLJOGhBa0AjIAL+AWAtP045NHz4/6B58fvIUuTkgBEw5G
wsHglVvmxDK0Geq00oxKP6HaUCbEQkgg2GhOc9GDZTfqwa6jXD/8tyFOdjT8
1VCalvRqMl/M8otk0jOKYAt+uHlWyBSg3AkehMEnmO2CK/0TIAQ1AbK9EW2G
lVtYriYev8vy81kyORHMWyggag4QLypiWp+TFNmKVsVZXBCfARdVKPhKGhmy
Wrk8OYEZIxrSFM5ABalwcc3h22EUXR6O8/kCFsxV9Im3dh7638x4BmuXebCE
uQayjOCXd0kFHdEiIJ4q4gz6esgaqUGwswTZm4CVKX5FTgE1dZri1jf8ZNgz
w0/xP9/Af3CpEYiw0WV2NUQTDj705lfSDr9cDRHuSZEvF7SXA1oZTTn1h4Mf
kwvCoO0WA9Oa4c/0CgLQKe6OkpM0w5XTz6dgCS2WlbICLJaJ9/BXQ2R5f4ED
QUlhJY5G/eUcn5es46keri2yqsgnyzHxXwTW1gnMbQlWxDfH/ceDNKmmaE5k
sHxO+/Lr1VV9qZM0FDaOWriQacPv8LQADcBuxSUygvkqYRpPDdhfMSpNwCiR
m3B6tTHja7UDXO9sZMjW41sCgWLPe0w5MMbSr9c0HH07pecJSlJuo6Y+D9gi
w7FVhNvNtMjnIKOQG2JlOF+gVnkkGnOFw1SZ6dBFRAzrzt10kAx6/nPfLw+o
8F4JQpZlvRWx5QUs+fdWbuCaubx89fTRvXv3Hlxd4dgz77VlGZ8kIgIBr3y2
BPqwpYl7WXqWzgx2ibwXLFUwFBQd1rrwK3/iZ4ewZo7Cvr1XYM3BVgH6PL7V
M7g46Lv8CHRfqP08oN6WRcrQA+96rZsHX34O3Xz/6hgB4j+vtGEryGU6AQD2
9fv7Bwf4+vfHjwe+YiHutJpmYZ861rPGDu7iVbEE9BAR4FIMQ6Hx6kEl51sN
pjxrU1bop3KlWRB5ikmrWUf+V6saWpYlUZLEsGCZCaNEZKYyJfULimBZ8QYi
fThfiH1B7UF6YaXm42EXtWk+x4KnVXzkgaf3OE09Ur3nGinhZZl72rGq6jRl
EQsFVECKJbELpQowqewYRUOeQQ/plFirCiaVXX61WdWHbdM6jxcgNklwsJCg
PtRpsVYNNV3xMJadtT4F5wEXFLBTHhZsCinbhETcyPrG9BeZUxEu7Lt6Ybjb
Q4NdvgP0hKBZRNYe4Yhd4E9qLbVC4P3CuQgQuQjfZI43GJeZGNy+0OcWMgv0
yWqOyl7uCKybAld6nk2c1rduFEC5I5hOHbBrQ/IefYZI/HzBZLVGip0WzOAg
KRs1XB2ts6FlshxHs43Nywb2mdAQofWJ9CWISFEkCk2ZQlLca9oBe+qC3Aoj
cr6JF+7F7HCGrnEGLAOUMOIimRHHAmd6Tm9m/GPVsngLRe23jFAa9UcxGn+A
8nleTFiZJdvQdx6F7sYqGZ/SSqXxxZEnZMZ5eVHi+u2ZEWxd5JCMJ38BscQL
cw7EI+uAaQK4PRmcwP55efny0VMQ6jAOxge6eX0en6B1ezDYU6ECBn5c6PLW
hlGHrO/+/Y54W+8DoC6NYQycDm34988EJ3GBwk/sdckmRDN0mCFaMKNoa6EL
msGKLt7mIRDx1+IlsPQEMhLDBw4HVMwTUr5R4SYfKnaIPnPWioWtwKoScx/0
ONDax04+Oz8RfnO7pu+I2fX8MJFg5AtoVO/LZCY7TQZQ5vlZMnkoINlugH0h
K53XHuZgRsIoQ5USEEeZ9u3jQ3LfoWEDAwYVwaQtDIc+ctxxgIHZNUgehMhx
DS8KJBlwJjKueQSqDHlHAMaT9zECBXX4o7F73E/k8RUKV1ylwCUgVt4btapM
dZ4bbWXSGcwVDIo8e3Z7MB5EhFDksNnCEoFpFfE1xJgNeh6tq5ZX1stlNQPR
9xoW4uL/b+ZqdqOGgfA9TzG4By41BQ4IVVApVCAhWnrgUIlTtmuzstiNV8mu
UFnlbXgTXoyZ8W+cDe2xl/2J7cmMxx5/85MEFpFDy5c5RbMNLCKHlHyhRJII
1GJiSeQjBKR8U6zOE/5WrkfIVxXVTuIySJ1nQr5ZdsPSIKqHc3mvPLEleu5X
1PuUd6iTGQQ3IJ5A9hiHTCPLBr8eN6Qn1l69jA2hBMJ90+dQudTV4RxOcD4p
d8yBYJnP28AqQTjZmZXz5uSnTuvfOAtJNdiILrT84Roep5wuJ+lHjpRUzhHk
I2h13TG68kdmoJDrIxjsQiO4gfZlXf/kyYLTWXVV4jNuBrTctPSDsZjKwvE6
iqJqJaZKeGjZ5BQfWjyTiUGPnE+HsRBzE+LER7eJCOy7Y+9bTfWE4uTM0/Gk
zvKR5evws7q9t6Om/A2q6XdWKyeCPgvZ486tg8afqsDyzWMknm7K02qG9RmW
y+XA+Dv19PiQUoZH5qksoIzX/SOB4lL7h5b+azDG+59MBtQptMZAhQa5m2j1
XrRWhMOFMcEIptC58GKjXCyI/oQ8MwVqmmgY16qyrSZHeiFdAKNZL9rVHv36
BrcEnz22u+eMEqXQ6PtwONSdgS+6+/un1e0wDM/7SizWO38L4TwSov+xM0v0
WVq0fT1iJDzgG7PtrbRqk5P3AV2XqPiFmFHhkuz3dwrR2JI7kARrhEWJc8+1
D7s0OzQ5fVMlmuTVvHsmJcCVRVR1S7DnHBjMMAjeImwJodSv8YJL6u2Mgwc3
13UFUl4cI5RXEXw3qw9aw9XtNSBghGiOIFjsWSpG4SpDENIu74F7tuQfZCsX
QiENuN00SykK1UNWqw433vcwjpQrgpklgvMeYh4q+8MxqZ3dmCWSmZeFwuII
5n5Ggf8BBfkMBMEEAgA=

-->

</rfc>
