<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.3.14 -->
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<?rfc toc="yes"?>
<?rfc docindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-marx-qlog-event-definitions-quic-h3-02" category="std" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.3.0 -->
  <front>
    <title>QUIC and HTTP/3 event definitions for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-marx-qlog-event-definitions-quic-h3-02"/>
    <author initials="R." surname="Marx" fullname="Robin Marx">
      <organization>Hasselt University</organization>
      <address>
        <email>robin.marx@uhasselt.be</email>
      </address>
    </author>
    <date year="2020" month="November" day="02"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes concrete qlog event definitions and their metadata for
QUIC and HTTP/3-related events. These events can then be embedded in the higher
level schema defined in <xref target="QLOG-MAIN" format="default"/>.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>This document describes the values of the qlog name ("category" + "event") and
"data" fields and their semantics for the QUIC and HTTP/3 protocols. This document
is based on draft-29 of the QUIC and HTTP/3 I-Ds <xref target="QUIC-HTTP" format="default">QUIC-TRANSPORT</xref> and
draft-16 of the QPACK I-D <xref target="QUIC-QPACK" format="default"/>.</t>
      <t>Feedback and discussion welcome at
<eref target="https://github.com/quiclog/internet-drafts">https://github.com/quiclog/internet-drafts</eref>.
Readers are advised to refer to the "editor's draft" at that URL for an
up-to-date version of this document.</t>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
      <section anchor="notational-conventions" numbered="true" toc="default">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in <xref target="RFC2119" format="default"/>.</t>
        <t>The examples and data definitions in ths document are expressed in a custom data
definition language, inspired by JSON and TypeScript, and described in
<xref target="QLOG-MAIN" format="default"/>.</t>
      </section>
    </section>
    <section anchor="overview" numbered="true" toc="default">
      <name>Overview</name>
      <t>This document describes the values of the qlog "name" ("category" + "event") and
"data" fields and their semantics for the QUIC and HTTP/3 protocols.</t>
      <t>This document assumes the usage of the encompassing main qlog schema defined in
<xref target="QLOG-MAIN" format="default"/>. Each subsection below defines a separate category (for example
connectivity, transport, http) and each subsubsection is an event type (for
example <tt>packet_received</tt>).</t>
      <t>For each event type, its importance and data definition is laid out, often
accompanied by possible values for the optional "trigger" field. For the
definition and semantics of "trigger", see the main schema document.</t>
      <t>Most of the complex datastructures, enums and re-usable definitions are grouped
together on the bottom of this document for clarity.</t>
      <section anchor="importance" numbered="true" toc="default">
        <name>Importance</name>
        <t>Many of the events defined in this document map directly to concepts seen in the
QUIC and HTTP/3 documents, while others act as aggregating events that combine
data from several possible protocol behaviours or code paths into one. This is
done to reduce the amount of unique event definitions, as reflecting each possible
protocol event as a separate qlog entity would cause an explosion of event types.
Similarly, we prevent logging duplicate packet data as much as possible. As such,
especially packet header value updates are split out into separate events (for
example spin_bit_updated, connection_id_updated), as they are expected to change
sparingly.</t>
        <t>Consequently, many events that can be directly inferred from data on the wire (for
example flow control limit changes) if the implementation is bug-free, are
currently not explicitly defined as stand-alone events. Exceptions can be made for
common events that benefit from being easily identifiable or individually logged
(for example the <tt>packets_acked</tt> event). This can in turn give rise to separate
events logging similar data, where it is not always clear which event should be
logged (for example the separate <tt>connection_started</tt> event, whereas the more
general <tt>connection_state_updated</tt> event also allows indicating that a connection
was started).</t>
        <t>To aid in this decision making, each event has an "importance indicator" with one
of three values, in decreasing order of importance and exptected usage:</t>
        <ul spacing="normal">
          <li>Core</li>
          <li>Base</li>
          <li>Extra</li>
        </ul>
        <t>The "Core" events are the events that SHOULD be present in all qlog files. These
are mostly tied to basic packet and frame parsing and creation, as well as listing
basic internal metrics. Tool implementers SHOULD expect and add support for these
events, though SHOULD NOT expect all Core events to be present in each qlog trace.</t>
        <t>The "Base" events add additional debugging options and CAN be present in qlog
files. Most of these can be implicitly inferred from data in Core events (if those
contain all their properties), but for many it is better to log the events
explicitly as well, making it clearer how the implementation behaves. These events
are for example tied to passing data around in buffers, to how internal state
machines change and help show when decisions are actually made based on received
data. Tool implementers SHOULD at least add support for showing the contents of
these events, if they do not handle them explicitly.</t>
        <t>The "Extra" events are considered mostly useful for low-level debugging of the
implementation, rather than the protocol. They allow more fine-grained tracking of
internal behaviour. As such, they CAN be present in qlog files and tool
implementers CAN add support for these, but they are not required to.</t>
        <t>Note that in some cases, implementers might not want to log for example
frame-level details in the "Core" events due to performance or privacy
considerations. In this case, they SHOULD use (a subset of) relevant "Base" events
instead to ensure usability of the qlog output. As an example, implementations
that do not log "packet_received" events and thus also not which (if any) ACK
frames the packet contain, SHOULD log <tt>packets_acked</tt> events instead.</t>
        <t>Finally, for event types who's data (partially) overlap with other event types'
definitions, where necessary this document includes guidance on which to use in
specific situations.</t>
      </section>
      <section anchor="custom-fields" numbered="true" toc="default">
        <name>Custom fields</name>
        <t>Note that implementers are free to define new category and event types, as well as
values for the "trigger" property within the "data" field, or other member fields
of the "data" field, as they see fit. They SHOULD NOT however expect
non-specialized tools to recognize or visualize this custom data. However, tools
SHOULD make an effort to visualize even unknown data if possible in the specific
tool's context.</t>
      </section>
    </section>
    <section anchor="handling-unknown-connections" numbered="true" toc="default">
      <name>Events not belonging to a single connection</name>
      <t>For several types of events, it is sometimes impossible to tie them to a specific
conceptual QUIC connection (e.g., a packet_dropped event triggered because the
packet has an unknown connection_id in the header). Since qlog events in a trace
are typically associated with a single connection, it is unclear how to log these
events.</t>
      <t>Ideally, implementers SHOULD create a separate, individual "endpoint-level" trace
file (or group_id value), not associated with a specific connection (for example a
"server.qlog" or group_id = "client"), and log all events that do not belong to a
single connection to this grouping trace. However, this is not always practical,
depending on the implementation. Because the semantics of most of these events are
well-defined in the protocols and because they are difficult to mis-interpret as
belonging to a connection, implementers MAY choose to log events not belonging to
a particular connection in any other trace, even those strongly associated with a
single connection.</t>
      <t>Note that this can make it difficult to match logs from different vantage points
with each other. For example, from the client side, it is easy to log connections
with version negotiation or retry in the same trace, while on the server they
would most likely be logged in separate traces. Servers can take extra efforts
(and keep additional state) to keep these events combined in a single trace
however (for example by also matching connections on their four-tuple instead of
just the connection ID).</t>
    </section>
    <section anchor="quic-and-http3-fields" numbered="true" toc="default">
      <name>QUIC and HTTP/3 fields</name>
      <t>This document re-uses all the fields defined in the main qlog schema (e.g., name,
category, type, data, group_id, protocol_type, the time-related fields, etc.).</t>
      <t>The value of the "protocol_type" qlog field MUST be "QUIC_HTTP3".</t>
      <t>When the qlog "group_id" field is used, it is recommended to use QUIC's Original
Destination Connection ID (ODCID, the CID chosen by the client when first
contacting the server), as this is the only value that does not change over the
course of the connection and can be used to link more advanced QUIC packets (e.g.,
Retry, Version Negotiation) to a given connection. Similarly, the ODCID should be
used 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 ODCID abcd1234).</t>
      <section anchor="raw-packet-and-frame-information" numbered="true" toc="default">
        <name>Raw packet and frame information</name>
        <t>While qlog is a more high-level logging format, it also allows the inclusion of
most raw wire image information, such as byte lengths and even raw byte values.
This can be useful when for example investigating or tuning packetization
behaviour or determining encoding/framing overheads. However, these fields are not
always necessary and can take up considerable space if logged for each packet or
frame. As such, they are grouped in a separate optional field called "raw" of type
RawInfo (where applicable).</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
class RawInfo {
    length?:uint64; // full packet/frame length, including header and AEAD authentication tag lengths (where applicable)
    payload_length?:uint64; // length of the packet/frame payload, excluding AEAD tag. For many control frames, this will have a value of zero

    data?:bytes; // full packet/frame contents, including header and AEAD authentication tag (where applicable)
}
]]></artwork>
        <dl newline="false" spacing="normal">
          <dt>Note:</dt>
          <dd>
  QUIC packets always include an AEAD authentication tag at the end. As this
tag is always the same size for a given connection (it depends on the used TLS
cipher), we do not have a separate "aead_tag_length" field here. Instead, this
field is reflected in "transport:parameters_set" and can be logged only once.</dd>
          <dt>Note:</dt>
          <dd>
  There is intentionally no explicit header_length field in RawInfo. QUIC and
HTTP/3 use many Variable-Length Integer Encoded (VLIE) values in their packet and
frame headers, which are of a dynamic length. Note too that because of this, we
cannot deterministally reconstruct the header encoding/length from qlog data, as
implementations might not necessarily employ the most efficient VLIE scheme for
all values. As such, it is typically easier to log just the total packet/frame
length and the payload length. The header length can be calculated by tools as:</dd>
          <dt/>
          <dd>For QUIC packets: header_length = length - payload_length - aead_tag_length</dd>
          <dt/>
          <dd>For QUIC and HTTP/3 frames: header_length = length - payload_length</dd>
          <dt/>
          <dd>For UDP datagrams: header_length = length - payload_length</dd>
          <dt>Note:</dt>
          <dd>
  In some cases, the length fields are also explicitly reflected inside of
frame/packet headers. For example, the QUIC STREAM frame has a "length" field
indicating its payload size. Similarly, all HTTP/3 frames include their explicit
payload lengths in the frame header. Finally, the QUIC Long Header has a "length"
field which is equal to the payload length plus the packet number length. In these
cases, those fields are intentionally preserved in the event definitions. Even
though this can lead to duplicate data when the full RawInfo is logged, it allows
a more direct mapping of the QUIC and HTTP/3 specifications to qlog, making it
easier for users to interpret.</dd>
          <dt>Note:</dt>
          <dd>
  as described in <xref target="QLOG-MAIN" format="default"/>, the RawInfo:data field can be truncated for privacy
or security purposes (for example excluding payload data). In this case, the
length properties should still indicate the non-truncated lengths.</dd>
        </dl>
      </section>
    </section>
    <section anchor="quic-event-definitions" numbered="true" toc="default">
      <name>QUIC event definitions</name>
      <t>Each subheading in this section is a qlog event category, while each
