<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-pardue-moq-qlog-moq-events-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title>MoQ qlog event definitions</title>
    <seriesInfo name="Internet-Draft" value="draft-pardue-moq-qlog-moq-events-02"/>
    <author fullname="Lucas Pardue">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <author fullname="Mathis Engelbart">
      <organization>Technical University of Munich</organization>
      <address>
        <email>mathis.engelbart@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="August" day="06"/>
    <area/>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>hi fidelity</keyword>
    <abstract>
      <?line 44?>

<t>This document defines a qlog event schema containing concrete events for MoQ.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://LPardue.github.io/draft-pardue-moq-qlog-moq-events/draft-pardue-moq-qlog-moq-events.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-pardue-moq-qlog-moq-events/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC  mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/LPardue/draft-pardue-moq-qlog-moq-events"/>.</t>
    </note>
  </front>
  <middle>
    <?line 49?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines a qlog event schema (<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>)
containing concrete events for Media over QUIC Transport <xref target="MOQT"/>.</t>
      <t>The event namespace with identifier <tt>moqt</tt> is defined; see <xref target="schema-def"/>. In
this namespace multiple events derive from the qlog abstract Event class
(<xref section="7" sectionFormat="of" target="QLOG-MAIN"/>), each extending the "data" field and defining
their "name" field values and semantics.</t>
      <t><xref target="events-table"/> summarizes the name value of each event type that is defined in
this specification. Some event data fields use complex data types. These are
represented as enums or re-usable definitions, which are grouped together on the
bottom of this document for clarity.</t>
      <table anchor="events-table">
        <name>MOQT Events</name>
        <thead>
          <tr>
            <th align="left">Name value</th>
            <th align="left">Importance</th>
            <th align="left">Definition</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">moqt:control_message_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="controlmessagecreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:control_message_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="controlmessageparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:stream_type_set</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="streamtypeset"/></td>
          </tr>
          <tr>
            <td align="left">moqt:object_datagram_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="objectdatagramcreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:object_datagram_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="objectdatagramparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:object_datagram_status_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="objectdatagramstatuscreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:object_datagram_status_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="objectdatagramstatusparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:subgroup_header_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="subgroupheadercreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:subgroup_header_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="subgroupheaderparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:subgroup_object_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="subgroupobjectcreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:subgroup_object_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="subgroupobjectparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:fetch_header_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="fetchheadercreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:fetch_header_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="fetchheaderparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:fetch_object_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="fetchobjectcreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:fetch_object_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="fetchobjectparsed"/></td>
          </tr>
        </tbody>
      </table>
      <t>When any event from this document is included in a qlog trace, the
"protocol_types" qlog array field <bcp14>MUST</bcp14> contain an entry with the value "MOQT":</t>
      <figure anchor="protocoltype-extension-moqt">
        <name>ProtocolType extension for MOQT</name>
        <sourcecode type="cddl"><![CDATA[
$ProtocolType /= "MOQT"
]]></sourcecode>
      </figure>
      <section anchor="usage-with-quic">
        <name>Usage with QUIC</name>
        <t>The events described in this document can be used with or without logging the
related QUIC events defined in <xref target="QLOG-QUIC"/>. If used with QUIC events, the QUIC
document takes precedence in terms of recommended filenames and trace separation
setups.</t>
        <t>If used without QUIC events, it is recommended that the implementation assign a
globally unique identifier to each MOQT session. This ID can then be used as the
value of the qlog "group_id" field, as well as the qlog filename or file
identifier, potentially suffixed by the vantagepoint type (For example,
abcd1234_server.qlog would contain the server-side trace of the connection with
GUID abcd1234).</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The event and data structure definitions in ths document are expressed
in the Concise Data Definition Language <xref target="CDDL"/> and its
extensions described in <xref target="QLOG-MAIN"/>.</t>
      <t>The following fields from <xref target="QLOG-MAIN"/> are imported and used: name, namespace,
type, data, group_id, protocol_types, RawInfo, and time-related
fields.</t>
      <t>Events are defined with an importance level as described in <xref section="8.3" sectionFormat="of" target="QLOG-MAIN"/>.</t>
      <t>As is the case for <xref target="QLOG-MAIN"/>, the qlog schema definitions in this document
are intentionally agnostic to serialization formats. The choice of format is an
implementation decision.</t>
    </section>
    <section anchor="schema-def">
      <name>Event Schema Definition</name>
      <t>This document describes how the MOQT protocol is expressed in qlog with an event
schema. Per the requirements in <xref section="8" sectionFormat="of" target="QLOG-MAIN"/>, this document
registers the <tt>moqt</tt> namespace. The event schema URI is
<tt>urn:ietf:params:qlog:events:moqt</tt>.</t>
      <section removeInRFC="true" anchor="draft-event-schema-identification">
        <name>Draft Event Schema Identification</name>
        <t>Only implementations of the final, published RFC can use the events belonging to
the event schema with the URI <tt>urn:ietf:params:qlog:events:moqt</tt>. Until such an
RFC exists, implementations <bcp14>MUST NOT</bcp14> identify themselves using this URI.</t>
        <t>Implementations of draft versions of the event schema <bcp14>MUST</bcp14> append the string
"-" and the corresponding draft number to the URI. For example, draft 99 of this
document is identified using the URI <tt>urn:ietf:params:qlog:events:moqt-99</tt>.</t>
        <t>The namespace identifier itself is not affected by this requirement.</t>
      </section>
    </section>
    <section anchor="moqt-events">
      <name>MOQT Events</name>
      <t>MOQT events extend the <tt>$ProtocolEventData</tt> extension point defined in
<xref target="QLOG-MAIN"/>. Additionally, they allow for direct extensibility by their use of
per-event extension points via the <tt>$$</tt> CDDL "group socket" syntax, as also
described in <xref target="QLOG-MAIN"/>.</t>
      <figure anchor="moqt-events-def">
        <name>MOQTEventData definition and ProtocolEventData extension</name>
        <sourcecode type="cddl"><![CDATA[
MOQTEventData = MOQTControlMessageCreated /
                MOQTControlMessageParsed /
                MOQTStreamTypeSet /
                MOQTObjectDatagramCreated /
                MOQTObjectDatagramParsed /
                MOQTObjectDatagramStatusCreated /
                MOQTObjectDatagramStatusParsed /
                MOQTSubgroupHeaderCreated /
                MOQTSubgroupHeaderParsed /
                MOQTSubgroupObjectCreated /
                MOQTSubgroupObjectParsed /
                MOQTFetchHeaderCreated /
                MOQTFetchHeaderParsed /
                MOQTFetchObjectCreated /
                MOQTFetchObjectParsed

$ProtocolEventData /= MOQTEventData
]]></sourcecode>
      </figure>
      <t>MOQT events are logged when a certain condition happens at the application
