<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-nandakumar-moq-mix-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="mix">MoQ Interconnect Exchange (MIX)</title>
    <seriesInfo name="Internet-Draft" value="draft-nandakumar-moq-mix-00"/>
    <author fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@iii.ca</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>Applications and Real-Time</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>MoQ</keyword>
    <keyword>MoQTransport</keyword>
    <keyword>Relay</keyword>
    <keyword>Interconnect</keyword>
    <keyword>Peering</keyword>
    <abstract>
      <?line 67?>

<t>This document specifies MoQ Interconnect Exchange (MIX), a protocol
that allows Media Over QUIC (MoQ) relays to discover each other,
exchange reachability and subscription information, and forward MoQ
objects across administrative and topological boundaries. MIX carries
its control state as MoQ tracks.</t>
      <t>This work is outside the scope of the IETF Media Over QUIC (MoQ)
working group. It is discussed on that working group's mailing list,
moq@ietf.org, because that is where the people interested in MoQ relay
interconnection are.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://suhasHere.github.io/moq-relay-interconnect/draft-nandakumar-moq-mix.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-nandakumar-moq-mix/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/suhasHere/moq-relay-interconnect"/>.</t>
    </note>
  </front>
  <middle>
    <?line 80?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Media Over QUIC Transport <xref target="MoQTransport"/> (MOQT) defines how endpoints
publish and subscribe to media tracks through relays. MOQT itself is
scoped to a single relay: it does not specify how relays
exchange the reachability and subscription information
they need to forward objects between their respective subscriber
populations.</t>
      <t>Related work (<xref target="MOQ-CLUSTER"/>) addresses relay coordination within a single
cluster or CDN but does not define cross-domain discovery, peering
negotiation, or policy-governed fan-out.</t>
      <t>This document specifies MoQ Interconnect Exchange (MIX), which closes
that gap by reusing MOQT for the inter-relay control plane and defining
a data plane that operates both within a single administrative domain
and across administrative boundaries.</t>
      <section anchor="moqt-benefits">
        <name>Why MOQT for Relay Control</name>
        <t>MIX uses MOQT facilities where their existing semantics fit the control
plane, so the request, fan-out, scheduling, and object-retrieval
behavior of the control plane comes directly from MOQT. MIX does not assume that every MOQT relay
caches objects or that MOQT itself supplies relay-to-relay routing.</t>
        <ul spacing="normal">
          <li>
            <t>Namespace discovery and separate tracks. Relays publish MIX
namespaces with <tt>PUBLISH_NAMESPACE</tt> and discover peers via
<tt>SUBSCRIBE_NAMESPACE</tt> / <tt>NAMESPACE</tt> / <tt>NAMESPACE_DONE</tt>. <tt>nodes</tt>, <tt>publishers</tt>,
and <tt>subscribers</tt> are independent tracks so a peer can subscribe to only the
state it needs and MIX can apply distinct retention, priority, and
admission policy to each.</t>
          </li>
          <li>
            <t>Live updates plus state repair. <tt>SUBSCRIBE</tt> carries live updates.
Draft 22's <tt>FILL_PARAMETERS</tt> mechanism, when backed by a cache,
recovers retained objects after a reconnect or missed update. Because
MOQT caching is optional, MIX needs its own recovery for the case
where a fill is incomplete (<xref target="ib-subscribe"/>).</t>
          </li>
          <li>
            <t>Priority scheduling and delivery deadlines. MOQT subgroup streams
and datagrams, publisher priorities, and <tt>OBJECT_DELIVERY_TIMEOUT</tt> /
<tt>SUBGROUP_DELIVERY_TIMEOUT</tt> let MIX prioritize routing-critical state
and bound how long an advertisement consumes delivery effort.
Priorities influence scheduling only, and deadlines may drop state
(<xref target="ib-subscribe"/>).</t>
          </li>
          <li>
            <t>Direct use of MOQT controls. MIX uses these MOQT controls as
defined, without re-encoding them in MIX messages. MIX-specific messages
carry only what MOQT does not represent: originator identity, freshness,
path, and target-set information.</t>
          </li>
        </ul>
      </section>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>The following terms are used throughout this document:</t>
        <dl>
          <dt>Node:</dt>
          <dd>
            <t>A MIX-capable MOQT relay. Each Node is identified by a 128-bit Node ID,
described in <xref target="node-id"/>.</t>
          </dd>
          <dt>MIX Edge Node:</dt>
          <dd>
            <t>A Node that connects MOQT application publishers or subscribers to the
inter-relay network. It originates publish and subscribe state for its
local clients and injects or delivers their objects through MIX.</t>
          </dd>
          <dt>MIX Transit Node:</dt>
          <dd>
            <t>A Node that carries relay reachability and forwarding state and
forwards objects along selected inter-relay paths. It typically does
not terminate application publisher or subscriber sessions.</t>
          </dd>
          <dt>MIX Control Node:</dt>
          <dd>
            <t>A Node that exchanges Publisher and Subscriber Table state on behalf of other Nodes and
does not forward objects. Control Nodes are used in the split
deployment model (<xref target="split-model"/>) and advertise <tt>type = 2</tt> in
<tt>node_info</tt> (<xref target="node-info"/>).</t>
          </dd>
          <dt>Forwarding Node:</dt>
          <dd>
            <t>A MIX Edge Node or MIX Transit Node; any Node that is not a Control
Node.</t>
          </dd>
          <dt>Control Session:</dt>
          <dd>
            <t>A QUIC connection between two Nodes used to exchange MIX control-plane
tracks, including <tt>announce</tt>, <tt>nodes</tt>, <tt>publishers</tt>, and <tt>subscribers</tt> (<xref target="control-plane"/>).
This connection also carries the MOQT control messages needed to
establish and manage its subscriptions and publications.</t>
          </dd>
          <dt>Data Session:</dt>
          <dd>
            <t>A separate QUIC connection between two Nodes used to forward
inter-relay data (<xref target="data-plane"/>). It also uses MOQT control messages
to establish the session and its <tt>delivery-node-sets</tt> track subscription. Those MOQT messages
manage the transport session; they do not make it a MIX control
Session.</t>
          </dd>
          <dt>Peering:</dt>
          <dd>
            <t>A MIX relationship between two Nodes. It consists of a Control
Session carrying the Node, Publisher, and Subscriber Table tracks in
the peering's scope
(<xref target="peering-scope"/>) and, when that scope includes the Node Table and data is
to be forwarded, a separate Data Session. Each
connection has its own MOQT session state. An <tt>delivery-node-sets</tt> track is associated
with the Data Session whose downstream targets it describes.</t>
          </dd>
          <dt>Session:</dt>
          <dd>
            <t>In this document, an unqualified Session means a Control Session.
When the Data Session is intended, it is named explicitly.</t>
          </dd>
          <dt>Node Table:</dt>
          <dd>
            <t>The Nodes this Node knows about, one entry per Node ID. Each entry
holds that Node's attributes and public key, and one candidate path to
it from each peer. It answers "which Nodes exist, and how do I reach
each one?" It is filled by <tt>NODE_INFO_ADVERTISEMENT</tt> and <tt>NODE_INFO_WITHDRAWAL</tt>.</t>
          </dd>
          <dt>Publisher Table:</dt>
          <dd>
            <t>The tracks that are published, one entry per originating Edge Node
and track. Each entry says that the Edge Node has a local publisher
for the track, and which forwarding mode it wants. It answers "where
does track T come from?" It is filled by <tt>PUBLISH_INFO_ADVERTISEMENT</tt> and
<tt>PUBLISH_INFO_WITHDRAWAL</tt>.</t>
          </dd>
          <dt>Subscriber Table:</dt>
          <dd>
            <t>The tracks that are wanted, one entry per originating Edge Node and
track. Each entry says that the Edge Node has local subscribers for
the track. It answers "who wants track T?" It is filled by
<tt>SUBSCRIBE_INFO_ADVERTISEMENT</tt> and <tt>SUBSCRIBE_INFO_WITHDRAWAL</tt>.</t>
          </dd>
        </dl>
        <t>Together, the Publisher Table says where a track comes from, the Subscriber Table says where it
must go, and the Node Table says how to get between them. Full details are in
<xref target="information-bases"/>.</t>
        <dl>
          <dt>Originator:</dt>
          <dd>
            <t>The Node that a Node, Publisher, or Subscriber Table entry describes, and the only Node that can create
or withdraw it. For a Node Table entry it is the Node itself (<tt>node_info.id</tt>).
For a Publisher or Subscriber Table entry it is the Edge Node whose local publisher or
subscriber the entry describes (<tt>source_node_id</tt>). The originator
signs the entry (<xref target="origin-auth"/>); other Nodes only re-publish it. The
term follows BGP route reflection <xref target="RR"/>, where <tt>ORIGINATOR_ID</tt> names
the router that injected a route.</t>
          </dd>
          <dt>Advertisement / Withdrawal:</dt>
          <dd>
            <t>An advertisement installs or updates an entry in a Node, Publisher,
or Subscriber Table; a withdrawal removes it. Both are signed by the
entry's originator. The messages for each table are defined in
<xref target="adv-wd"/>.</t>
          </dd>
          <dt>Delivery Node Set:</dt>
          <dd>
            <t>Forwarding state for one track on one Data Session: the Edge Nodes
with subscribers for the track that it must reach by way of that Data
Session's downstream Node. Each Data Session has one Delivery Node Set
per track it carries. The upstream Node builds it from its Subscriber Table (who
wants the track) and its Node Table (which next hop leads to each of them),
and sends it on the Data Session's <tt>delivery-node-sets</tt> track. Each
downstream Node splits it for its own next hops, so the set narrows
at every hop and the track is copied only where paths split. For
example, if track T has subscribers behind B1 and B2, both reached
through Transit X, the Delivery Node Set for T on the Data Session to
X lists {B1, B2}; X then sends {B1} toward B1 and {B2} toward B2.
See <xref target="sns-concept"/>.</t>
          </dd>
          <dt>Delivery Node Set Id:</dt>
          <dd>
            <t>A 32-bit label that the upstream Node of a Data Session assigns to
one Delivery Node Set on that Data Session. In pipelined mode it
travels with every forwarded object (<xref target="data-header"/>), so the
downstream Node can find the set without parsing the track identity.
It has meaning only on one Data Session.
See <xref target="sns-concept"/>.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="mix-overview">
      <name>MIX Overview</name>
      <t>This section is informative.</t>
      <t>Each MIX participant is a Node: an MOQT relay that also implements
MIX. A Node uses two kinds of Session, each a separate QUIC
connection. A Control Session carries MIX state as MOQT tracks: each
Node publishes its Node, Publisher, and Subscriber Tables as tracks to
which its peers subscribe. A Data
Session carries forwarded objects and is opened only when a track
needs to flow to a downstream peer, and only between Nodes that
exchange Node Tables. Whether a peering also carries the Publisher and Subscriber Tables depends
on the deployment: every peering carries all three when every Node
runs both planes, while a large deployment can move the exchange of
the Publisher and Subscriber Tables to a small set of Control Nodes (<xref target="deployment-models"/>).</t>
      <t>A track flows through MIX as follows:</t>
      <ol spacing="normal" type="1"><li>
          <t>Discovery. Each Node publishes an <tt>announce</tt> track under a
well-known namespace prefix. Nodes learn each other's Node IDs by
subscribing to that prefix (<xref target="control-plane"/>).</t>
        </li>
        <li>
          <t>Peering. Two Nodes subscribe to each other's Node, Publisher, and Subscriber
Table tracks over a
Control Session. Which of Node, Publisher, and Subscriber Tables a peering carries
is its scope (<xref target="peering-scope"/>).</t>
        </li>
        <li>
          <t>Flooding. Each Node advertises its own Node Table entry and
re-advertises entries learned from peers, appending itself to the
path. Publishers originate Publisher Table entries and subscribers originate
Subscriber Table entries (<xref target="information-bases"/>). Each advertisement is signed
by the Node that originated it (<xref target="origin-auth"/>).</t>
        </li>
        <li>
          <t>Path selection. Each Node selects a best egress Session per
destination Node, considering only paths on which every hop
supports the track's requested forwarding mode (<xref target="selection"/>).</t>
        </li>
        <li>
          <t>Fan-out setup. For each track it forwards, a Node groups the
track's destination Nodes by their best egress. It opens (or
reuses) a Data Session to each of those next hops and publishes on
it the track's Delivery Node Set: the destinations to be reached through that next
hop, labelled with a Delivery Node Set Id (<xref target="sns-track"/>).</t>
        </li>
        <li>
          <t>Delivery. Objects follow the selected path in the track's
forwarding mode (<xref target="forwarding-modes"/>). At each hop, the downstream
Node finds the Delivery Node Set for an arriving object (by its Id in pipelined
mode, by track in native mode), repeats the grouping of step 5 for
its own next hops, and forwards the object under its own Delivery Node Set Ids
(<xref target="sns"/>).</t>
        </li>
      </ol>
      <t>Each entry in the Node, Publisher, and Subscriber Tables then moves
through a few simple states:</t>
      <figure>
        <name>Lifecycle of Node, Publisher, and Subscriber Table entries</name>
        <artwork><![CDATA[
Node Table entry: is there a path to its Node?

                     |  advertisement
                     v
              +-------------+
           +--|  REACHABLE  |
           |  +-------------+
           |     |       ^
           |     | path  | path
           |     | lost  | back
           |     v       |
           |  +-------------+
withdrawal |  | UNREACHABLE |
           |  +-------------+
           |         |
           |         |  ORIGINATOR_UNREACH_HOLD expires
           |         v
           |  +-------------+
           +->|   REMOVED   |
              +-------------+

Publisher or Subscriber Table entry: is its originator reachable?

                     |  advertisement
                     v
              +-------------+
           +--|    ACTIVE   |
           |  +-------------+
           |     |       ^
           |     | lost  | back
           |     |       |
           |     v       |
withdrawal |  +-------------+
        or |  |   UNUSABLE  |
   restart |  +-------------+
           |         |
           |         |  ORIGINATOR_UNREACH_HOLD expires
           |         v
           |  +-------------+
           +->|   REMOVED   |
              +-------------+
]]></artwork>
      </figure>
      <t>A Publisher or Subscriber Table entry is UNUSABLE exactly while its originator's Node Table
entry is UNREACHABLE. "Restart" means the originator came back with a
newer <tt>origin_epoch</tt>. Both holds are <tt>ORIGINATOR_UNREACH_HOLD</tt>. In a
split deployment, a Forwarding Node also removes reflected entries if
it has had no Control Node for <tt>CONTROL_STALE_HOLD</tt>. The full rules are
in <xref target="nib-candidates"/> and <xref target="ib-lifetime"/>.</t>
    </section>
    <section anchor="node-id">
      <name>Node Identity</name>
      <t>Each Node has an Ed25519 <xref target="RFC8032"/> signing key pair. The Node ID
is a 128-bit value derived from the Node's Ed25519 public key:</t>
      <figure>
        <name>Node ID derivation</name>
        <artwork><![CDATA[
  node_id = first 16 bytes of SHA-256(ed25519_public_key),
            as a 128-bit value in network byte order
]]></artwork>
      </figure>
      <t>Because the Node ID is bound to the Node's public key, no separate
identity-to-key mapping is required: a receiver that has the Node's
public key can verify that any Node ID claim is authentic. This makes
MIX originator authentication (Section <xref target="origin-auth"/>) self-verifying: an
originating advertisement carries a signature by the Ed25519 private
key whose derived Node ID matches the advertisement's <tt>source_node_id</tt>.</t>
      <t>On receipt, a Node <bcp14>MUST</bcp14> verify that the public key in <tt>node_info</tt>
(<xref target="node-info"/>) derives the advertised ID using the formula above, in addition to
verifying the signature and local trust policy. A valid signature by
an unrelated key <bcp14>MUST NOT</bcp14> authenticate a claimed Node ID.</t>
      <t>The canonical textual form of a Node ID is four groups of eight
lowercase hexadecimal digits separated by colons; the colons <bcp14>MAY</bcp14> be
omitted for a compact form. Groups <bcp14>MUST NOT</bcp14> be shortened by trimming
leading zeros.</t>
      <figure>
        <name>Node ID textual form</name>
        <artwork><![CDATA[
  <group>    ::= 8HEXDIG
  <canonical> ::= <group> ":" <group> ":" <group> ":" <group>
  <compact>   ::= 32HEXDIG
]]></artwork>
      </figure>
      <t>Examples: <tt>1a2b3c4d:5e6f7081:9200aabb:ccddeeff</tt>,
<tt>1a2b3c4d5e6f70819200aabbccddeeff</tt>.</t>
      <t>Nodes <bcp14>MAY</bcp14> be configured with a static Ed25519 key pair or <bcp14>MAY</bcp14> generate
one at startup. Once generated, the key pair <bcp14>SHOULD</bcp14> be persisted across
restarts to preserve Node ID stability.</t>
    </section>
    <section anchor="information-bases">
      <name>Node, Publisher, and Subscriber Tables</name>
      <t>Each Node maintains a Node Table, a Publisher Table, and a Subscriber