sub-subheading is a qlog event type. Concretely, for the following two items, we
have the category "connectivity" and event type "server_listening", resulting in a
concatenated qlog "name" field value of "connectivity:server_listening".</t>
      <section anchor="connectivity" numbered="true" toc="default">
        <name>connectivity</name>
        <section anchor="serverlistening" numbered="true" toc="default">
          <name>server_listening</name>
          <t>Importance: Extra</t>
          <t>Emitted when the server starts accepting connections.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    ip_v4?: IPAddress,
    ip_v6?: IPAddress,
    port_v4?: uint32,
    port_v6?: uint32,

    retry_required?:boolean // the server will always answer client initials with a retry (no 1-RTT connection setups by choice)
}
]]></artwork>
          <t>Note: some QUIC stacks do not handle sockets directly and are thus unable to log
IP and/or port information.</t>
        </section>
        <section anchor="connectionstarted" numbered="true" toc="default">
          <name>connection_started</name>
          <t>Importance: Base</t>
          <t>Used for both attempting (client-perspective) and accepting (server-perspective)
new connections. Note that this event has overlap with connection_state_updated
and this is a separate event mainly because of all the additional data that should
be logged.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    ip_version?: "v4" | "v6",
    src_ip?: IPAddress,
    dst_ip?: IPAddress,

    protocol?: string, // transport layer protocol (default "QUIC")
    src_port?: uint32,
    dst_port?: uint32,

    src_cid?: bytes,
    dst_cid?: bytes,

}
]]></artwork>
          <t>Note: some QUIC stacks do not handle sockets directly and are thus unable to log
IP and/or port information.</t>
        </section>
        <section anchor="connectionclosed" numbered="true" toc="default">
          <name>connection_closed</name>
          <t>Importance: Base</t>
          <t>Used for logging when a connection was closed, typically when an error or timeout
occurred. Note that this event has overlap with
connectivity:connection_state_updated, as well as the CONNECTION_CLOSE frame.
However, in practice, when analyzing large deployments, it can be useful to have a
single event representing a connection_closed event, which also includes an
additional reason field to provide additional information. Additionally, it is
useful to log closures due to timeouts, which are difficult to reflect using the
other options.</t>
          <t>In QUIC there are two main connection-closing error categories: connection and
application errors. They have well-defined error codes and semantics. Next to
these however, there can be internal errors that occur that may or may not get
mapped to the official error codes in implementation-specific ways. As such,
multiple error codes can be set on the same event to reflect this.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    owner?:"local"|"remote", // which side closed the connection

    connection_code?:TransportError | CryptoError | uint32,
    application_code?:ApplicationError | uint32,
    internal_code?:uint32,

    reason?:string
}
]]></artwork>
          <t>Triggers:
* clean
* handshake_timeout
* idle_timeout
* error // this is called the "immediate close" in the QUIC specification
* stateless_reset
* version_mismatch
* application // for example HTTP/3's GOAWAY frame</t>
        </section>
        <section anchor="connectionidupdated" numbered="true" toc="default">
          <name>connection_id_updated</name>
          <t>Importance: Base</t>
          <t>This event is emitted when either party updates their current Connection ID. As
this typically happens only sparingly over the course of a connection, this event
allows loggers to be more efficient than logging the observed CID with each packet
in the .header field of the "packet_sent" or "packet_received" events.</t>
          <t>This is viewed from the perspective of the one applying the new id. As such, if we
receive a new connection id from our peer, we will see the dst_ fields are set. If
we update our own connection id (e.g., NEW_CONNECTION_ID frame), we log the src_
fields.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    owner: "local" | "remote",

    old?:bytes,
    new?:bytes,
}
]]></artwork>
        </section>
        <section anchor="spinbitupdated" numbered="true" toc="default">
          <name>spin_bit_updated</name>
          <t>Importance: Base</t>
          <t>To be emitted when the spin bit changes value. It SHOULD NOT be emitted if the
spin bit is set without changing its value.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    state: boolean
}
]]></artwork>
        </section>
        <section anchor="connectionretried" numbered="true" toc="default">
          <name>connection_retried</name>
          <t>TODO</t>
        </section>
        <section anchor="connectionstateupdated" numbered="true" toc="default">
          <name>connection_state_updated</name>
          <t>Importance: Base</t>
          <t>This event is used to track progress through QUIC's complex handshake and
connection close procedures. It is intended to provide exhaustive options to log
each state individually, but also provides a more basic, simpler set for
implementations less interested in tracking each smaller state transition. As
such, users should not expect to see -all- these states reflected in all qlogs and
implementers should focus on support for the SimpleConnectionState set.</t>
          <t>Data:
~~~
{
    old?: ConnectionState | SimpleConnectionState,
    new: ConnectionState | SimpleConnectionState
}</t>
          <t>enum ConnectionState {
    attempted, // initial sent/received
    peer_validated, // peer address validated by: client sent Handshake packet OR client used CONNID chosen by the server. transport-draft-32, section-8.1
    handshake_started,
    early_write, // 1 RTT can be sent, but handshake isn't done yet
    handshake_complete, // TLS handshake complete: Finished received and sent. tls-draft-32, section-4.1.1
    handshake_confirmed, // HANDSHAKE_DONE sent/received (connection is now "active", 1RTT can be sent). tls-draft-32, section-4.1.2
    closing,
    draining, // connection_close sent/received
    closed // draining period done, connection state discarded
}</t>
          <t>enum SimpleConnectionState {
    attempted,
    handshake_started,
    handshake_confirmed,
    closed
}
~~~</t>
          <t>These states correspond to the following transitions for both client and server:</t>
          <t><strong>Client:</strong></t>
          <ul spacing="normal">
            <li>
              <t>send initial
              </t>
              <ul spacing="normal">
                <li>state = attempted</li>
              </ul>
            </li>
            <li>
              <t>get initial
              </t>
              <ul spacing="normal">
                <li>state = validated <em>(not really "needed" at the client, but somewhat useful to indicate progress nonetheless)</em></li>
              </ul>
            </li>
            <li>
              <t>get first Handshake packet
              </t>
              <ul spacing="normal">
                <li>state = handshake_started</li>
              </ul>
            </li>
            <li>
              <t>get Handshake packet containing ServerFinished
              </t>
              <ul spacing="normal">
                <li>state = handshake_complete</li>
              </ul>
            </li>
            <li>
              <t>send ClientFinished
              </t>
              <ul spacing="normal">
                <li>state = early_write
  (1RTT can now be sent)</li>
              </ul>
            </li>
            <li>
              <t>get HANDSHAKE_DONE
              </t>
              <ul spacing="normal">
                <li>state = handshake_confirmed</li>
              </ul>
            </li>
          </ul>
          <t><strong>Server:</strong></t>
          <ul spacing="normal">
            <li>
              <t>get initial
              </t>
              <ul spacing="normal">
                <li>state = attempted</li>
              </ul>
            </li>
            <li>send initial <em>(don't think this needs a separate state, since some handshake will always be sent in the same flight as this?)</em></li>
            <li>
              <t>send handshake EE, CERT, CV, ...
              </t>
              <ul spacing="normal">
                <li>state = handshake_started</li>
              </ul>
            </li>
            <li>
              <t>send ServerFinished
              </t>
              <ul spacing="normal">
                <li>state = early_write
  (1RTT can now be sent)</li>
              </ul>
            </li>
            <li>
              <t>get first handshake packet / something using a server-issued CID of min length
              </t>
              <ul spacing="normal">
                <li>state = validated</li>
              </ul>
            </li>
            <li>
              <t>get handshake packet containing ClientFinished
              </t>
              <ul spacing="normal">
                <li>state = handshake_complete</li>
              </ul>
            </li>
            <li>
              <t>send HANDSHAKE_DONE
              </t>
              <ul spacing="normal">
                <li>state = handshake_confirmed</li>
              </ul>
            </li>
          </ul>
          <dl newline="false" spacing="normal">
            <dt>Note:</dt>
            <dd>
  connection_state_changed with a new state of "attempted" is the same
conceptual event as the connection_started event above from the client's
perspective. Similarly, a state of "closing" or "draining" corresponds to the
connection_closed event.</dd>
          </dl>
        </section>
        <section anchor="migration-related-events" numbered="true" toc="default">
          <name>MIGRATION-related events</name>
          <t>e.g., path_updated</t>
          <t>TODO: read up on the draft how migration works and whether to best fit this here or in TRANSPORT
TODO: integrate https://tools.ietf.org/html/draft-deconinck-quic-multipath-02</t>
          <t>For now, infer from other connectivity events and path_challenge/path_response frames</t>
        </section>
      </section>
      <section anchor="security" numbered="true" toc="default">
        <name>security</name>
        <section anchor="keyupdated" numbered="true" toc="default">
          <name>key_updated</name>
          <t>Importance: Base</t>
          <t>Note: secret_updated would be more correct, but in the draft it's called KEY_UPDATE, so stick with that for consistency</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    key_type:KeyType,
    old?:bytes,
    new:bytes,
    generation?:uint32 // needed for 1RTT key updates
}
]]></artwork>
          <t>Triggers:</t>
          <ul spacing="normal">
            <li>"tls" // (e.g., initial, handshake and 0-RTT keys are generated by TLS)</li>
            <li>"remote_update"</li>
            <li>"local_update"</li>
          </ul>
        </section>
        <section anchor="keyretired" numbered="true" toc="default">
          <name>key_retired</name>
          <t>Importance: Base</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    key_type:KeyType,
    key?:bytes,
    generation?:uint32 // needed for 1RTT key updates
}
]]></artwork>
          <t>Triggers:</t>
          <ul spacing="normal">
            <li>"tls" // (e.g., initial, handshake and 0-RTT keys are dropped implicitly)</li>
            <li>"remote_update"</li>
            <li>"local_update"</li>
          </ul>
        </section>
      </section>
      <section anchor="transport" numbered="true" toc="default">
        <name>transport</name>
        <section anchor="versioninformation" numbered="true" toc="default">
          <name>version_information</name>
          <t>Importance: Core</t>
          <t>QUIC endpoints each have their own list of of QUIC versions they support. The
client uses the most likely version in their first initial. If the server does
support that version, it replies with a version_negotiation packet, containing
supported versions. From this, the client selects a version. This event aggregates
all this information in a single event type. It also allows logging of supported
versions at an endpoint without actual version negotiation needing to happen.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    server_versions?:Array<bytes>,
    client_versions?:Array<bytes>,
    chosen_version?:bytes
}
]]></artwork>
          <t>Intended use:</t>
          <ul spacing="normal">
            <li>When sending an initial, the client logs this event with client_versions and
chosen_version set</li>
            <li>Upon receiving a client initial with a supported version, the server logs this
event with server_versions and chosen_version set</li>
            <li>Upon receiving a client initial with an unsupported version, the server logs
this event with server_versions set and client_versions to the
single-element array containing the client's attempted version. The absence of
chosen_version implies no overlap was found.</li>
            <li>Upon receiving a version negotiation packet from the server, the client logs