layer, and there isn't always a one to one mapping between HTTP and QUIC events.
The exchange of data between the HTTP and QUIC layer is logged via the
"stream_data_moved" and "datagram_data_moved" events in <xref target="QLOG-QUIC"/>.</t>
      <t>The concrete MOQT event types are further defined below, their type identifier
is the heading name.</t>
      <t>Some MOQT messages include a reason phrase that can provide additional
information in the format of a byte sequences. However, these sequences are not
guaranteed to be presentable as UTF-8. In order to accomodate various encodings,
where the wire image of a message includes a reason phrase, the MOQT qlog event
type, includes two option fields: <tt>reason</tt> (for UTF-8) and <tt>reason_bytes</tt> (a
hex-encoded string representing raw bytes). Implementations <bcp14>SHOULD</bcp14> log at least
one format, but <bcp14>MAY</bcp14> log both or none.</t>
      <section anchor="controlmessagecreated">
        <name>control_message_created</name>
        <t>The <tt>control_message_created</tt> event is emitted when a control message is created.
It has Core importance level.</t>
        <t>The definition of control message content is in <xref target="moqtcontrolmessage"/>.</t>
        <figure anchor="moqt-controlmessagecreated-def">
          <name>MOQTControlMessageCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTControlMessageCreated = {
    stream_id: uint64
    ? length: uint64
    message: $MOQTControlMessage
    ? raw: RawInfo

    * $$moqt-controlmessagecreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="controlmessageparsed">
        <name>control_message_parsed</name>
        <t>The <tt>control_message_parsed</tt> event is emitted when a control message is parsed.
It has Core importance level.</t>
        <t>The definition of control message content is in <xref target="moqtcontrolmessage"/>.</t>
        <figure anchor="controlmessageparsed-def">
          <name>MOQTControlMessageParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTControlMessageParsed = {
    stream_id: uint64
    ? length: uint64
    message: $MOQTControlMessage
    ? raw: RawInfo

    * $$moqt-controlmessageparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="streamtypeset">
        <name>stream_type_set</name>
        <t>The <tt>stream_type_set</tt> event conveys when a MOQT stream type becomes known. It
has Base importance level.</t>
        <figure anchor="streamtypeset-def">
          <name>MOQTStreamTypeSet definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTStreamTypeSet = {
    ? owner: Owner
    stream_id: uint64
    stream_type: $MOQTStreamType

    * $$moqt-streamtypeset-extension
}

$MOQTStreamType /=  "control" /
                    "subgroup_header" /
                    "fetch_header"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="objectdatagramcreated">
        <name>object_datagram_created</name>
        <t>The <tt>object_datagram_created</tt> event is emitted when the OBJECT_DATAGRAM message
is created. It has Core importance level.</t>
        <figure anchor="objectdatagramcreated-def">
          <name>MOQTObjectDatagramCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTObjectDatagramCreated = {
    track_alias: uint64
    group_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    ? object_payload: RawInfo

    * $$moqt-objectdatagramcreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="objectdatagramparsed">
        <name>object_datagram_parsed</name>
        <t>The <tt>object_datagram_parsed</tt> event is emitted when the OBJECT_DATAGRAM message
is parsed. It has Core importance level.</t>
        <figure anchor="objectdatagramparsed-def">
          <name>MOQTObjectDatagramParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTObjectDatagramParsed = {
    track_alias: uint64
    group_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    ? object_payload: RawInfo

    * $$moqt-objectdatagramparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="objectdatagramstatuscreated">
        <name>object_datagram_status_created</name>
        <t>The <tt>object_datagram_status_created</tt> event is emitted when the
OBJECT_DATAGRAM_STATUS message is created. It has Core importance level; see
<xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="objectdatagramstatuscreated-def">
          <name>MOQTObjectDatagramStatusCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTObjectDatagramStatusCreated = {
    track_alias: uint64
    group_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_status: uint64

    * $$moqt-objectdatagramstatuscreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="objectdatagramstatusparsed">
        <name>object_datagram_status_parsed</name>
        <t>The <tt>object_datagram_status_parsed</tt> event is emitted when the
OBJECT_DATAGRAM_STATUS message is parsed. It has Core importance level; see
<xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="objectdatagramstatusparsed-def">
          <name>MOQTObjectDatagramStatusParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTObjectDatagramStatusParsed = {
    track_alias: uint64
    group_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_status: uint64

    * $$moqt-objectdatagramstatusparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="subgroupheadercreated">
        <name>subgroup_header_created</name>
        <t>The <tt>subgroup_header_created</tt> event is emitted when a stream begins and a
SUBGROUP_HEADER is created. It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="subgroupheadercreated-def">
          <name>MOQTSubgroupHeaderCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupHeaderCreated = {
    stream_id: uint64
    track_alias: uint64
    group_id: uint64
    ? subgroup_id: uint64
    publisher_priority: uint8

    * $$moqt-subgroupheadercreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="subgroupheaderparsed">
        <name>subgroup_header_parsed</name>
        <t>The <tt>subgroup_header_parsed</tt> event is emitted when the SUBGROUP_HEADER is
parsed. It has Core importance level.</t>
        <figure anchor="subgroupheaderparsed-def">
          <name>MOQTSubgroupHeaderParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupHeaderParsed = {
    stream_id: uint64
    track_alias: uint64
    group_id: uint64
    ? subgroup_id: uint64
    publisher_priority: uint8

    * $$moqt-subgroupheaderparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="subgroupobjectcreated">
        <name>subgroup_object_created</name>
        <t>The <tt>subgroup_object_created</tt> event is emitted when a subgroup object is
created. It has Core importance level.</t>
        <figure anchor="subgroupobjectcreated-def">
          <name>MOQTSubgroupObjectCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupObjectCreated = {
    stream_id: uint64
    ? group_id: uint64
    ? subgroup_id: uint64
    object_id: uint64
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_payload_length: uint64
    ? object_status: uint64
    ? object_payload: RawInfo

    * $$moqt-subgroupobjectcreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="subgroupobjectparsed">
        <name>subgroup_object_parsed</name>
        <t>The <tt>subgroup_object_parsed</tt> event is emitted when a subgroup object is parsed.
It has Core importance level.</t>
        <figure anchor="subgroupobjectparsed-def">
          <name>MOQTSubgroupObjectParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupObjectParsed = {
    stream_id: uint64
    ? group_id: uint64
    ? subgroup_id: uint64
    object_id: uint64
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_payload_length: uint64
    ? object_status: uint64
    ? object_payload: RawInfo

    * $$moqt-subgroupobjectparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fetchheadercreated">
        <name>fetch_header_created</name>
        <t>The <tt>fetch_header_created</tt> event is emitted when a stream begins and a
FETCH_HEADER is created. It has Core importance level.</t>
        <figure anchor="fetchheadercreated-def">
          <name>MOQTFetchHeaderCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchHeaderCreated = {
    stream_id: uint64
    request_id: uint64

    * $$moqt-fetchheadercreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fetchheaderparsed">
        <name>fetch_header_parsed</name>
        <t>The <tt>fetch_header_parsed</tt> event is emitted when the SUBGROUP_HEADER is
parsed. It has Core importance level.</t>
        <figure anchor="fetchheaderparsedd-def">
          <name>MOQTFetchHeaderParsed   definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchHeaderParsed = {
    stream_id: uint64
    request_id: uint64

    * $$moqt-fetchheaderparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fetchobjectcreated">
        <name>fetch_object_created</name>
        <t>The <tt>fetch_object_created</tt> event is emitted when a fetch object is created. It
has Core importance level.</t>
        <figure anchor="fetchobjectcreated-def">
          <name>MOQTFetchObjectCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchObjectCreated = {
    stream_id: uint64
    group_id: uint64
    subgroup_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_payload_length: uint64
    ? object_status: uint64
    ? object_payload: RawInfo

    * $$moqt-fetchobjectcreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fetchobjectparsed">
        <name>fetch_object_parsed</name>
        <t>The <tt>fetch_object_parsed</tt> event is emitted when a fetch object is parsed. It has
Core importance level.</t>
        <figure anchor="fetchobjectparsed-def">
          <name>MOQTFetchObjectParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchObjectParsed = {
    stream_id: uint64
    group_id: uint64
    subgroup_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_payload_length: uint64
    ? object_status: uint64
    ? object_payload: RawInfo

    * $$moqt-fetchobjectparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="moqt-data-type-definitions">
      <name>MOQT Data Type Definitions</name>
      <t>The following data type definitions can be used in MOQT events.</t>
      <section anchor="owner">
        <name>Owner</name>
        <figure anchor="owner-def">
          <name>Owner definition</name>
          <sourcecode type="cddl"><![CDATA[
Owner = "local" /
        "remote"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="moqtsetupparameter">
        <name>MOQTSetupParameter</name>
        <t>The generic $MOQTSetupParameter is defined here as a CDDL "type socket"
extension point. It can be extended to support additional MOQT Setup Parameters.</t>
        <figure anchor="moqtsetupparameter-def">
          <name>MOQTSetupParameter type socket definition</name>
          <sourcecode type="cddl"><![CDATA[
; The MOQTSetupParameter is any key-value map (e.g., JSON object)
$MOQTSetupParameter /= {
    * text => any
}
]]></sourcecode>
        </figure>
        <figure anchor="moqtbasesetupparameters-def">
          <name>MOQTBaseSetupParameters definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTBaseSetupParameters /= MOQTPathSetupParameter /
                            MOQTMaxRequestIdSetupParameter /
                            MOQTUnknownSetupParameter

$MOQTSetupParameter /= MOQTBaseSetupParameters
]]></sourcecode>
        </figure>
        <section anchor="moqtpathsetupparameter">
          <name>MOQTPathSetupParameter</name>
          <figure anchor="moqtpathsetupparameter-def">
            <name>MOQTPathSetupParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPathSetupParameter = {
  name: "path"
  value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtmaxrequestidsetupparameter">
          <name>MOQTMaxRequestIdSetupParameter</name>
          <figure anchor="moqtmaxsubscribeidsetupparameter-def">
            <name>MOQTMaxRequestIdSetupParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTMaxRequestIdSetupParameter = {
  name: "max_request_id"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunknownsetupparameter">
          <name>MOQTUnknownSetupParameter</name>
          <figure anchor="moqtunknownsetupparameter-def">
            <name>MOQTUnknownSetupParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnknownSetupParameter = {
  name:"unknown"
  name_bytes: uint64
  ? length: uint64
  ? value: uint64
  ? value_bytes: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="moqtparameter">
        <name>MOQTParameter</name>
        <t>The generic $MOQTParameter is defined here as a CDDL "type socket" extension
point. It can be extended to support additional MOQT Parameters.</t>
        <figure anchor="moqtparameter-def">
          <name>MOQTParameter type socket definition</name>
          <sourcecode type="cddl"><![CDATA[
; The MOQTParameter is any key-value map (e.g., JSON object)
$MOQTParameter /= {
    * text => any
}
]]></sourcecode>
        </figure>
        <figure anchor="moqtbaseparameters-def">
          <name>MOQTBaseParameters definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTBaseParameters /= MOQTAuthorizationTokenParameter /
                      MOQTDeliveryTimeoutParameter /
                      MOQTMaxCacheDurationParameter /
                      MOQTUnknownParameter

$MOQTParameter /= MOQTBaseParameters
]]></sourcecode>
        </figure>
        <section anchor="moqtauthorizationtokenparameter">
          <name>MOQTAuthorizationTokenParameter</name>
          <figure anchor="moqtauthorizationTokenparameter-def">
            <name>MOQTAuthorizationTokenParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAuthorizationTokenParameter = {
  name: "authorization_token"
  alias_type: uint64
  ? token_alias: uint64
  ? token_type: uint64
  ? token_value: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtdeliverytimeoutparameter">
          <name>MOQTDeliveryTimeoutParameter</name>
          <figure anchor="moqtdeliverytimeoutparameter-def">
            <name>MOQTDeliveryTimeoutParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTDeliveryTimeoutParameter = {
  name: "delivery_timeout"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtmaxcachedurationparameter">
          <name>MOQTMaxCacheDurationParameter</name>
          <figure anchor="moqtmaxcachedurationparameter-def">
            <name>MOQTMaxCacheDurationParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTMaxCacheDurationParameter = {
  name: "max_cache_duration"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunknownparameter">
          <name>MOQTUnknownParameter</name>
          <figure anchor="moqtunknownparameter-def">
            <name>MOQTUnknownParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnknownParameter = {
  name:"unknown"
  name_bytes: uint64
  ? length: uint64
  ? value: uint64
  ? value_bytes: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="moqtbytestring">
        <name>MOQTByteString</name>
        <t>The MOQTByteString type allows representing MOQT bytestrings, such as the value
of a Track or Track Namespace tuple field, using two different encodings. The
<tt>value</tt> field can be used for bytestrings that can be encoded in UTF-8. The
<tt>value_bytes</tt> field can be used for bytestrings of any type by using the
<tt>hexstring</tt> encoding.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> populate one of either the <tt>value</tt> or <tt>value_bytes</tt>
field. Populating both fields is redundant.</t>
        <figure anchor="MOQTByteString-def">
          <name>MOQTByteString definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTByteString = {
  ? value: text
  ? value_bytes: hexstring
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="moqtlocation">
        <name>MOQTLocation</name>
        <t>A Location, as defined in <xref section="1.3.1" sectionFormat="of" target="MOQT"/></t>
        <figure anchor="moqtlocation-def">
          <sourcecode type="cddl"><![CDATA[
MOQTLocation = {
  group: uint64
  object: uint64
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="moqtcontrolmessage">
        <name>MOQTControlMessage</name>
        <t>The generic <tt>$MOQTControlMessage</tt> is defined here as a CDDL "type socket" extension point.
It can be extended to support additional MOQT control message types.</t>
        <figure anchor="control-message-def">
          <name>MOQTControlMessage type socket definition</name>
          <artwork><![CDATA[
; The MOQTControlMessage is any key-value map (e.g., JSON object)
$MOQTControlMessage /= {
    * text => any
}
]]></artwork>
        </figure>
        <t>The MOQT control message types defined in this document are as follows:</t>
        <figure anchor="moqtbasecontrolmessage-def">
          <name>MOQTBaseControlMessages definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTBaseControlMessages = MOQTClientSetupMessage /
                          MOQTServerSetupMessage /
                          MOQTGoaway /
                          MOQTMaxRequestId /
                          MOQTRequestsBlocked /
                          MOQTSubscribe /
                          MOQTSubscribeOk /
                          MOQTSubscribeError /
                          MOQTSubscribeUpdate /
                          MOQTUnsubscribe /
                          MOQTSubscribeDone /
                          MOQTPublish /
                          MOQTPublishOk /
                          MOQTPublishError /
                          MOQTFetch /
                          MOQTFetchOk /
                          MOQTFetchError /
                          MOQTFetchCancel /
                          MOQTTrackStatusRequest /
                          MOQTTrackStatus /
                          MOQTAnnounce /
                          MOQTAnnounceOk /
                          MOQTAnnounceError /
                          MOQTUnannounce /
                          MOQTAnnounceCancel /
                          MOQTSubscribeAnnounces /
                          MOQTSubscribeAnnouncesOk /
                          MOQTSubscribeAnnouncesError /
                          MOQTUnsubscribeAnnounces

$MOQTControlMessage /= MOQTBaseControlMessages
]]></sourcecode>
        </figure>
        <section anchor="moqtclientsetupmessage">
          <name>MOQTClientSetupMessage</name>
          <figure anchor="clientsetup-def">
            <name>MOQTClientSetupMessage definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTClientSetupMessage = {
  type: "client_setup"
  number_of_supported_versions: uint64
  supported_versions: [* uint64]
  number_of_parameters: uint64
  ? setup_parameters: [* $MOQTSetupParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtserversetupmessage">
          <name>MOQTServerSetupMessage</name>
          <figure anchor="serversetup-def">
            <name>MOQTServerSetupMessage definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTServerSetupMessage = {
  type: "server_setup"
  selected_version: uint64
  number_of_parameters: uint64
  ? setup_parameters: [* $MOQTSetupParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtgoaway">
          <name>MOQTGoaway</name>
          <figure anchor="goaway-def">
            <name>MOQTGoaway definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTGoaway = {
  type: "goaway"
  ? length: uint64
  new_session_uri: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtmaxrequestid">
          <name>MOQTMaxRequestId</name>
          <figure anchor="maxsubscribeid-def">
            <name>MOQTMaxRequestId definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTMaxRequestId = {
  type: "max_request_id"
  request_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtrequestsblocked">
          <name>MOQTRequestsBlocked</name>
          <figure anchor="subscribesblocked-def">
            <name>MOQTRequestsBlocked definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTRequestsBlocked = {
  type: "requests_blocked"
  maximum_request_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribe">
          <name>MOQTSubscribe</name>
          <figure anchor="subscribe-def">
            <name>MOQTSubscribe definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribe = {
  type: "subscribe"
  request_id: uint64
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  subscriber_priority: uint8
  group_order: uint8
  forward: uint8
  filter_type: uint64
  ? start_location: MOQTLocation
  ? end_group: uint64
  number_of_parameters: uint64
  ? subscribe_parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeok">
          <name>MOQTSubscribeOk</name>
          <figure anchor="subscribeok-def">
            <name>MOQTSubscribeOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeOk = {
  type: "subscribe_ok"
  request_id: uint64
  track_alias: uint64
  expires: uint64
  group_order: uint8
  content_exists: uint8
  ? largest_location: MOQTLocation
  number_of_parameters: uint64
  ? subscribe_parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeerror">
          <name>MOQTSubscribeError</name>
          <figure anchor="subscribeerror-def">
            <name>MOQTSubscribeError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeError = {
  type: "subscribe_error"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
  track_alias: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeupdate">
          <name>MOQTSubscribeUpdate</name>
          <figure anchor="subscribeupdate-def">
            <name>MOQTSubscribeUpdate definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeUpdate = {
  type: "subscribe_update"
  request_id: uint64
  start_location: MOQTLocation
  end_group: uint64
  subscriber_priority: uint8
  forward: uint8
  number_of_parameters: uint64
  ? subscribe_parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunsubscribe">
          <name>MOQTUnsubscribe</name>
          <figure anchor="unsubscribe-def">
            <name>MOQTUnsubscribe definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnsubscribe = {
  type: "unsubscribe"
  request_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribedone">
          <name>MOQTSubscribeDone</name>
          <figure anchor="subscribedone-def">
            <name>MOQTSubscribeDone definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeDone = {
  type: "subscribe_done"
  request_id: uint64
  status_code: uint64
  stream_count: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublish">
          <name>MOQTPublish</name>
          <figure anchor="publish-def">
            <name>MOQTPublish definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublish = {
  type: "publish"
  request_id: uint64
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  track_alias: uint64
  group_order: uint8
  content_exists: uint8
  ? largest: MOQTLocation
  forward: uint8
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublishok">
          <name>MOQTPublishOk</name>
          <figure anchor="publishok-def">
            <name>MOQTPublishOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishOk = {
  type: "publish_ok"
  request_id: uint64
  forward: uint8
  subscriber_priority: uint8
  group_order: uint8
  filter_type: uint64
  ? start: MOQTLocation
  ? end_group: uint64
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublisherror">
          <name>MOQTPublishError</name>
          <figure anchor="publisherror-def">
            <name>MOQTPublishError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishError = {
  type: "publish_error"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetch">
          <name>MOQTFetch</name>
          <figure anchor="fetch-def">
            <name>MOQTFetch definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetch = {
  type: "fetch"
  request_id: uint64
  subscriber_priority: uint8
  group_order: uint8
  fetch_type: uint64

  track_namespace: [ *MOQTByteString]
  ? track_name: MOQTByteString
  ? start_location: MOQTLocation
  ? end_location: MOQTLocation

  ? joining_request_id: uint64
  ? preceding_group_offset: uint64

  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]

}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetchok">
          <name>MOQTFetchOk</name>
          <figure anchor="fetchok-def">
            <name>MOQTFetchOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetchOk = {
  type: "fetch_ok"
  request_id: uint64
  group_order: uint8
  end_of_track: uint8
  end_location: MOQTLocation
  number_of_parameters: uint64
  ? subscribe_parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetcherror">
          <name>MOQTFetchError</name>
          <figure anchor="fetcherror-def">
            <name>MOQTFetchError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetchError = {
  type: "fetch_error"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetchcancel">
          <name>MOQTFetchCancel</name>
          <figure anchor="fetchcancel-def">
            <name>MOQTFetchCancel definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetchCancel = {
  type: "fetch_cancel"
  request_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqttrackstatusrequest">
          <name>MOQTTrackStatusRequest</name>
          <figure anchor="trackstatusrequest-def">
            <name>MOQTTrackStatusRequest definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTTrackStatusRequest = {
  type: "track_status_request"
  request_id: uint64
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqttrackstatus">
          <name>MOQTTrackStatus</name>
          <figure anchor="trackstatus-def">
            <name>MOQTTrackStatus definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTTrackStatus = {
  type: "track_status"
  request_id: uint64
  status_code: uint64
  last_group_id: uint64
  last_object_id: uint64
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtannounce">
          <name>MOQTAnnounce</name>
          <figure anchor="announce-def">
            <name>MOQTAnnounce definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAnnounce = {
  type: "announce"
  request_id: uint64
  track_namespace: [ *MOQTByteString]
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtannounceok">
          <name>MOQTAnnounceOk</name>
          <figure anchor="announceok-def">
            <name>MOQTAnnounceOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAnnounceOk = {
  type: "announce_ok"
  request_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtannounceerror">
          <name>MOQTAnnounceError</name>
          <figure anchor="announceerror-def">
            <name>MOQTAnnounceError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAnnounceError = {
  type: "announce_error"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunannounce">
          <name>MOQTUnannounce</name>
          <figure anchor="unannounce-def">
            <name>MOQTAnnounce definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnannounce = {
  type: "unannounce"
  track_namespace: [ *MOQTByteString]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtannouncecancel">
          <name>MOQTAnnounceCancel</name>
          <figure anchor="announcecancel-def">
            <name>MOQTAnnounceCancel definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAnnounceCancel = {
  type: "announce_cancel"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeannounces">
          <name>MOQTSubscribeAnnounces</name>
          <figure anchor="subscribeannounces-def">
            <name>MOQTSubscribeAnnounces definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeAnnounces = {
  type: "subscribe_announces"
  request_id: uint64
  track_namespace_prefix: [ *MOQTByteString]
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeannouncesok">
          <name>MOQTSubscribeAnnouncesOk</name>
          <figure anchor="subscribeannouncesok">
            <name>MOQTSubscribeAnnouncesOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeAnnouncesOk = {
  type: "subscribe_announces_ok"
  request_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeannounceserror">
          <name>MOQTSubscribeAnnouncesError</name>
          <figure anchor="subscribeannounceserror-def">
            <name>MOQTSubscribeAnnouncesError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeAnnouncesError = {
  type: "subscribe_announces_error"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunsubscribeannounces">
          <name>MOQTUnsubscribeAnnounces</name>
          <figure anchor="unsubscribeannounces-def">
            <name>MOQTUnsubscribeAnnounces definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnsubscribeAnnounces = {
  type: "unsubscribe_announces"
  track_namespace_prefix: [ *MOQTByteString]
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="moqtextensionheader">
        <name>MOQTExtensionHeader</name>
        <figure anchor="extensionheader-def">
          <name>Extension Header definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTExtensionHeader = {
  header_type: uint64
  ? header_value: uint64
  ? header_length: uint64
  ? payload: RawInfo
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security and privacy considerations discussed in <xref target="QLOG-MAIN"/> apply to this
document as well.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers a new entry in the "qlog event schema URIs" registry (created in <xref section="15" sectionFormat="of" target="QLOG-MAIN"/>).</t>
      <dl>
        <dt>Event schema URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:moqt</t>
        </dd>
        <dt>Namespace</dt>
        <dd>
          <t>moqt</t>
        </dd>
        <dt>Event Types</dt>
        <dd>
          <t>control_message_created,
control_message_parsed,
stream_type_set,
object_datagram_created,
object_datagram_parsed,
object_datagram_status_created,
object_datagram_status_parsed,
subgroup_header_created,
subgroup_header_parsed,
subgroup_object_created,
subgroup_object_parsed,
fetch_header_created,
fetch_header_parsed,
fetch_object_created,
fetch_object_parsed</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions related to the MOQT protocol.</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This Document</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="QLOG-MAIN">
        <front>
          <title>qlog: Structured Logging for Network Protocols</title>
          <author fullname="Robin Marx" initials="R." surname="Marx">
            <organization>Akamai</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Meta</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
          <author fullname="Lucas Pardue" initials="L." surname="Pardue">
            <organization>Cloudflare</organization>
          </author>
          <date day="7" month="July" year="2025"/>
          <abstract>
            <t>   qlog provides extensible structured logging for network protocols,
   allowing for easy sharing of data that benefits common debug and
   analysis methods and tooling.  This document describes key concepts
   of qlog: formats, files, traces, events, and extension points.  This
   definition includes the high-level log file schemas, and generic
   event schemas.  Requirements and guidelines for creating protocol-
   specific event schemas are also presented.  All schemas are defined
   independent of serialization format, allowing logs to be represented
   in various ways such as JSON, CSV, or protobuf.

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-12"/>
      </reference>
      <reference anchor="QLOG-QUIC">
        <front>
          <title>QUIC event definitions for qlog</title>
          <author fullname="Robin Marx" initials="R." surname="Marx">
            <organization>Akamai</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Meta</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
          <author fullname="Lucas Pardue" initials="L." surname="Pardue">
            <organization>Cloudflare</organization>
          </author>
          <date day="7" month="July" year="2025"/>
          <abstract>
            <t>   This document describes a qlog event schema containing concrete qlog
   event definitions and their metadata for the core QUIC protocol and
   selected extensions.

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-11"/>
      </reference>
      <reference anchor="MOQT">
        <front>
          <title>Media over QUIC Transport</title>
          <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
            <organization>Cisco</organization>
          </author>
          <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
            <organization>Google</organization>
          </author>
          <author fullname="Ian Swett" initials="I." surname="Swett">
            <organization>Google</organization>
          </author>
          <author fullname="Alan Frindell" initials="A." surname="Frindell">
            <organization>Meta</organization>
          </author>
          <date day="7" month="July" year="2025"/>
          <abstract>
            <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-13"/>
      </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="CDDL">
        <front>
          <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
          <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
          <author fullname="C. Vigano" initials="C." surname="Vigano"/>
          <author fullname="C. Bormann" initials="C." surname="Bormann"/>
          <date month="June" year="2019"/>
          <abstract>
            <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8610"/>
        <seriesInfo name="DOI" value="10.17487/RFC8610"/>
      </reference>
    </references>
    <?line 1168?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Sujay Patel for contributions to this document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+09a3fbNpbf8SuwSs/ZNsdSJm13ptFMmnFsp/GcOHb9OHvm
9PTIFAVJrClSJcjYHjf9Lftb9pftvRcASYDgQ2nT6e5OPsQSeAHcF+4LADUe
j1ke5bGY8tFJ+i3/MU5XXLwTSc4XYhklUR6liRyxMMjFKs3upzxKliljizRM
gg30WmTBMh9vg2xRiPEm/XGMI9AHGkWO//A5k8V8E0kJI+X3W+hzfHT5ivNH
PIhlCvNGyUJsBfyX5KM9PhKLKE+zKIjxy/H+S/iTZvDp/PLViCXFZi6yKVsA
PlMWAm4ikYWc8jwrBHs35V+wIBMBjDpit2l2s8rSYou0wagBP30nMv7t1fHB
iN2Ie3i+mDI+5uuIL6OFiKP8ngHSBYzMeWtPzhUVI/y4CaIYPgK9f41Evpyk
2QqbgyxcQ/M6z7dy+uQJQmFT9E5MDNgTbHgyz9JbKZ5A/yfYbxXl62IOPd+c
EUef9LEXO8XAC5nXptOdJ2q0SZT2DtMLMFnnm3jEWFDk6zRDrsHEnC+LOFZ6
8KYIA8nVxPQISAyS6B8BKtCUH8RpsVgCE9RDofgWY6e/0v9q6kmYbppjnwT5
OpL8KFmJeB5kuWf8SxGukygMYn6VAJczCbLk6ZKfFNC6rs+5ocEmwgz21xW2
08QsSTN4DP2nDLp8++b0m/HJ/vHbKfU/Hh+S8MY/FlGo+RNEyViGaxi67IBK
0tqBPimOMoYrqZqPjcdjHsxlngVhztglUgyrrNiUa1FIHtQXqJqYwyLIAY8o
WeHHMBO5UACSw/gcVvVEj76JFotYMPaIHyd5li6KEJm3w1SfPjxcCOrEv0Lu
lhx6//4z1ocHraPUrCN+mQWJ3KZZzh8e/u3k9NvL5yW/UO1y8/j9+wlyQ4/F
USNAWULBb0G7eYRWI1pGMOo1dMuvOdJCJCz+zKUQMLpCfgytMBaQzkibqoE2
RZxH27jEdiEyEAlfZumG5zAx8cFIhh8RGmEcSMlq/PiTy489LoJwzcVdDqYN
mYJDjcBuBSOwNiJe8CBZaCObrAAnEYGVQ6zM83dBXKAgAEwCAUBnKIEXDw/a
subBPBbv33NZbDZBFv0DYHEOHEL1RZQUEoQzmi2ACPIaj8CcK3bIrQiBjyGt
pwm/SDeG44iywkjyQgoQ7gaYdafacUw54SAfeIKrOxPbDD4nOYwNBgGs6Uai
/c7EuJCIcN2v7PHbNSxP7KjsLXTK05UAMjIOTIW/bJ7mOQgCSMktPUWdAilk
sNCBKT/xtxXZrf9+4scb1KkgAbH/xPlhiQr/if00HQ/4Z0HZXWAIjjo4xZWQ
pfEMFEwGKzGDtRAgP0osDtJMlF8eHjS8BtfQINjWAcFYymq8vgEVdH08UGUR
bGYovJkUeZNNzngKnmQt8vpA6fwH0P8ZqsIqgxH7KFXwBtxDqTtgH6X2gE1K
3fFkHuSFLPHsGU9BD0BTD2uwHTSsRyzFnFbBbC0CMEK93DTwCtyDpjtgHzft
ATsQ1PQPRVCBdyGoBxyKoAJvIrgUebhuYZ9vPIJvZZ81moNaz2htqPkZ1zpY
K+Os0Yai1uDaw5Q/qjsTTqnA8xG6Y+Xo5Og9Y/+5Fgm4oXvtELRjrBtj+Bwl
YVwsyKOY2AEdptgjKz7aZmmehmDDyIqMtFPNsuBee7uTq4tLE8vAZOA58uxe
OXn0asqyE2YjiJZ+/vlnHkI0wz450wNfond78lyDIACRZ+bFacfkjDEPwRAj
N9RaI5QgKmjBsYADjx7xKzSlCh+MX2oxCTpTMBLRXBFvcyYEUuYCHedCdYZR
8W9a5BxYsNKRAfjNmDSCYqNyWOOjQYJlcElBzLI2Yq0LMVvhV2KQBzcQGYBX
DgUES+D4EEeRoVteglsGd77B5GsBcogFRUUUcpDwIPAAdaGYgIHpL7YYgNQn
RzKs+SNShvqwFHEgWhHGDYgSjQfRgYxW8Iet4nQexPE9h1j9RxByLabLUxXA
kEJKQTkkRhswxfEh8TZH3TQMDigCYmXwU0ZvI2VlooWOrfYQ9FbEse6ioAwD
UEb4mVWY7PFtmuMXQlQWy2V0BxPO77VyAlHgaNPIhFmfvoIxxF2AJO+xYB4u
nn7+xZfgbDMIgCc0221agNobjcdh1NOxhGk1+zUNAJToOBOZzr65AurNoJ9N
MKI/SBOUAEZVJL4qtJFKVSHh5ZjxSlghsNQwuaYl9/aUPp8fgRjPjw7x88Xr
/Tdvyg9MQ1y8Pr16c1h9qnoenJ6cHL09VJ2hlVtNbHSy/3d4gliNTs8uj0/f
7r8ZNVcKBoEg7zkqKOjnFhMIFCmzVtfLg7P//q+nX2LScP7q4POnT5+BJVNf
vnr6py/hyy1ohJotTUBW6itw8Z4F260IMjJQIPkw2EZ5EEvSBblObxMOYacA
bj7+Djnz/ZT/ZR5un375tW5Agq1GwzOrkXjWbGl0Vkz0NHmmKblptTuctvHd
/7v13fC91viXFzFYFz5++tWLr1k9xaK8BIN7CPsgRSwyK2ZXgnPkJu4w6ocl
yLQqgzqGEaQEhzhOLcx+EySrAg0piOzg8PDNc5TbH5/+AeSG00aQF5cW2LGr
2gSq9ErnhMs0jtNbtKE6QSHfZEESfhGF/ULlXGgqppQm7VVZ4B7DdbtHhO9x
Yy5g2Vt+a4+fB7fHkLcrBcujjRhry80UBoCYcpw0r7HgZKfBWkVV+hEDs8n8
OESWCfbkC1j+zKZ5X6J1JZMQSEEuyiJ2rzJmOmVvSK625BixJsmV3SDLFqyS
VEKiiSsRzBGYO11i4apWoXI9DrFEpMyTakasgoQ5Fn4BKSVZbDRQKm++UFjV
NOLhUS0/b9Y9FG8kh/VJtJEnMELBaUvVQ/KUYdXMJm1mavQJP0N3AgNk4sci
yghL6XDcSeH3HG5lYhVJsExKALrcUCqQYoxVLrk6PwYM2XWRJVMsbEzRl27k
FLGcKoc5pVEmFGEcYg3O5tOxdkAqLYeABhBP34koyZbh8xHWPDE6OUU7Z/Ne
GtcBfA5iUONiHkdyDVyCBUeOE1P5vAph5iJOExWNpCx3KSnDMCRpAD38CtCO
wU9icp8wnFPcAfMwQHDwNJbVuH3yqBsp4ncC6w0qPgIxwMwYezSppNIlp5pf
jW4LfZoDrT+uWXS0eYY1l9F4pJYxudgM1GibqlqNGlMVm3EpaNInvO7WNdSz
Z6Y4wax42MQOi5KKgewbP3t2re1bVaSqBUVgJEW8xDmSFMzvcgn6a2IRir1K
BaeFVwvmGaMvWuSqNKWUuQyjCRCt9nUtFFaBTa1kZNtivr9YRMaEKF+LHhZW
LBqoBSAT5ma0eYRldh04RRmpIZi5LcQ9SmTOrJK/iwKN4yfXHH2Gjua4TMMb
kY+4vAd1uCM3jjsKrNNrlIkDcqIklj8nNh2ousmJqpsc6CTtCePOvybsmUrB
/KAXVD7B9OJC5C0wp5SbHeoKQffUNmzn1DboBRUedhlc9eimTufkrynx7R7c
hh00rMJn2LAKtnPYV5gID0G1Btg/4BAka4BqQMaaqw4zWEszy0SWLINO1mEl
1lP1qnfl7cmwNYavgiv0G3VjgKEA5qMYrFC6z0ORUWYSok2kIddkQgFW5XPw
LTaeKQ7uMUnS1hTDCpn8Oxin+Da4x72ENKHgHv9soB/aw7nIbwXM9Pry8ow6
1vLIiQpH78I1xIsUZ1BAarrg7HY3mh9NoqZBGw020qVO7D5D17lQJn9Ulu7q
TzQvGvm2MsblrkbFN1X/JuYti4zK1sZKokO93dNWjnLCyoQzHcRhrQhZgWYe
JqGiOw2uK7dlVQU4CGRINIrrLJC6jI9uHEKhd5gvBqUJrvaVAFyH4zpKAz4C
E+9zTDUh04YwFOK51+kt0JIRqrL2hKgCD8MgYM8gwRVUnMf8TFf4qWIERvfq
8tX4K9xYgbx5ofxlEEL+n+ImLeTGWZQWuBMQpkis3GO3pCGI121EwXmgZBwY
ug3Z0qV7r4oBq90pHbmXffJbULStClopJp/yazXKNf8UPRIh/BnpgX4wQ6ZI
eBywtbgbE65ArooTeLmnQV+CW2Kh/GzC3WhEJ3BU2sohwg9kzlDlFfv3+LzI
OWRmBDBPVTEoAQAV/7VtGzw88m8QKK28bul2rTUUQ+RNlOe1ha06VMyWXPeZ
sOMcVrlU1UM3WdHLoGZjQGbuYPi9rAjCMkKzZaPfdMN+t/ucP5Ad1Ss4gpyt
gIDgj19S6wvAKVnla6tRzzDlnzSH1b1AfFOTxDFqe8w/+YSMq5fLVc2Qvbdt
sR/cMc1+0ioW6uJiywaPK3ldum0RvHq6k9xVl9+F2LWT/SdLXTHEK3QvYKe4
NUkNabvbb5ACWxtsWr4OmBFsiJU+cKpaqqo0SqDKzcyx9gpm8CZJbxOwUTlD
0b5Er+ERrSURO1A1onjBYSCRTfkp/umQTg1hLYxqQIfrFsEWu5nTESMiPtLM
H3liK/w3cna6WuHqWzrVJoGNjSNTmykNYbZtgT488m92auG2dGtbvej2Tl/+
7ejgcna4f7n/zfn+idF7VrPfvGchW9L2pxxG6liAvpkFcRRIS8imNGY1amqc
VlN0yGZbiAFwp149/kqdxzFC1+KQM8/aftEEm/LvHqsY2TxRUfr3RlnNpth9
nAaLtmXvFY533fshHSXx87JXWUo7793HblGVbjvfoyna4v8CRXEM9f8rPelw
D17ATi1pcw89ZxZcZbEPKbTojD1Gh+4wR3dmF5f7l1cXvmCxU4fo8BWriqvP
Jp875dVuLbNLFf/LlU1jooRQDtWlaJZQB+ibDd+pdjZnh2pfi6WyjrJ0616v
2RqgekOs16+jef83rNyHKt5gO2eBD1C71pC45egThMbeQ04mRPZ3a8+BdKA8
F6tIb5QH7OLq5Tfnp1dns9dH+4dH57uZOO4qGutQNH+ptDvl2UnzXlSMHKx9
TmDuY7dXEfyQbvDspbhX/KW18Z5IaxF+f1zUlDT7kHjIW8X+HUuxYzV7ATtl
2LuCnSNulQztw2yuEO1uHStYd9C2DWX4QdmPf3+hr/ywo7z8nuCj2nodz/qH
9PuDXeJhrzA7VcuGbNEtWwq9ytWwD9bRxhbV6quPNTVraH2sQ7EGlrX+pVce
QQ5Qq26LZYmgoVTew8IPjzxngrVC+TrsFmq8Oro8eL1rnOEqmGcLs1u98ESA
kJa62MxvkuxlvQfMYbwHtW62lwu5eXbax/TfzMU3d39/PRZ3KHcDqovDZ+bY
dwuLG47Yc6TcYvJQF0zQNStZ02K2G4d3cb5eQ7ibgfwnpmAf2Xw2RduuX50O
2SOWbvWyV7DPD3vAh+uWvXjZrqo1aPH+S7OGaVaf4epyyU2ZOGqlNrLoFAtt
+zQOsFdnfcubh9bp1vpNiyipHdKQantd7V5VmkLfQTNGcRoG1s7SCE9Z5qLa
H6L9rzpFqm9jYVDsgdckzvBkn8hxPkR9JQA8CvWemAVQv4tJxyLwFJs+5kYk
6lNu1ckddS6OVoQmWR3kU8czZLGlS7XVeRDFCZqVl9PK+pr5Mx1d9eOG135u
xP1Y3anYBFv+qZisJnv8bxenb7UKfcZ8hD0xi+4xzwFD/vxrHMzZRadLJVvT
pxHH2SPW+OHw3lr+uNVp95TmWNVZkK9dNL0bheYfdjoJ7s6Vez9e7Nz5KqF9
WFcrWhjWgr7Fsjk8t9nWOBDm44CrrI9aGOIw08MxJVd1NX+0hef4EgLSjylJ
2hExQnSL2TOHH9t2SThYd4jMwn4T3M2q0K1GhzaUNiUADV5BHS6NFt00dWDg
p61FUSyyvDB1ikaFghjpBnWuqWb3PQcoXjg0ly2ms/ELNjP0TN1c8CPstZtd
JnNna1m5UvZB1rLPTn6oidzROnasmA+wiU1zuE9v89A3PC7TG5H0mzbsdyhi
fMnG/WW0EWmRD+sEK+IgCNfisFAXCof10hrkmk6v1ewwmN22stdMdjDKYXQX
Sy3TE9QBZzlC0ptjsESsj9DUFiQ9b9SPTXsLuF7X/vUbNBBt1bYumvz8alMQ
h1mtemRxaqGhZrkC6zPTBl6Dt5LVOnur8/Hrb9P3tOh5w/WECDdbaMAB7oc6
GPgu39OCQafr6fE6vxOH0+dretzMS5jiQl3/YcaaV23KnNLdFWkf+yW3QPgR
oNzTl5tkdTud0RHmS9zpwYO96sPb8gYPuMBYmOvH+krQbcoX0XIJngxvvpgT
0nSVjF3ToNf6enw9u8EzzDVUqsPg6N300WXIgPS57Gosc8q5f0SkBLyaOk94
X11gYtdrcaeArkt8Pdey9EHobbot8HIknfvHl9FEdESebvNo6mBiCzl1jXLC
z1RXuiiAJ6X1/U6637QokkVAt5tsH1eJUWnoCysqbahZSUpN0exxGr6imsGr
XG9SfR2C7XPzeU/d8azd5Df7xU8nX0ye0kuqoOt712Ob/poW/TqycsmosKLF
UsS6r4t/OWaFPUxrsHdOzlph2LXnbO317tGYzl3ZbtGYe9hYvXSI+FWLyWzk
dgzMnM690ZlGaaxR6j4H3BGkGeT9NNb1pnlZPpC6JiKnnmjPRkGaG25xBN0p
Hi9p7chhVZaKbyXYqcs3aXAb3PeC1XOkXmANKV/GyMd++AuTqQ2HPL0ZDnuU
ZWl3/m+BX23pMkwf/FUid0f7EK1rH/SZKlAOhRvACg05jBFU/hsGNWBqgtth
4gOsFce9sOSx1TklrW27dOmF3U+StMCi9VDAAZwwoMOYcZUEu+IwkHWlMpp+
/exodtll/ZWdhlIuGz1Zm+lvMaGNpNK+EeJLLF0jbBv/MgBvWmX3qkzTbCsP
pV9FGtLzGRVjKBSnm+uzdDnTPlUsZuaGfC2I8D387rF+/r01TpVAW3E7zWg9
hP6e4ub3dd9JyFLPht9s0ulPWZpOyT2F0fRaFsfUu3YqjkkR0zV6w4kalR+F
CWp+LxM8qPuZoNysQ7j2vRaxK2ob+dOxRNzO9KuVZkUW+dIv1d/FU8/UX6rt
KM7aeDbLsZ599Vqoa9VjuyqwLUg6MYWDpxtxWKhqxORsrp6qlwHfRZtiM+tE
usRY6p4u3u60LQvADNM8faTjB1vdTXMLU80JxfKFE6DD/LGd83xvQU3ddJq2
TNUkvl1QfRQLbwhXjZB33gbZotYQxbBQmgUtmQdZPjN5zdTOtmjvNFnM3Byp
f+EahL2L179uTRfPmSPN+B6Bnd60iQz8n19os/SmR25uZVDcbaPMKsR4+a+v
bc7Uy1mqdjATQbbCuVpZ/lGZm960sheY1MNgigjaeKzChRY2C3zYyml6OsPy
ikWnukFeKzLUr5TXqwx+WXmop4laGaAo6OGByjfamKCzkRYuFPS0lQ09S9G3
EDsNQ8MGfFTNUsS1Mldzpq1OKlusbj1vs7haJH2Wt8KxBtusbcqh5gWzwTa5
U6bYIvUFPOuSOV0fs3Vfn6YJIZzOP2xJeASEeLSKhwho2clW6ai7fa3TXoto
fVjnY7pCv1X+MBvcWGK7r5jB60SzprHfqNnYyfqGY6tqCT72dzm1BoUfEFp0
RRK/VgCxK1+bfq3iUSdvfT7NKsB4Ofxx/VmDOq/fsrD000g1Gt8ZPpsqOmPW
bqJ21xA6l2gpyODF/6J7+Q8MWFse0/MfUvphAF8yQZpH7/NFAE3bcgnJZJ2Q
X6q87uk+74m+Lok27IEp7zWl2mULvLJD7gFlJAS79TcNWNWxx8aiNoR2MMe3
oGtlTQ+LfqvFTLN5l3INvw7KVMXQR5quJXpoC+lJb4REwArWi5uewI9cs7rr
4Ogp/1qoqhWvQyGN58eMIX4970PTKMQ1si77PLT3crGdfe182zHCjAOA8xzD
pnbfSeyPwrMOZrWdF9I1ZvdwkKm+W/wxNflfqEu/HukGocY5IIN+N9ENu1/b
z/AS3m79mzg1jW1t9G68fCbX3j/xY/dbGV4zodf22oi25aeBX+9q+z5OdlrX
vSFqVs9Wf6GaeP2Es+3kF0int/gYEvG7HAfXnry8tu3kT86rnbOWDN1g025E
HQlCIAw43X10e1GiWGLYmsBXRA5lV3u5tL5v2MeyISamSUZ6w3k/Kf0VSXuz
speezhplRdJvZZeafOkuUDp09NbS2laGD6S1umavjh0Wgrf+1qrIXpy8Z8Gc
K1vum6ftp5osfcu1UbPQ7c1jk/qB54hl41ZXRWd5Gkv1rpNYosU1Xu4lrQsR
Fpha4w884O+UqAOm+oaWNA/xsjMk4e+C8B7LWzVAvohkWJjX9Ts/1LDdxvfq
bev1d6nrX2qhd5kf77/d90xdPxlVvaU/wK1N/TtC+j24o+ZvGl6dH8uR7gWA
n5rrsvZRvf9wf97P/M5DbZgpAwn0vNudsfJAKECrFjUOXnqT0NbyOtc9XSls
vvBzj3H3jZLY1PKCQd+japzu14Z1QNRQ8b+Sx/fI08m+gux7VHXyXcdvtLvg
zQk811MZO6R3yNNLhFGsR+4v4nLze036xwFwTZc/SwG6cS7oUC9EUdCbFPTQ
/IwE/RTnHOwTKvR+iIeWY7FY0Q9SwPpUblksno+WQSyFOiQYJDcSp7oofgju
+RnMHKsfQESNiOaFwkkvnXItTNj/AHnk3fjfdwAA

-->

</rfc>