Table and, for each of its Data
Sessions, a set of Delivery Node Sets:</t>
      <table>
        <name>State held by each Node</name>
        <thead>
          <tr>
            <th align="left">State</th>
            <th align="left">Describes</th>
            <th align="left">Keyed by</th>
            <th align="left">Stores</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Node Table</td>
            <td align="left">Reachable Nodes</td>
            <td align="left">Node ID</td>
            <td align="left">Most recent <tt>node_info</tt>, one candidate path per peer, and the computed best egress Session</td>
          </tr>
          <tr>
            <td align="left">Publisher Table</td>
            <td align="left">Published tracks</td>
            <td align="left">(<tt>source_node_id</tt>, <tt>full_name_hash</tt>)</td>
            <td align="left">Most recent <tt>publish_info</tt></td>
          </tr>
          <tr>
            <td align="left">Subscriber Table</td>
            <td align="left">Requested tracks</td>
            <td align="left">(<tt>source_node_id</tt>, <tt>full_name_hash</tt>)</td>
            <td align="left">Most recent <tt>subscribe_info</tt></td>
          </tr>
          <tr>
            <td align="left">Delivery Node Set</td>
            <td align="left">Where each forwarded track must go, per Data Session</td>
            <td align="left">(Data Session, Delivery Node Set Id)</td>
            <td align="left">Track and destination Node IDs (<xref target="sns-concept"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>Each of these tables is filled by the advertisement and withdrawal
messages defined in <xref target="adv-wd"/>. On
Session teardown a Node <bcp14>MUST</bcp14> remove every Node Table candidate learned from
the departing peer (<xref target="nib-candidates"/>). Publisher and Subscriber Table entries are not
withdrawn on Session teardown; their lifetime follows the reachability
of their originator (<xref target="ib-lifetime"/>).</t>
      <t>Best-egress selection is computed per Node Table entry using the algorithm in
<xref target="selection"/>.</t>
      <section anchor="sequence-comparison">
        <name>Sequence Comparison</name>
        <t>Every advertisement and withdrawal carries two freshness fields, both set by its originator:</t>
        <ul spacing="normal">
          <li>
            <t><tt>origin_epoch</tt> (64 bits) identifies the originator's current incarnation
(<xref target="origin-epoch"/>).</t>
          </li>
          <li>
            <t><tt>sequence</tt> (64 bits) counts the advertisements and withdrawals the originator has published for
one key in its Node, Publisher, or Subscriber Table
(<xref target="information-bases"/>). It increases with every message
for that key and <bcp14>MUST NOT</bcp14> wrap or be reused within an epoch.</t>
          </li>
        </ul>
        <t>An originator <bcp14>MUST</bcp14> either persist its epoch and per-key sequences across
restarts or advance <tt>origin_epoch</tt> before it publishes again.</t>
        <t>A receiver orders messages for the same originator and key by the pair
<tt>(origin_epoch, sequence)</tt>, comparing <tt>origin_epoch</tt> first. It accepts
a message only if its pair is greater than the stored one, and
re-floods only messages it accepts.</t>
        <t>For a <tt>NODE_INFO_ADVERTISEMENT</tt> (<xref target="msg-node-info"/>), this comparison covers only the originator-signed
fields of <tt>node_info</tt>. Its <tt>path</tt> is unsigned and tracked per peer
(<xref target="nib-candidates"/>), so an advertisement whose pair equals the stored one is not
accepted as new but still replaces the sending peer's candidate path.</t>
      </section>
      <section anchor="nib-candidates">
        <name>Candidate Paths and Unreachability</name>
        <t>A Node can usually reach another Node through more than one peer. For
each Node Table entry <tt>E</tt>, it therefore keeps one candidate path per peer: the
most recent <tt>path</tt> that peer advertised for <tt>E.id</tt>. Path selection
(<xref target="selection"/>) chooses the best egress among these candidates. When
the best one disappears, the Node fails over to the next without
waiting for the originator to re-advertise.</t>
        <t>A candidate changes only on one of four events, each tied to a single
peer <tt>S</tt>:</t>
        <table>
          <name>Events that change Node Table candidates</name>
          <thead>
            <tr>
              <th align="left">Event on Session S</th>
              <th align="left">Effect</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>NODE_INFO_ADVERTISEMENT</tt> for <tt>E.id</tt> (<xref target="msg-node-info"/>) whose <tt>(origin_epoch, sequence)</tt> equals or exceeds the stored one</td>
              <td align="left">
                <tt>S</tt>'s candidate becomes the received path. If that path contains the local Node ID, <tt>S</tt> reaches <tt>E.id</tt> only through this Node, so <tt>S</tt>'s candidate is removed instead.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>NODE_UNREACH</tt> for <tt>E.id</tt> (<xref target="msg-node-unreach"/>)</td>
              <td align="left">
                <tt>S</tt>'s candidate is removed.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>S</tt> enters <tt>CLOSED</tt></td>
              <td align="left">
                <tt>S</tt>'s candidate is removed from every entry.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>NODE_INFO_WITHDRAWAL</tt> from <tt>E.id</tt> (<xref target="msg-node-info"/>)</td>
              <td align="left">
                <tt>E</tt> is removed with all its candidates, and the withdrawal is re-flooded.</td>
            </tr>
          </tbody>
        </table>
        <t>After any of these events, the Node re-runs path selection for <tt>E</tt> and
tells its own peers what changed:</t>
        <ul spacing="normal">
          <li>
            <t>If the best path changed materially, it re-publishes <tt>E</tt> on its <tt>nodes</tt>
track with its own element appended.</t>
          </li>
          <li>
            <t>If no candidate is left, <tt>E</tt> is unreachable. If the Node had
advertised <tt>E</tt>, it publishes <tt>NODE_UNREACH</tt> for <tt>E.id</tt> on its <tt>nodes</tt>
track, so that its peers remove their path through it.</t>
          </li>
        </ul>
        <t>The same rules then apply at each peer, so the loss of a path spreads
hop by hop and stops at Nodes that still have another candidate.</t>
        <t>An unreachable entry keeps its originator-signed fields for
<tt>ORIGINATOR_UNREACH_HOLD</tt> (default <tt>90 s</tt>) and is then removed. If a path
returns within that time, an advertisement with the same <tt>(origin_epoch,
sequence)</tt> restores a candidate without the originator having to
re-advertise.</t>
        <t><tt>NODE_UNREACH</tt> needs no signature because it can only remove the
candidate of the Session it arrived on, which is the path the sender
itself advertised. The sender could have the same effect by never
advertising that path, so accepting an unsigned <tt>NODE_UNREACH</tt> gives it
no new power.</t>
        <t>Holding one candidate per peer costs memory in proportion to the
number of Nodes times the number of peers. A Node <bcp14>MAY</bcp14> keep fewer
candidates than it has peers, at the cost of slower failover.</t>
      </section>
      <section anchor="ib-lifetime">
        <name>Publisher and Subscriber Table Lifetime</name>
        <t>Publisher and Subscriber Table entries describe their originator, not the path they arrived
on. A Publisher Table entry says that the originator publishes a track; a Subscriber Table entry
says that the originator has subscribers for one. A Node therefore keeps an
entry when the peer that delivered it goes away. It removes the entry
only when the originator's statement is no longer true, or the Node can no
longer count on hearing about it if it changes.</t>
        <t>The originator ends an entry in one of two ways:</t>
        <ul spacing="normal">
          <li>
            <t>Withdrawal. The originator sends <tt>PUBLISH_INFO_WITHDRAWAL</tt>
(<xref target="msg-publish-info"/>) or <tt>SUBSCRIBE_INFO_WITHDRAWAL</tt> (<xref target="msg-subscribe-info"/>)
when its last local publisher or subscriber for the track leaves. The
withdrawal floods like any other message, and each Node removes the entry
when it accepts the withdrawal.</t>
          </li>
          <li>
            <t>Restart. When a Node accepts a <tt>NODE_INFO_ADVERTISEMENT</tt> from the originator
with a newer <tt>origin_epoch</tt>, it removes every Publisher and Subscriber Table entry from
that originator with an older epoch. The restarted originator re-advertises
the entries that are still valid.</t>
          </li>
        </ul>
        <t>A Node also ends entries on its own when it can no longer rely on
hearing from the originator:</t>
        <ul spacing="normal">
          <li>
            <t>Originator unreachable. While the originator's Node Table entry is unreachable
(<xref target="nib-candidates"/>), the originator's entries are kept but not used for
path setup. If the originator is still unreachable after
<tt>ORIGINATOR_UNREACH_HOLD</tt>, they are removed.</t>
          </li>
          <li>
            <t>No Control Node. In a split deployment, a Forwarding Node that
has had no <tt>ESTABLISHED</tt> Reflection peering for <tt>CONTROL_STALE_HOLD</tt>
removes every entry it did not originate, because it may have missed
withdrawals (<xref target="control-node-loss"/>).</t>
          </li>
        </ul>
        <t>These local removals are not flooded. Every Node reaches the same
conclusion from its own Node Table or peering state.</t>
        <t>When an unreachable originator comes back, no special recovery is needed.
The Sessions that re-form across the repaired link fill from each other
(<xref target="ib-subscribe"/>), the Nodes there accept the originator's entries as new,
and normal flooding carries the entries on.</t>
      </section>
      <section anchor="selection">
        <name>Path Selection</name>
        <t>Path selection chooses, for each destination Node <tt>E.id</tt>, the peer
through which this Node sends data toward it: <tt>E</tt>'s best egress. It
works on <tt>E</tt>'s candidates (<xref target="nib-candidates"/>), one per peer, and runs
again whenever they change.</t>
        <t>A candidate is eligible unless:</t>
        <ul spacing="normal">
          <li>
            <t>its peer is a Control Node, which never forwards data; or</t>
          </li>
          <li>
            <t>it is being considered for a track whose Publisher Table entry requests
pipelined mode, and some hop on its path does not set the pipelined
bit (bit 1) of <tt>data_modes</tt> (<xref target="node-info"/>). Every Forwarding Node
supports native mode, so a native-mode track can use any eligible
candidate.</t>
          </li>
        </ul>
        <t>Among eligible candidates, the Node prefers:</t>
        <ol spacing="normal" type="1"><li>
            <t>the shortest path, counted as the sum of <tt>hop_count</tt> over its
elements. Without path aggregation (<xref target="path-aggregation"/>) this is
the number of elements; then</t>
          </li>
          <li>
            <t>the lowest cumulative smoothed round-trip time (sRTT): the sum of <tt>srtt_us</tt> over the path plus
the Node's own sRTT to the peer that advertised it.</t>
          </li>
        </ol>
        <t>Hop count decides first, and sRTT only breaks ties.</t>
        <t>The chosen peer's Session is cached on <tt>E</tt> as its best egress. The
Node recomputes it when that Session closes, when its candidate is
removed, or when a materially better candidate arrives. A change of
best egress moves <tt>E.id</tt> from the Delivery Node Set on the old egress Data Session to
the Delivery Node Set on the new one, for every track forwarded toward it (<xref target="sns"/>) and can lead the Node to re-publish <tt>E</tt> (<xref target="nib-candidates"/>).</t>
        <t>To judge "materially better", implementations <bcp14>SHOULD</bcp14> round sRTT values
(for example, to whole milliseconds) before comparing them, so that
sub-millisecond jitter does not make the best egress, and the
advertisements that depend on it, oscillate.</t>
      </section>
      <section anchor="sns-concept">
        <name>Delivery Node Sets</name>
        <t>The Node, Publisher, and Subscriber Tables say which Nodes exist, which tracks are published, and which
Edge Nodes have subscribers. To forward a track, a Node also needs to
know, on each Data Session, where the objects it sends there must end
up. That is the Delivery Node Set.</t>
        <t>An Delivery Node Set belongs to one track on one Data Session. It names the
destination Nodes, the Edge Nodes with subscribers for the track, that
the track must reach through the downstream Node of that Data Session.</t>
        <t>Delivery Node Sets are built hop by hop. The publisher's Edge Node takes the
destinations for the track from its Subscriber Table, groups them by best egress
(<xref target="selection"/>), and creates one Delivery Node Set per egress Data Session. Each
downstream Node receives that Delivery Node Set, groups its destinations again by its
own best egress, and creates its own Delivery Node Sets. At each hop a Delivery Node Set keeps
only the destinations still ahead on that branch, so a track is copied
exactly where its destinations' paths diverge:</t>
        <figure>
          <name>Delivery Node Sets for one track, built hop by hop</name>
          <artwork><![CDATA[
   E1's Subscriber Table: track T has subscribers behind B1, B2, B3

            {B1,B2}               {B1}
   [E1] --------------> [X] ------------> [B1]
     |                   |
     |                   |         {B2}
     |                   +--------------> [B2]
     |
     |             {B3}
     +------------------------------------> [B3]
]]></artwork>
        </figure>
        <t>Each Delivery Node Set is labelled with an Id that the upstream Node chooses and
that is unique on that Data Session. In pipelined mode every forwarded
object carries the Delivery Node Set Id (<xref target="data-header"/>), so the downstream Node
finds the Delivery Node Set with one lookup instead of parsing the track identity.
Delivery Node Set Ids have no meaning beyond their Data Session: each hop assigns its
own on its egress Data Sessions.</t>
        <t>An Delivery Node Set changes when a destination is added or removed (a Subscriber Table change)
or when a destination's best egress changes (a Node Table change). The
upstream Node then publishes the updated Delivery Node Set under the same Id, or
withdraws it when no destinations remain. Delivery Node Sets are published on each
Data Session's <tt>delivery-node-sets</tt> track (<xref target="sns-track"/>) as <tt>DELIVERY_NODE_SET_ADVERTISEMENT</tt>
and <tt>DELIVERY_NODE_SET_WITHDRAWAL</tt> (<xref target="msg-sns"/>). How a Node forwards objects
using them is specified in <xref target="sns"/>.</t>
      </section>
    </section>
    <section anchor="control-plane">
      <name>Control-Plane Track Layout</name>
      <t>MIX carries all of its state as MOQT tracks. Every track sits under the
namespace prefix <tt>("mix","v1")</tt>. The rest of the namespace tuple says
whose state the track holds and, for <tt>delivery-node-sets</tt>, which Data Session it
belongs to:</t>
      <table>
        <name>MIX tracks</name>
        <thead>
          <tr>
            <th align="left">Namespace</th>
            <th align="left">Track</th>
            <th align="left">Published by</th>
            <th align="left">Carried on</th>
            <th align="left">Contents</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>("mix","v1","announce","&lt;node-id&gt;")</tt></td>
            <td align="left">
              <tt>announce</tt></td>
            <td align="left">Every Node</td>
            <td align="left">Control Session</td>
            <td align="left">The Node's <tt>CONNECT</tt>, for discovery (<xref target="msg-connect"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>("mix","v1","&lt;node-id&gt;")</tt></td>
            <td align="left">
              <tt>nodes</tt></td>
            <td align="left">Every Node</td>
            <td align="left">Control Session</td>
            <td align="left">Node Table advertisements and withdrawals, and <tt>NODE_UNREACH</tt> (<xref target="msg-node-info"/>, <xref target="msg-node-unreach"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>("mix","v1","&lt;node-id&gt;")</tt></td>
            <td align="left">
              <tt>publishers</tt></td>
            <td align="left">Every Node</td>
            <td align="left">Control Session</td>
            <td align="left">Publisher Table advertisements and withdrawals (<xref target="msg-publish-info"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>("mix","v1","&lt;node-id&gt;")</tt></td>
            <td align="left">
              <tt>subscribers</tt></td>
            <td align="left">Every Node</td>
            <td align="left">Control Session</td>
            <td align="left">Subscriber Table advertisements and withdrawals (<xref target="msg-subscribe-info"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>("mix","v1","&lt;node-id&gt;")</tt></td>
            <td align="left">
              <tt>publishers-mesh</tt>, <tt>subscribers-mesh</tt></td>
            <td align="left">Control Nodes only</td>
            <td align="left">Control Session</td>
            <td align="left">Publisher and Subscriber Table entries reflected to other Control Nodes (<xref target="pib-sib-reflection"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>("mix","v1","&lt;node-id&gt;","&lt;sid&gt;")</tt></td>
            <td align="left">
              <tt>delivery-node-sets</tt></td>
            <td align="left">Upstream Node of the Data Session</td>
            <td align="left">That Data Session</td>
            <td align="left">One Delivery Node Set per track forwarded on that Data Session (<xref target="msg-sns"/>)</td>
          </tr>
        </tbody>
      </table>
      <t><tt>&lt;node-id&gt;</tt> is the textual form of the publishing Node's ID
(<xref target="node-id"/>). <tt>&lt;sid&gt;</tt> is a 128-bit Data Session Identifier, chosen by
the Node that opens the Data Session (<xref target="establishment"/>) and written in
the same textual form. The <tt>publishers-mesh</tt> and <tt>subscribers-mesh</tt> tracks carry the
same objects as <tt>publishers</tt> and <tt>subscribers</tt> and follow the same track semantics.</t>
      <t>Each Data Session has its own namespace, so its <tt>delivery-node-sets</tt> track is kept
apart from every other Data Session's while the track name stays the
fixed literal <tt>"delivery-node-sets"</tt>. A Node <bcp14>MAY</bcp14> list its active Data Sessions by
issuing a MOQT <tt>SUBSCRIBE_NAMESPACE</tt> on its own prefix
<tt>("mix","v1","&lt;node-id&gt;")</tt>: it receives one <tt>NAMESPACE</tt> message per
Data Session and a <tt>NAMESPACE_DONE</tt> when one is withdrawn.</t>
      <t>Discovery uses the separate <tt>announce</tt> prefix, so a Node can find every
other Node without a directory service. A MOQT <tt>SUBSCRIBE_NAMESPACE</tt> on
<tt>("mix","v1","announce")</tt> returns one <tt>NAMESPACE</tt> message per Node in
the mesh, and a <tt>NAMESPACE_DONE</tt> when a Node withdraws. A MOQT
<tt>SUBSCRIBE</tt> to a Node's <tt>announce</tt> track then retrieves its <tt>CONNECT</tt>
(<xref target="establishment"/>).</t>
      <t>How each track numbers its groups and objects, its priority, and how
to subscribe to it are given in <xref target="track-semantics"/>.</t>
      <section anchor="track-semantics">
        <name>Track Semantics</name>
        <t>Each MIX control track specifies an <tt>Object priority</tt> value for its
objects. MOQT uses lower numeric priority for higher scheduling
precedence, with <tt>0</tt> the highest (<xref target="MoQTransport"/>). Priority <tt>0</tt> is
reserved for MOQT control traffic, and MIX tracks <bcp14>MUST NOT</bcp14> use it.</t>
        <t>The <tt>nodes</tt> and <tt>delivery-node-sets</tt> tracks use priority <tt>1</tt>, because they gate
forwarding: path selection cannot proceed without reachability, and
data egress is held back until the target set is known. The <tt>publishers</tt> and
<tt>subscribers</tt> tracks carry per-track demand that does not gate delivery, and
use priority <tt>2</tt>. The bootstrap <tt>announce</tt> track also uses priority
<tt>2</tt>; after initial discovery, its refresh is a liveness heartbeat
rather than a routing decision.</t>
        <section anchor="nodes-track">
          <name><tt>nodes</tt> Track</name>
          <t>The <tt>nodes</tt> track distributes reachability. A Node publishes on it its own
<tt>NODE_INFO</tt> advertisement and the advertisements it has accepted from
peers, so that every Node learns which other Nodes exist, the path to
each, and the per-hop sRTT along that path.</t>
          <dl>
            <dt>Group ID:</dt>
            <dd>
              <t>A monotonically increasing epoch, incremented when self-info
materially changes (Node type, contact, geo) and at process start.
Advertisements for other Nodes reuse the current epoch.</t>
            </dd>
            <dt>Subgroup ID:</dt>
            <dd>
              <t><tt>0</tt>.</t>
            </dd>
            <dt>Object payload:</dt>
            <dd>
              <t>A single MIX control message (<xref target="message-encoding"/>) tagged
<tt>NODE_INFO_ADVERTISEMENT</tt>, <tt>NODE_INFO_WITHDRAWAL</tt>, or <tt>NODE_UNREACH</tt>.</t>
            </dd>
            <dt>Object priority:</dt>
            <dd>
              <t><tt>1</tt>. Node Table gates path selection.</t>
            </dd>
            <dt>Subscription filter:</dt>
            <dd>
              <t>As in <xref target="ib-subscribe"/>.</t>
            </dd>
          </dl>
          <t>Loop prevention is inherited from the payload: an advertisement whose
<tt>path</tt> contains the receiver's own Node ID removes the sending peer's
candidate instead of adding one (<xref target="nib-candidates"/>). When a Node
re-publishes an advertisement on its own <tt>nodes</tt> track, it appends its own
element to the <tt>path</tt> (<xref target="node-info"/>).</t>
          <t>A Control Node <bcp14>MUST NOT</bcp14> re-publish Node Table advertisements it has accepted
from peers. It accepts them to learn public keys
(<xref target="public-key-distribution"/>), but it never appears in a data-plane
path.</t>
        </section>
        <section anchor="publishers-and-subscribers-tracks">
          <name><tt>publishers</tt> and <tt>subscribers</tt> Tracks</name>
          <t>The <tt>publishers</tt> track distributes publications: each entry states that a track
is available at its originator and the forwarding mode requested for
it. The <tt>subscribers</tt> track distributes demand: each entry states that a Node has
subscribers for a track. A Node publishes on these tracks the entries
it originates and the entries it has accepted from peers. Together they
let each Node determine which tracks need to flow toward it and from
where. In the split deployment model, which accepted entries a Node
re-publishes depends on its role (<xref target="pib-sib-reflection"/>).</t>
          <dl>
            <dt>Group ID:</dt>
            <dd>
              <t>A monotonically increasing MOQT Group ID assigned by the Node
publishing this track. It is a local transport location, separate
from the MIX freshness fields, and <bcp14>MUST NOT</bcp14> wrap or be reused during
the track's lifetime. A Node that re-publishes an entry assigns its
own MOQT locations and preserves the signed MIX payload fields.</t>
            </dd>
            <dt>Subgroup ID:</dt>
            <dd>
              <t><tt>0</tt>.</t>
            </dd>
            <dt>Object payload:</dt>
            <dd>
              <t>A MIX control message tagged <tt>SUBSCRIBE_INFO_ADVERTISEMENT</tt>,
<tt>SUBSCRIBE_INFO_WITHDRAWAL</tt>, <tt>PUBLISH_INFO_ADVERTISEMENT</tt>, or <tt>PUBLISH_INFO_WITHDRAWAL</tt>.</t>
            </dd>
            <dt>Object priority:</dt>
            <dd>
              <t><tt>2</tt>.</t>
            </dd>
          </dl>
          <t>MOQT Group IDs and Object IDs are local transport locations, not MIX
sequence numbers (<xref target="sequence-comparison"/>); this keeps MOQT location
ordering and FETCH ranges independent of per-originator freshness.</t>
        </section>
        <section anchor="sns-track">
          <name><tt>delivery-node-sets</tt> Track</name>
          <t>The <tt>delivery-node-sets</tt> track carries one Delivery Node Set for each track forwarded on its Data
Session: the destination Nodes that the track must reach through the
downstream Node, labelled with a Delivery Node Set Id. The track is scoped to that Data Session: <tt>&lt;sid&gt;</tt> in the namespace tuple identifies the
Data Session, and both endpoints agree on it when that session is opened
(<xref target="establishment"/>). The track name is the fixed literal <tt>"delivery-node-sets"</tt>.</t>
          <dl>
            <dt>Group ID:</dt>
            <dd>
              <t>The 32-bit Delivery Node Set Id assigned by the sender, carried in the low 32
bits of the MOQT Group ID (upper bits zero). MIX reuses the same Delivery Node Set
Id when the target set changes, so each Delivery Node Set Id maps to one MOQT group
whose most recent object is the current set.</t>
            </dd>
            <dt>Subgroup ID:</dt>
            <dd>
              <t><tt>0</tt>.</t>
            </dd>
            <dt>Object ID within a group:</dt>
            <dd>
              <t>A monotonically increasing counter starting at <tt>0</tt> for the first
object in the group and incremented by one for each subsequent
update to the set. Consumers treat the object with the greatest
Object ID in the group as the current state for that Delivery Node Set Id.</t>
            </dd>
            <dt>Object payload:</dt>
            <dd>
              <t><tt>DELIVERY_NODE_SET_ADVERTISEMENT</tt> or <tt>DELIVERY_NODE_SET_WITHDRAWAL</tt>.</t>
            </dd>
            <dt>Delivery Node Set Id encoding:</dt>
            <dd>
              <t>The Delivery Node Set Id is a 32-bit identifier. It is carried as a 32-bit field in
<tt>DELIVERY_NODE_SET_ADVERTISEMENT</tt> payloads (<xref target="message-encoding"/>) and as a
variable-length integer (<xref target="RFC9000"/>) in the data-plane MIX Data Header
(<xref target="data-header"/>). Both forms carry the same 32-bit value.</t>
            </dd>
            <dt>Subscription filter:</dt>
            <dd>
              <t>As in <xref target="ib-subscribe"/>.</t>
            </dd>
            <dt>Object priority:</dt>
            <dd>
              <t><tt>1</tt>. Data cannot be forwarded until its Delivery Node Set is known.</t>
            </dd>
            <dt>Track lifetime:</dt>
            <dd>
              <t>Tied to the Data Session. On teardown the publisher unpublishes the track
and the subscriber implicitly loses its subscription.</t>
            </dd>
          </dl>
        </section>
        <section anchor="bootstrap-announce-track">
          <name>Bootstrap <tt>announce</tt> Track</name>
          <t>The <tt>announce</tt> track lets Nodes discover each other. Each Node
publishes on it a <tt>CONNECT</tt> message describing itself, including its
Node ID and public key, so that a prospective peer can identify the
Node and verify its signed advertisements before subscribing to its
Node, Publisher, and Subscriber Table tracks.</t>
          <dl>
            <dt>Group ID:</dt>
            <dd>
              <t>A monotonically increasing epoch, bumped whenever the publisher
publishes a new <tt>CONNECT</tt> object (see <xref target="announce-refresh"/>). The
initial group after process start is <tt>0</tt>.</t>
            </dd>
            <dt>Subgroup ID:</dt>
            <dd>
              <t><tt>0</tt>.</t>
            </dd>
            <dt>Object ID within a group:</dt>
            <dd>
              <t>A monotonically increasing counter reset to <tt>0</tt> at each new group.</t>
            </dd>
            <dt>Object payload:</dt>
            <dd>
              <t>A <tt>CONNECT</tt> message (<xref target="message-encoding"/>) carrying the publisher's
<tt>node_info</tt>.</t>
            </dd>
            <dt>Object priority:</dt>
            <dd>
              <t><tt>2</tt>.</t>
            </dd>
            <dt>Subscription filter:</dt>
            <dd>
              <t>As in <xref target="ib-subscribe"/>; the fill yields the current <tt>CONNECT</tt>.</t>
            </dd>
            <dt>Object expiry:</dt>
            <dd>
              <t>See <xref target="announce-refresh"/>.</t>
            </dd>
          </dl>
          <t>A Node discovers peers by issuing a MOQT <tt>SUBSCRIBE_NAMESPACE</tt> with
prefix <tt>("mix","v1","announce")</tt> and receiving one <tt>NAMESPACE</tt> message
per known peer, followed by <tt>NAMESPACE_DONE</tt> on withdrawal. It then
attaches to each peer's <tt>announce</tt> track with a MOQT <tt>SUBSCRIBE</tt> (see
<xref target="establishment"/>).</t>
          <t>If a peer withdraws its <tt>announce</tt> namespace while A still holds an
<tt>ESTABLISHED</tt> peering with that peer, the withdrawal is treated as an
intent-to-depart signal. A <bcp14>SHOULD</bcp14> begin the <tt>CLOSED</tt> transition
(<xref target="state-machine"/>) for that peering unless a replacement <tt>CONNECT</tt>
arrives on a re-published namespace within the staleness window
defined in <xref target="announce-refresh"/>. The peering's Control Session and any
Data Sessions remain open until the state machine completes the
transition; this prevents a flapping announce from immediately
tearing down in-flight data.</t>
        </section>
        <section anchor="announce-refresh">
          <name><tt>announce</tt> Refresh and Timeout</name>
          <t>A <tt>CONNECT</tt> object is a soft-state advertisement: subscribers use it to
learn the publisher's public key, contact, geo, and capability bits, and
they need a bounded assurance that the currently held object still
reflects the publisher. Two rules govern the publisher's rewrite
schedule:</t>
          <ol spacing="normal" type="1"><li>
              <t>Timer-driven refresh. A publisher <bcp14>MUST</bcp14> re-publish its <tt>CONNECT</tt>
object at least once per <tt>ANNOUNCE_REFRESH_INTERVAL</tt>. The default
value is <tt>30 s</tt>; deployments <bcp14>MAY</bcp14> use a shorter interval where faster
detection of stale peers matters, or a longer interval on
resource-constrained deployments, provided all peers agree via
configuration.</t>
            </li>
            <li>
              <t>Change-driven refresh. A publisher <bcp14>MUST</bcp14> re-publish its <tt>CONNECT</tt>
object as soon as any field of <tt>node_info</tt> covered by the originator
signature (<xref target="origin-auth"/>) changes — Node type, contact string, geo
coordinates, public key, <tt>data_modes</tt>, or <tt>origin_epoch</tt>. Path
accumulation is not a change (<tt>path</tt> is not signed).</t>
            </li>
          </ol>
          <t>Each rewrite advances the MOQT Group ID by one and resets Object ID to
<tt>0</tt>. Because the <tt>announce</tt> track is latest-state oriented, older
groups need not be retained beyond the configured recovery window.</t>
          <t>A subscriber <bcp14>MUST</bcp14> treat a <tt>CONNECT</tt> object as stale when it has not
observed a new group within
<tt>ANNOUNCE_STALE_MULTIPLIER * ANNOUNCE_REFRESH_INTERVAL</tt> (default
multiplier <tt>3</tt>, giving a <tt>90 s</tt> default staleness bound). A stale
<tt>CONNECT</tt> on an active peering is a hint that the peer is
unhealthy; the subscriber <bcp14>SHOULD</bcp14> initiate <tt>CLOSED</tt> transition
(<xref target="state-machine"/>) if no refresh arrives within one additional
interval.</t>
          <t>The <tt>CONNECT</tt> refresh has a monotonically increasing MIX sequence within
the current originator epoch. <tt>origin_epoch</tt> changes only when the Node
starts a new incarnation that may reuse sequence state. Subscribers
use the <tt>(origin_epoch, sequence)</tt> pair for replay defence independently
of MOQT group progression.</t>
        </section>
      </section>
    </section>
    <section anchor="establishment">
      <name>Peering Establishment</name>
      <t>Peering between two Nodes A and B is established using standard MOQT
control messages. The mapping below is normative; any additional MOQT
messages required by <xref target="MoQTransport"/> for these exchanges (<tt>SETUP</tt>,
<tt>REQUEST_OK</tt> / <tt>REQUEST_ERROR</tt>, <tt>PUBLISH_OK</tt> / <tt>PUBLISH_ERROR</tt>, and so
on) are used as defined there.</t>
      <ol spacing="normal" type="1"><li>
          <t>Publish namespaces and tracks. On startup, each Node issues a MOQT
<tt>PUBLISH_NAMESPACE</tt> for its per-Node namespace
<tt>("mix","v1","&lt;node-id&gt;")</tt> and a second <tt>PUBLISH_NAMESPACE</tt> for the
bootstrap namespace <tt>("mix","v1","announce","&lt;node-id&gt;")</tt>.
It then issues MOQT <tt>PUBLISH</tt> requests for <tt>nodes</tt>, <tt>publishers</tt>, <tt>subscribers</tt>, and
<tt>announce</tt> tracks and publishes its <tt>CONNECT</tt> message as an object
on <tt>announce</tt>. <tt>PUBLISH_NAMESPACE</tt> announces namespace availability;
it does not by itself publish a track or its objects.</t>
        </li>
        <li>
          <t>Discover peers. To find peers, Node A issues a MOQT
<tt>SUBSCRIBE_NAMESPACE</tt> with prefix <tt>("mix","v1","announce")</tt>. It
receives one <tt>NAMESPACE</tt> message per Node currently in the mesh
(and a <tt>NAMESPACE_DONE</tt> when a peer's namespace is subsequently
withdrawn), learning each peer's Node ID.</t>
        </li>
        <li>
          <t>Attach control-plane tracks. To peer with B, Node A:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Issues a MOQT <tt>SUBSCRIBE</tt> with <tt>FILL_PARAMETERS</tt> for the
<tt>announce</tt> track of B (<tt>("mix","v1","announce","&lt;B-node-id&gt;")</tt>
/ <tt>"announce"</tt>) to obtain B's current <tt>CONNECT</tt> body and receive
later refreshes.</t>
            </li>
            <li>
              <t>Issues MOQT <tt>SUBSCRIBE</tt> requests for the tracks under
<tt>("mix","v1","&lt;B-node-id&gt;")</tt> that the peering's scope calls for
(<xref target="peering-scope"/>), drawn from <tt>nodes</tt>, <tt>publishers</tt>, and <tt>subscribers</tt>, to
receive current state and live updates (<xref target="ib-subscribe"/>). A
needs no further discovery for this: B's namespace follows from
the Node ID that A learned in step 2, and the track names are
fixed by this document (<xref target="control-plane"/>). MOQT allows a
subscriber to subscribe to a track without first receiving a
<tt>PUBLISH_NAMESPACE</tt> for its namespace (<xref target="MoQTransport"/>).</t>
            </li>
            <li>
              <t>When the peering's scope includes the Node Table and A selects B as the
egress for a track, A opens a separate Data Session to B and
chooses its <tt>&lt;sid&gt;</tt>. On that connection, A issues a MOQT
<tt>PUBLISH_NAMESPACE</tt> for <tt>("mix","v1","&lt;A-node-id&gt;","&lt;sid&gt;")</tt> and
a <tt>PUBLISH</tt> for its <tt>delivery-node-sets</tt> track, and B subscribes to that track
(<xref target="ib-subscribe"/>). The MOQT control messages for this run on the
Data Session. A opens the Data Session when a track first needs
to flow to B and reuses it for later tracks.</t>
            </li>
          </ol>
        </li>
      </ol>
      <section anchor="peering-scope">
        <name>Peering Scope</name>
        <t>The scope of a peering is the set of Node, Publisher, and Subscriber
Table tracks that each Node
subscribes to from the other. Scope is set by local configuration for
each peering and is not negotiated on the wire. Three scopes are
defined:</t>
        <table>
          <name>Peering scopes</name>
          <thead>
            <tr>
              <th align="left">Scope</th>
              <th align="left">A subscribes to B's</th>
              <th align="left">Used between</th>
              <th align="left">Data Sessions</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Full</td>
              <td align="left">
                <tt>nodes</tt>, <tt>publishers</tt>, <tt>subscribers</tt></td>
              <td align="left">Forwarding Nodes, integrated model</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">Topology</td>
              <td align="left">
                <tt>nodes</tt></td>
              <td align="left">Forwarding Nodes, split model</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">Reflection</td>
              <td align="left">Forwarding Node and Control Node: <tt>publishers</tt>, <tt>subscribers</tt>, plus <tt>nodes</tt> when A is the Control Node. Two Control Nodes: <tt>publishers-mesh</tt>, <tt>subscribers-mesh</tt></td>
              <td align="left">A Forwarding Node and a Control Node, or two Control Nodes</td>
              <td align="left">No</td>
            </tr>
          </tbody>
        </table>
        <t>The following rules apply regardless of deployment model:</t>
        <ul spacing="normal">
          <li>
            <t>A Forwarding Node <bcp14>MUST NOT</bcp14> subscribe to the <tt>nodes</tt> track of a Control
Node.</t>
          </li>
          <li>
            <t>A Node <bcp14>MUST</bcp14> open a Data Session to a peer only over an <tt>ESTABLISHED</tt>
peering with Full or Topology scope. Path selection (<xref target="selection"/>)
yields only such peers.</t>
          </li>
          <li>
            <t>A Control Node <bcp14>MUST NOT</bcp14> open or accept Data Sessions.</t>
          </li>
        </ul>
        <t>A Control Node's subscription to a Forwarding Node's <tt>nodes</tt> track lets
the Control Node learn the public keys of every Forwarding Node that
Forwarding Node can reach, which it needs to verify the Publisher and Subscriber Tables
entries it receives (<xref target="origin-auth"/>).</t>
      </section>
      <section anchor="ib-subscribe">
        <name>Subscribing to Node, Publisher, and Subscriber Tables</name>
        <t>For the <tt>nodes</tt>, <tt>publishers</tt>, and <tt>subscribers</tt> tracks, subscribers <bcp14>SHOULD</bcp14> issue a MOQT
<tt>SUBSCRIBE</tt> whose Location Filter starts at the <tt>Next Object</tt>. To also
acquire retained state, the initial <tt>SUBSCRIBE</tt> <bcp14>SHOULD</bcp14> include
<tt>FILL_PARAMETERS</tt> with a location filter ending at <tt>Largest Object</tt>.
The fill range and the live subscription filter are distinct in draft
22. Implementations <bcp14>MUST</bcp14> process both fill-delivered and
subscription-delivered objects using the same MIX freshness and
duplicate-suppression rules. A relay <bcp14>MAY</bcp14> return an incomplete fill
when objects are unavailable; MIX therefore requires a full-state
snapshot or equivalent recovery mechanism after a cache miss (see the
editor's note below).</t>
        <t>The same pattern applies to the <tt>announce</tt> track and to the
per-Data-Session <tt>delivery-node-sets</tt> track (<xref target="sns-track"/>). The <tt>delivery-node-sets</tt> cache lifetime
<bcp14>SHOULD</bcp14> cover expected peer setup and recovery intervals.</t>
        <t>Priorities influence scheduling only. A Node <bcp14>MUST NOT</bcp14> treat an
advertisement whose delivery timed out under <tt>OBJECT_DELIVERY_TIMEOUT</tt>
or <tt>SUBGROUP_DELIVERY_TIMEOUT</tt> (<xref target="MoQTransport"/>) as delivered.</t>
        <ul empty="true">
          <li>
            <t>Editor's note: This document does not yet define how a Node
recovers full state when a fill is incomplete because the publishing
relay has no usable cache.</t>
          </li>
        </ul>
        <t>B performs the subscriptions to A that the peering's scope calls for
(<xref target="peering-scope"/>). For Full and Topology scope these mirror A's.</t>
      </section>
      <section anchor="simultaneous-peer-tiebreaker">
        <name>Simultaneous-Peer Tiebreaker</name>
        <t>Two Nodes <bcp14>MAY</bcp14> open Control Sessions to each other at the same time. A
pair of Nodes keeps at most one Control Session. Once each Node has
received the other's <tt>CONNECT</tt>, the connection opened by the Node with
the numerically lower Node ID is kept and the other is closed. Both
directions of subscription then run over the kept connection. Closing
the duplicate connection is not a peering close: neither Node removes
state learned from the other (<xref target="state-machine"/>).</t>
      </section>
      <section anchor="state-machine">
        <name>Peering State Machine</name>
        <t>Each peering (an ordered pair of Nodes A and B, viewed from A's side) progresses through a small state machine. States describe the
control-plane relationship only; data-plane subscriptions
(<xref target="establishment"/> step 3) are opened independently once <tt>ESTABLISHED</tt>
is reached on a peering whose scope includes the Node Table.</t>
        <figure>
          <name>Peering state machine</name>
          <artwork><![CDATA[
                       +---------+
                       |  INIT   |
                       +---------+
                            |
                            |  subscribe to B's announce track
                            v
                       +---------+
                       | OPENING |
                       +---------+
                            |
                            |  receive B.CONNECT object
                            v
                       +---------+
                       |  HELLO  |-------> REJECTED
                       |  RECVD  |   signature / policy reject
                       +---------+
                            |
                            |  subscribe to tracks in scope
                            |
                            v
                     +-------------+
                     | ESTABLISHED |
                     +-------------+
                       |    |    |
                       |    |    |  signature failure at ingress
                       |    |    |  / peer close / QUIC error
                       v    v    v
                     +-------------+
                     |   CLOSED    |
                     +-------------+
]]></artwork>
        </figure>
        <t>State transitions:</t>
        <ul spacing="normal">
          <li>
            <t>INIT -&gt; OPENING: A issues a MOQT <tt>SUBSCRIBE</tt> for B's <tt>announce</tt>
track (<tt>("mix","v1","announce","&lt;B-node-id&gt;")</tt> / <tt>"announce"</tt>).</t>
          </li>
          <li>
            <t>OPENING -&gt; HELLO_RECVD: A receives B's <tt>CONNECT</tt> object on the
announce track. A does not yet trust B; the object's signature <bcp14>MUST</bcp14>
verify against a pubkey that either (a) is derived from B's Node ID
(<xref target="node-id"/>) or (b) was already installed as a trusted key.</t>
          </li>
          <li>
            <t>HELLO_RECVD -&gt; ESTABLISHED: A applies the simultaneous-peer
tiebreaker and issues MOQT <tt>SUBSCRIBE</tt> requests with
<tt>FILL_PARAMETERS</tt> for the B tracks in the peering's scope
(<xref target="peering-scope"/>) as specified in <xref target="ib-subscribe"/>. B receives A's
advertisements through its own subscriptions to A.</t>
          </li>
          <li>
            <t>HELLO_RECVD -&gt; REJECTED: signature verification failed, the peer
pubkey does not match A's local pinning policy, or admission control
declines the peering. A cancels its subscription to B's <tt>announce</tt>
track and does not subscribe to B's Node, Publisher, or Subscriber
Table tracks. The state is terminal
from A's perspective; B may retry after a backoff.</t>
          </li>
          <li>
            <t>ESTABLISHED -&gt; CLOSED: A observes any of (i) a MOQT
<tt>PUBLISH_DONE</tt> on any control-plane track from B, an explicit
cancellation of A's <tt>SUBSCRIBE</tt>, or, when the peering's scope
includes Node Table, a <tt>STOP_SENDING</tt> on a Data Session to B; (ii) QUIC
transport failure; (iii) sustained signature failure at ingress; or
(iv) a local admin action. A connection closed by the
simultaneous-peer tiebreaker (<xref target="simultaneous-peer-tiebreaker"/>) does
not close the peering. On entry to <tt>CLOSED</tt>, A removes every Node Table
candidate it learned from B (<xref target="nib-candidates"/>). Publisher and Subscriber Table entries
follow <xref target="ib-lifetime"/>, and those learned over a Reflection peering
also follow <xref target="control-node-loss"/>.</t>
          </li>
        </ul>
        <t>Tying a Topology or Full peering to its Data Sessions keeps Node Table and the
data plane in step: a peer that can no longer forward is withdrawn from
path selection rather than left as a black hole. A Reflection peering
has no Data Sessions, so data-plane events never close it.</t>
        <t><tt>CLOSED</tt> is a terminal state; recovery is a fresh <tt>INIT</tt> on a new
session identifier. The Node ID of the peer is unchanged, so any
previously distributed originator pubkey remains valid across
reconnection.</t>
      </section>
      <section anchor="control-node-loss">
        <name>Loss of a Reflection Peering</name>
        <t>Losing a Reflection peering does not by itself remove any Publisher or Subscriber Table
entry. The entries are signed by their originators and stay valid while
those originators are reachable (<xref target="ib-lifetime"/>), and a Forwarding Node
peered with more than one Control Node keeps receiving updates from
the others.</t>
        <t>Reachability here comes from the Node Table, not from the Control Nodes. An
originator is reachable while the Node's Node Table entry for it has at least
one candidate (<xref target="nib-candidates"/>). A Forwarding Node builds its Node Table
over its Topology peerings with its data-plane neighbors, so it keeps
tracking originators even when it has no Control Node at all. A
Control Node builds its Node Table from its subscriptions to the <tt>nodes</tt> tracks
of the Forwarding Nodes it serves (<xref target="peering-scope"/>).</t>
        <t>A Forwarding Node that has no <tt>ESTABLISHED</tt> Reflection peering receives
no updates, and so misses any withdrawals issued in the meantime. To
bound that, a Forwarding Node that has had no <tt>ESTABLISHED</tt> Reflection
peering for <tt>CONTROL_STALE_HOLD</tt> removes every Publisher and Subscriber Table entry it did
not originate. The default is <tt>90 s</tt>. It <bcp14>SHOULD</bcp14> exceed the time needed
to re-establish a Reflection peering and complete its fill
(<xref target="ib-subscribe"/>). The fill on the next Reflection peering restores
the entries.</t>
      </section>
    </section>
    <section anchor="data-plane">
      <name>Data Plane</name>
      <t>The data plane between two Nodes uses a Data Session: a QUIC connection
separate from the Control Session of the peering between them, whose
scope includes the Node Table (<xref target="peering-scope"/>). Keeping the two
connections separate prevents media flow control from delaying
control-plane updates, allows a Data Session to be opened only when a
track needs to flow, and lets each connection use its own congestion
control and priority settings. Each Data
Session uses MOQT control messages to set up and manage its <tt>delivery-node-sets</tt> track
subscription, but carries forwarded objects separately from the MIX
control-state tracks. Two forwarding modes are defined
(<xref target="forwarding-modes"/>), and each Publisher Table entry carries the mode requested by
its originator. A Node <bcp14>MUST</bcp14> select an
end-to-end path only if every hop supports the mode requested for the
track.</t>
      <section anchor="forwarding-modes">
        <name>Forwarding Modes</name>
        <t>MIX defines two ways to carry a track's objects between Nodes. In
native mode every hop forwards whole MOQT objects. In pipelined mode
every hop forwards bytes as they arrive, behind a small MIX Data
Header. The track's originator picks the mode in its Publisher Table entry, and a
path is usable for pipelined mode only if every hop on it supports it.</t>
        <table>
          <name>Native and pipelined forwarding between relays</name>
          <thead>
            <tr>
              <th align="left"> </th>
              <th align="left">Native mode</th>
              <th align="left">Pipelined mode</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">What crosses each hop</td>
              <td align="left">A MOQT object, framed per hop</td>
              <td align="left">A MIX Data Header, then the object's bytes</td>
            </tr>
            <tr>
              <td align="left">Publisher's Edge Node</td>
              <td align="left">Forwards MOQT objects</td>
              <td align="left">Re-frames each object with an <tt>delivery_set_id</tt></td>
            </tr>
            <tr>
              <td align="left">Transit Nodes</td>
              <td align="left">Receive whole objects and <bcp14>MAY</bcp14> cache them</td>
              <td align="left">Forward bytes before the object boundary is known</td>
            </tr>
            <tr>
              <td align="left">Subscriber's Edge Node</td>
              <td align="left">Delivers MOQT objects</td>
              <td align="left">Rebuilds the MOQT object</td>
            </tr>
            <tr>
              <td align="left">Support</td>
              <td align="left">Required of every Forwarding Node</td>
              <td align="left">
                <bcp14>OPTIONAL</bcp14>, advertised in <tt>data_modes</tt></td>
            </tr>
          </tbody>
        </table>
        <section anchor="native-mode">
          <name>Native Mode</name>
          <t>In native mode, the inter-relay data-plane connection runs the same MOQT
<xref target="MoQTransport"/> object framing that is used between application
publishers/subscribers and their edge relays. Each application object is
forwarded as a MOQT object, preserving its track identity and location
<tt>(group_id, subgroup_id, object_id)</tt> across hops. Track Aliases and
request IDs are local to each MOQT session and <bcp14>MUST</bcp14> be mapped per hop.
Publisher priority is preserved as the priority of the forwarded object
subject to relay policy. The MOQT stream mapping is:</t>
          <ul spacing="normal">
            <li>
              <t>A subgroup maps to a QUIC unidirectional stream per hop, as defined
by <xref target="MoQTransport"/>. Each relay may use a different stream and local
Track Alias on egress while preserving the object locations.</t>
            </li>
            <li>
              <t>Objects delivered via QUIC datagrams remain in datagrams.</t>
            </li>
            <li>
              <t>FETCH responses (<xref target="MoQTransport"/>) traverse each hop as a single
unidirectional stream carrying the FETCH object sequence.</t>
            </li>
          </ul>
          <t>Intermediate relays <bcp14>MAY</bcp14> cache objects and serve retained ranges with
<tt>FETCH</tt> or fill fetch streams when supported. MOQT does not require a
relay to cache, so a peer must be able to repair state after a cache
miss; this is not yet defined (see the editor's note in
<xref target="ib-subscribe"/>). Priority scheduling and delivery-timeout behavior follow
<xref target="MoQTransport"/> on each session; ordering is per subgroup or as
otherwise specified by a request's Group Order, not a global order
across tracks or streams.</t>
          <t>Native mode is the default. Forwarding Nodes <bcp14>MUST</bcp14> support native mode.</t>
        </section>
        <section anchor="pipelined-mode">
          <name>Pipelined Mode</name>
          <t>In pipelined mode, the inter-relay data-plane connection replaces MOQT
subgroup framing with the MIX Data Header (<xref target="data-header"/>) followed by
verbatim application bytes. The stream mapping is:</t>
          <ul spacing="normal">
            <li>
              <t>Each MOQT subgroup arriving at the publisher's Edge Node is re-framed
into one unidirectional QUIC stream on the inter-relay connection.
The stream carries a <tt>new_stream_header</tt> (<xref target="data-header"/>) followed by
back-to-back object bodies from the subgroup, each later one preceded
by its own <tt>existing_stream_header</tt>. Intermediate relays forward the
stream's bytes hop by hop, rewriting only the Delivery Node Set Id in each header,
since Delivery Node Set Ids are local to a Data Session. The terminal edge relay reconstructs a MOQT
subgroup stream toward each local subscriber, preserving the
subgroup identifier.</t>
            </li>
            <li>
              <t>Objects that the publisher's Edge Node received in MOQT datagrams are re-emitted as
QUIC datagrams, each beginning with a <tt>datagram_header</tt>. Each
hop rewrites the Delivery Node Set Id and re-enqueues the datagram.</t>
            </li>
            <li>
              <t>FETCH responses are always carried in native framing regardless of
the track's <tt>forwarding_mode</tt>, because FETCH requires bounded
cache-and-replay semantics at every hop.</t>
            </li>
          </ul>
          <t>Intermediate relays <bcp14>MUST</bcp14> forward bytes as they arrive: they <bcp14>SHOULD NOT</bcp14>
wait for MOQT-level object boundaries. Intermediate relays do not
maintain a per-object cache and cannot replay a partially-forwarded
object.</t>
          <t>Pipelined mode is <bcp14>OPTIONAL</bcp14>. Support is signalled per Node via the
<tt>data_modes</tt> field in <tt>node_info</tt> (<xref target="node-info"/>) and requested per
track via the <tt>forwarding_mode</tt> field in <tt>publish_info</tt>
(<xref target="pib-entry"/>).</t>
          <t>A route from the publisher's Edge Node to a subscriber is admissible for a pipelined-mode
track only if every intermediate Node advertises pipelined-mode support
in its Node Table entry. If no such path exists at the time of a <tt>SUBSCRIBE</tt>
(or a <tt>PUBLISH</tt> in publisher-initiated tracks), the publisher's Edge Node
<bcp14>MAY</bcp14> downgrade the track to native mode for that subscriber and <bcp14>MUST</bcp14>
record the downgrade in its local subscribe state so that the
subscriber sees stock MOQT object framing.</t>
        </section>
        <section anchor="route-failure-semantics">
          <name>Route Failure Semantics</name>
          <t>When a Data Session terminates mid-stream, the upstream Node re-runs
path selection (<xref target="selection"/>) and opens a Data Session on the
replacement path. If a peering closes, the Node removes the Node Table
candidates learned over it (<xref target="nib-candidates"/>), and path selection uses
the remaining candidates.</t>
          <t>In native mode, each affected relay <bcp14>MAY</bcp14> replay cached MOQT objects onto
the new egress subgroup stream so that subscribers see a small gap
rather than a lost group. A subscriber <bcp14>MAY</bcp14> also recover the missing
range with a bounded <tt>FETCH</tt> (<xref target="MoQTransport"/>) served by any relay
whose cache still contains the range.</t>
          <t>In pipelined mode, bytes that were in-flight beyond the last completed
MIX stream boundary are lost; the receiving relay <bcp14>MUST NOT</bcp14> attempt to
re-assemble a partially-received MOQT object. The terminal edge relay
signals the loss to the subscriber by advancing to a new group or
<tt>object_id</tt> as defined by MOQT.</t>
        </section>
      </section>
      <section anchor="data-header">
        <name>Data Header</name>
        <t>In pipelined mode, every datagram and every stream between Nodes
begins with a MIX Data Header. A stream also carries one before each
later object on it. The header tells the receiving Node which Delivery Node Set the
bytes belong to, so it can forward them before the object ends. There
are three types of header, using the notation of Section 1.3 of
<xref target="RFC9000"/>:</t>
        <figure>
          <name>MIX Data Header types</name>
          <artwork><![CDATA[
datagram_header {
  type (8) = 0x00,
  header_length (8),
  delivery_set_id (i),
  data_length (i),
}

new_stream_header {
  type (8) = 0x02,
  header_length (8),
  delivery_set_id (i),
  priority (8),
  ttl_us (i),
  data_length (i),
}

existing_stream_header {
  type (8) = 0x01,
  header_length (8),
  delivery_set_id (i),
}
]]></artwork>
        </figure>
        <dl>
          <dt>type:</dt>
          <dd>
            <t>Which header this is. <tt>0x00</tt> begins a QUIC datagram. <tt>0x02</tt> begins a
QUIC stream and precedes its first object. <tt>0x01</tt> precedes each later
object on the same stream.</t>
          </dd>
          <dt>header_length:</dt>
          <dd>
            <t>The number of bytes in the header after this field. A receiver that
does not need every field can use it to skip to the payload.</t>
          </dd>
          <dt>delivery_set_id:</dt>
          <dd>
            <t>The Id of the track's Delivery Node Set on this Data Session
(<xref target="sns-concept"/>). The receiving Node looks it up to find where to
forward the bytes (<xref target="sns"/>).</t>
          </dd>
          <dt>priority:</dt>
          <dd>
            <t>The MOQT publisher priority of the subgroup carried on the stream
(<xref target="MoQTransport"/>).</t>
          </dd>
          <dt>ttl_us:</dt>
          <dd>
            <t>A lifetime for the stream's objects, in microseconds.</t>
          </dd>
          <dt>data_length:</dt>
          <dd>
            <t>The number of payload bytes that follow the header: the datagram's
payload, or the first object on a new stream.</t>
          </dd>
        </dl>
        <ul empty="true">
          <li>
            <t>Editor's note: The meaning of <tt>ttl_us</tt> is not yet specified. An
<tt>existing_stream_header</tt> carries no length, so a receiver cannot yet
find where each later object on a stream ends.</t>
          </li>
        </ul>
        <t>Native-mode streams do not carry a MIX Data Header; they carry MOQT
object frames as defined in <xref target="MoQTransport"/>.</t>
      </section>
      <section anchor="sns">
        <name>Delivery Node Set Fan-Out</name>
        <t>Each Node derives its egress Delivery Node Sets from its ingress Delivery Node Sets as described
in <xref target="sns-concept"/>; a destination that is the Node itself is delivered
locally. The result maps each ingress Delivery Node Set Id to a set of egress Data
Sessions and their Delivery Node Set Ids.</t>
        <t>For each ingress unidirectional stream, a Node looks up the ingress
<tt>delivery_set_id</tt> in that mapping (<xref target="sns-track"/>), then opens one
egress unidirectional stream per selected downstream Data Session. Egress
streams are opened lazily, on the first byte of the ingress stream, so
that a relay does not consume QUIC flow-control budget on peers that
have no active subscribers.</t>
        <figure>
          <name>Delivery Node Set lookup and fan-out at a Node</name>
          <artwork><![CDATA[
          ingress stream for track T, delivery_set_id = 42
                          |
                          v
            +---------------------------+
            | Delivery Node Sets for    |
            | the ingress Data Session: |
            |   Id 42 -> {B2, C1}       |
            |   Id 57 -> {D1}           |
            +-------------+-------------+
                          |
                +---------+---------+
                v                   v
          egress to B2        egress to C1
]]></artwork>
        </figure>
        <t>Datagrams are fanned out by rewriting the Delivery Node Set Id per egress and queuing
a fresh QUIC datagram frame on each downstream Data Session.</t>
        <t>In native mode the Delivery Node Set is found by track (<tt>full_name_hash</tt>) rather than
by Delivery Node Set Id, and selects the set of downstream Data Sessions in the same
way, but the egress carries a MOQT subgroup stream (or datagram,
or FETCH response) as defined by <xref target="MoQTransport"/> rather than a MIX
Data Header stream. The relay preserves track identity and object
locations on egress. Track Alias and request state are mapped to the
local MOQT session.</t>
      </section>
    </section>
    <section anchor="message-encoding">
      <name>Control Messages</name>
      <t>All MIX control messages appear as MOQT object payloads. Structures in
this section use the notation of Section 1.3 of <xref target="RFC9000"/>, as
<xref target="MoQTransport"/> does. Each object carries exactly one message:</t>
      <figure>
        <name>MIX control message</name>
        <artwork><![CDATA[
mix_control_message {
  tag (8),
  body (..),
}
]]></artwork>
      </figure>
      <t><tt>tag</tt> identifies the message type, and <tt>body</tt> is the structure listed
for that type below. Because MOQT frames each object with a length, the
body needs no length prefix of its own.</t>
      <table>
        <name>MIX control message types</name>
        <thead>
          <tr>
            <th align="left">Tag</th>
            <th align="left">Name</th>
            <th align="left">Track</th>
            <th align="left">Body</th>
            <th align="left">Defined in</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">0x01</td>
            <td align="left">CONNECT</td>
            <td align="left">announce</td>
            <td align="left">
              <tt>node_info</tt></td>
            <td align="left">
              <xref target="msg-connect"/></td>
          </tr>
          <tr>
            <td align="left">0x04</td>
            <td align="left">NODE_INFO_ADVERTISEMENT</td>
            <td align="left">nodes</td>
            <td align="left">
              <tt>node_info</tt></td>
            <td align="left">
              <xref target="msg-node-info"/></td>
          </tr>
          <tr>
            <td align="left">0x05</td>
            <td align="left">NODE_INFO_WITHDRAWAL</td>
            <td align="left">nodes</td>
            <td align="left">
              <tt>node_info</tt> (empty path)</td>
            <td align="left">
              <xref target="msg-node-info"/></td>
          </tr>
          <tr>
            <td align="left">0x06</td>
            <td align="left">SUBSCRIBE_INFO_ADVERTISEMENT</td>
            <td align="left">subscribers</td>
            <td align="left">
              <tt>subscribe_info</tt></td>
            <td align="left">
              <xref target="msg-subscribe-info"/></td>
          </tr>
          <tr>
            <td align="left">0x07</td>
            <td align="left">SUBSCRIBE_INFO_WITHDRAWAL</td>
            <td align="left">subscribers</td>
            <td align="left">
              <tt>subscribe_info</tt> (empty <tt>subscribe_data</tt>)</td>
            <td align="left">
              <xref target="msg-subscribe-info"/></td>
          </tr>
          <tr>
            <td align="left">0x08</td>
            <td align="left">PUBLISH_INFO_ADVERTISEMENT</td>
            <td align="left">publishers</td>
            <td align="left">
              <tt>publish_info</tt></td>
            <td align="left">
              <xref target="msg-publish-info"/></td>
          </tr>
          <tr>
            <td align="left">0x09</td>
            <td align="left">PUBLISH_INFO_WITHDRAWAL</td>
            <td align="left">publishers</td>
            <td align="left">
              <tt>publish_info</tt> (empty <tt>parameters</tt>)</td>
            <td align="left">
              <xref target="msg-publish-info"/></td>
          </tr>
          <tr>
            <td align="left">0x0A</td>
            <td align="left">DELIVERY_NODE_SET_ADVERTISEMENT</td>
            <td align="left">delivery-node-sets</td>
            <td align="left">
              <tt>delivery_node_set_info</tt></td>
            <td align="left">
              <xref target="msg-sns"/></td>
          </tr>
          <tr>
            <td align="left">0x0B</td>
            <td align="left">DELIVERY_NODE_SET_WITHDRAWAL</td>
            <td align="left">delivery-node-sets</td>
            <td align="left">empty</td>
            <td align="left">
              <xref target="msg-sns"/></td>
          </tr>
          <tr>
            <td align="left">0x0C</td>
            <td align="left">NODE_UNREACH</td>
            <td align="left">nodes</td>
            <td align="left">
              <tt>node_unreach</tt></td>
            <td align="left">
              <xref target="msg-node-unreach"/></td>
          </tr>
        </tbody>
      </table>
      <t>All fixed-width integers are in network byte order. A 128-bit field
holds either a Node ID (<xref target="node-id"/>) or a track hash (<xref target="track-hash"/>).
Fields marked <tt>(i)</tt> use the QUIC variable-length integer encoding
(Section 16 of <xref target="RFC9000"/>).</t>
      <section anchor="adv-wd">
        <name>Advertisement and Withdrawal Messages</name>
        <t>The Node, Publisher, and Subscriber Tables each have one advertisement
and one withdrawal message: <tt>NODE_INFO_ADVERTISEMENT</tt> and
<tt>NODE_INFO_WITHDRAWAL</tt> for Node Table, <tt>PUBLISH_INFO_ADVERTISEMENT</tt> and <tt>PUBLISH_INFO_WITHDRAWAL</tt> for
Publisher Table, and <tt>SUBSCRIBE_INFO_ADVERTISEMENT</tt> and <tt>SUBSCRIBE_INFO_WITHDRAWAL</tt> for Subscriber Table. The
following rules apply to all six:</t>
        <ul spacing="normal">
          <li>
            <t>The entry's originator creates and signs the
message (<xref target="origin-auth"/>) and publishes it on its own <tt>nodes</tt>,
<tt>publishers</tt>, or <tt>subscribers</tt> track.</t>
          </li>
          <li>
            <t>A Node that accepts the message (<xref target="sequence-comparison"/>)
re-publishes it on its own track of the same kind without changing any
signed field, unless its role rules this out: Control Nodes do not
re-publish Node Table entries, and in a split deployment Forwarding Nodes do
not re-publish Publisher or Subscriber Table entries (<xref target="pib-sib-reflection"/>).</t>
          </li>
          <li>
            <t>A withdrawal uses the same body as the advertisement with its variable-length part
emptied, as stated for each message below.</t>
          </li>
        </ul>
      </section>
      <section anchor="msg-connect">
        <name>CONNECT</name>
        <t>Announces a Node to prospective peers. Each Node publishes a <tt>CONNECT</tt>
on its <tt>announce</tt> track at startup and refreshes it as described in
<xref target="announce-refresh"/>. Peers use it to discover the Node and to learn
its public key before subscribing to its Node, Publisher, and
Subscriber Table tracks (<xref target="establishment"/>).</t>
        <t>The body is the Node's <tt>node_info</tt> (<xref target="node-info"/>). <tt>CONNECT</tt> and
<tt>NODE_INFO_ADVERTISEMENT</tt> share the same body and signature input
(<xref target="origin-auth"/>) and differ only in the tag byte and the track they
appear on.</t>
      </section>
      <section anchor="msg-node-info">
        <name>NODE_INFO_ADVERTISEMENT and NODE_INFO_WITHDRAWAL</name>
        <t>A <tt>NODE_INFO_ADVERTISEMENT</tt> states that a Node exists, gives its attributes and
public key, and gives one path to it. A Node originates its own
<tt>NODE_INFO_ADVERTISEMENT</tt> at startup and again whenever a signed field of its
<tt>node_info</tt> changes. A Forwarding Node that accepts one re-publishes it,
with its own path element appended, whenever its best path to the
originator changes (<xref target="nib-candidates"/>). A receiver stores the signed
fields in the Node Table entry for the originator and the path as the sending
peer's candidate.</t>
        <t>A <tt>NODE_INFO_WITHDRAWAL</tt> states that a Node is leaving the mesh. Only the Node
itself sends it, with an empty path. A receiver removes the Node Table entry
and all its candidates and re-floods the withdrawal. A Node that has only lost
its path to another Node sends <tt>NODE_UNREACH</tt> instead
(<xref target="msg-node-unreach"/>).</t>
        <section anchor="node-info">
          <name>node_info Structure</name>
          <t>The <tt>node_info</tt> structure is:</t>
          <figure>
            <name>node_info encoding</name>
            <artwork><![CDATA[
node_info {
  id (128),
  type (8),
  contact_len (8),
  contact (..),
  longitude (64),
  latitude (64),
  pubkey (256),
  origin_epoch (64),
  sequence (64),
  data_modes (8),
  path_len (i),
  path (..) ...,
  origin_sig (512),
}

path_element {
  flags (8),
  node_id_or_token (128),
  srtt_us (64),
  hop_count (16),
}
]]></artwork>
          </figure>
          <dl>
            <dt>id:</dt>
            <dd>
              <t>The Node ID of the Node this entry describes (<xref target="node-id"/>).</t>
            </dd>
            <dt>type:</dt>
            <dd>
              <t><tt>0</tt> for a MIX Transit Node, <tt>1</tt> for a MIX Edge Node, <tt>2</tt> for a MIX
Control Node. Other values are reserved.</t>
            </dd>
            <dt>contact_len, contact:</dt>
            <dd>
              <t>An optional UTF-8 contact string of <tt>contact_len</tt> bytes (0 to 253),
without a NUL terminator.</t>
            </dd>
            <dt>longitude, latitude:</dt>
            <dd>
              <t>Optional location, each an IEEE 754 binary64 value in network byte
order.</t>
            </dd>
            <dt>pubkey:</dt>
            <dd>
              <t>The originator's Ed25519 public key (<xref target="origin-auth"/>).</t>
            </dd>
            <dt>origin_epoch, sequence:</dt>
            <dd>
              <t>Freshness fields (<xref target="sequence-comparison"/>, <xref target="origin-epoch"/>).</t>
            </dd>
            <dt>data_modes:</dt>
            <dd>
              <t>The forwarding modes the Node supports (see below).</t>
            </dd>
            <dt>path_len, path:</dt>
            <dd>
              <t>The number of path elements (0 to 32), followed by that many
<tt>path_element</tt> structures, ordered from the originator to the most
recent hop (see below).</t>
            </dd>
            <dt>origin_sig:</dt>
            <dd>
              <t>The originator's Ed25519 signature (<xref target="origin-auth"/>).</t>
            </dd>
            <dt>flags:</dt>
            <dd>
              <t>Path element flags (see below).</t>
            </dd>
            <dt>node_id_or_token:</dt>
            <dd>
              <t>The Node ID of this hop, or an aggregation token when flags bit 0 is
set (<xref target="path-aggregation"/>).</t>
            </dd>
            <dt>srtt_us:</dt>
            <dd>
              <t>The hop's sRTT to the previous hop, in microseconds, or the sum over
an aggregated run.</t>
            </dd>
            <dt>hop_count:</dt>
            <dd>
              <t>The number of Nodes this element represents: <tt>1</tt>, or more for an
aggregated element.</t>
            </dd>
          </dl>
          <t>The <tt>data_modes</tt> byte advertises which inter-relay forwarding modes the
Node supports:</t>
          <table>
            <name>data_modes bitmap</name>
            <thead>
              <tr>
                <th align="left">Bit</th>
                <th align="left">Meaning</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0</td>
                <td align="left">Native mode (see <xref target="forwarding-modes"/>). Set by every Forwarding Node.</td>
              </tr>
              <tr>
                <td align="left">1</td>
                <td align="left">Pipelined mode (see <xref target="forwarding-modes"/>).</td>
              </tr>
              <tr>
                <td align="left">2-7</td>
                <td align="left">Reserved; <bcp14>MUST</bcp14> be sent as 0 and ignored on receive.</td>
              </tr>
            </tbody>
          </table>
          <t>A Forwarding Node <bcp14>MUST</bcp14> set bit 0. A Control Node does not forward
objects and <bcp14>MUST</bcp14> send <tt>data_modes = 0</tt>. A receiver <bcp14>MUST</bcp14> treat a Node
whose <tt>type</tt> is a value other than 0, 1, or 2 as a Control Node for
path selection. Bit 1 is set only if the Node's implementation
performs MIX Data Header framing and byte-pipeline forwarding on the
data plane.</t>
          <t>The <tt>flags</tt> byte in each path element encodes:</t>
          <table>
            <name>Path element flags</name>
            <thead>
              <tr>
                <th align="left">Bit</th>
                <th align="left">Meaning</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0</td>
                <td align="left">Aggregated: <tt>node_id_or_token</tt> is an opaque aggregation token</td>
              </tr>
              <tr>
                <td align="left">1-7</td>
                <td align="left">Reserved; <bcp14>MUST</bcp14> be sent as 0 and ignored on receive</td>
              </tr>
            </tbody>
          </table>
          <t><tt>hop_count</tt> gives the number of Nodes represented by the element. For
non-aggregated elements it is always <tt>1</tt>. For aggregated elements it
records the interior hop count so downstream selection can still
compute a meaningful path length. See <xref target="path-aggregation"/>.</t>
          <t>The originator publishes its own <tt>NODE_INFO_ADVERTISEMENT</tt> with a single path
element for itself (<tt>srtt_us = 0</tt>, <tt>hop_count = 1</tt>). Each Node that
re-publishes the advertisement appends its own element, with <tt>srtt_us</tt>
set to its sRTT to the peer it received the advertisement from.
Elements therefore run from the originator to the most recent hop.</t>
          <t>The 32-element maximum on <tt>path_len</tt> bounds propagation diameter and
functions as a hop-count TTL. A Node that receives a <tt>NODE_INFO_ADVERTISEMENT</tt>
whose <tt>path_len</tt> is 32 <bcp14>MUST NOT</bcp14> re-flood it (appending its own hop
would exceed the maximum); the entry is still accepted locally. A
receiver <bcp14>MUST</bcp14> discard any advertisement that arrives with
<tt>path_len &gt; 32</tt> as malformed.</t>
        </section>
      </section>
      <section anchor="msg-node-unreach">
        <name>NODE_UNREACH</name>
        <t>States that the sender no longer has a path to the Node named by
<tt>node_id</tt>, and retracts the path it last advertised for that Node. A
Node sends it on its own behalf, not an originator's, so it is not signed.
When a Node sends it and how a receiver applies it are specified in
<xref target="nib-candidates"/>.</t>
        <figure>
          <name>node_unreach encoding</name>
          <artwork><![CDATA[
node_unreach {
  node_id (128),
}
]]></artwork>
        </figure>
        <dl>
          <dt>node_id:</dt>
          <dd>
            <t>The Node ID of the Node that is no longer reachable.</t>
          </dd>
        </dl>
      </section>
      <section anchor="msg-publish-info">
        <name>PUBLISH_INFO_ADVERTISEMENT and PUBLISH_INFO_WITHDRAWAL</name>
        <t>A <tt>PUBLISH_INFO_ADVERTISEMENT</tt> states that a track is available at its originator,
and the forwarding mode the originator requests for it
(<xref target="forwarding-modes"/>). An Edge Node originates one when a local MOQT
publisher makes a track available. A receiver stores it in its Publisher Table.</t>
        <t>A <tt>PUBLISH_INFO_WITHDRAWAL</tt> states that the track is no longer available at
the originator. The originator sends it when its local publisher stops
publishing. A receiver removes the Publisher Table entry.</t>
        <section anchor="pib-entry">
          <name>publish_info Structure</name>
          <t>The <tt>publish_info</tt> structure is:</t>
          <figure>
            <name>publish_info encoding</name>
            <artwork><![CDATA[
publish_info {
  sequence (64),
  source_node_id (128),
  origin_epoch (64),
  track_full_name_hash (..),
  forwarding_mode (8),
  parameters_len (i),
  parameters (..),
  origin_sig (512),
}

track_full_name_hash {
  namespace_hashes_len (16),
  namespace_hashes (128) ...,
  name_hash (128),
}
]]></artwork>
          </figure>
          <dl>
            <dt>sequence, origin_epoch:</dt>
            <dd>
              <t>Freshness fields (<xref target="sequence-comparison"/>, <xref target="origin-epoch"/>).</t>
            </dd>
            <dt>source_node_id:</dt>
            <dd>
              <t>The Node ID of the originator.</t>
            </dd>
            <dt>track_full_name_hash:</dt>
            <dd>
              <t>The per-component hashes of the track's namespace tuple
(<tt>namespace_hashes_len</tt> of them) and of its name (<xref target="track-hash"/>),
so receivers can do prefix matching. The single-value
<tt>full_name_hash</tt> used in Publisher and Subscriber Table keys is derived from these
components.</t>
            </dd>
            <dt>forwarding_mode:</dt>
            <dd>
              <t>The mode the originator selected for this track: <tt>0</tt> for native, <tt>1</tt>
for pipelined (<xref target="forwarding-modes"/>). It is covered by the originator
signature (<xref target="origin-auth"/>), and an intermediate Node <bcp14>MUST NOT</bcp14>
rewrite it.</t>
            </dd>
            <dt>parameters_len, parameters:</dt>
            <dd>
              <t>Additional MOQT <tt>PUBLISH</tt> / <tt>PUBLISH_NAMESPACE</tt> parameters as defined
in <xref target="MoQTransport"/>, opaque to MIX.</t>
            </dd>
            <dt>origin_sig:</dt>
            <dd>
              <t>The originator's Ed25519 signature (<xref target="origin-auth"/>).</t>
            </dd>
          </dl>
          <t>A <tt>PUBLISH_INFO_WITHDRAWAL</tt> uses the same encoding with <tt>parameters_len = 0</tt>;
receivers ignore its <tt>forwarding_mode</tt> field.</t>
        </section>
      </section>
      <section anchor="msg-subscribe-info">
        <name>SUBSCRIBE_INFO_ADVERTISEMENT and SUBSCRIBE_INFO_WITHDRAWAL</name>
        <t>A <tt>SUBSCRIBE_INFO_ADVERTISEMENT</tt> states that its originator has local subscribers for
a track. An Edge Node originates one when its first local subscriber
for the track subscribes. A receiver stores it in its Subscriber Table.</t>
        <t>A <tt>SUBSCRIBE_INFO_WITHDRAWAL</tt> states that the originator no longer has subscribers
for the track. The originator sends it when its last local subscriber
leaves. A receiver removes the Subscriber Table entry.</t>
        <section anchor="sib-entry">
          <name>subscribe_info Structure</name>
          <t>The <tt>subscribe_info</tt> structure is:</t>
          <figure>
            <name>subscribe_info encoding</name>
            <artwork><![CDATA[
subscribe_info {
  sequence (64),
  source_node_id (128),
  origin_epoch (64),
  track_full_name_hash (..),
  subscribe_data_len (i),
  subscribe_data (..),
  origin_sig (512),
}
]]></artwork>
          </figure>
          <t><tt>sequence</tt>, <tt>source_node_id</tt>, <tt>origin_epoch</tt>, <tt>track_full_name_hash</tt>,
and <tt>origin_sig</tt> are as in <tt>publish_info</tt> (<xref target="pib-entry"/>).</t>
          <dl>
            <dt>subscribe_data_len, subscribe_data:</dt>
            <dd>
              <t>Subscription data of <tt>subscribe_data_len</tt> bytes.</t>
            </dd>
          </dl>
          <t>A <tt>SUBSCRIBE_INFO_WITHDRAWAL</tt> uses the same encoding with
<tt>subscribe_data_len = 0</tt>.</t>
        </section>
      </section>
      <section anchor="msg-sns">
        <name>DELIVERY_NODE_SET_ADVERTISEMENT and DELIVERY_NODE_SET_WITHDRAWAL</name>
        <t>A <tt>DELIVERY_NODE_SET_ADVERTISEMENT</tt> carries one Delivery Node Set: for one track on the Data
Session whose <tt>delivery-node-sets</tt> track carries it (<xref target="sns-track"/>), the destination
Nodes the track must reach through the downstream Node. The upstream Node of the Data Session sends it, and a later advertisement
for the same Delivery Node Set Id replaces the earlier one. A
<tt>DELIVERY_NODE_SET_WITHDRAWAL</tt> removes the Delivery Node Set whose Id is given by the
MOQT group it appears in; its body
is empty. Both are local to one Data Session and are not signed.</t>
        <t>The <tt>delivery_node_set_info</tt> structure is:</t>
        <figure>
          <name>delivery_node_set_info encoding</name>
          <artwork><![CDATA[
delivery_node_set_info {
  delivery_set_id (32),
  full_name_hash (128),
  nodes_len (i),
  nodes (128) ...,
}
]]></artwork>
        </figure>
        <dl>
          <dt>delivery_set_id:</dt>
          <dd>
            <t>The Id this Delivery Node Set is published under (<xref target="sns-concept"/>).</t>
          </dd>
          <dt>full_name_hash:</dt>
          <dd>
            <t>The track this Delivery Node Set applies to (<xref target="track-hash"/>).</t>
          </dd>
          <dt>nodes_len, nodes:</dt>
          <dd>
            <t>The number of destination Nodes, followed by their Node IDs.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="track-hash">
      <name>Track Hashing</name>
      <t>All MIX track identifiers (namespace hash, name hash, full-name hash)
are 128-bit values computed with keyed SipHash-2-4 <xref target="SipHash"/> in
two-word output mode. The SipHash key is a fixed 16-byte value shared
by every MIX Node:</t>
      <figure>
        <name>MIX track-hash SipHash key</name>
        <artwork><![CDATA[
  MIX_SIPHASH_KEY = 4d 49 58 74 72 61 63 6b 68 61 73 68 4b 31 00 00
                   ("MIXtrackhashK1" zero-padded to 16 bytes)
]]></artwork>
      </figure>
      <t>A single fixed key across the network suffices because MIX's security
posture treats track hashes as <em>identifiers</em>, not as capabilities: an
attacker who can guess a track name learns the corresponding hash and
gains nothing beyond what they'd gain by observing an advertisement on the wire.
The key is fixed to guarantee interoperability. Deployments <bcp14>MAY</bcp14>
additionally rekey by rolling a new protocol version.</t>
      <section anchor="namespace-and-name-hashes">
        <name>Namespace and Name Hashes</name>
        <t>MOQT track identifiers are tuples: an ordered list of namespace strings
plus a name string. MIX hashes each component individually.</t>
        <t>For a namespace tuple <tt>ns = (ns_0, ns_1, ..., ns_k-1)</tt> and a name
string <tt>nm</tt>:</t>
        <artwork><![CDATA[
  namespace_hash_i = SipHash-2-4-128(MIX_SIPHASH_KEY, ns_i)
  name_hash        = SipHash-2-4-128(MIX_SIPHASH_KEY, nm)
]]></artwork>
        <t>The <tt>namespace_hashes[]</tt> field of <tt>publish_info</tt> and <tt>subscribe_info</tt> is
exactly this per-component sequence.</t>
        <t>For contexts that require a single value (Publisher and Subscriber Table keys, Delivery Node Set
lookup), the <tt>full_name_hash</tt> is:</t>
        <artwork><![CDATA[
  full_name_hash = SipHash-2-4-128(
      MIX_SIPHASH_KEY,
      ns_0 || 0x00 || ns_1 || 0x00 || ... || ns_{k-1} || 0x00 || nm)
]]></artwork>
        <t>The <tt>0x00</tt> separator prevents boundary-injection attacks (namespaces
<tt>("ab","c")</tt> and <tt>("a","bc")</tt> produce distinct hashes).</t>
      </section>
      <section anchor="rationale">
        <name>Rationale</name>
        <t>MIX hashes identify tracks; they are not authenticators. Compared to
the 64-bit FNV-1a64 used in earlier designs, SipHash-128 raises the
cost of accidental or adversarial collisions by many orders of
magnitude: FNV-1a64 collisions can be constructed in seconds, whereas
constructing a 128-bit SipHash collision requires on the order of
<tt>2^64</tt> work (birthday bound).</t>
        <t>The SipHash key is a published constant, so MIX hashes offer no
secret-key protection against chosen inputs. Authorization of
advertisements is handled separately by originator
signatures (<xref target="origin-auth"/>) and operator-level ACLs. Implementations
<bcp14>MUST NOT</bcp14> treat MIX hashes as capabilities, authenticators, or
authorization tokens.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> validate their SipHash output against the test
vectors in <xref target="SipHash"/>.</t>
      </section>
    </section>
    <section anchor="origin-auth">
      <name>Originator Authentication</name>
      <t>Originator authentication is a core requirement of MIX. Every <tt>CONNECT</tt>,
<tt>NODE_INFO_ADVERTISEMENT</tt>, <tt>SUBSCRIBE_INFO_ADVERTISEMENT</tt>, <tt>PUBLISH_INFO_ADVERTISEMENT</tt>, and their
respective <tt>_WITHDRAWAL</tt> variants <bcp14>MUST</bcp14> carry a 64-byte Ed25519 <xref target="RFC8032"/>
signature produced by the originating Node's private key. There is no
unsigned encoding of these messages. <tt>NODE_UNREACH</tt> (<xref target="nib-candidates"/>)
is not an originator's advertisement: it retracts only the sender's own path
and is not signed. Every Node <bcp14>MUST</bcp14> verify the signature before
installing the entry in its Node, Publisher, or Subscriber Table and
before re-flooding. Advertisements
that fail signature verification <bcp14>MUST</bcp14> be discarded and <bcp14>MUST NOT</bcp14> be
re-flooded.</t>
      <t>Signature verification restricts trust in the peering fabric to the
<em>originator</em> of each advertisement rather than to every transit peer. A
compromised transit Node can suppress or delay advertisements it
receives (a routing availability failure) but cannot forge <tt>NODE_INFO</tt>,
<tt>SUBSCRIBE_INFO</tt>, or <tt>PUBLISH_INFO</tt> on behalf of another Node.</t>
      <section anchor="signature-input">
        <name>Signature Input</name>
        <t>The signature covers a canonical byte string over the immutable portion
of the advertisement. The mutable portion of a <tt>NODE_INFO_ADVERTISEMENT</tt> — its
<tt>path</tt> accumulated during propagation — is excluded from signature
input. Specifically:</t>
        <t>For <tt>CONNECT</tt>, <tt>NODE_INFO_ADVERTISEMENT</tt>, and <tt>NODE_INFO_WITHDRAWAL</tt>:</t>
        <figure>
          <name>Signature input for node_info</name>
          <artwork><![CDATA[
node_info_sig_input {
  domain_separator (..) = "MIX/node_info/v1",
  tag (8),
  id (128),
  type (8),
  contact_len (8),
  contact (..),
  longitude (64),
  latitude (64),
  pubkey (256),
  origin_epoch (64),
  sequence (64),
  data_modes (8),
}
]]></artwork>
        </figure>
        <t>Note that <tt>path</tt> is not part of the signature input: paths accumulate
during propagation and cannot be pre-signed by the originator. Therefore,
the originator signature does not protect path contents or metrics. MIX
implementations <bcp14>MUST</bcp14> treat path data as an assertion by the immediate
authenticated peer unless a future version defines per-hop integrity.
Inter-provider deployments <bcp14>MUST NOT</bcp14> use an unsigned path as a sole
authorization or policy signal. Path aggregation does not solve this
integrity limitation.</t>
        <t>For <tt>SUBSCRIBE_INFO_ADVERTISEMENT</tt> and <tt>SUBSCRIBE_INFO_WITHDRAWAL</tt>:</t>
        <figure>
          <name>Signature input for subscribe_info</name>
          <artwork><![CDATA[
subscribe_info_sig_input {
  domain_separator (..) = "MIX/subscribe_info/v1",
  tag (8),
  sequence (64),
  source_node_id (128),
  origin_epoch (64),
  track_full_name_hash (..),
  subscribe_data_len (i),
  subscribe_data (..),
}
]]></artwork>
        </figure>
        <t>For <tt>PUBLISH_INFO_ADVERTISEMENT</tt> and <tt>PUBLISH_INFO_WITHDRAWAL</tt>:</t>
        <figure>
          <name>Signature input for publish_info</name>
          <artwork><![CDATA[
publish_info_sig_input {
  domain_separator (..) = "MIX/publish_info/v1",
  tag (8),
  sequence (64),
  source_node_id (128),
  origin_epoch (64),
  track_full_name_hash (..),
  forwarding_mode (8),
  parameters_len (i),
  parameters (..),
}
]]></artwork>
        </figure>
        <t>Each field takes its value from the message being signed, and <tt>tag</tt> is
that message's tag (<xref target="message-encoding"/>). <tt>domain_separator</tt> is the
ASCII string shown, with no length prefix or terminator; it prevents a
signature over one message type from being reused for another.
Variable-length integers appear in their shortest encoding.</t>
      </section>
      <section anchor="origin-epoch">
        <name>Replay Guard</name>
        <t>Every advertisement includes a 64-bit <tt>origin_epoch</tt> set by the
originating Node. It identifies a Node incarnation and <bcp14>MUST</bcp14> increase
before that Node publishes after a restart that could reuse a sequence.
It <bcp14>MUST NOT</bcp14> be derived solely from an unsynchronized wall clock. The
pair <tt>(origin_epoch, sequence)</tt> distinguishes a new process incarnation
from successive updates in that incarnation; <tt>sequence</tt> is wide enough
to avoid modular comparison and wrap handling.</t>
        <t>Freshness comparison is defined in <xref target="sequence-comparison"/>.
Withdrawals carry the same originator, key, and freshness fields and an
originator signature, so a stale withdrawal cannot erase newer state.</t>
      </section>
      <section anchor="public-key-distribution">
        <name>Public Key Distribution</name>
        <t>The <tt>CONNECT</tt> object includes the Node's public key and signed
<tt>node_info</tt>. A receiver <bcp14>MUST</bcp14> check both the signature and the binding
between the public key and Node ID before using the key to validate
advertisements. Deployments <bcp14>MAY</bcp14> also distribute trusted keys out of
band.</t>
        <t>An implementation <bcp14>MUST NOT</bcp14> install a signed advertisement whose signature
verifies against a public key it has never confirmed for that Node ID
via at least one of:</t>
        <ul spacing="normal">
          <li>
            <t>A prior <tt>CONNECT</tt> object received over an authenticated, authorized
MOQT session.</t>
          </li>
          <li>
            <t>An out-of-band configuration source (for example, a peering registry).</t>
          </li>
          <li>
            <t>A first-flight trust-on-first-use policy, if local policy explicitly
permits it.</t>
          </li>
        </ul>
        <t>Deployments in inter-provider settings <bcp14>SHOULD NOT</bcp14> rely on trust-on-first-
use.</t>
      </section>
    </section>
    <section anchor="convergence-and-flood-minimization">
      <name>Convergence and Flood Minimization</name>
      <t>As in BGP <xref target="BGP"/>, the Node, Publisher, and Subscriber Tables at each
Node hold the most recent advertisement
it has accepted for each key, and the mesh has converged when no Node
has anything new to publish. To keep re-flooding to a minimum and avoid
oscillation, Nodes <bcp14>SHOULD</bcp14>:</t>
      <ul spacing="normal">
        <li>
          <t>Suppress repeats. Keep a sent-state record: for each key, the
last advertisement or withdrawal the Node published on its own
<tt>nodes</tt>, <tt>publishers</tt>, or <tt>subscribers</tt> track. BGP calls the
equivalent state the Adj-RIB-Out. A Node does not publish a message
that matches its sent-state record.</t>
        </li>
        <li>
          <t>Ignore sRTT jitter when deciding whether a best path changed
materially (<xref target="selection"/>).</t>
        </li>
        <li>
          <t>Rate-limit what it publishes on those tracks; a token bucket
suffices.</t>
        </li>
        <li>
          <t>Damp flapping keys with the Minimum Route Advertisement Interval
(MRAI) extension (<xref target="mrai"/>) where it is deployed.</t>
        </li>
      </ul>
      <t>These techniques are informative. Conforming implementations <bcp14>MAY</bcp14> use
other mechanisms provided that convergence is guaranteed in finite time
in the absence of continuing topology change.</t>
    </section>
    <section anchor="deployment-models">
      <name>Deployment Models</name>
      <t>This section is informative, except <xref target="pib-sib-reflection"/>, which is
normative for Nodes in a split deployment. It describes the two deployment shapes for MIX and the
trade-offs between them.</t>
      <t>MIX separates topology state (the Node Table), which grows with the
number of Nodes, from per-track state (the Publisher and Subscriber
Tables), which grows with the number of tracks and subscribers. The
Node Table has to follow the data-plane topology because path
selection runs over it; the Publisher and Subscriber Tables do not.
Operators can therefore exchange all three tables among the Forwarding
Nodes, the simplest shape to operate, or move the exchange of the
Publisher and Subscriber Tables to a small, dedicated
set of Control Nodes in front of a larger forwarding fabric. The
choice shapes failure blast radius, the trust model between control
and data roles, and which parts of the operational toolchain are
involved in a given MIX event.</t>
      <section anchor="integrated-model">
        <name>Integrated model</name>
        <t>In the integrated model, every Node is a Forwarding Node and every
peering has Full scope (<xref target="peering-scope"/>). The same pair of Nodes
exchanges Node, Publisher, and Subscriber Tables over a Control Session and, when a
track needs to flow, forwards objects over a separate Data Session.</t>
        <figure>
          <name>Integrated deployment</name>
          <artwork><![CDATA[
 ---  Control Session: Node, Publisher, and Subscriber Tables
 ===  Data Session: Delivery Node Sets and objects

 +---------+   +---------+   +---------+   +---------+
 | Edge A1 |---|Transit X|---|Transit Y|---| Edge B1 |
 |         |===|         |===|         |===|         |
 +---------+   +---------+   +---------+   +---------+

 Every Node exchanges all three tables and forwards objects.
]]></artwork>
        </figure>
        <t>Properties:</t>
        <ul spacing="normal">
          <li>
            <t>One role per Node. Each Node holds its own Node, Publisher, and Subscriber
Tables and forwards
objects for the Delivery Node Set Ids it is responsible for.</t>
          </li>
          <li>
            <t>Failure blast radius = the relay. Losing a Node withdraws its
table entries and tears down its data-plane peerings together.</t>
          </li>
          <li>
            <t>Simplest to operate. No Control Nodes to place or provision.</t>
          </li>
        </ul>
        <t>Typical use: small-to-medium meshes within a single operator,
pre-production environments, and reference implementations.</t>
      </section>
      <section anchor="split-model">
        <name>Split model</name>
        <t>In the split model, a small, redundant set of Control Nodes holds and
distributes Publisher and Subscriber Table state for a larger fabric of Forwarding Nodes.
Forwarding Nodes exchange only their Node Tables with their data-plane neighbors,
so path selection (<xref target="selection"/>) runs over the data-plane topology.
Publisher and Subscriber Table entries reach Forwarding Nodes through the Control Nodes.
Each entry names its originator in <tt>source_node_id</tt>, and a Forwarding Node
finds the path toward that originator in its own Node Table. Control Nodes never
appear in a data-plane path.</t>
        <t>Peerings are configured as follows:</t>
        <ul spacing="normal">
          <li>
            <t>Each Forwarding Node holds Topology peerings with its data-plane
neighbors, and Reflection peerings with at least one Control Node.
It <bcp14>SHOULD</bcp14> hold Reflection peerings with at least two, so that the
loss of one is covered by <xref target="control-node-loss"/>.</t>
          </li>
          <li>
            <t>Control Nodes hold Reflection peerings with each other and with the
Forwarding Nodes they serve.</t>
          </li>
        </ul>
        <figure>
          <name>Split deployment</name>
          <artwork><![CDATA[
 ---  Control Session        ===  Data Session

                    Publisher and
          +------+  Subscriber Tables +------+  Control Nodes:
          |  C1  |--------------------|  C2  |  Publisher and
          +------+                    +------+  Subscriber Tables only,
             |                           |      no objects
      +------+------+-------------+------+------+
      |             |             |             |
 +---------+   +---------+   +---------+   +---------+
 | Edge A1 |---|Transit X|---|Transit Y|---| Edge B1 |
 |         |===|         |===|         |===|         |
 +---------+   +---------+   +---------+   +---------+

 Reflection peerings (to C1 and C2): Publisher and Subscriber
 Tables, plus the Node Table toward the Control Nodes. Topology
 peerings between Forwarding Nodes: Node Table only. Data
 Sessions: Delivery Node Sets and objects.
]]></artwork>
        </figure>
        <t>Properties:</t>
        <ul spacing="normal">
          <li>
            <t>Two roles. Control Nodes hold Publisher and Subscriber Tables for the whole domain.
Forwarding Nodes hold the full Node Table, which grows only with the number
of Nodes, plus the Publisher and Subscriber Table entries the Control Nodes send them.</t>
          </li>
          <li>
            <t>Failure blast radius is split. Losing one Control Node is
covered by the remaining ones (<xref target="control-node-loss"/>). Losing a
Forwarding Node closes its Topology peerings; its neighbors withdraw
it from Node Table and re-run path selection without involving the Control
Nodes.</t>
          </li>
          <li>
            <t>Independent scaling. Per-track state scales on the Control
Nodes; Forwarding Nodes scale with the number of Nodes and
concurrent flows. In the integrated model every Node carries both.</t>
          </li>
        </ul>
        <t>Typical use: large multi-site deployments, operators who already
separate control and forwarding planes elsewhere in their stack, and
inter-provider interconnects where the control-plane trust surface is
intentionally smaller than the forwarding fabric.</t>
        <t>Three things a split deployment needs are out of scope for this
specification and are left to configuration or other specifications:
how a Forwarding Node finds the Control Nodes for its domain and
replaces one it has lost; how a Control Node verifies that a
Forwarding Node may inject Publisher and Subscriber Table entries for its local
publishers and subscribers, beyond the originator signature; and which
Publisher and Subscriber Table entries a Control Node sends to which Forwarding Nodes,
since sending every entry to every Forwarding Node scales poorly.</t>
        <section anchor="pib-sib-reflection">
          <name>Publisher and Subscriber Table Reflection</name>
          <t>Control Nodes reflect Publisher and Subscriber Table entries in a single hop over a full
mesh, in the manner of BGP route reflection <xref target="RR"/>. The Control Nodes
serving a domain <bcp14>MUST</bcp14> hold a Reflection peering with every other
Control Node in that domain.</t>
          <t>A Control Node publishes two tracks in addition to <tt>publishers</tt> and <tt>subscribers</tt>:
<tt>publishers-mesh</tt> and <tt>subscribers-mesh</tt> (<xref target="control-plane"/>). Its Forwarding Node
peers subscribe to <tt>publishers</tt> and <tt>subscribers</tt>; its Control Node peers subscribe
to <tt>publishers-mesh</tt> and <tt>subscribers-mesh</tt> (<xref target="peering-scope"/>). Which accepted
entries a Node re-publishes depends on its role and where it learned
the entry:</t>
          <table>
            <name>Publisher and Subscriber Tables re-publication in the split model</name>
            <thead>
              <tr>
                <th align="left">Node</th>
                <th align="left">Entry learned from</th>
                <th align="left">Re-published on</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Control Node</td>
                <td align="left">A Forwarding Node</td>
                <td align="left">
                  <tt>publishers</tt>/<tt>subscribers</tt> and <tt>publishers-mesh</tt>/<tt>subscribers-mesh</tt></td>
              </tr>
              <tr>
                <td align="left">Control Node</td>
                <td align="left">A Control Node (<tt>publishers-mesh</tt>/<tt>subscribers-mesh</tt>)</td>
                <td align="left">
                  <tt>publishers</tt>/<tt>subscribers</tt> only</td>
              </tr>
              <tr>
                <td align="left">Forwarding Node</td>
                <td align="left">Any Reflection peering</td>
                <td align="left">Not re-published</td>
              </tr>
            </tbody>
          </table>
          <t>A Control Node needs two pairs of tracks because a MOQT track delivers
the same objects to every subscriber. Its clients need every entry it
holds, while other Control Nodes need only the entries learned from its
own clients. If other Control Nodes subscribed to <tt>publishers</tt> and <tt>subscribers</tt>
instead, each would re-publish what it received, and every Control Node
would receive every entry once from each of the others. Nothing would
loop, because copies that are not newer are dropped
(<xref target="sequence-comparison"/>), but each copy still costs a signature check.
With the mesh tracks, an entry from Edge A, a client of C1, travels as
follows:</t>
          <figure>
            <name>One-hop reflection through the mesh tracks</name>
            <artwork><![CDATA[
                      +---------+
                      | Edge A  |  originator, a client of C1
                      +---------+
                           |  publishers
                           v
                      +---------+
           +----------|   C1    |-----------+
           |          +---------+           |
           |  publishers   publishers-mesh  |
           v                                v
    +-------------+                  +-------------+
    | C1's other  |                  |   C2, C3    |
    |   clients   |                  +-------------+
    +-------------+                         |  publishers only,
                                            |  never publishers-mesh
                                            v
                                     +-------------+
                                     | C2's and    |
                                     | C3's clients|
                                     +-------------+
]]></artwork>
          </figure>
          <t>Because entries learned from another Control Node never return to the
mesh, every entry crosses at most two Control Nodes on its way from
originator to Forwarding Node. A Forwarding Node that holds a Reflection
peering <bcp14>MUST NOT</bcp14> hold Full peerings, so its <tt>publishers</tt> and <tt>subscribers</tt> tracks
carry only the entries it originates.</t>
          <t>The same entry normally arrives more than once: a Control Node
receives it from each Control Node that serves its originator, and a
Forwarding Node receives it from each Control Node it peers with. A
copy whose <tt>(origin_epoch, sequence)</tt> equals the stored one is not
accepted as new (<xref target="sequence-comparison"/>) and is not re-flooded.</t>
        </section>
      </section>
    </section>
    <section anchor="extensions">
      <name>Extensions</name>
      <t>The sections before this one, other than those marked informative,
form the mandatory MIX core. Every conforming implementation <bcp14>MUST</bcp14>
implement them, except for features marked <bcp14>OPTIONAL</bcp14> where they are
defined. The sections that follow define <bcp14>OPTIONAL</bcp14> extensions; a Node
<bcp14>MAY</bcp14> implement any subset. Each extension is
self-describing on the wire (via existing capability bits, path-element
flags, or policy configuration) so that a Node without a given
extension interoperates unchanged with a Node that has it.</t>
    </section>
    <section anchor="path-aggregation">
      <name>Extension: Path Aggregation</name>
      <t>This extension allows a Transit Node to replace a contiguous run of
<tt>path</tt> elements with a single aggregated element. The aggregated
element carries an aggregator-scoped token (<xref target="agg-token"/>) in place of
the interior Node IDs, and the sum of the interior sRTTs in place of
the per-hop values. Loop detection (<xref target="agg-loop-detection"/>) and
best-path selection continue to work across the aggregated element.</t>
      <t>Path aggregation is intended for an operator that provides transit for
third parties and does not want to reveal the interior topology of its
network to external peers. It also shortens <tt>path</tt> on
advertisements sent across wide-area peerings. In a single-operator
mesh it provides no benefit and <bcp14>SHOULD</bcp14> be disabled.</t>
      <t>A Transit Node <bcp14>MAY</bcp14> aggregate a contiguous run of path elements that it
originated or transited, provided all of those elements belong to a
single administrative aggregation domain recognized by local policy.</t>
      <section anchor="agg-token">
        <name>Aggregation Token</name>
        <t>The aggregation token is a 128-bit HMAC-SHA-256 output truncated to the
first 16 bytes so that it shares the wire slot with a Node ID:</t>
        <artwork><![CDATA[
  agg_token = truncate128(HMAC-SHA-256(
      key    = aggregator_secret,
      input  = "MIX/agg/v1" || aggregator_scope_id))
]]></artwork>
        <t><tt>aggregator_secret</tt> is a per-aggregator 32-byte value <bcp14>SHOULD</bcp14> be rotated
periodically. <tt>aggregator_scope_id</tt> is a 128-bit value identifying the
aggregation domain (typically the aggregator's own Node ID, but a
distinct value <bcp14>MAY</bcp14> be used when a single operator runs multiple
disjoint aggregation domains).</t>
        <t><tt>agg_token</tt> is stable per aggregator for the lifetime of
<tt>aggregator_secret</tt>, which allows a downstream Node to detect a loop
that transits the aggregator twice: the same <tt>agg_token</tt> reappears in
the accumulating path.</t>
      </section>
      <section anchor="construction-rules">
        <name>Construction Rules</name>
        <t>When a Transit Node V receives a <tt>NODE_INFO_ADVERTISEMENT</tt> and re-floods it to peer P,
V <bcp14>MAY</bcp14> apply aggregation:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <tt>interior</tt> be the contiguous suffix of <tt>path</tt> whose elements
V considers part of its own aggregation domain, followed by V's own
about-to-be-appended element.</t>
          </li>
          <li>
            <t>If aggregation to P is permitted by local policy AND <tt>|interior| &gt; 1</tt>,
V replaces <tt>interior</tt> in the outbound <tt>path</tt> with a single element:  </t>
            <artwork><![CDATA[
flags            = 0x01                 ; aggregated bit set
node_id_or_token = agg_token            ; V's aggregation token
srtt_us          = sum(srtt_us over interior)
hop_count        = sum(hop_count over interior)
]]></artwork>
          </li>
          <li>
            <t>Otherwise, V appends its own element unchanged:  </t>
            <artwork><![CDATA[
flags            = 0x00
node_id_or_token = V.node_id
srtt_us          = observed sRTT to previous hop
hop_count        = 1
]]></artwork>
          </li>
        </ol>
        <t>Aggregation <bcp14>MUST NOT</bcp14> re-order path elements outside the aggregated
suffix. Aggregation <bcp14>MUST NOT</bcp14> alter path elements that are already
aggregated by a different aggregator (recognizable by their <tt>flags</tt>
being set with a different <tt>node_id_or_token</tt>).</t>
      </section>
      <section anchor="agg-loop-detection">
        <name>Loop Detection</name>
        <t>A receiver detects a loop as follows:</t>
        <ul spacing="normal">
          <li>
            <t>For a non-aggregated element (flags bit 0 clear), the receiver checks
whether <tt>node_id_or_token</tt> equals its own Node ID.</t>
          </li>
          <li>
            <t>For an aggregated element (flags bit 0 set), the receiver checks
whether <tt>node_id_or_token</tt> equals any <tt>agg_token</tt> derived from its own
<tt>aggregator_secret</tt> and any <tt>aggregator_scope_id</tt> it uses.</t>
          </li>
        </ul>
        <t>If either check matches, the advertisement is a loop: it removes the
sending peer's candidate instead of adding one (<xref target="nib-candidates"/>).</t>
      </section>
      <section anchor="selection-semantics">
        <name>Selection Semantics</name>
        <t>Best-path selection (<xref target="selection"/>) <bcp14>SHOULD</bcp14> use the sum of <tt>hop_count</tt>
across path elements as the "path length" comparison metric, not
<tt>path_len</tt> (the number of encoded elements). This keeps aggregated and
non-aggregated advertisements comparable.</t>
      </section>
      <section anchor="policy-and-configurability">
        <name>Policy and Configurability</name>
        <t>Aggregation is a local policy decision at each Transit Node. Implementations
<bcp14>MUST</bcp14> provide operator control over:</t>
        <ul spacing="normal">
          <li>
            <t>Whether aggregation is enabled at all.</t>
          </li>
          <li>
            <t>Which peers receive aggregated advertisements (typically peers outside
the aggregator's administrative domain).</t>
          </li>
          <li>
            <t>The <tt>aggregator_secret</tt> and its rotation schedule.</t>
          </li>
        </ul>
        <t>A downstream Node cannot un-aggregate an aggregated path element. Its
best-current selection algorithm operates on the aggregated metrics
directly.</t>
      </section>
    </section>
    <section anchor="mrai">
      <name>Extension: MRAI Flood Damping</name>
      <t>This extension, named after BGP's Minimum Route Advertisement Interval
(MRAI) <xref target="BGP"/>, limits how often a Node re-advertises a key to a peer.
After sending an advertisement for a key to a peer, the Node holds
further advertisements for that key to that peer until a timer of
<tt>mrai_ms</tt> milliseconds expires (<xref target="mrai-timer"/>). Each key therefore
changes at most <tt>1000 / mrai_ms</tt> times per second on each peering. The
sent-state record (<xref target="convergence-and-flood-minimization"/>) alone does
not provide this bound, because a key that genuinely flaps differs from
the record on every transition.
Withdrawals are not delayed (<xref target="mrai-withdraw-bypass"/>), so failures still
propagate immediately, and the worst-case convergence time is bounded
(<xref target="mrai-convergence"/>).</t>
      <t>MRAI is intended for inter-provider peering and for any deployment in
which advertisement flaps from a peer could impose measurable work on
the receiver. In a single-operator mesh, a Node <bcp14>MAY</bcp14> omit this
extension.</t>
      <t>An implementation of this extension maintains a per-peer configuration
value <tt>mrai_ms</tt>, an integer number of milliseconds. Deployment guidance:</t>
      <table>
        <name>MRAI deployment guidance</name>
        <thead>
          <tr>
            <th align="left">Deployment</th>
            <th align="left">Recommended mrai_ms</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Closed-mesh, single operator</td>
            <td align="left">
              <tt>0</tt> (disabled)</td>
          </tr>
          <tr>
            <td align="left">Inter-provider peering</td>
            <td align="left">
              <tt>&gt;= 250</tt></td>
          </tr>
        </tbody>
      </table>
      <t><tt>mrai_ms = 0</tt> disables damping and reduces MRAI behavior to that of
the sent-state record plus the token-bucket rate limiter alone.
Closed-mesh deployments <bcp14>MAY</bcp14> use <tt>mrai_ms = 0</tt> since keys are unlikely
to be adversarially flapped and every millisecond of extra latency
matters.</t>
      <section anchor="mrai-timer">
        <name>Timer</name>
        <t>For each peer P and each key K (a Node ID for Node Table, or a
<tt>(source_node_id, full_name_hash)</tt> pair for Publisher and Subscriber Tables), a Node
maintains one timer <tt>T[P,K]</tt>.</t>
        <ul spacing="normal">
          <li>
            <t>On sending an advertisement to P for K, the Node records the current time as
the last-send time.</t>
          </li>
          <li>
            <t>Before sending any subsequent advertisement to P for K, the Node checks
<tt>now - last_send &gt;= mrai_ms</tt>. If not, the send is deferred until the
timer expires; only the most recent deferred state (if any) is
transmitted when it does.</t>
          </li>
        </ul>
        <t>If the sent-state record (<xref target="convergence-and-flood-minimization"/>)
suppresses the send outright (state unchanged from last transmitted), the timer is
not restarted.</t>
      </section>
      <section anchor="mrai-withdraw-bypass">
        <name>Withdrawal Bypass</name>
        <t>A <tt>NODE_INFO_WITHDRAWAL</tt>, <tt>NODE_UNREACH</tt>, <tt>SUBSCRIBE_INFO_WITHDRAWAL</tt>, or
<tt>PUBLISH_INFO_WITHDRAWAL</tt> <bcp14>MUST NOT</bcp14> be held by the MRAI timer. Withdrawals are sent
immediately and reset
<tt>T[P,K]</tt> so that a subsequent advertisement for the same key is delayed by
<tt>mrai_ms</tt> (this preserves the anti-flap property even across a withdrawal-advertisement
cycle).</t>
      </section>
      <section anchor="interaction-with-other-mechanisms">
        <name>Interaction With Other Mechanisms</name>
        <t>MRAI, the sent-state record, and the token-bucket rate limiter compose:</t>
        <ol spacing="normal" type="1"><li>
            <t>Sent-state record: identical state → suppressed. Applied first.</t>
          </li>
          <li>
            <t>MRAI: different state, timer not expired → deferred. Applied second.</t>
          </li>
          <li>
            <t>Token bucket: send admitted → consume token; empty bucket → dropped
without updating the sent-state record (retry on next state change).</t>
          </li>
        </ol>
      </section>
      <section anchor="mrai-convergence">
        <name>Convergence Bound</name>
        <t>For a network with maximum diameter D hops and MRAI <tt>mrai_ms</tt>, the
worst-case convergence time for a single state change is
<tt>D * mrai_ms + propagation</tt>. Operators <bcp14>SHOULD</bcp14> size <tt>mrai_ms</tt> with this
in mind; a value larger than one round-trip across the mesh may cause
observable stall during correlated failures.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>TODO</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="MoQTransport">
          <front>
            <title>Media over QUIC Transport</title>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <date day="1" month="October" year="2026"/>
            <abstract>
              <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-22"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="LAPS" target="https://github.com/Quicr/laps/blob/main/docs/relay-protocol.md">
          <front>
            <title>Latency-Aware Peering for Streaming (LAPS) Relay Protocol</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="BGP">
          <front>
            <title>A Border Gateway Protocol 4 (BGP-4)</title>
            <author fullname="Y. Rekhter" initials="Y." role="editor" surname="Rekhter"/>
            <author fullname="T. Li" initials="T." role="editor" surname="Li"/>
            <author fullname="S. Hares" initials="S." role="editor" surname="Hares"/>
            <date month="January" year="2006"/>
            <abstract>
              <t>This document discusses the Border Gateway Protocol (BGP), which is an inter-Autonomous System routing protocol.</t>
              <t>The primary function of a BGP speaking system is to exchange network reachability information with other BGP systems. This network reachability information includes information on the list of Autonomous Systems (ASes) that reachability information traverses. This information is sufficient for constructing a graph of AS connectivity for this reachability from which routing loops may be pruned, and, at the AS level, some policy decisions may be enforced.</t>
              <t>BGP-4 provides a set of mechanisms for supporting Classless Inter-Domain Routing (CIDR). These mechanisms include support for advertising a set of destinations as an IP prefix, and eliminating the concept of network "class" within BGP. BGP-4 also introduces mechanisms that allow aggregation of routes, including aggregation of AS paths.</t>
              <t>This document obsoletes RFC 1771. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4271"/>
          <seriesInfo name="DOI" value="10.17487/RFC4271"/>
        </reference>
        <reference anchor="RR">
          <front>
            <title>BGP Route Reflection: An Alternative to Full Mesh Internal BGP (IBGP)</title>
            <author fullname="T. Bates" initials="T." surname="Bates"/>
            <author fullname="E. Chen" initials="E." surname="Chen"/>
            <author fullname="R. Chandra" initials="R." surname="Chandra"/>
            <date month="April" year="2006"/>
            <abstract>
              <t>The Border Gateway Protocol (BGP) is an inter-autonomous system routing protocol designed for TCP/IP internets. Typically, all BGP speakers within a single AS must be fully meshed so that any external routing information must be re-distributed to all other routers within that Autonomous System (AS). This represents a serious scaling problem that has been well documented with several alternatives proposed.</t>
              <t>This document describes the use and design of a method known as "route reflection" to alleviate the need for "full mesh" Internal BGP (IBGP).</t>
              <t>This document obsoletes RFC 2796 and RFC 1966. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4456"/>
          <seriesInfo name="DOI" value="10.17487/RFC4456"/>
        </reference>
        <reference anchor="SipHash" target="https://www.aumasson.jp/siphash/siphash.pdf">
          <front>
            <title>SipHash: a fast short-input PRF</title>
            <author initials="J." surname="Aumasson">
              <organization/>
            </author>
            <author initials="D. J." surname="Bernstein">
              <organization/>
            </author>
            <date year="2012"/>
          </front>
        </reference>
        <reference anchor="MOQ-CLUSTER">
          <front>
            <title>MoQ Cluster Extension</title>
            <author fullname="Luke Curley" initials="L." surname="Curley">
         </author>
            <date day="21" month="September" year="2026"/>
            <abstract>
              <t>   This document defines a clustering extension for MoQ Transport
   [moqt], used to build a mesh of relays.  Each namespace advertisement
   carries the list of Hop IDs it has passed through, starting with the
   original publisher, and the accumulated cost of that path.  A
   receiver uses the list to detect loops and to tell which
   advertisements come from the same publisher, and the cost to choose
   between paths.  Each endpoint declares its own Hop ID at setup, so a
   peer never advertises or serves it a path that already passed through
   it.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-lcurley-moq-cluster-01"/>
        </reference>
      </references>
    </references>
    <?line 2307?>

<section anchor="change-log">
      <name>Change Log</name>
      <section anchor="draft-nandakumar-moq-mix-00">
        <name>draft-nandakumar-moq-mix-00</name>
        <ul spacing="normal">
          <li>
            <t>Initial version.</t>
          </li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The design of MIX was informed by earlier work on inter-relay peering,
in particular <xref target="LAPS"/>, which explored path-appending Node Table, sequence-gated
PIB/SIB, and session-scoped Subscribe Node Set (SNS) concepts. The authors thank the LAPS
authors for their contributions to the problem space.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
5O8BEUSMzUw+yprIUkWCy5ylxSa7zRdN3V5WEtLtdhfqP2MDFW9G3yKajWfD
OuKiTh5JF7PNVjatJob6wKXUXn/eUspCxrIrrZdyNm0pXaZKVs/WqLsyqUlr
I5W1HklX56wiBsIsGONoEZ7Mx2wkMg4xJWKr5JWuaBfeISlsvq6b7KpSfTdl
vvwkjhPxXRpFbGKfj7I3a9LxpjARzWq1q7lPnyI9eXiRE49lteLEK90xl9G9
7d42cGC2hy0b6LloGDArobHwTncZHX22WlBD4NTTVX5Lk6UxVyvtL2lVuKOf
vVpLd4J4OSqnY5acpIH3sSS+YaShzUBmcj+0TmzGVBbJ83inNVsaS12tV5Pi
XIaE0fAyBmsG2iivFnX0Ot2+8vsQPk+6e18kQjwv3KoYmtqFBTpjXQ36h+qq
Nby5bJuCGfJyprfpp0+npz/9NFA6Gp+cHv/u+N3h2cnp+fHrsViB9ejwq2qL
FkUNRgf5mijjMDFjPc3+pNuVz1i6adu5SrpZSVtiXc8MpbThuuSLHmISKmhv
Ekn5njJoM1bFvLqBfYyW4CWcFqBnLKdwONFguZMndbTmsgdePgbj5cumEdmF
2lALl8hInz7RZIa3omm/NkMdU8aHosF837RVSzQJhidnmxYeHxIJOiWx2mST
Fh8LXEx3gsRMnHy+IzHFWxKf2TVBP6L9IBk+qWOJhnUfYamJtAEOymNrTwsG
Ney/iFFeuZalWy+jZrOLdTljm7Bc+5DWOodrh84Q5iic1ya166X06GzvyK23
KH5siIsts1mRT2szt6sfZr5rfoKaJCXuu+rKUk+2Sf9e2Gytkqi5Mh0xXrDs
acOpvTcJ5sUFrQodNozFXDsYsvE4L4SSsFwWwfC2EnGplr6Yv4FQf8xhIyep
79Jf4NifmCZIry+p8Zd73MfL/YE465geWMI1k4npxn+W66Szvzy5s75VEyHu
z+wyr7NPL/cG1M9PL+ibBgKrLDh9/RM9yOYDHcwnesp/tT9iSizo8NSLekgC
/aRYNv0nKDueikr0fJ9NXrP8opiF6z4lNlaDkuGSgC8MFMPupWWPDkiVDZLh
l+WymPFJV8lKxI+bYqaOsMK8G6K6qKnEK6vXRJvFili0UUUPPeFmuyyVIkA0
ZjUnDag2zU0pRS3bWDwSSrD50B/M2t/HSDav82NWMYE5uCmLW3U/13oRsJbh
YUr0NLMGdm3kxLYn5TJf8E0onPkA3DrYLlUCgHJegmTB42tYsUZmthIHAmmy
H0uQC+2ajncgxzhPrQcuaHxooqUseRsHxhfwJRiOSJsH3KgoRXZB156v3KsR
Q0n0cmvlhP/gbfFy+vOHoTGTbY+rTR9q34TvrFhE535h4p4TNxosIjMR1PKY
btBvZKo3Ac5UvLwJUIzAOIk3k0bJgkJuOn3XRLTdgAhHFHystVPGEGx9B3oW
rGVrFC4DYjpFIRMs/Mlzq/VCsQRs06kZyIALlk446dexHRFnBFe5SEE2t+rS
PWTIAmSZYyA4XkRrqR0Th9V3JTbKWkyNh3ruLlliiqzNIAgVpA6c2xtlr82p
HpvtA6nR8IOhTxtdkwpPQwYI7baYzYZQyBfB054tSS4rfxzpIOmWWy0ieNeT
2tT0WlQST4bMMio5gtJGv73Q7Y8MW0i3tjfFJV7yTn9bzgrGkBiQGAjA82sb
N4gQS7mrH3r+2mSFVks5wmJp6jFJ0RSf0905q9jxGG+MFz6D7aijPIiuCUE6
eho/lbYbAO9AoGEuMIBNn04GO8VF0fA+Er7MR2GWQdbsqn7WQ+Isid9Ae726
SSmk3KOp7ercWzJ3raIwWhRpONK3fH+Qv7oqB63tFzQj2HTEE+LNcyok8ZfY
OFJzSPS5AubK8+ulUAuRW2PIKyEEtmZOZaeZtYkYxDY4UIwXoYTgl7C2RvLi
k9owPMW0YxaBF8KGKjP4kqhDkD5gDIANvvGivsm15v4ZmILJqILadta6bU+l
1hUtV/ECiGeMyIR2ikU6RmgV9W5bZkmkWSiXXrwMljZmLAJmVVSTDaargyiv
9mOs1eaqcqFnbbz16AutUncDEbZg92BxJ+8Rno6nvLQkXXD/srRfjfyTo+xE
Lz3hmCrnqPuMzYLqQNLxo++ezQtfMY8Wuj5sZKF4rDxJf0uiGR7kJYsYm6Vc
oC6Iqdww0an8dnHHnOGYnVteCkSTcyZU7K6QCFg2A9rwA8l5K7ogcyVKphVu
9pLkkmKZfanGpz61IfJByts6Frkn7IW+9ecVkz2Q1Y9MY7q0D+SzLMGzzuyM
JPLssrglTgE5ToQrXHn//u//7tos80AtI2y1UnOvF7L+2Xm0dfL3OUvZUv9T
N62vfz2M/37t0p+ozdOjw1ffHb58e0Q9xL9+3vru5+h/s+y/9/3E89L/9v0+
q+i0038Bwer+fmOf7hlTZMP4jAd+eBcm9LPn09dh+Fdk49Fezr87efsa7oRy
JRdt972bh4/h18Nv8d7p0fcnfzx63R5K1n3XPcAMd2CXfwT7UYf+7L+a1LLs
8NXZ8R+Pelb5l5HadlKyV3t2NlBZSkebhkOL91ne/eHdDx+iUwNwO6l7/zdS
GRjYpwOJVPnm0dvyspjcTWbFg2VSE7ke/QQ14UGW4zosb/FjzohgUXhSQn4S
W7tc9K5nAaPs0anszCP1HzaJzZiE5HnBZKO3NqmTtzSasTxyXiyryfVYTaLi
1stb5t54k8ZsCskdG6MirQwiUQuMIfqkmV3VsAzfpMqn5aUrxW5xnU+zRZVo
YnwZj1+dvDs7PXl7/uHs8O2R9c8gKzgmVuuZIE+cYJzKi6F3MdLlJ4YmQBpn
tKNNOS/U1CG6kppPsk+PDRyld2VwvC0yDeSCLVwivqhZCMqYI8CAgtn1zo7j
147NIAbIuslna8haJFCYgmAXMO2sNR58pXqZAiHELoDsGxJYVnTy974iKQOG
cBhHEDn25Vc7hbx+Lq+f0+ts6Ax/eXcokFAEmMXtEZ3Q4Fr0rzORYbOECLp+
6QNg/FxBiQJaFe3G5hX7fmlbzXjjzGIFUDoWTyMJ0QwkdTr70wNBHhcQa0QA
xUaEtl1om+0A9BjiTsTEZJgeGtlklpdzNkmtIcY05WQkiBgAL9j6FB8R/5DI
7DsfvAckVXQgqV4OpU9gM6hLFzsnW3hdM3owxeTNmo6VqlZ+53mFC8e4UgEW
KK3YREh5Y8g/3kqah7265S+CE24hy7dsvI7CqMt4nRjGEZaRSCLCWLkWxkoH
1BrAFENbe4MklMz1LAeA4AYmaXh0pmWj9mG/XiLs+7XA8RQ/GQcOK1YedjOi
VaL9eNUcIyZWGs2DYRuYNN48yJq882EBRwLKJFqpFoy4bkjIXtN/MWYxEEfU
fEkLakod/VaUV9eNIzWlWAGrnl0Tq54Wk3JO709p22FwUOJmH9KkmpE69UKD
P/Dv7PvDv5Bu5ap52ageijFW8yXxfB7DSGKO6zAh4CERG1mYZ2pVzhHm6eDc
wDL+vVhVgJgIq/gnHu+3OPAHB99kX3939OfXx7/DD37S3/Iv9uCjg0f3/Zvf
lkF+q+0+39eG+5lFvKxgF0fin6gPsvFevn/xfPLF9ODL4qvL3zz7eu/gt/vP
nuX5xcXBZDKdFsXl5Xjg/GP2lD3kn1Eki60p7AOX5RXRh9dHoZEQVdvpMgbN
EEB654pWlBkR7OKAJeHWhKZ/ArS8/ToV3dG/rIDiC2CfVoBXFRbF5FQkYgWa
weerm8AcATRjQKm/cx6gc3163DXZxNcS4qgQsFEnLu5B4q+2rwCrjE1yHm01
CF5MInJQcWyorgVyxbbRjoIJde9z9oHN6p/pZ/NdR5LZ74s7odv4D+9Uq/jB
h/59dp8PIKXJ/3b+ft7XD/ij/mL732dkLBBVQm05Oh/b5tY0v6/Y4zrBBRCx
1UEfAGqpsVEB54Azt2Zm0mMow8jaFsLwzdQsrTKODphgkI0hNJ3DpnyO2Onx
bnu4aklSsG17F7qiLNbGDGy/uHNv3+x2j867po7P8GDQ5cB0HJwqYonxkBes
cWJNo9HFnwe9RhSM7owbkpCZ1J7HdvadlhONXonYopyQ62LGJ6Gw8/vIDrN4
piFOyblPwFadu17wXV59cx6NEKAHMfCA+Jn3OjUFLQtsRbE0IDJ55H7RDQ30
Gdu0nfp24Ouj24dD6Ha64vbu6D7AuTdn064tqsYrpHBUZu0Bv1CLqcnuHqvS
jid2spblKpbodlpyPwxhL2kbh3qmvPFXHO566jzeMVbVgpiTz64QZHU9FxhU
ZECWcKEPOA24Sl7h6lyVNUTIx7V+O5z4b0EFEnS5ZZeDJ+62CsFLRCZEVLW6
8sGm1TpZRfArN2ypd9nOV19kpAXUuyF2pK0okkA5Wa9WgsChvoXgBeCrYjA3
pmFhY5tX3PiEtIGmR1itW3PrKKmQ8j2UUu2i4JgqoPZ6Z3u0aw1i6/V6HPO8
iHLqIvHX62HyoEoSDNArR36aSHa7ypfoj63kjE+3iOdFxosC/+AinhC/WpTs
YVW5gWfBT4vdvlixFmTrWHekCsiK05scFNXazouCxsrgzsiteEVyAfspvQLF
2l2dgpdYBodJINZ/FiJTK++B2OPGO3GXAz/M3fEgU0pGxEI6LlZWBUM5AVus
XW69iwunFHmDBSs6eVcM4uNV17ARSAmMFpZY2lUxvITPTpFsfial70GCQIi9
bcb5EknM66thrNYMBPwcjmSm8bAWChwtz1A9Y3LywLqjix2TJU0M9/kYM1ov
FFLmcb7KV8A2XR/bZDRIJ9hTtEFepwJA8bq1PBqz4mQVOMaPNPtbzkpAtxWs
I8VyxkHa4mIRbyRGgYOeCCLCvV75796znw0T+GGRREZ9etwaPajN41bW9ZqD
nARvRrqHxyF6l9K84oD8XKApAvcGnslfkAnnHR+NB+rOWgnBfyyKZb1NlGLn
lpsnUg1vjXjAcXVFSizbmI4A/Gy7L13LQZhNrqtK41wT4SyfV3I71NGYBF3B
ySzkYYx4WtYSO1kPghHlkpG17BxXGwo7gRT1427zsrF0Py2O2VSJO5oPflgU
CwGLkUBEuKzfEtsjjqzYmqZMs3s4XqPxhzEL+kd4NL6d6YfNknp2dHkJJ9U/
8GdS/sPF9H9YwBcRfzO3CETRxzj0YG7mjnZcoWH9OBHkTnpyP2MVk0N4UQii
W0QbZt5TxQkcK16TqRy4DVb+8KCYTlQeHfDOiAe3tuErLzNvbml3KPGb9gjY
BAehcMrw2yKfjrKwTGoA3rg2a2ETLARvaXp0HwnwJAoEe9EcXr09+XD0ejO5
be1Kg0okSh7MpNV3iwQiPL68uYUAPoMvxV2J8QG5C5poMBF6PZLp+DW50gpe
4qAy8FnTyIUOXitql50MkqRhcRcUCTvVnrVQPwyqWiaMTbdQgjaaAjBr8yYL
gO029D9lSfL4MjA9oUL5EabJYlWC5TOXDihzpkCQn8TUSSCjxWrIclmfxUxF
X8bL0JJIh4sq3dVZcdkMbN3XC+/dG9no1GYvyTc8f7cLJBrXRnruH61CNfMm
gvip9iQ6h7i29YyVjZobWcAS9wR70SV1SN6EMCePDJ4hHQ7bIWWjlitAmB2Q
wRcBIEzsA3CPJoL16TV/nXPuLbls/aKJPBqtlF6pcoGm+oLKN6pZsPC90fuT
7ZDKma9ndK/+9llWj3cNvMjT9Of82OZDAlyzXi1qk5fFAE0q2aBH5LF4O169
Fod1EYeFgMzGpDyiEgPKdhSLG8HAudZt2aIEwVjCWxGszurxKAVyqKEUtvcu
dK3pfnxQXiMQEmb3lpBJ40SUXEQgI4FQ0WGBZsWZJL9CnZpNZYf9uhRyx14g
wp5ecvaqKKl6U4hMyaKhJEcJcmlr3lelxEQ4mjrkxyWM3bQ831WzqQCvEllL
xSwaGfDec1oNgZUsVxXgVwpXwvJI0lBzoda86bIG4Rc+Tx4GDBMt6BMYE5pY
4HgiMaqv0AB2lrupZkNlzUZ6FqcgTIlEe4854q1ZFj49jm0FMeZgqxnDInc6
1oeBBPhH231nFOEEs9wH9GtHrkVEHCl5wpZeJJbduBG3sZF2dICGnYxC8oBU
ys4X6m++tdBT3nluWgMlBA94hSBCut3uWPEzf68PUXIB0NwxODCEyACIRIHI
psCBJOtikKnM6/WLReX0dzYzgGNfF6KGcuQqh2Nd8nEV6VeZcbQGHI4QxxKp
XAwTC02g5gsvhCe14680nmFjpKOYHyAx6I55oQH3zOYYQHvLb4+95zJZODDs
GZJmduPK4qiyNAhoVhDjqC3eKxJCVKOelR8LkSH47lDdWsSWoJB199OPyVTw
lpCDO1whCaIHme3RHt+mq3sfeRL1pv6dPuSCyh4ySBH4HnB+Jf8ah8BE+FYN
JQSFEPtDBk227TAVqFUGTD2GGUWAYA2GM/bgg1rlnmaf5sgrzIyNYGqy51UA
gVRk6ytUb6diVbAu54zoe5aK6TcEYqai0p8YX9I5g91IyUTEEprusVp0GorN
ux9po9kWAU64rr1NT4VR9rqp6BYna6p1sWLBhROSIcx2k0wyMA5beAEEOe5S
PInAVrKHwFY4ZiKLgSnjow9nh3zkoZCchhDJZZSOtw+s4rIWafq4UVpJXhsP
rR7E8gZSc/G1L4nXkuNbxwh+1kwgQoqJ+4xVAWES3HE+8+b2zGsdR8Hubxqj
iReIrUGeS9YULECvBYmvVn7eklfBOTnlqcAZQ5BYu71geRoiFnJ78Qg1IVxp
eUdGzLDNESlHCPoSfPWaOVJ0ZBjGiKhm5eKj5I0LSQSYm7luLrOgGnlgKvOj
LYTMJrUB563kxNHKOuOIlvjEW9owNiV98BoXXABmSSLhIlXH1K4UuWQ73iZR
UAb+CvZoXJEsQxYHuZ04lYaG1pXNAZSgJ3UbeM4pcpnnyM+RsNV/2sVeF/sr
oVw6NjozvyoEsQNcDt++LYMUjZFkhqsSlLFekGIkd61pVRI9Fh9YE5ylYY+F
xuxeIJx6qNHXFwVvh8YKeIiF6ppsrOmXtjQ4AGw7jeyT6dXIhgD1S/kyc66Q
8LZQAS9CgwNltYP/2dtlIzGGes7o9G7mIj2DLdbjojiGCEgu0rx+w3h3ywPA
Vle5xG11XZZqgWyf9Esfmye8cIXAIJIIJXiJOQHDT2rTJVjcEhMz/7pm4MyY
FuecfxqLAVNSd5lKDxuoj13EnXpFxHelAKtPn/DdMPoOQhJTMieBaekJ1iT7
BBeIVRLN+RZjnKznnPAXaYDnFU7/FJHni+mQTuWS9Y5spz49O9s9SIZfr5rm
fF3r4L20jpScNgLFs4H/oQEz0QY5OLI1sO7/HdGLCKeACYHTsEdEKQpNSIwe
cUmED5ZeRp2AUBdmno/Su0wkJkMOaqb5bZLDDPFOebk6Mtk9ErLv+ADEmXAa
L1HGp9Pp1clit0YfBgMPogqb2L6g+gwrbyEALzaMy62nxhUvqmwIty0gb9mb
7fjire9BZ2VvEfNPfkTD9AIiwHhhCIvg/cDpAaQqHASxqVuuBCx4r58bGTuy
v64Rj/+os0aPBiHMVcNrFEHERClUwGDM2u3woC2Sm3onfjXDpT+jASD/6rTe
NV9f8LnRcOfeLoWKHcPoheyvJe+U51ScaarltfCmSdfy0qpyB1uc8D0ih3pC
rQszobutiwjC/RYBIYSeHwh3ImU160nxoxebQEpaWXZ8qhsXEiKIrBQpt3Qq
Qvbw3GfJiURvi6l1iLTE9SaXbwoNCUneLVS3bPSWFQmCYSb02UGePdNUcr30
Kga5LhlfFJDua8lCvCUHBOvWHA/K+9YJMRN2Hi3J9gwRAyGeoCxGmSKCx6Do
xKfH6SOiZGU9VIFtQ7IHycsgpkzRpLz2yhBoM3M3AOa259bOa7ExZ8QgCsWb
o7eI2tu+PKEhyR+zIaEFizo97EjzQLRXRX02en46rfnBYeTJ7ER8EgSHwzXT
OaQ2zI0hX3US99YblMf2HOc928kIRN/KkZvAZz64WOWLidoQ22kpXIhWkOxC
6YyeaJDmFEO4KjyePTvae9LdtYP7U1cMOG/Fy+dpGA8STSCDRPqHPBN47F+P
9v4tS11+32b/+uf0O/rm5d6/OfUk9bmjNv8U9bj/0+bnft0Zw8t967HvrU8v
n2trrTf7/9De839r4XF7TmKSX2bQOZQek9YlHHhe0pDPBaIgN2TbMBc5e5aU
F64XJUnZD86p0cqgoRVHEmVrU8xpf4qNNgNz2+I/eYpYKVLyPq6X5gllS/WW
9Bu9UZhyJS0qn5Pjorir5NItV63sPuHwanYS4waqevQwonrTfWKOfxXh4nsC
KtaU806svO9yp8eOLE3suiAIRq2kqqTvbifJuKUtiGyaEgn7iYI9W6hoygD6
7mQk2tW7Po5ZOvWwwSDm0jInTG2F4k+LUZ+wkkgTdu0n+Uq3JgJqRzdDIh/7
1O9s1fxwdNYyarIBoeepPguwRO1m31W3Jq60cw47D0jkABcrDaIgUG6AEeeq
TA/fc/UJQbO+ze+gkH16nGaAkKTCcZIOxYX35U8x3VXTouIxv0+unbEiG+9w
NbrBo5u9R7vjYEo1p1l4oVkvNR+dE7VdOg8nToPTDL/et0kmOqZJMhsXpCyG
tYT6F1v+DAHc80PAXLdg7vTbK15FJi3/VYUcnbROD0a5bHxs2/s9v0VfMeIh
2ozBI8tBQv/8Jw2B+5b2CACHkJ4kmVtkOOysSTsND9YvqNAwjr47enU2lr0L
ZUeU7jWlj8Co2wNNRhf3qc76vi36mUONmNd24OogyhrqnahdmMgg2wCP+RmT
i/I+/wfMsG0Euwefu8GP9XPGn2Sp/uUT6NxTD5tBx6f2D+7BkFgGvE3xtOS7
aLiierGk/bC92OpgDiGz0A7ZSddJVrSElZv+P+RtvG+K9O/aT/Vz/13HaQba
qdRYaEpDKc7aQh19d7JRoWobZvqkwvQiTABSuKPkCoLIOvYzGpvS3Q7ta4Ky
aRZWYkXHr0OM45Qv2zEvyDhLQneTQR0baH41MFPdxZ0LdiOtiKXIvPZ8fM5x
EKpZn25XMNSg+JnzAk48AbkqOwTYSQCvX6uxREqk4CYWjLdlGKtTdtLNIi8J
R0JKFh6O3PBWMMtyiXRyQvr8JXatsvR9Tz51Wmw4CV2OuJIYrieE3pLIbr3v
Ut5GVxAQ7sRkQJIGe4OaYkXLN37U7fbROMGZzAyPn0sBuUS2xt6Wdb1mZIGI
Pv1lqyKXrYg7bjNfORA/tRoKoGXEJa8MJI9kSGnCQo7ia9fDErFXYeA+jAaG
GH+xWlWekDsvutVltKrhe4AFJx7kTXARdtuAVbnWLgPiB5GO5YSxI1uXx22Q
OBjEJcCwLSsh/esBAZkPti5HHsbL6oGNzsUltRqbMYSSdhY2BbFxPTe1uXjB
xfUcZLb438ZJosRnIa+q0Sf3peJQ6wGepLhaGHIvOxpUkmmtFOAAsFkLEeu5
9aE/ihZxJBLqB1/S7tPj9oNRskYriKDH2pcURD46ycrkhzbWdAFWkcUX/eDd
ZtISwBXNt1iVE/8iv3FdXoF6QvkptwThTwHfG2jNuGdjJk5+tGbLfFraEtFk
1iYeZg8FB9iKhy8p8UAzurwsJ7Kg4ZoI8TviVldfi0mNzAQ3MiiuQxHmNd4b
x0VAi7vsCpHEIQ/VQRtoOwF1YUkroMCj8lchoEJiXNhhq/o0HWcJGpSkgE05
E6bHNQbY6wi+ieSAnftBIL0pV09uBQQcyd5PQR5qx/GOAszHlxaTkaUrsK/q
20VVNajcuOweoFCCw15z9NoLLSpXLsqm5NB5XxgT54F4EaLb5PpF9xznBpRL
c1HkjSPmdW0xQrmVUGMHW22Vuh77TeUTke6zzhnVJrVAQbwH/lqI86ixb1k4
uwtYpXFPvF7TDXVToKKPzGGkkcIWDU0chV5yqGWtimucu1udIQFHWHGcTMCV
Y0NhNmKXklQi8ghQWhbOK0DijuTLnVe0yZIOAHFYEgmHhdQIBv4GEwCtSu7e
2SXLzC6LPYHe4iOSz91SMvU1dJEOsqui0no+Svh1LVH2yDx7mC4TmyWj6XJg
nYA6NQzRIus+WPk+mQuxA2S6UI6V382qXHMCa/XRmNnZdQKxUv7pq8+xyzm/
umLn/UZE2mBDnAA7SlM9MBqVUj8Pd288ivXLK6mDlWZL9CUSpCLuZTmjBedJ
1XIBpGAWev5tRTtPfPVGilBKkl5azdJITglHlmdDgJnT6KgksMTCB59EyJ/j
1wkQMA0ni6DQkckUKUAUQNwfLRxBA10SPNAZayRnJYeasX8SOuClUGchBeqs
1xl2S0cdpvmG/F0ReYA3WwVaZ9yF3J9x9KMY6WggkrA1JF1hn5R8RAzo0DMn
81BdCJxVwC8aNia570PdI+dj9x7fJ90zV6yVLcaPdnljXMlJTdOKTm4Mi934
zMRg2Td5OZMlatpZ2IxRtRM4Jnk5ndYkyHqurmRkcmttGZMGgdSu7fbMLYt7
H6tvJA7fKpF49RvJqaLCdTYXn72qh8sbBVhBDxYUHOqABjzttJDKb0Xq5fYl
ryXFsyEWWC3D/cHutpGUEio6MEaprWbWTz8mD2TrOWSau9nO1grAg032hIdf
JiyW2bPqzwhJDRTjFOnkDPkJlVfKUO0mFNDCZ6mz6zNJZYHDgdl3o+Pvid6e
rrkcd1T45UntMw2MknJ6bc6kCYEjT00W6k3ZUDUzq0qsyjNlKSRtOnNlHe3P
ueH6rja5w+4pQ4PMYFsQ6IOtFX7krttS36fv2tvHDwk9yKros/xxVWzc7Vqi
KFBy2kJ/vHbFDv1uVgUUP2GCkgCGZEccx8JbpeA3R2evvstWIsnEtaI5KGU1
jHiYpy3jtH0ag+hhAoQR15Dy2s32D/O29OMPQpmRrs2snbCnk9A3DhK7D+HR
xjI8LMnvKFRvYh8UkmxPfaLx1LvprWuLXodPmo/CpQCcnMsiI1XDYrqsSjbz
XiF9vIjoUYW5gJiTNPq96no0ajYgqd3wQdajlAWiIa1A0euQbnM+Cega6K77
Kplg9s/3BTtam8ky5aE76yVMIfwAEn/tjrQaYDDwYCp9NVmOpyHsJtIgVYJn
ZaTod/wfI7pz6VFJPCJmUBz8AedcHGKvXnpdTZPeawY9beNsNDtLoyGt33O5
CA51JRoFH+WGbQOGEWKsJdixjkdmLt1zmGKk4lzc8cz8OYPIwCwFDYhH2iRI
TASyIopvo+osEDkRKCzELUo2Cx5CmGE6itYS+fo//cAhnLS+e+BejzPz660O
5w21VTJTjozIex/ia1rJ35/fld3gRuN59BTfdFrQ9d7B60zrTUobK5g1VxO4
IdYP4XM4KxZXnDy8Ka4kP9Hpm1e/ffbsGV7QPQiiMx8hZjXfMWJEglxSCImm
RIUtPrKry2nTWbGR7B/Q3TZpiTwitRvFRTDVEsSMvw+kIwYhunIk7kvlGN7C
svDZOVPwzUmUGypylBQIGkrxGSLqZ14CjgLOgHSVMpMZg4s71WH10nzZZzKK
TTVtQ9Ks0Iw/tbcWRdEdUXEB1zbb5MFk6yUkjdQM5RjiorsQ4UzH9fn0NXup
mWtyWDNgMWVngUTAIiRVaF8cLoItpQY01yYvheaCSZVHRfS2anTYOB5ak/Vn
W3gu1vOlGncsWCOpKRlHmQJWHdbREuHXXDvI9mqohju7WV3mLXzK7djql9iB
QK1yB/xnXAyQt1nxx61g0faYCjeyQaTukssGtpNUz41ArC4pUr1NGv5ZfOKF
3mmzWXYnkfnx1eFHHfrj9Nnc24cN+xTCD+1QWU4DQFAf4vHCtrgeaE/q2+Hw
ILYimQWox8PjINZInRsJKhL3oxVtbXl4UPUjiss9biQUJG8aDWCrQm6FPteO
CrOtqY2Zpl2vZ0dyGOCox4CzpOkgy4p/8tByMihSyaWBgxY1pwKDJiQSC2+a
I4RlDL1CF45L/DbImixZ+CRHwQx6qk9OeqV3nE+b0khNN8tlBEljOKcVKrni
TxA6bFASlMXplzlv1DyhMqfxHtiHPNaJp/EiWI4Hds3OxI5/S+pVdevSTIVd
yhRkuC8u3QZN8JW/uHOpn1ZwfizxR84Skap0rhw3QbeJqhdhVVRVVAsqJn45
03zUNjyFm8/nxRQ1oWd3rtHQW741y8XwcoYMwSxYmHoYqONU/RoY+xndx4K8
68wdZ7LDalnCqqvLZqgQvPgGOUig0hoy2lROrIwt7pTcZ7GhXvHl+dKye0HF
GCh6t7gTi1QuCb6ZFOv1inPReb1SeRHxYvZZ6dD5CDi1H9XpcKS2lCRGuQL/
6Q53VQAZUTj1HhYSlYb1Ww2nK/aI6sqB/oPUookto0qnsfM281oBjZ3WiXNy
TcTLPD589+7kh3fEak6P3pwesYXj7Oj0j5CSmSw15Qka0Szq1PRzpD95Edng
JC8xh+NpAN1KCtfTO4qWv6R+rdpRo25CrgZDh0UZ8TxH+E7NFpfcIr99M1Lh
hybP6VWBmoNUxQcrGsgAd+5NybtG3EgaFr35puQaXJY6OVcZbZ8UHNYK/2OW
mC77iostcmSiyP5p2jxJtxf04yTaP8rB0qk15f1P//t//M+s64LKYC5eXDGB
y0Qr2J0l4DE+CXF0ppi3WvUQ3mtNl3xiAYZiXoBsnlvM205I/MdRoSzu+aI7
SsqWxLHu0e5VDZULE5aGSHOkEw2pKIsz73fuNYboQ+lURkGzKLSGNjIYOAUh
8GFWtWKFes5sm/CQ9DiXto/KFs7NMkMk8jMRiA6cd/lWXis1WwoD2MiRp7C6
UOd9HgQyvTBcOIASOv/9D2/Pjt+/PT46zX6VbT6cPheRo/1pStJEcJif03Ze
ieCRa5IiO8DRrcRcDSWj5DsXTYQD2fMg6WuFgjyjoTaB+WnUslsvSGOcNdd3
L9rKkd7NIhM3D7+aS85/ZV5xu3j1cmVq0eT6+cwZZzBog5+GvS4F5Dfb61Ek
08yruh2xmBnnTpFcGK2Mn0miQW9tYs1Ms5jKhkcpZWUNkeJAXL6+f8kmEOk7
tfN0vznfHufIvOSYhiXKjdJmc2uRWXfGSYKDFQv8kfEWqqFa6cPsKBYD6bJO
xULn7DlfJd1XSjzkM/yS49ztJSjutaZJWEzh0WE4Ust+r2WSrRgGoOq3wlC0
4OoL5qJh06UVnwrVSmeAl7RRNGYaq0OhTNQZ/3B09sN75Nw/PfrDDySinp/8
fpw9zfzHo9PTk9PYJ6C/20f7XeLkXbXYZVM+u1bykJW6YZ8V39+q0gZhsQ4J
Ums2Rmgy/kHkKoNGwtooT5h4sR9ApE1Y3WWY7fkt3wW/sRnnK1AyjZrd1HIj
lf0C5CVIuw8C0wP3YMqKzUd0EO1w7PMQSFDDQm+k2Eubgo5l3XlyrcugXQ8w
uZ+9diuFbYRf86UdlyMd9a6E/VxH01e/L4uOL9BOGWGJJKIRmc1MVrBAQquS
rYAyFj0MtBjcpwJFVMwM7+phDzVs1FD7gk8SDZVTYLAkdT8eU/GRXtZVDQd4
RDSxsx2SqPpoWLeyjmzNMy7W6gGcuwNBCrDRJtJm1TwlNUwPWeXNkggef5Bo
6bzKmr20tTvg6Ek6hsfxGiZ6sKDy3hy/fXv+/vCU5kKX7IfkDPQQHIS6l8RP
Np6El8PoLGgjxEfCM+Nd9jFcQCLJXkYpyAPdXlTTu8iiYGOZ5WLx4WsOeRTo
u30/w878klPmrZoaumTTS5lFMvj04hclVYrN4k6trZRjlvUVnx1kkuZeUov2
H/EOaGMgRcqzQKYtvwHXz8HX4q6os27OG6IWbcLnN7xcrxiaEEJwZEXK+oA3
IFCqJdzXTFn484h3iKdYkENfKaBcSFXL/YBPC542qdIlbYi3jeV+OgvTisRr
zKmvLLFsYy7DyPX9SMJq42bzyNgDbVtqZwVLlDWx7R4J8+/BpOL954pc6qMF
sSoXoWKVoYdoRQ59HdyX6gfS0Sj0MwKqDOhhCSeISp+3a8K+tGsAao6G3jLH
F3+rWPg5masvlz7oY6Nb1qN1IA7DgYiCSMIo8uhWs+Xc7AEfqMTkd7D2DmTz
OOhx6hD1melRbVHK0zKyEym4R9tJvR+Hm8I14sLrSj98dOwAhCLsL5UprWXh
uWthSt4+/zhIlh+YPj49TlmDZovl3yqzN6rCoa7HBxQhdEmlbcGXev9Iurwh
Z5z4UWRYuJOkkoSgMRLzALM2fxsZgkI13kVxVbF2M7WELLclcEpnXOSdJyZn
X2VCKR/EnWp41GGLAMCD7v/7nP1QswYrcvjP+vvcivZoRWX+o5nFf1FG8ta7
iN96gxKHNuKHyIUPmnor4xRCEuAylRJmjCLb/O5finhrMMazalnNqqu7bGs0
5j8wKAG4bR3PxkFF+fk6TTPtxrjPg+2SNrJB+Ykxbzi0s5lmF4RdMwnOO3hw
8OBh7yDb2dDA2Np9cOBqshxRuJxxHjmEj5TXyKWO77V6JmemRhau1ZQdAMRu
2rhCztTWHaXH1yV3cNNB3jNj03E7KcM94gZDK2zB75Y9V/+LFDFgJOwizcUI
r2XsVOEzQyvl6ZIn3y7u0K7+Tq2oh417qtfK62oZZj9MmIeMK1uSCHaSMySv
PUm94jK31no+qVvrBh+4a1Na1jLyC5yYk6T1ZZTj28C1v4TveiWxBJqduvEJ
kUKpyOKeONXaRVhYr0l1LLZaGyl1dj/I0V1LZuZw90upl4jC7hWi9VIcJB4T
M8xBEjJBKNGFGOH0VpGD2Rt21GZmzhItYPwOdTrEWDtmvQuxLy6fsDEm2FhZ
VBcXnznH4668jZDlRtdVwNRvaTBG9Rpnir8HAOotkF11GIscc64AwzZqk8ZZ
Vai7Hmg23QBnTYNg0BTpKpeN24cy1UpkxsRv/nzG5aGfYcgGDVkw7iL6yUJR
QzktRtKk8F0Oh1ovGYBOwuJ6uVQrnXAryG2oAXrHrhaJIARPoJGrl48H5CQ6
0mJfYZlaeJj6CwkQ88mu1XzGDkDiHmJGd/UiX9bXnJ8VBT3KGxiOm2Abnxew
ppX1XEEOuSTq43ytgpOA5FlMS8koSqJSIZa93bhCwJKdPVIeoDT5t8fIn/sS
u3CaD8Frhr4iy4NzlSjKvu95GbwBh5xSpcJuflxKEDrzYs7da+q4Zm9VGzTY
nsbsMVNYXM7UrusDAZnBjhLWD16q7oSF66uBZOPlTI5ER2vLCzM+efkvR6/O
zj2e7Oz4+6OTH87GTrNt/+705If33Z97FDuxWiqp0jS+zY7irTuQ2sFeV/V2
rruiUWsn4jgNZ/+trU0tdapFXVfNgk8mB+t4mo3CCiNsPDcz40TArLivay0E
QquJanawTQk4LfI7LOWgErEcPsRi0WOr4IJMcpGy4zq5SdWWPC9XK3ro8Ikq
OR9KeGBIaa/W9RByB3BnnOSSlBN35o3kOLV8b7bc+wG+IQFhOm4JQhdEvpNC
rlZNQFPUN4JDhfWu1aQWdQ3GZMSF+No6XgNKU5OoJ2xhrtll0QpeEPwLw5gl
8JX9KRIKa3YRDWz3fFemBFwkIHJTgRU6iaXmucMDnAgHHIUM/dVQWtxeGNgo
e0VNgUQY1Wj8Mh66d1SaeMSdH9AtLyXp3lUhtbsT+oxLPkYD7/FQtTRbfvt7
hVt8epw+ra5QG8YOTM8rSdSb7qg6UAbZTVnc2jAOQbPltNj1Hhu2rQh6Pc/q
ee6Pl3Y4kvGk1RlcaizlMtJY+utyyRzpRQwNTU5SD4xczFzPxeWhJJL4mgRZ
kMqppQadip4ctkUzHW0zHvlCz71/IVPcrzc98jnLjt8dn2U+69w/1IrqF1t/
zVJVAKq8x9LENp3+v5tfNMeT90fvjt/97r9gjmaNfTlSzhE5Uzb+/bLJZd8d
vX17Qv/SR7/NTo9w9x293vLO6dGrP76WHIMBUPFUy6zTLLaN+T+HINRCBVMx
KP4XtLxhOdO8iRuG/jmLjuamfh7UkiZw/Lx1vJ/j/wkbgVI1+C+iJheSp/Qh
DTxV9DHYOX34ww/Hr7ICt/Gmt2/C//yiNcsygS9smWu7pTQzpbdHxOwaZgm5
QAIoQjLDM8siQtdzfdA2XSdqFGyvLxPYp7NyYw/1TrX9UtD9jafQMPgAnvOR
OsgOg7r7MpYgDAXjDc8p94Pgm4iOzQoxWS9fRNEkT+qIRiAgI8hBNHJOFlvz
pb6+QLlWsfTKhb6T7+LSR4ybL3/3MrgOJcAhJD2CXrNzsZvdwhs8Q8mxO47d
zjnyK5dCQ2sO0aWesBbRAmA9oiOE9fAaDAc6RtIgFyzIkOpc5UG1Ht/jpWM5
K9vskMxeRsykR8Z1vX44hiel+RJbsRnUrt/aQ4Z2dzJkW6k3zQvfkbt7FsuY
9UG0t7yppWn1xAyA2bKZCBofexzl8W5IjoJApDWAygX7iYWdC15wCvWTc494
a9u0mCC/ah0vEidtByJt1g3YsHu75yRh40IBhPZF37HoJOWZqZEkdkGqnDVa
GUIiovOZxfViliiarAEXL2hXBC7EobeqcCNFSnV5ieWO+TkttzAqkKWizgSH
SKLmTrkbPF/e6+UR5niqx6+up4lL1pE2zBEvLtMlVGQgNY5RR8SMFRikxbNS
AvXyXpD1kKN8/OHs5P35h6N3r4n1yLC6vr8XNBWaC9i/7I9Gz+qtwj/T7zUd
YbVDbbl4uJ4GHZjyZteHX4OWBAYn7rJItxA9RtUil3XPe3zaoT60fx+G33Eo
QVPUDKhKrrWEVE8s5BphHYqgGzAHjuvqhCV0WVzXoEnVmpe/qHA9yFNSpLWq
y5vLG4O3/sRe3VMsCDwFaXJ8Uz21fGAkuhMIo1fATSs31UFChlq+LNGLW55n
bBMnGRKaVk/9gZnXxUmclJqy1PlxdjHNY5Na0uPcPCjSKVfHxUzztXIsfc8S
qEkjGTtHW0V6mOLyJVZJCINTOHkYJYMyjXUIM3mR1BTKxbKYjSFL6ElaFLfO
BwtHoYtnEbLBUgdqXRriglLxVCt13yEA5qYkaiZdLySoSAqDKfeWAIVain+F
+u6RKs+q9FtfAzRaK5OXQrLeQCBI/1ILffRUo+qBYWndSjC4QOsJh9bTo8Vy
z6JMF1zDLI5mToodCugMqfh0lhwK4+QwJI+tCku8JKkmkiO0a7nd2iVxMCkL
Rk/LhyduESH8APUwTAwTrbdmwF51Glc0Z1i+lKfydo+YHXPdLPsh8b0RZSOp
QFy7LMwupCtUz050IrX8HOMjBJ6rEQkurbXZz6m6bjjkc9f0NxEXtIo8gX8o
ddShAG902BZFeXV9UWmKqtJqBvD1x3bbaCNxMFv47nQvYMudITzJJV/3DjSU
dOhIUh1PYu30ZLb9xVKWY6Xup45FE964Pr+YDf7e8m4mEqJIqhKWgV+lQpsI
GHH2WZZwpwEsiHR8MGSeVY6x5zyATdXnHlJ7zt1Xe+4fKYoohelcUpguiYHh
0BcG1XMMnjoKpNC5YL5QbkmKuTkpp+PNZ/3MioOQzBIOOmAPzibUD1vPfemf
H5v+3ZLywHzslYkxypuvG0mH/ulxIH71jEc3ZBfezSCfvJXZIhf1O3Bz58Fa
HZ5hwlt0tyRAcq7pIzm5tkPJek32v6fT6ssT3FYuDKkOADIf6sbxbIJjMgAV
j3cKdwOu51QGDhSvQLyOOHrhDaEhDCB3Cv8zvzL6k1PDwd2FglhNqpQwNlGq
JpBCal5RG6Dk09FUhHXRIP9DrXHgcTIU2al+cBjggqgqIP6reb4Awnc7SC3x
ZkpaLkvcEuVkUU+jrfTsLklP5JezNkOHaEC3vkSRJcaSS1KhUjgD4Xcu+1b7
e5JXr7+uXVwso5VtC3ltkwxdqStOxLqMC/9OEW6KMlAs8PG2loYx4JyDVqeu
pxsDDYvRgyWciMt9zxP99LgzN6lCILOvfUle7JpkX8h9piZbcDs9eiEfL1xU
NS8arC+hIPW1mDp8StNOFRLX8+LFHecA4+laMeeBVakxR4QllXCSVCJKN/Mk
SYu2LC3VGI+zlJQ+vbupUpGI3ZBFxQl4ya0kpVO6WyT5EPxGsfDcV6bGLHzv
orXb8tj7tN8H/m0rffBLiyLc9x7N+k+s40D8LupQb0XwhxE5DOjg5nP2da/0
CZ31YTtlyED8dInlTqgknXXY16TcVQR7qxOC7C74aTHkUenA46wzeeT/Pye2
dY5ie92Vz87EuKqXWdq4ODPkZHjMBNKnHf5FcQG4nMJwdZaaxCLMX2LqclG9
JK4fXQdJI53/Z0tlcv/0VXD00ZPa3330Rl0z6Xd/ozY1ZmojbioTn9LZ8cm7
w7eDpNDjIi3t2dN1MHrrmeLby5+biOsbB2NPP4P0EESub4FTOne8SGuBCpSI
9N6hwAMiKT66TlGdNULZwOLVCQ7TdQRxlZY7lnlMhKxlw66mUAtQq6cxnCr3
ZY0KbK9MRa/m6PUQ2u7C1Zl7c74dQE2ap5lZWsWWRHywlG7jHY7mI6JnfFf4
IG3RPwFPl7LBdJhx53Jrh7Myt0JVemu109EpHIFHZuYCn1PwQqL1ApsYucC8
vZAiyQUs6lUNsPajioFtGQLiBi8Si87YXTHvRpB3zdVm4YJlrehMWwCfuEul
0/Wi9FgDNpPw6zrwQRSuhyxk3QhC3UcZDIywEuA+LS8vC41F4QZtY2DDjVaZ
KyxJfIPoxNH2RqzDJ/1jr4tygoAduyl1MqD1KyJXn/oBcDX7Du9qYr+CRr+o
RR1sQ32IosB1irjsFq5wzh2M5F+9C5Ykf5FeLN+BhqIiZQiOpWaL0HMQsdGY
uTJZBJSgZiJkr8eYW+cUXlLZuoDhX4ahdb30TgeYhGnCG3wUzEYCg2wYy07U
t2b6Z4sW5wEkEhZzfKXFtC2mKEazOei2miejbAOeph7mlqUwt3LhepQ3n8w9
AoOxQ8Ek70YzZJBMld+UmDzbR3u4lpbq1GP5IvOZHUv2GoSTAJdILaUMbkvA
LLzr5+KOs5jw0adxSzj+yYqvdcHNXM2qCyRcwHfOSo+Lx6la2W7QlsdCkwLD
VVUedc0UImXrrRQxdc0dEiQrz/nblakfyPwlhYvcrM6vhzF6n7CuJdJ0c6DF
OXkcbdMFjXmeMHUWBsyd08eZjgIftXGw+Kzw1Qjz1pIQ2KAmks+UvSWajLB1
PpkvaNdqGIgXKDa1ZvEwfbWzbLwobs/l23OZ+fielcjY+QQNifP0e/lnWsZ2
RJuvhjRLbBDXUZdqCMpxfWZrzvdOy9IaCzSULlsxC726YPgNL4GG4o4DTUJh
2EsJeOrN6afHSnodsF8Hnuv+6obJVZm3gqtY7TG7fJAJ2DaPhCVr5oLmhvNk
oRujyY9lzbiLIGwMWvdH/HpkzY8ukQCC7CUyjwgsNYNvuGHEXj0s5qjTgxuc
OksvId1YTr608AcrF/EQT4Qt5LKxGW+MZgXZUs1S0LWkfRN/WuuD1mTfJYeR
5jNWlqP8ospf7NAnIR4uzXw8DhIpS7VRqQvrS0HSmg2InWzEyIc01KHmXfA1
RzJf34BFo/5bEZzwMlEoUuX6QD6ogfHdyZm7zTXIDvs0nFEPs5bmUYoRoNvb
tOIcJJAYONA4lyS/VlwUl7MWBJdLlOeTo+hnw0UPhu2KpEA6p2owcSvTFkZe
8SgVzMGgCh9KDmkGtJtoEZYgM0mS00par4RhZhbUChLxWFvs7mPUrNK/tOw0
0zfbGMxEjsoakeVyQ5lmHPc4A2RtsAOzS+Th0mLDjrOa1rF9oox3SZwGpmHV
rfftwnRqJ2m7UmjLOWGKhO3ATsKM1EdqsEWanWuRc97t8EhDvGoZqpKuhpay
xRJU7A42r4iDgId8YHQ6p3GJKlqp2BrlE65Fi2caBbsEhZlHTel8WzxQBTXL
TAlCilokkQwZeCrqP1aVlQmonHHKG/1GcQC+epBzWpEhNe8KI8cJnZfToTBp
WY+0sitxLCidbQ9xK9aK52yxzUlHCpqK089xgYPsOA6MZUewVjuPQcwtM3ko
SVGnHvmy6XWsiZ2tNXSYktmJIMoGd+9fGnU1c74NclKMOFwiDlRhhjIR/G9i
7ahIqhE8eXFrilL7QrStjnVuiN5mdrzKl60aOTOA4iXnZZYmb6LRMPhA3eRi
hMTpXVw5CRfSO8zSvpk20qNIqWoLWXpxJ9PVyq3CUiUXYlpaBF2MeiVbuQR4
ordcWdxn14vSVM2QuM28RVO2F+sieeOTSCZ1I6C64BDW7bCQE0TezJecNo8I
N6/p9mK4RMT0vWwQ7dhG4cYJo5dpzlhbqOLADKw+VopTgSl8I06FVa3c2Jst
xnEWHXoLAxA7eiytqw9LRdTeRRVma7KDeA74K1u12IDuWJCpfarMVDmQXFmi
64OC4vz1agvkUsoq5nogpFX3kGHS0s1mdWtrJLJCCvd25CHwBLM4SomjynzU
XLMuyMHzHpskSlxw/6vC5fwT4tKRMo4BFyrsRkFpJAB4QNcH5QN7o+eQmaKU
0lrXviXnZZ8gV1Hb2c7Xu9k32bMfnz2DIC2/nmuKavptwMC8xGwLaBp/DZnA
nsRXtLEd/aSno/2f25E3ReljTTM7X9fbhtGvn/SMZe/njeWnFlC4rZXybsE0
in8gve2fmFSMoMQ6McrGWO5xpkTcMhjJz/vhZxPmI/OVqmW1eqGR+sEOPV7e
G4cngkLnshT0K/ZWaZWObLIKllNdyliAwoSwFSSgExITDE+LpbdRgBuLBIF1
NIMP5/WTIy2iHs6Ezwia1R/LpTEiTXpMg2rtgg3reGpmSdMLuqeRJ1mmqDPB
2iLScILIl2UotdA64rOq+shYjTUPinM8SWJMznQTHWVdmB2tZw75NM6m7I2h
y67ZVafgL9FJqMfdeO1fhtzJ7uLkEEheaMMmecixV7JDNccFXZ6wDXESMYgE
0bnp7raVfYmuuqjkqmz/QaLtMQJZX5MUANdFQpoe1BZIrid2UQAobAO4zMYy
yXFs0vOWMUY1fbvRFuG5PqCCPEu1LHoCVR2KGqVmoh2OTSDRyPX4FbJ6YkxT
qV8NnqK7eRdwizm8EDVRfmWDQiTxilKZZB5uGbflTu1Q+Zt8MTzhbL0gPw1h
k7zZhWRjBItQca3zeh0wTQqw7XsmDyFqU8djS07QCxjZo5Iu5pzxYq4C+8rI
Tu5YVZjd2eGrAdhhdwCv/sbB4OSLXifpZmxiEawi9vL0WoRGEpufdNRrSR9Y
oS7hBmAFbLKTEJiuN7P0+SLFrNgKalY3rGgUJIu4YkvfYh4utKh2VPkmtV8d
yViMAqM4v1n+93IGsP0iOok4zsZ2bOo21xrSPadKVXutMe6J1BORSwjQmKHB
VS7W0yvhtJK4l1n+dX4D2cTykkaqQCc8MB2CcC9WSM8Gnfv3m+yL/S1xVtti
sNJool9v8b+nIUWfew8MDbLT3+dkRVPoVftJLnbzxT7Q/59e7g+yV3s/9c5B
n/zyN/zka/9U98lWMNOWGd23Zr/uaaXbwk1PW/EaK10D/L/f/e7VXkuI6h5S
nDeFPl0Sf+OSzlY1D9LV68TySY8sNNr+4i4yIm80WuJo6XjQBUyXUCoNg51I
Y8KdvSdn00Fsa9gbOoegxJBKoJM15gtx9+dI5XZ+ndfX490YqE7qRO8UFNJZ
hLzlyg83jM8LbhD53G1+J/gw9ojJQgQfQ+oA0cZgg7IlGSBpQWrY3W1pgR1P
WKr0A2kWi80qEOhdwL7kUI+u61VXB3SoYOc9t4nbPLZBms9w5f3hmqRCTFax
85zxl4aF/N4AeZ8ed+psOHeoSKoOfE/KYGJRYtOWFQtC4Dc8C+sVS9SOxdQ6
Ahdu1+6ySLuDV7zrdwTrVm+4txzL9hY/ElueSSZvHa0qiPPyx3Odx7mlFGV9
Kb8ylYjTW+6MRhsUodYq4KCO6e1xq25aKAbI2dA5Dw5aHvtMcrY4JNfWXLHU
7JGsu3FukpBqnBd4I+jIi36sm2P8Prukqnuaf5WWVb1bDD07o1kzzmzeDxv7
rIQWffESrd/zhxvFi3itnwx1tgU71vnpYTizbS3SXKEw0sgsQrxn0D421L6I
Lf+b5/rp07y+Gqpb86fo/tJev8AK99cyThtapFiwn9d/5JZo9f9l0n+oONZq
ZmvvOzDN3bE5dvfn9f4VPbOtDqZvKDamSv/+m81LYP37R8MgtP/fdPvvLsFD
etcliL7HTUEX2cYx6Ai+BkRzYynPaCoBzWU7kLiItu+/Phpvgvb/23b/fSRw
f+82fyCq5yiZW0dz39z7IbjB9vpy0l0X8Y0xePmYiZGF5K3HIewGzBStn2RE
L3tH1FqUDeORNdj+d/8IXtmJ1Drlrdc3nMT1gsOZNsw9OYn6qN+JrTdYMOfh
oudkwMPbchpq94n8CQd20dxWq4+qX63UBr23/3WoKOik0pLGwOc+gq8T624Z
XSEN4lf+NMQnNvy8kfR/83z1ET6PnXJ37GUGllw31Rk0ucXteHHiq5Y0oely
DpPUVrig/xRKPkUSUT69Gd5ONSblgWnyBLgBFVHKQ0Q9OZbtFkmBKZNRso1F
7xka2V/3nnW1OERuW+FgEUQ2FQ7mFFQt2LvKLltrGfc+0h5ie5WkRF1/+ksY
P5BIqPyRIUtnGjd0l8L2J1LeU7QErv4sCJSobFyrVk07HX9PIXuuy5zkMEQ4
VzeFYZQxUwwKocJ8PID+ssguS8tYpyPxWTq9+foj2+00iTYHvwpc785lFgnK
x29gVcN8BXFZVZa96d2DVrpSxWHEo2m780sLrWOYRqfOeQdSN600dDxqcmuE
qw9r3VzsHCsdHZe00K6ko5cvWunqLK6yzSzgUqRRgpuXiCKWIjkWKcOH17ZQ
5HBmGCY6kpIUCXzENn0xhtxDMtrVKeuoQmZS1zGUa1IC6OYabKwUh6p6mmCf
a2tGNkvBefZVcntfJGXJQgFPb7vUfIbsmOeIpJDKdHNxzF5m6DrbqyDNvvLP
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

-->

</rfc>