this event with client_versions set and server_versions to the versions in
the version negotiation packet and chosen_version to the version it will use for
the next initial packet</li>
          </ul>
        </section>
        <section anchor="alpninformation" numbered="true" toc="default">
          <name>alpn_information</name>
          <t>Importance: Core</t>
          <t>QUIC implementations each have their own list of application level protocols and
versions thereof they support. The client includes a list of their supported
options in its first initial as part of the TLS Application Layer Protocol
Negotiation (alpn) extension. If there are common option(s), the server chooses
the most optimal one and communicates this back to the client. If not, the
connection is closed.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    server_alpns?:Array<string>,
    client_alpns?:Array<string>,
    chosen_alpn?:string
}
]]></artwork>
          <t>Intended use:</t>
          <ul spacing="normal">
            <li>When sending an initial, the client logs this event with client_alpns set</li>
            <li>When receiving an initial with a supported alpn, the server logs this event with
server_alpns set, client_alpns equalling the client-provided list, and
chosen_alpn to the value it will send back to the client.</li>
            <li>When receiving an initial with an alpn, the client logs this event with
chosen_alpn to the received value.</li>
            <li>Alternatively, a client can choose to not log the first event, but wait for the
receipt of the server initial to log this event with both client_alpns and
chosen_alpn set.</li>
          </ul>
        </section>
        <section anchor="parametersset" numbered="true" toc="default">
          <name>parameters_set</name>
          <t>Importance: Core</t>
          <t>This event groups settings from several different sources (transport parameters,
TLS ciphers, etc.) into a single event. This is done to minimize the amount of
events and to decouple conceptual setting impacts from their underlying mechanism
for easier high-level reasoning.</t>
          <t>All these settings are typically set once and never change. However, they are
typically set at different times during the connection, so there will typically be
several instances of this event with different fields set.</t>
          <t>Note that some settings have two variations (one set locally, one requested by the
remote peer). This is reflected in the "owner" field. As such, this field MUST be
correct for all settings included a single event instance. If you need to log
settings from two sides, you MUST emit two separate event instances.</t>
          <t>In the case of connection resumption and 0-RTT, some of the server's parameters
are stored up-front at the client and used for the initial connection startup.
They are later updated with the server's reply. In these cases, utilize the
separate <tt>parameters_restored</tt> event to indicate the initial values, and this
event to indicate the updated values, as normal.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    owner?:"local" | "remote",

    resumption_allowed?:boolean, // valid session ticket was received
    early_data_enabled?:boolean, // early data extension was enabled on the TLS layer
    tls_cipher?:string, // (e.g., "AES_128_GCM_SHA256")
    aead_tag_length?:uint8, // depends on the TLS cipher, but it's easier to be explicit. Default value is 16

    // transport parameters from the TLS layer:
    original_destination_connection_id?:bytes,
    initial_source_connection_id?:bytes,
    retry_source_connection_id?:bytes,
    stateless_reset_token?:Token,
    disable_active_migration?:boolean,

    max_idle_timeout?:uint64,
    max_udp_payload_size?:uint32,
    ack_delay_exponent?:uint16,
    max_ack_delay?:uint16,
    active_connection_id_limit?:uint32,

    initial_max_data?:uint64,
    initial_max_stream_data_bidi_local?:uint64,
    initial_max_stream_data_bidi_remote?:uint64,
    initial_max_stream_data_uni?:uint64,
    initial_max_streams_bidi?:uint64,
    initial_max_streams_uni?:uint64,

    preferred_address?:PreferredAddress
}

interface PreferredAddress {
    ip_v4:IPAddress,
    ip_v6:IPAddress,

    port_v4:uint16,
    port_v6:uint16,

    connection_id:bytes,
    stateless_reset_token:Token
}
]]></artwork>
          <t>Additionally, this event can contain any number of unspecified fields. This is to
reflect setting of for example unknown (greased) transport parameters or employed
(proprietary) extensions.</t>
        </section>
        <section anchor="parametersrestored" numbered="true" toc="default">
          <name>parameters_restored</name>
          <t>Importance: Base</t>
          <t>When using QUIC 0-RTT, clients are expected to remember and restore the server's
transport parameters from the previous connection. This event is used to indicate
which parameters were restored and to which values when utilizing 0-RTT. Note that
not all transport parameters should be restored (many are even prohibited from
being re-utilized). The ones listed here are the ones expected to be useful for
correct 0-RTT usage.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    disable_active_migration?:boolean,

    max_idle_timeout?:uint64,
    max_udp_payload_size?:uint32,
    active_connection_id_limit?:uint32,

    initial_max_data?:uint64,
    initial_max_stream_data_bidi_local?:uint64,
    initial_max_stream_data_bidi_remote?:uint64,
    initial_max_stream_data_uni?:uint64,
    initial_max_streams_bidi?:uint64,
    initial_max_streams_uni?:uint64,
}
]]></artwork>
          <t>Note that, like parameters_set above, this event can contain any number of
unspecified fields to allow for additional/custom parameters.</t>
        </section>
        <section anchor="packetsent" numbered="true" toc="default">
          <name>packet_sent</name>
          <t>Importance: Core</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    header:PacketHeader,

    frames?:Array<QuicFrame>, // see appendix for the definitions

    is_coalesced?:boolean, // default value is false

    retry_token?:Token, // only if header.packet_type === retry

    stateless_reset_token?:bytes, // only if header.packet_type === stateless_reset. Is always 128 bits in length.

    supported_versions:Array<bytes>, // only if header.packet_type === version_negotiation

    raw?:RawInfo,
    datagram_id?:uint32
}
]]></artwork>
          <t>Note: We do not explicitly log the encryption_level or packet_number_space: the
header.packet_type specifies this by inference (assuming correct implementation)</t>
          <t>Triggers:</t>
          <ul spacing="normal">
            <li>"retransmit_reordered" // draft-23 5.1.1</li>
            <li>"retransmit_timeout" // draft-23 5.1.2</li>
            <li>"pto_probe" // draft-23 5.3.1</li>
            <li>"retransmit_crypto" // draft-19 6.2</li>
            <li>"cc_bandwidth_probe" // needed for some CCs to figure out bandwidth allocations
when there are no normal sends</li>
          </ul>
          <t>Note: for more details on "datagram_id", see <xref target="datagram-id" format="default"/>. It is only needed
when keeping track of packet coalescing.</t>
        </section>
        <section anchor="packetreceived" numbered="true" toc="default">
          <name>packet_received</name>
          <t>Importance: Core</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    header:PacketHeader,

    frames?:Array<QuicFrame>, // see appendix for the definitions

    is_coalesced?:boolean,

    retry_token?:Token, // only if header.packet_type === retry

    stateless_reset_token?:bytes, // only if header.packet_type === stateless_reset. Is always 128 bits in length.

    supported_versions:Array<bytes>, // only if header.packet_type === version_negotiation

    raw?:RawInfo,
    datagram_id?:uint32
}
]]></artwork>
          <t>Note: We do not explicitly log the encryption_level or packet_number_space: the
header.packet_type specifies this by inference (assuming correct implementation)</t>
          <t>Triggers:</t>
          <ul spacing="normal">
            <li>"keys_available" // if packet was buffered because it couldn't be decrypted
before</li>
          </ul>
          <t>Note: for more details on "datagram_id", see <xref target="datagram-id" format="default"/>. It is only needed
when keeping track of packet coalescing.</t>
        </section>
        <section anchor="packetdropped" numbered="true" toc="default">
          <name>packet_dropped</name>
          <t>Importance: Base</t>
          <t>This event indicates a QUIC-level packet was dropped after partial or no parsing.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    header?:PacketHeader, // primarily packet_type should be filled here, as other fields might not be parseable

    raw?:RawInfo,
    datagram_id?:uint32
}
]]></artwork>
          <t>For this event, the "trigger" field SHOULD be set (for example to one of the
values below), as this helps tremendously in debugging.</t>
          <t>Triggers:</t>
          <ul spacing="normal">
            <li>"key_unavailable"</li>
            <li>"unknown_connection_id"</li>
            <li>"header_parse_error"</li>
            <li>"payload_decrypt_error"</li>
            <li>"protocol_violation"</li>
            <li>"dos_prevention"</li>
            <li>"unsupported_version"</li>
            <li>"unexpected_packet"</li>
            <li>"unexpected_source_connection_id"</li>
            <li>"unexpected_version"</li>
            <li>"duplicate"</li>
            <li>"invalid_initial"</li>
          </ul>
          <t>Note: sometimes packets are dropped before they can be associated with a
particular connection (e.g., in case of "unsupported_version"). This situation is
discussed more in <xref target="handling-unknown-connections" format="default"/>.</t>
          <t>Note: for more details on "datagram_id", see <xref target="datagram-id" format="default"/>. It is only needed
when keeping track of packet coalescing.</t>
        </section>
        <section anchor="packetbuffered" numbered="true" toc="default">
          <name>packet_buffered</name>
          <t>Importance: Base</t>
          <t>This event is emitted when a packet is buffered because it cannot be processed
yet. Typically, this is because the packet cannot be parsed yet, and thus we only
log the full packet contents when it was parsed in a packet_received event.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    header?:PacketHeader, // primarily packet_type and possible packet_number should be filled here, as other elements might not be available yet

    raw?:RawInfo,
    datagram_id?:uint32
}
]]></artwork>
          <t>Note: for more details on "datagram_id", see <xref target="datagram-id" format="default"/>. It is only needed
when keeping track of packet coalescing.</t>
          <t>Triggers:</t>
          <ul spacing="normal">
            <li>"backpressure" // indicates the parser cannot keep up, temporarily buffers
packet for later processing</li>
            <li>"keys_unavailable" // if packet cannot be decrypted because the proper keys were
not yet available</li>
          </ul>
        </section>
        <section anchor="packetsacked" numbered="true" toc="default">
          <name>packets_acked</name>
          <t>Importance: Extra</t>
          <t>This event is emitted when a (group of) sent packet(s) is acknowledged by the
remote peer <em>for the first time</em>. This information could also be deduced from the
contents of received ACK frames. However, ACK frames require additional processing
logic to determine when a given packet is acknowledged for the first time, as QUIC
uses ACK ranges which can include repeated ACKs. Additionally, this event can be
used by implementations that do not log frame contents.</t>
          <t>Data:
~~~
{
    packet_number_space?:PacketNumberSpace,</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
packet_numbers?:Array<uint64> } ~~~
]]></artwork>
          <t>Note: if packet_number_space is omitted, it assumes the default value of
PacketNumberSpace.application_data, as this is by far the most prevalent packet
number space a typical QUIC connection will use.</t>
        </section>
        <section anchor="datagram-id" numbered="true" toc="default">
          <name>datagrams_sent</name>
          <t>Importance: Extra</t>
          <t>When we pass one or more UDP-level datagrams to the socket. This is useful for
determining how QUIC packet buffers are drained to the OS.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    count?:uint16, // to support passing multiple at once
    raw?:Array<RawInfo>, // RawInfo:length field indicates total length of the datagrams, including UDP header length

    datagram_ids?:Array<uint32>
}
]]></artwork>
          <t>Note: QUIC itself does not have a concept of a "datagram_id". This field is a
purely qlog-specific construct to allow tracking how multiple QUIC packets are
coalesced inside of a single UDP datagram, which is an important optimization
during the QUIC handshake. For this, implementations assign a (per-endpoint)
unique ID to each datagram and keep track of which packets were coalesced into the
same datagram. As packet coalescing typically only happens during the handshake
(as it requires at least one long header packet), this can be done without much
overhead.</t>
        </section>
        <section anchor="datagramsreceived" numbered="true" toc="default">
          <name>datagrams_received</name>
          <t>Importance: Extra</t>
          <t>When we receive one or more UDP-level datagrams from the socket. This is useful
for determining how datagrams are passed to the user space stack from the OS.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    count?:uint16, // to support passing multiple at once
    raw?:Array<RawInfo>, // RawInfo:length field indicates total length of the datagrams, including UDP header length

    datagram_ids?:Array<uint32>
}
]]></artwork>
          <t>Note: for more details on "datagram_ids", see <xref target="datagram-id" format="default"/>.</t>
        </section>
        <section anchor="datagramdropped" numbered="true" toc="default">
          <name>datagram_dropped</name>
          <t>Importance: Extra</t>
          <t>When we drop a UDP-level datagram. This is typically if it does not contain a
valid QUIC packet (in that case, use packet_dropped instead).</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    raw?:RawInfo
}
]]></artwork>
        </section>
        <section anchor="streamstateupdated" numbered="true" toc="default">
          <name>stream_state_updated</name>
          <t>Importance: Base</t>
          <t>This event is emitted whenever the internal state of a QUIC stream is updated, as
described in QUIC transport draft-23 section 3. Most of this can be inferred from
several types of frames going over the wire, but it's much easier to have explicit
signals for these state changes.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    stream_id:uint64,
    stream_type?:"unidirectional"|"bidirectional", // mainly useful when opening the stream

    old?:StreamState,
    new:StreamState,

    stream_side?:"sending"|"receiving"
}

enum StreamState {
    // bidirectional stream states, draft-23 3.4.
    idle,
    open,
    half_closed_local,
    half_closed_remote,
    closed,

    // sending-side stream states, draft-23 3.1.
    ready,
    send,
    data_sent,
    reset_sent,
    reset_received,

    // receive-side stream states, draft-23 3.2.
    receive,
    size_known,
    data_read,
    reset_read,

    // both-side states
    data_received,

    // qlog-defined
    destroyed // memory actually freed
}
]]></artwork>
          <t>Note: QUIC implementations SHOULD mainly log the simplified bidirectional
(HTTP/2-alike) stream states (e.g., idle, open, closed) instead of the more
finegrained stream states (e.g., data_sent, reset_received). These latter ones are
mainly for more in-depth debugging. Tools SHOULD be able to deal with both types
equally.</t>
        </section>
        <section anchor="framesprocessed" numbered="true" toc="default">
          <name>frames_processed</name>
          <t>Importance: Extra</t>
          <t>This event's main goal is to prevent a large proliferation of specific purpose
events (e.g., packets_acknowledged, flow_control_updated, stream_data_received).
We want to give implementations the opportunity to (selectively) log this type of
signal without having to log packet-level details (e.g., in packet_received).
Since for almost all cases, the effects of applying a frame to the internal state
of an implementation can be inferred from that frame's contents, we aggregate
these events in this single "frames_processed" event.</t>
          <t>Note: This event can be used to signal internal state change not resulting
directly from the actual "parsing" of a frame (e.g., the frame could have been
parsed, data put into a buffer, then later processed, then logged with this
event).</t>
          <t>Note: Implementations logging "packet_received" and which include all of the
packet's constituent frames therein, are not expected to emit this
"frames_processed" event (contrary to the HTTP-level "frames_parsed" event).
Rather, implementations not wishing to log full packets or that wish to explicitly
convey extra information about when frames are processed (if not directly tied to
their reception) can use this event.</t>
          <t>Note: for some events, this approach will lose some information (e.g., for which
encryption level are packets being acknowledged?). If this information is
important, please use the packet_received event instead.</t>
          <t>Note: in some implementations, it can be difficult to log frames directly, even
when using packet_sent and packet_received events. For these cases, this event
also contains the direct packet_number field, which can be used to more explicitly
link this event to the packet_sent/received events.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    frames:Array<QuicFrame>, // see appendix for the definitions

    packet_number?:uint64
}
]]></artwork>
        </section>
        <section anchor="datamoved" numbered="true" toc="default">
          <name>data_moved</name>
          <t>Importance: Base</t>
          <t>Used to indicate when data moves between the different layers (for example passing
from HTTP/3 to QUIC stream buffers and vice versa) or between HTTP/3 and the actual
user application on top (for example a browser engine). This helps make clear the
flow of data, how long data remains in various buffers and the overheads
introduced by individual layers.</t>
          <t>For example, this helps make clear whether received data on a QUIC stream is moved
to the HTTP layer immediately (for example per received packet) or in larger
batches (for example, all QUIC packets are processed first and afterwards the HTTP
layer reads from the streams with newly available data). This in turn can help
identify bottlenecks or scheduling problems.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    stream_id?:uint64,
    offset?:uint64,
    length?:uint64, // byte length of the moved data

    from?:string, // typically: use either of "application","http","transport"
    to?:string, // typically: use either of "application","http","transport"

    data?:bytes // raw bytes that were transferred
}
]]></artwork>
          <t>Note: we do not for example use a "direction" field (with values "up" and "down")
to specify the data flow. This is because in some optimized implementations, data
might skip some individual layers. Additionally, using explicit "from" and "to"
fields is more flexible and allows the definition of other conceptual "layers"
(for example to indicate data from QUIC CRYPTO frames being passed to a TLS
library ("security") or from HTTP/3 to QPACK ("qpack")).</t>
          <t>Note: this event type is part of the "transport" category, but really spans all
the different layers. This means we have a few leaky abstractions here (for
example, the stream_id or stream offset might not be available at some logging
points, or the raw data might not be in a byte-array form). In these situations,
implementers can decide to define new, in-context fields to aid in manual
debugging.</t>
        </section>
      </section>
      <section anchor="recovery" numbered="true" toc="default">
        <name>recovery</name>
        <t>Note: most of the events in this category are kept generic to support different
recovery approaches and various congestion control algorithms. Tool creators
SHOULD make an effort to support and visualize even unknown data in these events
(e.g., plot unknown congestion states by name on a timeline visualization).</t>
        <section anchor="parametersset-1" numbered="true" toc="default">
          <name>parameters_set</name>
          <t>Importance: Base</t>
          <t>This event groups initial parameters from both loss detection and congestion
control into a single event. All these settings are typically set once and never
change. Implementation that do, for some reason, change these parameters during
execution, MAY emit the parameters_set event twice.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    // Loss detection, see recovery draft-23, Appendix A.2
    reordering_threshold?:uint16, // in amount of packets
    time_threshold?:float, // as RTT multiplier
    timer_granularity?:uint16, // in ms
    initial_rtt?:float, // in ms

    // congestion control, Appendix B.1.
    max_datagram_size?:uint32, // in bytes // Note: this could be updated after pmtud
    initial_congestion_window?:uint64, // in bytes
    minimum_congestion_window?:uint32, // in bytes // Note: this could change when max_datagram_size changes
    loss_reduction_factor?:float,
    persistent_congestion_threshold?:uint16 // as PTO multiplier
}
]]></artwork>
          <t>Additionally, this event can contain any number of unspecified fields to support
different recovery approaches.</t>
        </section>
        <section anchor="metricsupdated" numbered="true" toc="default">
          <name>metrics_updated</name>
          <t>Importance: Core</t>
          <t>This event is emitted when one or more of the observable recovery metrics changes
value. This event SHOULD group all possible metric updates that happen at or
around the same time in a single event (e.g., if min_rtt and smoothed_rtt change
at the same time, they should be bundled in a single metrics_updated entry, rather
than split out into two). Consequently, a metrics_updated event is only guaranteed
to contain at least one of the listed metrics.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    // Loss detection, see recovery draft-23, Appendix A.3
    min_rtt?:float, // in ms or us, depending on the overarching qlog's configuration
    smoothed_rtt?:float, // in ms or us, depending on the overarching qlog's configuration
    latest_rtt?:float, // in ms or us, depending on the overarching qlog's configuration
    rtt_variance?:float, // in ms or us, depending on the overarching qlog's configuration

    pto_count?:uint16,

    // Congestion control, Appendix B.2.
    congestion_window?:uint64, // in bytes
    bytes_in_flight?:uint64,

    ssthresh?:uint64, // in bytes

    // qlog defined
    packets_in_flight?:uint64, // sum of all packet number spaces

    pacing_rate?:uint64 // in bps
}
]]></artwork>
          <t>Note: to make logging easier, implementations MAY log values even if they are the
same as previously reported values (e.g., two subsequent METRIC_UPDATE entries can
both report the exact same value for min_rtt). However, applications SHOULD try to
log only actual updates to values.</t>
          <t>Additionally, this event can contain any number of unspecified fields to support
different recovery approaches.</t>
        </section>
        <section anchor="congestionstateupdated" numbered="true" toc="default">
          <name>congestion_state_updated</name>
          <t>Importance: Base</t>
          <t>This event signifies when the congestion controller enters a significant new state
and changes its behaviour. This event's definition is kept generic to support
different Congestion Control algorithms. For example, for the algorithm defined in
the Recovery draft ("enhanced" New Reno), the following states are defined:</t>
          <ul spacing="normal">
            <li>slow_start</li>
            <li>congestion_avoidance</li>
            <li>application_limited</li>
            <li>recovery</li>
          </ul>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    old?:string,
    new:string
}
]]></artwork>
          <t>The "trigger" field SHOULD be logged if there are multiple ways in which a state change
can occur but MAY be omitted if a given state can only be due to a single event
occuring (e.g., slow start is exited only when ssthresh is exceeded).</t>
          <t>Some triggers for ("enhanced" New Reno):</t>
          <ul spacing="normal">
            <li>persistent_congestion</li>
            <li>ECN</li>
          </ul>
        </section>
        <section anchor="losstimerupdated" numbered="true" toc="default">
          <name>loss_timer_updated</name>
          <t>Importance: Extra</t>
          <t>This event is emitted when a recovery loss timer changes state. The three main
event types are:</t>
          <ul spacing="normal">
            <li>set: the timer is set with a delta timeout for when it will trigger next</li>
            <li>expired: when the timer effectively expires after the delta timeout</li>
            <li>cancelled: when a timer is cancelled (e.g., all outstanding packets are
acknowledged, start idle period)</li>
          </ul>
          <t>Note: to indicate an active timer's timeout update, a new "set" event is used.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    timer_type?:"ack"|"pto", // called "mode" in draft-23 A.9.
    packet_number_space?: PacketNumberSpace,

    event_type:"set"|"expired"|"cancelled",

    delta?:float // if event_type === "set": delta time in ms or us (see configuration) from this event's timestamp until when the timer will trigger
}
]]></artwork>
          <t>TODO: how about CC algo's that use multiple timers? How generic do these events
need to be? Just support QUIC-style recovery from the spec or broader?</t>
          <t>TODO: read up on the loss detection logic in draft-27 onward and see if this suffices</t>
        </section>
        <section anchor="packetlost" numbered="true" toc="default">
          <name>packet_lost</name>
          <t>Importance: Core</t>
          <t>This event is emitted when a packet is deemed lost by loss detection.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    header?:PacketHeader, // should include at least the packet_type and packet_number

    // not all implementations will keep track of full packets, so these are optional
    frames?:Array<QuicFrame> // see appendix for the definitions
}
]]></artwork>
          <t>For this event, the "trigger" field SHOULD be set (for example to one of the
values below), as this helps tremendously in debugging.</t>
          <t>Triggers:</t>
          <ul spacing="normal">
            <li>"reordering_threshold",</li>
            <li>"time_threshold"</li>
            <li>"pto_expired" // draft-23 section 5.3.1, MAY</li>
          </ul>
        </section>
        <section anchor="markedforretransmit" numbered="true" toc="default">
          <name>marked_for_retransmit</name>
          <t>Importance: Extra</t>
          <t>This event indicates which data was marked for retransmit upon detecing a packet
loss (see packet_lost). Similar to our reasoning for the "frames_processed" event,
in order to keep the amount of different events low, we group this signal for all
types of retransmittable data in a single event based on existing QUIC frame
definitions.</t>
          <t>Implementations retransmitting full packets or frames directly can just log the
consituent frames of the lost packet here (or do away with this event and use the
contents of the packet_lost event instead). Conversely, implementations that have
more complex logic (e.g., marking ranges in a stream's data buffer as in-flight),
or that do not track sent frames in full (e.g., only stream offset + length), can
translate their internal behaviour into the appropriate frame instance here even
if that frame was never or will never be put on the wire.</t>
          <t>Note: much of this data can be inferred if implementations log packet_sent events
(e.g., looking at overlapping stream data offsets and length, one can determine
when data was retransmitted).</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    frames:Array<QuicFrame>, // see appendix for the definitions
}
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="http3-event-definitions" numbered="true" toc="default">
      <name>HTTP/3 event definitions</name>
      <section anchor="http" numbered="true" toc="default">
        <name>http</name>
        <t>Note: like all category values, the "http" category is written in lowercase.</t>
        <section anchor="parametersset-2" numbered="true" toc="default">
          <name>parameters_set</name>
          <t>Importance: Base</t>
          <t>This event contains HTTP/3 and QPACK-level settings, mostly those received from
the HTTP/3 SETTINGS frame. All these parameters are typically set once and never
change. However, they are typically set at different times during the connection,
so there can be several instances of this event with different fields set.</t>
          <t>Note that some settings have two variations (one set locally, one requested by the
remote peer). This is reflected in the "owner" field. As such, this field MUST be
correct for all settings included a single event instance. If you need to log
settings from two sides, you MUST emit two separate event instances.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    owner?:"local" | "remote",

    max_header_list_size?:uint64, // from SETTINGS_MAX_HEADER_LIST_SIZE
    max_table_capacity?:uint64, // from SETTINGS_QPACK_MAX_TABLE_CAPACITY
    blocked_streams_count?:uint64, // from SETTINGS_QPACK_BLOCKED_STREAMS

    // qlog-defined
    waits_for_settings?:boolean // indicates whether this implementation waits for a SETTINGS frame before processing requests
}
]]></artwork>
          <t>Note: enabling server push is not explicitly done in HTTP/3 by use of a setting or
parameter. Instead, it is communicated by use of the MAX_PUSH_ID frame, which
should be logged using the frame_created and frame_parsed events below.</t>
          <t>Additionally, this event can contain any number of unspecified fields. This is to
reflect setting of for example unknown (greased) settings or parameters of
(proprietary) extensions.</t>
        </section>
        <section anchor="parametersrestored-1" numbered="true" toc="default">
          <name>parameters_restored</name>
          <t>Importance: Base</t>
          <t>When using QUIC 0-RTT, clients are expected to remember and reuse the server's
SETTINGs from the previous connection. This event is used to indicate which
settings were restored and to which values when utilizing 0-RTT.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    max_header_list_size?:uint64,
    max_table_capacity?:uint64,
    blocked_streams_count?:uint64
}
]]></artwork>
          <t>Note that, like for parameters_set above, this event can contain any number of
unspecified fields to allow for additional and custom settings.</t>
        </section>
        <section anchor="streamtypeset" numbered="true" toc="default">
          <name>stream_type_set</name>
          <t>Importance: Base</t>
          <t>Emitted when a stream's type becomes known. This is typically when a stream is
opened and the stream's type indicator is sent or received.</t>
          <t>Note: most of this information can also be inferred by looking at a stream's id,
since id's are strictly partitioned at the QUIC level. Even so, this event has a
"Base" importance because it helps a lot in debugging to have this information
clearly spelled out.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    stream_id:uint64,

    owner?:"local"|"remote"

    old?:StreamType,
    new:StreamType,

    associated_push_id?:uint64 // only when new == "push"
}

enum StreamType {
    data, // bidirectional request-response streams
    control,
    push,
    reserved,
    qpack_encode,
    qpack_decode
}
]]></artwork>
        </section>
        <section anchor="framecreated" numbered="true" toc="default">
          <name>frame_created</name>
          <t>Importance: Core</t>
          <t>HTTP equivalent to the packet_sent event. This event is emitted when the HTTP/3
framing actually happens. Note: this is not necessarily the same as when the
HTTP/3 data is passed on to the QUIC layer. For that, see the "data_moved" event.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    stream_id:uint64,
    length?:uint64, // payload byte length of the frame
    frame:HTTP3Frame, // see appendix for the definitions,

    raw?:RawInfo
}
]]></artwork>
          <t>Note: in HTTP/3, DATA frames can have arbitrarily large lengths to reduce frame
header overhead. As such, DATA frames can span many QUIC packets and can be
created in a streaming fashion. In this case, the frame_created event is emitted
once for the frame header, and further streamed data is indicated using the
data_moved event.</t>
        </section>
        <section anchor="frameparsed" numbered="true" toc="default">
          <name>frame_parsed</name>
          <t>Importance: Core</t>
          <t>HTTP equivalent to the packet_received event. This event is emitted when we
actually parse the HTTP/3 frame. Note: this is not necessarily the same as when
the HTTP/3 data is actually received on the QUIC layer. For that, see the
"data_moved" event.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    stream_id:uint64,
    length?:uint64, // payload byte length of the frame
    frame:HTTP3Frame, // see appendix for the definitions,

    raw?:RawInfo
}
]]></artwork>
          <t>Note: in HTTP/3, DATA frames can have arbitrarily large lengths to reduce frame
header overhead. As such, DATA frames can span many QUIC packets and can be
processed in a streaming fashion. In this case, the frame_parsed event is emitted
once for the frame header, and further streamed data is indicated using the
data_moved event.</t>
        </section>
        <section anchor="pushresolved" numbered="true" toc="default">
          <name>push_resolved</name>
          <t>Importance: Extra</t>
          <t>This event is emitted when a pushed resource is successfully claimed (used) or,
conversely, abandoned (rejected) by the application on top of HTTP/3 (e.g., the
web browser). This event is added to help debug problems with unexpected PUSH
behaviour, which is commonplace with HTTP/2.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    push_id?:uint64,
    stream_id?:uint64, // in case this is logged from a place that does not have access to the push_id

    decision:"claimed"|"abandoned"
}
]]></artwork>
        </section>
      </section>
      <section anchor="qpack" numbered="true" toc="default">
        <name>qpack</name>
        <t>Note: like all category values, the "qpack" category is written in lowercase.</t>
        <t>The QPACK events mainly serve as an aid to debug low-level QPACK issues. The
higher-level, plaintext header values SHOULD (also) be logged in the
http.frame_created and http.frame_parsed event data (instead).</t>
        <t>Note: qpack does not have its own parameters_set event. This was merged with
http.parameters_set for brevity, since qpack is a required extension for HTTP/3
anyway. Other HTTP/3 extensions MAY also log their SETTINGS fields in
http.parameters_set or MAY define their own events.</t>
        <section anchor="stateupdated" numbered="true" toc="default">
          <name>state_updated</name>
          <t>Importance: Base</t>
          <t>This event is emitted when one or more of the internal QPACK variables changes
value. Note that some variables have two variations (one set locally, one
requested by the remote peer). This is reflected in the "owner" field. As such,
this field MUST be correct for all variables included a single event instance. If
you need to log settings from two sides, you MUST emit two separate event
instances.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    owner:"local" | "remote",

    dynamic_table_capacity?:uint64,
    dynamic_table_size?:uint64, // effective current size, sum of all the entries

    known_received_count?:uint64,
    current_insert_count?:uint64
}
]]></artwork>
        </section>
        <section anchor="streamstateupdated-1" numbered="true" toc="default">
          <name>stream_state_updated</name>
          <t>Importance: Core</t>
          <t>This event is emitted when a stream becomes blocked or unblocked by header
decoding requests or QPACK instructions.</t>
          <t>Note: This event is of "Core" importance, as it might have a large impact on
HTTP/3's observed performance.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    stream_id:uint64,

    state:"blocked"|"unblocked" // streams are assumed to start "unblocked" until they become "blocked"
}
]]></artwork>
        </section>
        <section anchor="dynamictableupdated" numbered="true" toc="default">
          <name>dynamic_table_updated</name>
          <t>Importance: Extra</t>
          <t>This event is emitted when one or more entries are inserted or evicted from QPACK's dynamic table.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    owner:"local" | "remote", // local = the encoder's dynamic table. remote = the decoder's dynamic table

    update_type:"inserted"|"evicted",

    entries:Array<DynamicTableEntry>
}

class DynamicTableEntry {
    index:uint64;
    name?:string | bytes;
    value?:string | bytes;
}
]]></artwork>
        </section>
        <section anchor="headersencoded" numbered="true" toc="default">
          <name>headers_encoded</name>
          <t>Importance: Base</t>
          <t>This event is emitted when an uncompressed header block is encoded successfully.</t>
          <t>Note: this event has overlap with http.frame_created for the HeadersFrame type.
When outputting both events, implementers MAY omit the "headers" field in this
event.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    stream_id?:uint64,

    headers?:Array<HTTPHeader>,

    block_prefix:QPackHeaderBlockPrefix,
    header_block:Array<QPackHeaderBlockRepresentation>,

    length?:uint32,
    raw?:bytes
}
]]></artwork>
        </section>
        <section anchor="headersdecoded" numbered="true" toc="default">
          <name>headers_decoded</name>
          <t>Importance: Base</t>
          <t>This event is emitted when a compressed header block is decoded successfully.</t>
          <t>Note: this event has overlap with http.frame_parsed for the HeadersFrame type.
When outputting both events, implementers MAY omit the "headers" field in this
event.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    stream_id?:uint64,

    headers?:Array<HTTPHeader>,

    block_prefix:QPackHeaderBlockPrefix,
    header_block:Array<QPackHeaderBlockRepresentation>,

    length?:uint32,
    raw?:bytes
}
]]></artwork>
        </section>
        <section anchor="instructioncreated" numbered="true" toc="default">
          <name>instruction_created</name>
          <t>Importance: Base</t>
          <t>This event is emitted when a QPACK instruction (both decoder and encoder) is
created and added to the encoder/decoder stream.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    instruction:QPackInstruction // see appendix for the definitions,

    length?:uint32,
    raw?:bytes
}
]]></artwork>
          <t>Note: encoder/decoder semantics and stream_id's are implicit in either the
instruction types or can be logged via other events (e.g., http.stream_type_set)</t>
        </section>
        <section anchor="instructionparsed" numbered="true" toc="default">
          <name>instruction_parsed</name>
          <t>Importance: Base</t>
          <t>This event is emitted when a QPACK instruction (both decoder and encoder) is read
from the encoder/decoder stream.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    instruction:QPackInstruction // see appendix for the definitions,

    length?:uint32,
    raw?:bytes
}
]]></artwork>
          <t>Note: encoder/decoder semantics and stream_id's are implicit in either the
instruction types or can be logged via other events (e.g., http.stream_type_set)</t>
        </section>
      </section>
    </section>
    <section anchor="generic-events-and-simulation-indicators" numbered="true" toc="default">
      <name>Generic events and Simulation indicators</name>
      <section anchor="generic" numbered="true" toc="default">
        <name>generic</name>
        <t>The main goal of the events in this category is to allow implementations to fully
replace their existing text-based logging by qlog. This is done by providing
events to log generic strings for typical well-known logging levels (error,
warning, info, debug, verbose).</t>
        <section anchor="error" numbered="true" toc="default">
          <name>error</name>
          <t>Importance: Core</t>
          <t>Used to log details of an internal error. For errors that effectively lead to the
closure of a QUIC connection, it is recommended to use transport:connection_closed
instead.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    code?:uint32,
    message?:string
}
]]></artwork>
        </section>
        <section anchor="warning" numbered="true" toc="default">
          <name>warning</name>
          <t>Importance: Base</t>
          <t>Used to log details of an internal warning that might not get reflected on the
wire.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    code?:uint32,
    message?:string
}
]]></artwork>
        </section>
        <section anchor="info" numbered="true" toc="default">
          <name>info</name>
          <t>Importance: Extra</t>
          <t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    message:string
}
]]></artwork>
        </section>
        <section anchor="debug" numbered="true" toc="default">
          <name>debug</name>
          <t>Importance: Extra</t>
          <t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    message:string
}
]]></artwork>
        </section>
        <section anchor="verbose" numbered="true" toc="default">
          <name>verbose</name>
          <t>Importance: Extra</t>
          <t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>
          <t>Data:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    message:string
}
]]></artwork>
        </section>
      </section>
      <section anchor="simulation" numbered="true" toc="default">
        <name>simulation</name>
        <t>When evaluating a protocol evaluation, one typically sets up a series of
interoperability or benchmarking tests, in which the test situations can change
over time. For example, the network bandwidth or latency can vary during the test,
or the network can be fully disable for a short time. In these setups, it is
useful to know when exactly these conditions are triggered, to allow for proper
correlation with other events.</t>
        <section anchor="scenario" numbered="true" toc="default">
          <name>scenario</name>
          <t>Importance: Extra</t>
          <t>Used to specify which specific scenario is being tested at this particular
instance. This could also be reflected in the top-level qlog's <tt>summary</tt> or
<tt>configuration</tt> fields, but having a separate event allows easier aggregation of
several simulations into one trace.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    name?:string,
    details?:any
}
]]></artwork>
        </section>
        <section anchor="marker" numbered="true" toc="default">
          <name>marker</name>
          <t>Importance: Extra</t>
          <t>Used to indicate when specific emulation conditions are triggered at set times
(e.g., at 3 seconds in 2% packet loss is introduced, at 10s a NAT rebind is
triggered).</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
{
    type?:string,
    message?:string
}
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>TBD</t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>TBD</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="QUIC-TRANSPORT">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
              <organization>Fastly</organization>
            </author>
            <author initials="M." surname="Thomson" fullname="Martin Thomson" role="editor">
              <organization>Mozilla</organization>
            </author>
            <date year="2020" month="October" day="01"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-transport-32"/>
        </reference>
        <reference anchor="QUIC-HTTP">
          <front>
            <title>Hypertext Transfer Protocol Version 3 (HTTP/3)</title>
            <author initials="M." surname="Bishop" fullname="Mike Bishop" role="editor">
              <organization>Akamai</organization>
            </author>
            <date year="2020" month="October" day="01"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-http-32"/>
        </reference>
        <reference anchor="QUIC-QPACK">
          <front>
            <title>QPACK: Header Compression for HTTP/3</title>
            <author initials="A." surname="Frindell" fullname="Alan Frindell" role="editor">
              <organization>Facebook</organization>
            </author>
            <date year="2020" month="October" day="20"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qpack-19"/>
        </reference>
        <reference anchor="QLOG-MAIN">
          <front>
            <title>Main logging schema for qlog</title>
            <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
              <organization>Hasselt University</organization>
            </author>
            <date year="2020" month="November" day="02"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-marx-qlog-main-schema-02"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization/>
            </author>
            <date year="1997" month="March"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
      </references>
    </references>
    <section anchor="quic-data-field-definitions" numbered="true" toc="default">
      <name>QUIC data field definitions</name>
      <section anchor="ipaddress" numbered="true" toc="default">
        <name>IPAddress</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
class IPAddress : string | bytes;

// an IPAddress can either be a "human readable" form (e.g., "127.0.0.1" for v4 or "2001:0db8:85a3:0000:0000:8a2e:0370:7334" for v6) or use a raw byte-form (as the string forms can be ambiguous)

]]></artwork>
      </section>
      <section anchor="packettype" numbered="true" toc="default">
        <name>PacketType</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
enum PacketType {
    initial,
    handshake,
    zerortt = "0RTT",
    onertt = "1RTT",
    retry,
    version_negotiation,
    stateless_reset,
    unknown
}
]]></artwork>
      </section>
      <section anchor="packetnumberspace" numbered="true" toc="default">
        <name>PacketNumberSpace</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
enum PacketNumberSpace {
    initial,
    handshake,
    application_data
}
]]></artwork>
      </section>
      <section anchor="packetheader" numbered="true" toc="default">
        <name>PacketHeader</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
class PacketHeader {
    // Note: short vs long header is implicit through PacketType

    packet_type: PacketType;
    packet_number: uint64;

    flags?: uint8; // the bit flags of the packet headers (spin bit, key update bit, etc. up to and including the packet number length bits if present) interpreted as a single 8-bit integer

    token?:Token; // only if packet_type == initial

    length?: uint16, // only if packet_type == initial || handshake || 0RTT. Signifies length of the packet_number plus the payload.

    // only if present in the header
    // if correctly using transport:connection_id_updated events,
    // dcid can be skipped for 1RTT packets
    version?: bytes; // e.g., "ff00001d" for draft-29
    scil?: uint8;
    dcil?: uint8;
    scid?: bytes;
    dcid?: bytes;
}
]]></artwork>
      </section>
      <section anchor="token" numbered="true" toc="default">
        <name>Token</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
class Token {
    type?:"retry"|"resumption"|"stateless_reset";

    length?:uint32; // byte length of the token
    data?:bytes; // raw byte value of the token

    details?:any; // decoded fields included in the token (typically: peer's IP address, creation time)
}
]]></artwork>
        <t>The token carried in an Initial packet can either be a retry token from a Retry
packet, a stateless reset token from a Stateless Reset packet or one originally
provided by the server in a NEW_TOKEN frame used when resuming a connection (e.g.,
for address validation purposes). Retry and resumption tokens typically contain
encoded metadata to check the token's validity when it is used, but this metadata
and its format is implementation specific. For that, this field includes a
general-purpose "details" field.</t>
      </section>
      <section anchor="keytype" numbered="true" toc="default">
        <name>KeyType</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
enum KeyType {
    server_initial_secret,
    client_initial_secret,

    server_handshake_secret,
    client_handshake_secret,

    server_0rtt_secret,
    client_0rtt_secret,

    server_1rtt_secret,
    client_1rtt_secret
}
]]></artwork>
      </section>
      <section anchor="quic-frames" numbered="true" toc="default">
        <name>QUIC Frames</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
type QuicFrame = PaddingFrame | PingFrame | AckFrame | ResetStreamFrame | StopSendingFrame | CryptoFrame | NewTokenFrame | StreamFrame | MaxDataFrame | MaxStreamDataFrame | MaxStreamsFrame | DataBlockedFrame | StreamDataBlockedFrame | StreamsBlockedFrame | NewConnectionIDFrame | RetireConnectionIDFrame | PathChallengeFrame | PathResponseFrame | ConnectionCloseFrame | HandshakeDoneFrame | UnknownFrame;
]]></artwork>
        <section anchor="paddingframe" numbered="true" toc="default">
          <name>PaddingFrame</name>
          <t>In QUIC, PADDING frames are simply identified as a single byte of value 0. As
such, each padding byte could be theoretically interpreted and logged as an
individual PaddingFrame.</t>
          <t>However, as this leads to heavy logging overhead, implementations SHOULD instead
emit just a single PaddingFrame and set the payload_length property to the amount
of PADDING bytes/frames included in the packet.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class PaddingFrame{
    frame_type:string = "padding";

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork>
        </section>
        <section anchor="pingframe" numbered="true" toc="default">
          <name>PingFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class PingFrame{
    frame_type:string = "ping";

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork>
        </section>
        <section anchor="ackframe" numbered="true" toc="default">
          <name>AckFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class AckFrame{
    frame_type:string = "ack";

    ack_delay?:float; // in ms

    // first number is "from": lowest packet number in interval
    // second number is "to": up to and including // highest packet number in interval
    // e.g., looks like [[1,2],[4,5]]
    acked_ranges?:Array<[uint64, uint64]|[uint64]>;

    // ECN (explicit congestion notification) related fields (not always present)
    ect1?:uint64;
    ect0?:uint64;
    ce?:uint64;

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork>
          <t>Note: the packet ranges in AckFrame.acked_ranges do not necessarily have to be
ordered (e.g., [[5,9],[1,4]] is a valid value).</t>
          <t>Note: the two numbers in the packet range can be the same (e.g., [120,120] means
that packet with number 120 was ACKed). However, in that case, implementers SHOULD
log [120] instead and tools MUST be able to deal with both notations.</t>
        </section>
        <section anchor="resetstreamframe" numbered="true" toc="default">
          <name>ResetStreamFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class ResetStreamFrame{
    frame_type:string = "reset_stream";

    stream_id:uint64;
    error_code:ApplicationError | uint32;
    final_size:uint64; // in bytes

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork>
        </section>
        <section anchor="stopsendingframe" numbered="true" toc="default">
          <name>StopSendingFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class StopSendingFrame{
    frame_type:string = "stop_sending";

    stream_id:uint64;
    error_code:ApplicationError | uint32;

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork>
        </section>
        <section anchor="cryptoframe" numbered="true" toc="default">
          <name>CryptoFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class CryptoFrame{
    frame_type:string = "crypto";

    offset:uint64;
    length:uint64;

    payload_length?:uint32;
}
]]></artwork>
        </section>
        <section anchor="newtokenframe" numbered="true" toc="default">
          <name>NewTokenFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class NewTokenFrame{
  frame_type:string = "new_token";

  token:Token
}
]]></artwork>
        </section>
        <section anchor="streamframe" numbered="true" toc="default">
          <name>StreamFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class StreamFrame{
    frame_type:string = "stream";

    stream_id:uint64;

    // These two MUST always be set
    // If not present in the Frame type, log their default values
    offset:uint64;
    length:uint64;

    // this MAY be set any time, but MUST only be set if the value is "true"
    // if absent, the value MUST be assumed to be "false"
    fin?:boolean;

    raw?:bytes;
}
]]></artwork>
        </section>
        <section anchor="maxdataframe" numbered="true" toc="default">
          <name>MaxDataFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class MaxDataFrame{
  frame_type:string = "max_data";

  maximum:uint64;
}
]]></artwork>
        </section>
        <section anchor="maxstreamdataframe" numbered="true" toc="default">
          <name>MaxStreamDataFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class MaxStreamDataFrame{
  frame_type:string = "max_stream_data";

  stream_id:uint64;
  maximum:uint64;
}
]]></artwork>
        </section>
        <section anchor="maxstreamsframe" numbered="true" toc="default">
          <name>MaxStreamsFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class MaxStreamsFrame{
  frame_type:string = "max_streams";

  stream_type:string = "bidirectional" | "unidirectional";
  maximum:uint64;
}
]]></artwork>
        </section>
        <section anchor="datablockedframe" numbered="true" toc="default">
          <name>DataBlockedFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class DataBlockedFrame{
  frame_type:string = "data_blocked";

  limit:uint64;
}
]]></artwork>
        </section>
        <section anchor="streamdatablockedframe" numbered="true" toc="default">
          <name>StreamDataBlockedFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class StreamDataBlockedFrame{
  frame_type:string = "stream_data_blocked";

  stream_id:uint64;
  limit:uint64;
}
]]></artwork>
        </section>
        <section anchor="streamsblockedframe" numbered="true" toc="default">
          <name>StreamsBlockedFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class StreamsBlockedFrame{
  frame_type:string = "streams_blocked";

  stream_type:string = "bidirectional" | "unidirectional";
  limit:uint64;
}
]]></artwork>
        </section>
        <section anchor="newconnectionidframe" numbered="true" toc="default">
          <name>NewConnectionIDFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class NewConnectionIDFrame{
  frame_type:string = "new_connection_id";

  sequence_number:uint32;
  retire_prior_to:uint32;

  connection_id_length?:uint8;
  connection_id:bytes;

  stateless_reset_token?:Token;
}
]]></artwork>
        </section>
        <section anchor="retireconnectionidframe" numbered="true" toc="default">
          <name>RetireConnectionIDFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class RetireConnectionIDFrame{
  frame_type:string = "retire_connection_id";

  sequence_number:uint32;
}
]]></artwork>
        </section>
        <section anchor="pathchallengeframe" numbered="true" toc="default">
          <name>PathChallengeFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class PathChallengeFrame{
  frame_type:string = "path_challenge";

  data?:bytes; // always 64-bit
}
]]></artwork>
        </section>
        <section anchor="pathresponseframe" numbered="true" toc="default">
          <name>PathResponseFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class PathResponseFrame{
  frame_type:string = "path_response";

  data?:bytes; // always 64-bit
}
]]></artwork>
        </section>
        <section anchor="connectioncloseframe" numbered="true" toc="default">
          <name>ConnectionCloseFrame</name>
          <t>raw_error_code is the actual, numerical code. This is useful because some error
types are spread out over a range of codes (e.g., QUIC's crypto_error).</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
type ErrorSpace = "transport" | "application";

class ConnectionCloseFrame{
    frame_type:string = "connection_close";

    error_space?:ErrorSpace;
    error_code?:TransportError | ApplicationError | uint32;
    raw_error_code?:uint32;
    reason?:string;

    trigger_frame_type?:uint64 | string; // For known frame types, the appropriate "frame_type" string. For unknown frame types, the hex encoded identifier value
}
]]></artwork>
        </section>
        <section anchor="handshakedoneframe" numbered="true" toc="default">
          <name>HandshakeDoneFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class HandshakeDoneFrame{
  frame_type:string = "handshake_done";
}
]]></artwork>
        </section>
        <section anchor="unknownframe" numbered="true" toc="default">
          <name>UnknownFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class UnknownFrame{
    frame_type:string = "unknown";
    raw_frame_type:uint64;

    raw_length?:uint32;
    raw?:bytes;
}
]]></artwork>
        </section>
        <section anchor="transporterror" numbered="true" toc="default">
          <name>TransportError</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
enum TransportError {
    no_error,
    internal_error,
    connection_refused,
    flow_control_error,
    stream_limit_error,
    stream_state_error,
    final_size_error,
    frame_encoding_error,
    transport_parameter_error,
    connection_id_limit_error,
    protocol_violation,
    invalid_token,
    application_error,
    crypto_buffer_exceeded
}
]]></artwork>
        </section>
        <section anchor="cryptoerror" numbered="true" toc="default">
          <name>CryptoError</name>
          <t>These errors are defined in the TLS document as "A TLS alert is turned into a QUIC
connection error by converting the one-byte alert description into a QUIC error
code. The alert description is added to 0x100 to produce a QUIC error code from
the range reserved for CRYPTO_ERROR."</t>
          <t>This approach maps badly to a pre-defined enum. As such, we define the
crypto_error string as having a dynamic component here, which should include the
hex-encoded value of the TLS alert description.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
enum CryptoError {
    crypto_error_{TLS_ALERT}
}
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="http3-data-field-definitions" numbered="true" toc="default">
      <name>HTTP/3 data field definitions</name>
      <section anchor="http3-frames" numbered="true" toc="default">
        <name>HTTP/3 Frames</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
type HTTP3Frame = DataFrame | HeadersFrame | PriorityFrame | CancelPushFrame | SettingsFrame | PushPromiseFrame | GoAwayFrame | MaxPushIDFrame | DuplicatePushFrame | ReservedFrame | UnknownFrame;
]]></artwork>
        <section anchor="dataframe" numbered="true" toc="default">
          <name>DataFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class DataFrame{
    frame_type:string = "data";

    raw?:bytes;
}
]]></artwork>
        </section>
        <section anchor="headersframe" numbered="true" toc="default">
          <name>HeadersFrame</name>
          <t>This represents an <em>uncompressed</em>, plaintext HTTP Headers frame (e.g., no QPACK
compression is applied).</t>
          <t>For example:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
headers: [{"name":":path","value":"/"},{"name":":method","value":"GET"},{"name":":authority","value":"127.0.0.1:4433"},{"name":":scheme","value":"https"}]
]]></artwork>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class HeadersFrame{
    frame_type:string = "header";
    headers:Array<HTTPHeader>;
}

class HTTPHeader {
    name:string;
    value:string;
}
]]></artwork>
        </section>
        <section anchor="cancelpushframe" numbered="true" toc="default">
          <name>CancelPushFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class CancelPushFrame{
    frame_type:string = "cancel_push";
    push_id:uint64;
}
]]></artwork>
        </section>
        <section anchor="settingsframe" numbered="true" toc="default">
          <name>SettingsFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class SettingsFrame{
    frame_type:string = "settings";
    settings:Array<Setting>;
}

class Setting{
    name:string;
    value:string;
}
]]></artwork>
        </section>
        <section anchor="pushpromiseframe" numbered="true" toc="default">
          <name>PushPromiseFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class PushPromiseFrame{
    frame_type:string = "push_promise";
    push_id:uint64;

    headers:Array<HTTPHeader>;
}
]]></artwork>
        </section>
        <section anchor="goawayframe" numbered="true" toc="default">
          <name>GoAwayFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class GoAwayFrame{
    frame_type:string = "goaway";
    stream_id:uint64;
}
]]></artwork>
        </section>
        <section anchor="maxpushidframe" numbered="true" toc="default">
          <name>MaxPushIDFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class MaxPushIDFrame{
    frame_type:string = "max_push_id";
    push_id:uint64;
}
]]></artwork>
        </section>
        <section anchor="duplicatepushframe" numbered="true" toc="default">
          <name>DuplicatePushFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class DuplicatePushFrame{
    frame_type:string = "duplicate_push";
    push_id:uint64;
}
]]></artwork>
        </section>
        <section anchor="reservedframe" numbered="true" toc="default">
          <name>ReservedFrame</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class ReservedFrame{
    frame_type:string = "reserved";
}
]]></artwork>
        </section>
        <section anchor="unknownframe-1" numbered="true" toc="default">
          <name>UnknownFrame</name>
          <t>HTTP/3 re-uses QUIC's UnknownFrame definition, since their values and usage
overlaps.</t>
        </section>
      </section>
      <section anchor="applicationerror" numbered="true" toc="default">
        <name>ApplicationError</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
enum ApplicationError{
    http_no_error,
    http_general_protocol_error,
    http_internal_error,
    http_stream_creation_error,
    http_closed_critical_stream,
    http_frame_unexpected,
    http_frame_error,
    http_excessive_load,
    http_id_error,
    http_settings_error,
    http_missing_settings,
    http_request_rejected,
    http_request_cancelled,
    http_request_incomplete,
    http_early_response,
    http_connect_error,
    http_version_fallback
}
]]></artwork>
      </section>
    </section>
    <section anchor="qpack-data-type-definitions" numbered="true" toc="default">
      <name>QPACK DATA type definitions</name>
      <section anchor="qpack-instructions" numbered="true" toc="default">
        <name>QPACK Instructions</name>
        <t>Note: the instructions do not have explicit encoder/decoder types, since there is
no overlap between the insturctions of both types in neither name nor function.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
type QPackInstruction = SetDynamicTableCapacityInstruction | InsertWithNameReferenceInstruction | InsertWithoutNameReferenceInstruction | DuplicateInstruction | HeaderAcknowledgementInstruction | StreamCancellationInstruction | InsertCountIncrementInstruction;
]]></artwork>
        <section anchor="setdynamictablecapacityinstruction" numbered="true" toc="default">
          <name>SetDynamicTableCapacityInstruction</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class SetDynamicTableCapacityInstruction {
    instruction_type:string = "set_dynamic_table_capacity";

    capacity:uint32;
}
]]></artwork>
        </section>
        <section anchor="insertwithnamereferenceinstruction" numbered="true" toc="default">
          <name>InsertWithNameReferenceInstruction</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class InsertWithNameReferenceInstruction {
    instruction_type:string = "insert_with_name_reference";

    table_type:"static"|"dynamic";

    name_index:uint32;

    huffman_encoded_value:boolean;

    value_length?:uint32;
    value?:string;
}
]]></artwork>
        </section>
        <section anchor="insertwithoutnamereferenceinstruction" numbered="true" toc="default">
          <name>InsertWithoutNameReferenceInstruction</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class InsertWithoutNameReferenceInstruction {
    instruction_type:string = "insert_without_name_reference";

    huffman_encoded_name:boolean;

    name_length?:uint32;
    name?:string;

    huffman_encoded_value:boolean;

    value_length?:uint32;
    value?:string;
}
]]></artwork>
        </section>
        <section anchor="duplicateinstruction" numbered="true" toc="default">
          <name>DuplicateInstruction</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class DuplicateInstruction {
    instruction_type:string = "duplicate";

    index:uint32;
}
]]></artwork>
        </section>
        <section anchor="headeracknowledgementinstruction" numbered="true" toc="default">
          <name>HeaderAcknowledgementInstruction</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class HeaderAcknowledgementInstruction {
    instruction_type:string = "header_acknowledgement";

    stream_id:uint64;
}
]]></artwork>
        </section>
        <section anchor="streamcancellationinstruction" numbered="true" toc="default">
          <name>StreamCancellationInstruction</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class StreamCancellationInstruction {
    instruction_type:string = "stream_cancellation";

    stream_id:uint64;
}
]]></artwork>
        </section>
        <section anchor="insertcountincrementinstruction" numbered="true" toc="default">
          <name>InsertCountIncrementInstruction</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class InsertCountIncrementInstruction {
    instruction_type:string = "insert_count_increment";

    increment:uint32;
}
]]></artwork>
        </section>
      </section>
      <section anchor="qpack-header-compression" numbered="true" toc="default">
        <name>QPACK Header compression</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
type QPackHeaderBlockRepresentation = IndexedHeaderField | LiteralHeaderFieldWithName | LiteralHeaderFieldWithoutName;
]]></artwork>
        <section anchor="indexedheaderfield" numbered="true" toc="default">
          <name>IndexedHeaderField</name>
          <t>Note: also used for "indexed header field with post-base index"</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class IndexedHeaderField {
    header_field_type:string = "indexed_header";

    table_type:"static"|"dynamic"; // MUST be "dynamic" if is_post_base is true
    index:uint32;

    is_post_base:boolean = false; // to represent the "indexed header field with post-base index" header field type
}
]]></artwork>
        </section>
        <section anchor="literalheaderfieldwithname" numbered="true" toc="default">
          <name>LiteralHeaderFieldWithName</name>
          <t>Note: also used for "Literal header field with post-base name reference"</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class LiteralHeaderFieldWithName {
    header_field_type:string = "literal_with_name";

    preserve_literal:boolean; // the 3rd "N" bit
    table_type:"static"|"dynamic"; // MUST be "dynamic" if is_post_base is true
    name_index:uint32;

    huffman_encoded_value:boolean;
    value_length?:uint32;
    value?:string;

    is_post_base:boolean = false; // to represent the "Literal header field with post-base name reference" header field type
}
]]></artwork>
        </section>
        <section anchor="literalheaderfieldwithoutname" numbered="true" toc="default">
          <name>LiteralHeaderFieldWithoutName</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class LiteralHeaderFieldWithoutName {
    header_field_type:string = "literal_without_name";

    preserve_literal:boolean; // the 3rd "N" bit

    huffman_encoded_name:boolean;
    name_length?:uint32;
    name?:string;

    huffman_encoded_value:boolean;
    value_length?:uint32;
    value?:string;
}
]]></artwork>
        </section>
        <section anchor="qpackheaderblockprefix" numbered="true" toc="default">
          <name>QPackHeaderBlockPrefix</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
class QPackHeaderBlockPrefix {
    required_insert_count:uint32;
    sign_bit:boolean;
    delta_base:uint32;
}
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="change-log" numbered="true" toc="default">
      <name>Change Log</name>
      <section anchor="since-draft-01" numbered="true" toc="default">
        <name>Since draft-01:</name>
        <t>Major changes:</t>
        <ul spacing="normal">
          <li>Moved data_moved from http to transport. Also made the "from" and "to" fields
flexible strings instead of an enum (#111,#65)</li>
          <li>Moved packet_type fields to PacketHeader. Moved packet_size field out of
PacketHeader to RawInfo:length (#40)</li>
          <li>Made events that need to log packet_type and packet_number use a header field
instead of logging these fields individually</li>
          <li>Added support for logging retry, stateless reset and initial tokens (#94,#86,#117)</li>
          <li>Moved separate general event categories into a single category "generic" (#47)</li>
          <li>Added "transport:connection_closed" event (#43,#85,#78,#49)</li>
          <li>Added version_information and alpn_information events (#85,#75,#28)</li>
          <li>Added parameters_restored events to help clarify 0-RTT behaviour (#88)</li>
        </ul>
        <t>Smaller changes:</t>
        <ul spacing="normal">
          <li>Merged loss_timer events into one loss_timer_updated event</li>
          <li>Field data types are now strongly defined (#10,#39,#36,#115)</li>
          <li>Renamed qpack instruction_received and instruction_sent to instruction_created
and instruction_parsed (#114)</li>
          <li>Updated qpack:dynamic_table_updated.update_type. It now has the value "inserted"
instead of "added" (#113)</li>
          <li>Updated qpack:dynamic_table_updated. It now has an "owner" field to
differentiate encoder vs decoder state (#112)</li>
          <li>Removed push_allowed from http:parameters_set (#110)</li>
          <li>Removed explicit trigger field indications from events, since this was moved to
be a generic property of the "data" field (#80)</li>
          <li>Updated transport:connection_id_updated to be more in line with other similar
events. Also dropped importance from Core to Base (#45)</li>
          <li>Added length property to PaddingFrame (#34)</li>
          <li>Added packet_number field to transport:frames_processed (#74)</li>
          <li>Added a way to generically log packet header flags (first 8 bits) to
PacketHeader</li>
          <li>Added additional guidance on which events to log in which situations (#53)</li>
          <li>Added "simulation:scenario" event to help indicate simulation details</li>
          <li>Added "packets_acked" event (#107)</li>
          <li>Added "datagram_ids" to the datagram_X and packet_X events to allow tracking of
coalesced QUIC packets (#91)</li>
          <li>Extended connection_state_updated with more fine-grained states (#49)</li>
        </ul>
      </section>
      <section anchor="since-draft-00" numbered="true" toc="default">
        <name>Since draft-00:</name>
        <ul spacing="normal">
          <li>Event and category names are now all lowercase</li>
          <li>Added many new events and their definitions</li>
          <li>"type" fields have been made more specific (especially important for PacketType
fields, which are now called packet_type instead of type)</li>
          <li>Events are given an importance indicator (issue #22)</li>
          <li>Event names are more consistent and use past tense (issue #21)</li>
          <li>Triggers have been redefined as properties of the "data" field and updated for most events (issue #23)</li>
        </ul>
      </section>
    </section>
    <section anchor="design-variations" numbered="true" toc="default">
      <name>Design Variations</name>
      <t>TBD</t>
    </section>
    <section anchor="acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>Thanks to Marten Seemann, Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen
Petrides, Jari Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy
Laine, Kazu Yamamoto, Christian Huitema, and Lucas Pardue for their feedback and
suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIALOVoF8AA+1963bj1rHmfzwFFnvNsuQh1Vc7Nj1Oj6yWbcV9O5KcnIzj
RUMkJOE0CTAA2Gol9nmfeYf5Ny82VV9V7QsAUeqOk8maSc5JWsRlY+/atet+
mUwmSVu0y3ya/tv3RwdpVi7Sb09PX99/nOZv87JNF/l5URZtUZVNel7V6Z+X
1UWyqOZltqJ3FnV23k5WWf1uwjcmeGcSvDP586aYTy4fTx48SuZZm19U9fU0
bdpFkhTrepq29aZpHz148Dndz+o8m6andVY266puk6uqfnNRV5u1zC15k1/T
pcU0PSrbvC7zdvKMP58kTUvTnmXLqqQpXedNsi6m6Q9tNR+nNNOiXNCkxmlD
Y9b5eUN/Xa/0j7Yu5nRrXq3Wmf6xoofpVlEuizL/MUmyTXtZ1dMkTSf035Ru
NNP0eC99QYvGBYHEcXVWlP5iVV9M02+zpsmXbfp9WbzN66Zor3EvX2XFcprW
/MYew+6/by7lyb2zPEnKql5lLb3B3+SFT06P91+evH51fDrF+7pfI743TffT
75+9nnyVNfkifbFZtsV6mb+jv3knT/L5ps49SEd4v8nrIm+K8ryS8dIOQG1b
i7w9l/1rbYDJ40d4ZUFbOU0fPXj0YPLwweTBQ1z0kOL/TPRfhdjv9tKj67y8
yGp3XQD3u6zMercAvq+zpl1eu2t1xavOF0Vb1cPfeLGXnl5Wq6YqO9+gbWlp
d7o38ZUX1V+K5TK76TPYAD4RMey/vV7ndZu/awW453mdvq4rQrlqmf6e97oq
08fpjhyl3dHNQHv/zbhs27Xtw1aQEzi+KprLat2FRvEm794BKPbfZISaWyHx
b6/3D77roCEupd/m2YKgcEBHqc4bAIDphUBgCACPHnwgAP5MZ/XN5OHnt0Ng
fy/9uubzv1x2YLC/zMr+PUW7eX5WVW9uhMPzV99MXuwfvYzB8CIjDCMaeFGU
F2kzv6RT7ghmf/kPmSC+z/I9jaUtKifyARtkKxBCWuUB0KFXbvU30KweHBKe
siNUyWQySbMzoqdERpPk9LJomPRuVsJCmnldnOUNkddyXudtDqAMMBimWe1l
XtTpKm8zghdAmHQ406TOlwTKhQzQ8KHPm1x/pXPaWBqjTM/o0uosXyzoyQLX
0svi4jKvkyU9urQ9wvflkR/c1v64J0taFYvFkmjyPd6Vulps5jzRmxfIH3mb
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
hDwnyZHdJ/xM0mwuNC2M3Wf/B8ygjTs/IgEA

-->

</rfc>
