<?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.39 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-einarsson-moq-locmaf-01" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="LOCMAF">Low Overhead CMAF for Media over QUIC (LOCMAF)</title>
    <seriesInfo name="Internet-Draft" value="draft-einarsson-moq-locmaf-01"/>
    <author fullname="Torbjörn Einarsson">
      <organization>Eyevinn Technology</organization>
      <address>
        <email>torbjorn.einarsson@eyevinn.se</email>
      </address>
    </author>
    <date year="2026" month="July" day="05"/>
    <area>ART</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>moq</keyword>
    <keyword>cmaf</keyword>
    <keyword>live streaming</keyword>
    <keyword>low latency</keyword>
    <abstract>
      <?line 65?>

<t>This document specifies LOCMAF (Low Overhead CMAF for Media over
QUIC), a compact packaging for low-latency CMAF media carried
end-to-end as MoQ Transport (MOQT) Object payloads, with per-object
overhead comparable to the Low Overhead Container (LOC). LOCMAF
carries the CMAF chunk head metadata from a single <tt>moof</tt> (movie
fragment) as a small set of tagged fields, while leaving the sample
data (<tt>mdat</tt>) untouched. Boxes that may surround the <tt>moof</tt> in a
CMAF chunk — <tt>styp</tt> (segment type), <tt>prft</tt> (producer reference
time), and any number of <tt>emsg</tt> (event message) boxes — are carried
verbatim, each through a generic box element (a genBox). The first Object of
each MOQT group carries a full reference; subsequent Objects in the
same group carry only the differences. The receiver reconstructs
CMAF chunks that are decode-equivalent to the sender input,
including the encryption metadata required by CMAF DRM (Common
Encryption) pipelines, and a canonical byte-identical
reconstruction — independent of the encoder's representation
choices — is defined for conformance testing.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://Eyevinn.github.io/locmaf-id/draft-einarsson-moq-locmaf.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-einarsson-moq-locmaf/"/>.
      </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/Eyevinn/locmaf-id"/>.</t>
    </note>
  </front>
  <middle>
    <?line 85?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>CMAF <xref target="CMAF"/> chunk headers have a size starting at around 100 bytes,
which can be as large as, or larger than, the coded frame the chunk
describes — at low latency and low bitrate, such as audio, a frame is
often only a few hundred bytes. Carrying CMAF directly over MoQ
Transport <xref target="MOQT"/> therefore incurs a per-object overhead that the
Low Overhead Container (LOC) <xref target="LOC"/> avoids by carrying raw codec
frames with a minimal set of metadata. LOC, however, cannot transport
the per-sample CENC <xref target="CENC"/> metadata needed for browser EME / CDM
decryption of DRM-protected live streams, nor the <tt>prft</tt> (Producer
Reference Time), <tt>emsg</tt> (DASH Event Message), and <tt>uuid</tt> boxes that a
CMAF chunk may carry alongside the <tt>moof</tt>.</t>
      <t>LOCMAF closes this gap. It is a packaging — a compact container for
CMAF media — that exploits the observation that consecutive CMAF
chunk heads within a single CMAF segment are nearly identical: the
first chunk of a MOQT group is sent in full, subsequent chunks are
sent as compact deltas against the previous chunk in the same group,
and <tt>mdat</tt> payloads are passed through unchanged. The receiver
reconstructs full CMAF chunks suitable for any unmodified CMAF
playback pipeline (such as browser MSE / EME), or feeds the
elementary samples directly to a frame-based decoder interface
(such as WebCodecs); see <xref target="consumption"/>.</t>
      <t>LOCMAF is carried end-to-end as the payload of MOQT Objects. MOQT
relays forward the Object payload unchanged; only the encoder
produces LOCMAF and only the receiver expands it. LOCMAF is
therefore a media packaging, not a hop-by-hop transfer encoding, and
not a transport — MOQT <xref target="MOQT"/> is the transport.</t>
      <t>This document specifies the LOCMAF Object encoding, the generic box
and raw-boxes elements, the full and delta chunk encodings, the
catalog signaling (aligned with <xref target="CMSF"/>), the canonical CMAF
reconstruction, and the DRM box round-trip. Auxiliary top-level boxes
such as <tt>uuid</tt> ride alongside the <tt>moof</tt> (<xref target="genbox"/>), and content
outside the field model can be carried as whole boxes verbatim
(<xref target="rawboxes"/>). A reference implementation, conformance test vectors,
golden files, and worked examples are published at <xref target="LOCMAF-REPO"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Throughout this document, <tt>vi64</tt> denotes a variable-length integer
as defined in <xref section="1.4.1" sectionFormat="of" target="MOQT"/>.</t>
      <t>The following terms are used throughout this document:</t>
      <dl>
        <dt>CMAF chunk:</dt>
        <dd>
          <t>One <tt>moof</tt> + one <tt>mdat</tt> pair, optionally preceded by at most one
<tt>styp</tt>, at most one <tt>prft</tt>, zero or more <tt>emsg</tt> boxes, and other
top-level boxes (e.g. <tt>uuid</tt>), as defined in <xref target="CMAF"/> §7.3.3.2. The
smallest CMAF addressable media object.</t>
        </dd>
        <dt>CMAF fragment:</dt>
        <dd>
          <t>One or more CMAF chunks whose first chunk starts at a Stream Access
Point (<xref target="CMAF"/> §7.3.2.2). A fragment is logically a single
<tt>MovieFragmentBox</tt> worth of samples; in "chunked" CMAF the samples
are split across multiple smaller <tt>moof</tt> + <tt>mdat</tt> pairs.</t>
        </dd>
        <dt>CMAF segment:</dt>
        <dd>
          <t>One or more CMAF fragments in decode order (<xref target="CMAF"/> §7.3.2.4). The
segment is the typical unit of HTTP delivery in DASH and HLS-fMP4;
in LOCMAF the segment corresponds to one MOQT group.</t>
        </dd>
        <dt>CMAF Header:</dt>
        <dd>
          <t>The <tt>ftyp</tt> + <tt>moov</tt> pair that initializes a CMAF track. Also called
an <em>initialization segment</em> in DASH parlance and carried or
referenced as initialization data by CMSF <xref target="CMSF"/> catalogs.</t>
        </dd>
        <dt>MOQT group, MOQT object:</dt>
        <dd>
          <t>As defined in <xref target="MOQT"/>.</t>
        </dd>
        <dt>LOCMAF Object:</dt>
        <dd>
          <t>A MOQT Object whose payload is a LOCMAF Object encoding: either a
sequence of generic box elements (see below) and exactly one
moof-header element, followed by the <tt>mdat</tt> payload, or a single
raw-boxes element, as defined in <xref target="object-encoding"/>.</t>
        </dd>
        <dt>genBox:</dt>
        <dd>
          <t>A generic box element that carries one ISO BMFF box that precedes
<tt>moof</tt> in a CMAF chunk (for example <tt>styp</tt>, <tt>prft</tt>, <tt>emsg</tt>, or
<tt>uuid</tt>). See <xref target="genbox"/>.</t>
        </dd>
        <dt>rawBoxes:</dt>
        <dd>
          <t>A raw-boxes element that carries one or more complete ISO BMFF
boxes verbatim, including their box headers, as the entire payload
of a LOCMAF Object. See <xref target="rawboxes"/>.</t>
        </dd>
        <dt>locmafHeader:</dt>
        <dd>
          <t>The single moof-header element of a LOCMAF Object. It carries the
tagged <tt>moof</tt> fields in either a full (absolute) or delta encoding
and marks the position of <tt>moof</tt> in the reconstructed chunk. See
<xref target="object-encoding"/>.</t>
        </dd>
        <dt>Full LOCMAF chunk:</dt>
        <dd>
          <t>A LOCMAF Object whose moof-header element is a full header. It
carries an absolute encoding of the CMAF chunk head and serves as
the in-group reference for subsequent delta Objects. See
<xref target="full-chunk"/>.</t>
        </dd>
        <dt>Delta LOCMAF chunk:</dt>
        <dd>
          <t>A LOCMAF Object whose moof-header element is a delta header. It
encodes differences against the most recently received full LOCMAF
chunk in the same MOQT group. See <xref target="delta-chunk"/>.</t>
        </dd>
        <dt>BMDT:</dt>
        <dd>
          <t>Abbreviation for <tt>tfdt.baseMediaDecodeTime</tt> (<xref target="ISOBMFF"/>).</t>
        </dd>
      </dl>
    </section>
    <section anchor="mapping">
      <name>MOQT Group / Object Mapping</name>
      <t>LOCMAF assumes the following mapping from CMAF to MOQT:</t>
      <ul spacing="normal">
        <li>
          <t>One MOQT group per CMAF segment. Group boundaries align with random
access points.</t>
        </li>
        <li>
          <t>One MOQT Object per CMAF chunk. Each MOQT Object is a LOCMAF Object
carrying the (full or delta) chunk head followed by the unmodified
<tt>mdat</tt> payload.</t>
        </li>
        <li>
          <t>Audio MOQT groups typically have the same duration as the video
MOQT groups with which they will be muxed, to enable joint tune-in.</t>
        </li>
        <li>
          <t>Sparse tracks, such as subtitle, event, or metadata tracks, are
more likely to have groups that are not aligned with video.</t>
        </li>
      </ul>
      <t>Delta chunks reference the preceding chunk in the same group (see
<xref target="delta-chunk"/>), so LOCMAF depends on in-order delivery within a
group. MOQT <xref target="MOQT"/> guarantees ordering only within a <em>subgroup</em>:
a subgroup carries Objects of one group in ascending Object ID
order on a single stream, while datagrams are unordered. A
publisher <bcp14>MUST</bcp14> therefore send all Objects of a LOCMAF group in a
single subgroup, and <bcp14>MUST NOT</bcp14> use the Datagram forwarding
preference for LOCMAF tracks. The first moof-carrying Object of
each group <bcp14>MUST</bcp14> be a full LOCMAF chunk so a subscriber tuning in at
a group boundary has a complete reference (see
<xref target="element-sequence"/>).</t>
      <t>When a receiver detects that Objects are missing within a group — a
gap in Object IDs, or a reset of the subgroup's stream — it <bcp14>MUST
NOT</bcp14> apply subsequent delta chunks; it resumes either at the next
full LOCMAF chunk or rawBoxes Object (<xref target="rawboxes"/>) in the same
group or at the start of the next group.</t>
    </section>
    <section anchor="scope">
      <name>Scope and Publisher Requirements</name>
      <t>LOCMAF targets the low-latency CMAF case: short CMAF fragments
composed of small CMAF chunks (often one sample per chunk),
optionally carrying CENC encryption metadata. To keep the
packaging minimal, the following constraints apply.</t>
      <section anchor="mandatory-preconditions">
        <name>Mandatory preconditions</name>
        <t>A LOCMAF publisher <bcp14>MUST</bcp14> ensure that:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Single <tt>trak</tt> per <tt>moov</tt>.</strong> The CMAF Header contains exactly
one <tt>trak</tt> box. Multi-track ISO BMFF files <bcp14>MUST</bcp14> be demuxed
before LOCMAF encoding.</t>
          </li>
          <li>
            <t><strong>No key ID (KID) change within a CMAF chunk.</strong> Key-identifier
transitions <bcp14>MUST</bcp14> align with fragment (and therefore chunk)
boundaries. This removes the need for <tt>sgpd</tt> / <tt>sbgp</tt> boxes in
the packaging.</t>
          </li>
        </ol>
        <t>If a source violates either of these, the publisher <bcp14>MUST NOT</bcp14> use
LOCMAF packaging for that track and <bcp14>MUST</bcp14> instead use plain CMAF
packaging. LOCMAF and plain CMAF tracks <bcp14>MAY</bcp14> coexist in the same
catalog under the same namespace (see <xref target="catalog"/>).</t>
      </section>
      <section anchor="recommended-source-properties">
        <name>Recommended source properties</name>
        <t>The following are recommendations whose violation costs bytes but
does not break LOCMAF:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Commensurate media timescales.</strong> Choose a timescale so every
frame has an exact integer duration (e.g. 48 000 for 48 kHz AAC,
60 000 for 60000/1001 fps video).</t>
          </li>
          <li>
            <t><strong>Stable <tt>trex</tt> defaults.</strong> Keeping <tt>trex</tt> consistent across the
stream maximizes what can be omitted from each chunk header.</t>
          </li>
        </ol>
      </section>
      <section anchor="optional-encoder-modes">
        <name>Optional encoder modes</name>
        <t>A LOCMAF encoder <bcp14>MAY</bcp14> operate in <strong>strict <tt>cmf2</tt> mode</strong>, in which it
always emits the four <tt>tfhd</tt> defaults (sample duration, size,
flags, sample-description index) in the full chunk header even when
they match <tt>trex</tt>. This costs a handful of bytes per group but
produces reconstructed CMAF chunks in which each chunk is a
self-decodable single-chunk fragment per <xref target="CMAF"/> §7.7.3. It need
not be signaled, since it does not affect compatibility between
encoders and decoders. Strict <tt>cmf2</tt> mode is an opt-in encoder
tweak and is <strong>not</strong> the canonical baseline used for conformance;
the canonical reconstruction defined in <xref target="canonical"/> emits a
<tt>tfhd</tt> default only when it differs from <tt>trex</tt>.</t>
      </section>
    </section>
    <section anchor="catalog">
      <name>Catalog Signaling</name>
      <t>LOCMAF media is signaled in a CMSF <xref target="CMSF"/> catalog. This document
extends the allowed <tt>packaging</tt> values defined in <xref target="MSF"/> with one
new entry, in the same manner that <xref target="CMSF"/> adds <tt>"cmaf"</tt>:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Value</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">LOCMAF</td>
            <td align="left">
              <tt>locmaf</tt></td>
            <td align="left">This document</td>
          </tr>
        </tbody>
      </table>
      <t>Every track entry in a CMSF catalog that carries LOCMAF-encoded
media <bcp14>MUST</bcp14> declare a <tt>packaging</tt> value of <tt>"locmaf"</tt>. As with
<tt>"cmaf"</tt>, the <tt>"locmaf"</tt> packaging is defined for CMSF catalogs
only, not for plain MSF <xref target="MSF"/> catalogs. The <tt>"locmaf"</tt> packaging
value and the <tt>locmafVersion</tt> field below are expected to migrate
into <xref target="CMSF"/> once it registers them; until then they are defined
here.</t>
      <t>The LOCMAF Object encoding is versioned independently of the CMSF
catalog <tt>version</tt>. This document adds one track-level catalog
field, following the field-definition conventions of <xref target="MSF"/>:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Field</th>
            <th align="left">Name</th>
            <th align="left">Location</th>
            <th align="left">Required</th>
            <th align="left">JSON Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">LOCMAF version</td>
            <td align="left">
              <tt>locmafVersion</tt></td>
            <td align="left">T</td>
            <td align="left">Conditional</td>
            <td align="left">String</td>
          </tr>
        </tbody>
      </table>
      <t><tt>locmafVersion</tt> identifies the LOCMAF packaging version of the
track. It <bcp14>MUST</bcp14> be present when <tt>packaging</tt> is <tt>"locmaf"</tt> and <bcp14>MUST
NOT</bcp14> be present otherwise. The version specified by this document
is <tt>"0.3"</tt>. A receiver <bcp14>MUST NOT</bcp14> subscribe to a LOCMAF track whose
<tt>locmafVersion</tt> it does not support; when the catalog offers the
same source under an alternative packaging, it <bcp14>MAY</bcp14> select that
instead.</t>
      <t>The unknown-field rule of <xref target="parity"/> covers additive evolution
within a version; <tt>locmafVersion</tt> signals behavioral changes that
reinterpret existing wire syntax, which a receiver cannot detect
from the wire bytes alone.</t>
      <t>The CMAF Header for a <tt>locmaf</tt> track is carried by the <strong>same</strong>
mechanism <xref target="CMSF"/> uses for a <tt>cmaf</tt> track: an <tt>initDataList</tt> entry
referenced from the track entry by <tt>initRef</tt> (see <xref target="cmaf-header"/>).
LOCMAF places no additional restriction on the <tt>initDataList</tt> entry
<tt>type</tt> and has the same flexibility as <tt>cmaf</tt> packaging: the inline
base64 type is the common case, but any <tt>initDataList</tt> type defined
by <xref target="MSF"/> or <xref target="CMSF"/> <bcp14>MAY</bcp14> be used. LOCMAF defines no init carriage
of its own. A consequence is that a <tt>cmaf</tt> track and a <tt>locmaf</tt>
track wrapping the same source <bcp14>MAY</bcp14> refer to the same <tt>initData</tt>
entry; only the per-chunk Object encoding differs.</t>
      <t>DRM is signaled exactly as for a <tt>cmaf</tt> track, by the CMSF
<xref target="CMSF"/> root-level <tt>contentProtections</tt> array referenced from the
track entry by <tt>contentProtectionRefIDs</tt>, following the DASH-IF
content-protection model <xref target="DASHIF-ECCP"/>. LOCMAF does <strong>not</strong> use the
MSF moq-secure-objects mechanism; the encryption metadata travels
inside the reconstructed CMAF boxes (see <xref target="drm"/>). The precise
catalog field names are those defined by <xref target="MSF"/> and <xref target="CMSF"/>;
beyond the <tt>packaging</tt> value <tt>"locmaf"</tt> and the <tt>locmafVersion</tt>
field, LOCMAF introduces no catalog fields.</t>
      <t><tt>cmaf</tt> and <tt>locmaf</tt> tracks <bcp14>MAY</bcp14> be mixed in the same catalog under the
same namespace — for example video using <tt>cmaf</tt> packaging while audio
uses <tt>locmaf</tt> — and <bcp14>MAY</bcp14> coexist as alternative encodings of the same
source.</t>
    </section>
    <section anchor="cmaf-header">
      <name>CMAF Header Delivery</name>
      <t>The CMAF Header for a LOCMAF track is byte-identical to the CMAF
Header a plain <tt>cmaf</tt> track of the same source would carry — <tt>ftyp</tt>
followed by <tt>moov</tt> (which contains <tt>mvex</tt> with <tt>trex</tt>, and, for
protected content, optionally <tt>pssh</tt>). It is carried or referenced
via the same CMSF <xref target="CMSF"/> mechanism as for <tt>cmaf</tt> packaging (an
<tt>initDataList</tt> entry referenced by <tt>initRef</tt>), using whichever
<tt>initDataList</tt> <tt>type</tt> the catalog specifies; the inline base64 type
is the common case. There is no LOCMAF-specific CMAF Header carrier.</t>
      <t>The <tt>moov</tt> in the CMAF Header <bcp14>MUST</bcp14> contain exactly one <tt>trak</tt> box
(see <xref target="scope"/>).</t>
      <t>A LOCMAF receiver:</t>
      <ol spacing="normal" type="1"><li>
          <t>Resolves the track's <tt>initRef</tt> to its <tt>initDataList</tt> entry and
obtains the CMAF Header bytes as the entry's <tt>type</tt> dictates
(base64-decoding an inline entry).</t>
        </li>
        <li>
          <t>Feeds the bytes to its MSE / decoder pipeline exactly as it would
for a plain CMAF track.</t>
        </li>
        <li>
          <t>Extracts the parameters required to reconstruct CMAF chunks — the
single <tt>trak</tt>'s <tt>track_ID</tt>, <tt>mdhd.timescale</tt>, <tt>trex</tt> defaults, and
any track-encryption information (<tt>tenc</tt> defaults: default KID,
default per-sample IV size, constant IV, scheme type, and pattern
parameters) — from the decoded CMAF Header. These values seed the
per-track reconstruction state (see <xref target="canonical"/>).</t>
        </li>
        <li>
          <t>Begins receiving LOCMAF-encoded media Objects on the subscribed
track and reconstructs each CMAF chunk from the LOCMAF Object
payload.</t>
        </li>
      </ol>
      <t>Compression of the CMAF Header (init data), which can be sizeable,
is out of scope for LOCMAF: it is a property of the <tt>initDataList</tt>
entry <tt>type</tt> and handled by the CMSF <xref target="CMSF"/> / MSF <xref target="MSF"/> init-data
mechanism, not defined here.</t>
    </section>
    <section anchor="object-encoding">
      <name>Object Encoding</name>
      <t>A LOCMAF Object is the payload of a single MOQT <xref target="MOQT"/> object. It
carries one CMAF chunk: the <tt>moof</tt> chunk head as a small set of
tagged fields, any boxes that precede the <tt>moof</tt>, and the
unmodified <tt>mdat</tt> sample data. MOQT relays forward the Object
payload unchanged; only the encoder produces LOCMAF and only the
receiver expands it back to CMAF.</t>
      <section anchor="element-sequence">
        <name>Element sequence and dispatch</name>
        <t>A LOCMAF Object payload takes one of two shapes. The first — the
moof-carrying shape — is an ordered sequence of <em>elements</em> followed
by the raw <tt>mdat</tt> payload:</t>
        <artwork><![CDATA[
[ genBox ]*       zero or more pre-moof boxes, in reconstruction order
locmafHeader      exactly one: a full or delta moof header
mdat raw payload  length = MOQT-object-len minus the elements above
]]></artwork>
        <t>The second shape is a single raw-boxes element spanning the entire
payload:</t>
        <artwork><![CDATA[
rawBoxes          complete ISO BMFF boxes, verbatim ({{rawboxes}})
]]></artwork>
        <t>The raw-boxes shape is not the common per-chunk path. It serves
in-group resync (<xref target="mapping"/>), verbatim carriage of chunks whose
<tt>moof</tt> falls outside the LOCMAF field model, and self-framed storage
outside MOQT (<xref target="outside-moqt"/>); see <xref target="rawboxes"/>.</t>
        <t>In the moof-carrying shape, the <tt>locmafHeader</tt> marks where the
<tt>moof</tt> sits in the reconstructed chunk: every <tt>genBox</tt> before it
renders before the <tt>moof</tt>, and the <tt>mdat</tt> immediately follows the
<tt>moof</tt>. The common case — no boxes outside the <tt>moof</tt> — is simply
<tt>locmafHeader</tt> followed by <tt>mdat</tt>; <tt>genBox</tt> is purely additive.</t>
        <t>Each element begins with an <strong>element_type</strong> <tt>vi64</tt>. Four element
types are defined:</t>
        <table>
          <thead>
            <tr>
              <th align="center">element_type</th>
              <th align="left">Symbol</th>
              <th align="left">Meaning</th>
              <th align="left">Delimited by</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center">1</td>
              <td align="left">
                <tt>genBox</tt></td>
              <td align="left">one generic pre-<tt>moof</tt> box (<xref target="genbox"/>)</td>
              <td align="left">its own <tt>box_size</tt> field</td>
            </tr>
            <tr>
              <td align="center">2</td>
              <td align="left">
                <tt>locmafFullHeader</tt></td>
              <td align="left">full moof header (absolute encoding)</td>
              <td align="left">its <tt>properties_length</tt></td>
            </tr>
            <tr>
              <td align="center">3</td>
              <td align="left">
                <tt>locmafDeltaHeader</tt></td>
              <td align="left">delta moof header (in-group deltas)</td>
              <td align="left">its <tt>properties_length</tt></td>
            </tr>
            <tr>
              <td align="center">4</td>
              <td align="left">
                <tt>rawBoxes</tt></td>
              <td align="left">complete boxes, verbatim (<xref target="rawboxes"/>)</td>
              <td align="left">the Object end (sole element)</td>
            </tr>
          </tbody>
        </table>
        <t>The <tt>mdat</tt> payload carries no element_type tag — it is whatever
bytes remain after the <tt>locmafHeader</tt>.</t>
        <t>A receiver parses elements in a loop, reading element_type <tt>vi64</tt>
values:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the first element_type of the Object is <tt>4</tt>, the Object is a
single <tt>rawBoxes</tt> element (<xref target="rawboxes"/>) and the loop ends;
element_type <tt>4</tt> anywhere but first is malformed.</t>
          </li>
          <li>
            <t>While the element_type is <tt>1</tt>, it parses one <tt>genBox</tt> (delimited
by its <tt>box_size</tt>, see <xref target="genbox"/>) and continues.</t>
          </li>
          <li>
            <t>When the element_type is <tt>2</tt> or <tt>3</tt>, it parses exactly one
<tt>locmafHeader</tt>, full or delta respectively (delimited by its
<tt>properties_length</tt>, see <xref target="full-chunk"/> and <xref target="delta-chunk"/>).
The bytes following that header's property block, to the end of
the MOQT object, are the <tt>mdat</tt> payload.</t>
          </li>
        </ol>
        <t>Exactly one header element <bcp14>MUST</bcp14> appear in a moof-carrying LOCMAF
Object, and it <bcp14>MUST</bcp14> be the last element before the <tt>mdat</tt> payload.
A <tt>genBox</tt> that follows the header is malformed.</t>
        <t>The full-vs-delta distinction is signaled exclusively by the
header element_type (<tt>2</tt> for full, <tt>3</tt> for delta), never by the
MOQT object position within a group:</t>
        <ol spacing="normal" type="1"><li>
            <t>The first moof-carrying object of every MOQT group <bcp14>MUST</bcp14> carry a
<tt>locmafFullHeader</tt>, so a subscriber tuning in at a group
boundary has a complete reference. The only objects that may
precede it in the group are rawBoxes Objects (<xref target="rawboxes"/>).</t>
          </li>
          <li>
            <t>The encoder <bcp14>MAY</bcp14> emit a <tt>locmafFullHeader</tt> at any object position
within a group, not only at object index 0. A mid-group full
chunk re-anchors the in-group reference for subsequent delta
chunks.</t>
          </li>
          <li>
            <t>After parsing a <tt>locmafFullHeader</tt>, the receiver <bcp14>MUST</bcp14> discard
its in-group delta state and treat the new full chunk as the
reference for any following <tt>locmafDeltaHeader</tt> objects in the
group.</t>
          </li>
          <li>
            <t>A rawBoxes Object likewise resets the in-group delta state; the
next moof-carrying object in the group <bcp14>MUST</bcp14> carry a
<tt>locmafFullHeader</tt> (see <xref target="rawboxes"/>).</t>
          </li>
          <li>
            <t>The receiver <bcp14>MUST</bcp14> dispatch on the header element_type alone. It
<bcp14>MUST NOT</bcp14> infer "full" from object index 0 or "delta" from object
index greater than 0.</t>
          </li>
        </ol>
        <t>An element_type not defined in the table above is not
self-delimiting, so a receiver cannot skip it. A receiver that
reads an unrecognized
leading element_type <bcp14>MUST</bcp14> treat the Object as malformed and reject
it; there is no generic skip for unknown top-level elements. This
hard failure is deliberate: an element one receiver silently
skipped and another understood would make the two reconstruct
different chunks, defeating canonical comparison (<xref target="canonical"/>).
Extension happens through new <tt>genBox</tt> <tt>box_name</tt> FourCCs and new
header field IDs (see <xref target="parity"/>) — both of which <em>are</em>
self-delimiting — not through new element types.</t>
        <t>For event-only tracks (see <xref target="event-only"/>) the <tt>mdat</tt> payload <bcp14>MAY</bcp14>
be zero bytes; the receiver reconstructs an empty <tt>mdat</tt> box
(8-byte header only).</t>
      </section>
      <section anchor="header-layout">
        <name>Header element layout</name>
        <t>A <tt>locmafHeader</tt> element (full or delta) is, in order:</t>
        <artwork><![CDATA[
element_type        vi64     = 2 (full) or 3 (delta)
properties_length   vi64     byte length of the property block
property block      properties_length bytes of (field_id, value) tuples
]]></artwork>
        <t><tt>element_type</tt> and <tt>properties_length</tt> are <tt>vi64</tt> values. The
property block is the flat sequence of
<tt>(field_id, value)</tt> tuples defined in <xref target="parity"/> and is exactly
<tt>properties_length</tt> bytes long, so the header element is
self-delimited. When this is the Object's header element, the bytes
following the property block, to the end of the MOQT object, are the
<tt>mdat</tt> payload (see <xref target="element-sequence"/>). A delta header with
<tt>properties_length == 0</tt> carries no field changes (see
<xref target="delta-chunk"/>).</t>
      </section>
      <section anchor="parity">
        <name>Property encoding (parity rule)</name>
        <t>The property block inside a <tt>locmafHeader</tt> is a flat sequence of
<tt>(field_id, value)</tt> tuples. Field IDs are <tt>vi64</tt> values.
This is the property scheme of <xref target="LOC"/> §2.3: the value encoding is
determined by the parity of the field ID. LOCMAF reuses that parity
scheme but governs its own field IDs in this document (see
<xref target="field-ref"/>); they are not <xref target="LOC"/> properties and are not
IANA-registered.</t>
        <ul spacing="normal">
          <li>
            <t><strong>Even ID — scalar.</strong> The value is a single <tt>vi64</tt> with no
length prefix. In a full header it is an absolute unsigned
<tt>vi64</tt>; in a delta header it is a zigzag <tt>vi64</tt> (see <xref target="zigzag"/>)
of the signed delta against the in-group reference.</t>
          </li>
          <li>
            <t><strong>Odd ID — length-prefixed bytes.</strong> The tuple is <tt>field_id |
byte_length | bytes</tt>. The interpretation of the bytes is
per-field. <tt>vi64</tt>-list fields concatenate their elements, each an
absolute unsigned <tt>vi64</tt> in full context and a per-element
zigzag <tt>vi64</tt> (see <xref target="zigzag"/>) in delta context. Raw-byte fields
(<tt>sencInitializationVector</tt>, ID 9) carry opaque content verbatim
in both contexts.</t>
          </li>
        </ul>
        <t>Parity governs <em>framing</em>: it tells a receiver how far every tuple
extends, whether or not it recognizes the field ID. The
interpretation of the value bytes is per-field (<xref target="field-ref"/>).
Three fields deviate from the absolute-in-full / delta-in-delta
value encoding above:</t>
        <ul spacing="normal">
          <li>
            <t><tt>trunSampleCompositionTimeOffsets</tt> (ID 5): elements are zigzag
<tt>vi64</tt> values (see <xref target="zigzag"/>) in <strong>both</strong> full and delta context,
because composition time offsets are signed in <tt>trun</tt> version 1 —
the common video case, where B-frames make the composition/
decode-time relation non-monotonic.</t>
          </li>
          <li>
            <t><tt>sencInitializationVector</tt> (ID 9): opaque raw bytes, carried
verbatim in both contexts (overwrite, never a delta).</t>
          </li>
          <li>
            <t><tt>deltaDeletedLocmafIDs</tt> (ID 27): delta-only control list whose
elements are plain unsigned <tt>vi64</tt> field IDs, never zigzag (see
<xref target="deletion-marker"/>).</t>
          </li>
        </ul>
        <t>Two fields are additionally restricted to one header kind:
<tt>tfdtBaseMediaDecodeTime</tt> (ID 10) appears only in full headers — a
delta chunk's BMDT is always derived (see <xref target="bmdt-derivation"/>) —
and <tt>deltaDeletedLocmafIDs</tt> (ID 27) appears only in delta headers.</t>
        <t>A receiver that encounters a field ID not defined in this document
<bcp14>MUST</bcp14> skip its value using the parity rule — one <tt>vi64</tt> for an even
ID, <tt>byte_length</tt> bytes for an odd ID — and <bcp14>MUST</bcp14> otherwise ignore
it. New field IDs can therefore be added backward-compatibly, as
long as a reconstruction that ignores them remains correct; an
extension that cannot be safely ignored requires a new <tt>packaging</tt>
value instead.</t>
        <t>The ID space is structurally aligned with the parity rule: every
scalar/default field has an even ID and every list or byte field
has an odd ID. A field ID <bcp14>MUST NOT</bcp14> appear twice in one property
block; a receiver <bcp14>MUST</bcp14> reject a property block that repeats one.
Field IDs <bcp14>MAY</bcp14> appear in any order and receivers <bcp14>MUST</bcp14> tolerate any
ordering; encoders <bcp14>SHOULD</bcp14> emit IDs in ascending order, and the
canonical encoding (<xref target="canonical-encoding"/>) requires it.</t>
      </section>
      <section anchor="zigzag">
        <name>Zigzag vi64 encoding</name>
        <t>A <em>zigzag vi64</em> is a signed integer encoded as an unsigned <tt>vi64</tt>
by interleaving non-negative and negative values so that
small-magnitude values of either sign occupy small unsigned values,
and thus the shortest <tt>vi64</tt> forms.</t>
        <t>For a signed 64-bit integer <tt>n</tt>, the mapping to its unsigned zigzag
representation <tt>z</tt> is:</t>
        <artwork><![CDATA[
encode:  z = (n << 1) ^ (n >> 63)  ; arithmetic right shift
                                   ; equivalently:
                                   ;   n >= 0:  z = 2 * n
                                   ;   n <  0:  z = -2 * n - 1

decode:  n = (z >> 1) ^ -(z & 1)   ; equivalently:
                                   ;   z even:  n =  z / 2
                                   ;   z odd:   n = -(z + 1) / 2
]]></artwork>
        <t>The first few mappings: 0↔0, -1↔1, 1↔2, -2↔3, 2↔4, -3↔5, 3↔6, ….</t>
        <t>The encoded <tt>z</tt> is then serialized as an unsigned <tt>vi64</tt>; decoders
read the <tt>vi64</tt> and apply the decode rule above.</t>
        <t>This zigzag mapping is widely used in compact binary serialization
formats; the description is included here for self-containment.</t>
        <t>LOCMAF uses zigzag <tt>vi64</tt> values wherever a signed value is written: for
deltas against the in-group reference, and for the signed list
<tt>trunSampleCompositionTimeOffsets</tt> (ID 5) in both contexts (see
<xref target="parity"/>).</t>
      </section>
    </section>
    <section anchor="genbox">
      <name>Generic Boxes (genBox)</name>
      <t>A <tt>genBox</tt> is the single generic carrier for every box that sits
outside the <tt>moof</tt> in a CMAF chunk — <tt>styp</tt>, <tt>prft</tt>, <tt>emsg</tt>,
<tt>uuid</tt>, and any other ISO box type. One <tt>genBox</tt> element carries
exactly one ISO box.</t>
      <t>Boxes <em>inside</em> <tt>moof.traf</tt> are not <tt>genBox</tt>es. In particular the
CENC boxes <tt>senc</tt>, <tt>saiz</tt>, and <tt>saio</tt> live inside <tt>traf</tt>, so their
data is carried as <tt>moof</tt>-header fields (<tt>senc</tt>) or recomputed on
reconstruction (<tt>saiz</tt>, <tt>saio</tt>); see <xref target="field-ref"/> and <xref target="drm"/>.
Only boxes outside the <tt>moof</tt> are <tt>genBox</tt>es.</t>
      <section anchor="byte-layout">
        <name>Byte layout</name>
        <t>A <tt>genBox</tt> element is, in order:</t>
        <artwork><![CDATA[
element_type  vi64                = 1 (genBox)
box_size      vi64                length in bytes of box_name + payload
box_name      4 bytes             the ISO box type FourCC
                                  ('styp','emsg','prft','uuid', ...)
payload       box_size − 4 bytes  the box contents WITHOUT the
                                  8-byte ISO box header
]]></artwork>
        <t><tt>element_type</tt> and <tt>box_size</tt> are <tt>vi64</tt> values. <tt>box_size</tt> covers
the <tt>box_name</tt> and the <tt>payload</tt> — the
entire remainder of the element — mirroring ISOBMFF, where a box's
<tt>size</tt> covers its type and contents (the ISO <tt>size</tt> additionally
counts its own 4 bytes). The element on the wire is therefore
<tt>1 | box_size | box_name(4) | payload(box_size − 4)</tt> and is fully
self-delimited by <tt>box_size</tt>; a <tt>box_size</tt> less than 4 is
malformed. Every element that other elements may follow — <tt>genBox</tt>
and the two headers — thus shares the same <tt>type | length | body</tt>
shape, so the length field alone delimits it; only <tt>rawBoxes</tt>,
which nothing ever follows, carries no length (<xref target="rawboxes"/>).</t>
        <t>The <tt>payload</tt> is the box contents that would follow the 8-byte ISO
box header (<tt>size</tt> + <tt>type</tt>). For a <tt>uuid</tt> box, the 16-byte
<tt>usertype</tt> is part of the box contents: the encoder <bcp14>MUST</bcp14> place the
<tt>usertype</tt> as the first 16 bytes of <tt>payload</tt>, followed by the
remaining box data.</t>
      </section>
      <section anchor="full-bytes-no-delta">
        <name>Full bytes, no delta</name>
        <t><tt>genBox</tt>es always carry full bytes; there is no cross-chunk
<tt>genBox</tt> delta and no <tt>genBox</tt> deletion marker. Presence in the
Object payload means the box is rendered in this chunk, in the
position implied by element order; absence means the box is not
rendered in this chunk. A delta <tt>locmafHeader</tt> <bcp14>MAY</bcp14> still be
combined with full <tt>genBox</tt>es in the same Object — for example a
per-chunk <tt>prft</tt> <tt>genBox</tt> in front of a delta moof header.</t>
      </section>
      <section anchor="reconstruction">
        <name>Reconstruction</name>
        <t>To reconstruct the ISO box from a <tt>genBox</tt>, the receiver wraps
<tt>payload</tt> in a standard ISO box header:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <tt>L = 4 + box_size</tt>. <tt>L</tt> <bcp14>MUST</bcp14> fit in 32 bits: a <tt>box_size</tt>
above <tt>0xFFFFFFFB</tt> is malformed and the receiver <bcp14>MUST</bcp14> reject
the Object.</t>
          </li>
          <li>
            <t>Emit the box header <tt>uint32be(L) | box_name(4)</tt>, then
<tt>payload</tt>. The total box is <tt>L</tt> bytes.</t>
          </li>
          <li>
            <t>For a <tt>uuid</tt> box (<tt>box_name == 'uuid'</tt>), the 16-byte <tt>usertype</tt>
is the first 16 bytes of <tt>payload</tt> (see above) and is therefore
emitted immediately after the box header as part of <tt>payload</tt>.
The receiver performs no reordering; reconstruction is the
standard byte-for-byte wrap.</t>
          </li>
        </ol>
        <t>The ISO <tt>size</tt> escape values 0 (box extends to end of file) and 1
(64-bit <tt>largesize</tt> follows, <xref target="ISOBMFF"/>) are never produced: a
reconstructed genBox always carries its actual size in the 32-bit
<tt>size</tt> field. An encoder <bcp14>MUST NOT</bcp14> emit a <tt>genBox</tt> that would
require either escape.</t>
      </section>
      <section anchor="ordering">
        <name>Ordering</name>
        <t>Every <tt>genBox</tt> in the Object payload renders, in payload order,
before the <tt>moof</tt>; the <tt>mdat</tt> immediately follows the <tt>moof</tt>. The
reconstructed chunk is <tt>genBox*</tt> (in payload order), then <tt>moof</tt>,
then <tt>mdat</tt>.</t>
      </section>
      <section anchor="box-carriage">
        <name>Box carriage</name>
        <t>The <tt>payload</tt> of every <tt>genBox</tt> is simply the box contents as
defined by <xref target="ISOBMFF"/> (or the specification owning the box type),
carried verbatim — LOCMAF re-encodes no fields.</t>
        <t>The set of box types carried as <tt>genBox</tt>es is open: any box outside
the <tt>moof</tt> is carried under its ISO <tt>box_name</tt> FourCC, which is
self-describing and needs no LOCMAF identifier allocation.</t>
      </section>
    </section>
    <section anchor="rawboxes">
      <name>Raw Boxes (rawBoxes)</name>
      <t>A <tt>rawBoxes</tt> element carries one or more complete ISO BMFF boxes
verbatim — box headers included — as the entire payload of a LOCMAF
Object. Where a <tt>genBox</tt> carries one pre-<tt>moof</tt> box alongside a
<tt>locmafHeader</tt>, a <tt>rawBoxes</tt> element replaces the header and <tt>mdat</tt>
entirely: it is the escape from the moof-header model for content
that LOCMAF does not otherwise carry. Two uses motivate it:</t>
      <ul spacing="normal">
        <li>
          <t><strong>In-band CMAF Header.</strong> In self-framed carriage
(<xref target="outside-moqt"/>), a leading rawBoxes Object holds the <tt>ftyp</tt> +
<tt>moov</tt> bytes, so a stored LOCMAF segment is self-contained and
the initialization bytes round-trip exactly.</t>
        </li>
        <li>
          <t><strong>Verbatim chunk carriage.</strong> A chunk whose <tt>moof</tt> uses structures
outside the LOCMAF field model rides verbatim, at plain-CMAF
cost, without forcing the whole track onto plain CMAF packaging.</t>
        </li>
      </ul>
      <section anchor="byte-layout-1">
        <name>Byte layout</name>
        <t>A <tt>rawBoxes</tt> element is, in order:</t>
        <artwork><![CDATA[
element_type   vi64                 = 4 (rawBoxes)
boxes          all remaining bytes  complete ISO BMFF boxes, verbatim
]]></artwork>
        <t><tt>element_type</tt> is a <tt>vi64</tt>. <tt>boxes</tt> is the concatenation of one or
more complete ISO BMFF boxes <xref target="ISOBMFF"/>, each starting with its
own box header, spanning the entire remainder of the Object; the
box sizes <bcp14>MUST</bcp14> sum to exactly that remainder. A <tt>rawBoxes</tt> element
carries no length field of its own: it is always the sole element
of its Object (see below), so the Object length — supplied by MOQT,
or by the <tt>object_length</tt> prefix in self-framed carriage
(<xref target="outside-moqt"/>) — delimits it, exactly as it delimits the
untagged <tt>mdat</tt> payload of a moof-carrying Object. The ISO <tt>size</tt>
escape values 0 (box extends to end of file) and 1 (64-bit
<tt>largesize</tt> follows) are not allowed: every box in <tt>boxes</tt> <bcp14>MUST</bcp14>
carry its actual size in the 32-bit <tt>size</tt> field. An empty <tt>boxes</tt>
is malformed.</t>
      </section>
      <section anchor="sole-element-of-its-object">
        <name>Sole element of its Object</name>
        <t>A <tt>rawBoxes</tt> element <bcp14>MUST</bcp14> be the only element of its LOCMAF Object:
element_type <tt>4</tt> <bcp14>MUST</bcp14> appear first in the Object payload, and a
receiver <bcp14>MUST</bcp14> reject an Object in which it appears after another
element. A rawBoxes Object carries no <tt>genBox</tt>, no <tt>locmafHeader</tt>,
and no <tt>mdat</tt> payload. Restricting rawBoxes to whole Objects keeps
the representation unambiguous — a pre-<tt>moof</tt> box accompanying a
moof header has exactly one carrier, <tt>genBox</tt>, so canonical
comparison (<xref target="canonical"/>) never reconciles two encodings of the
same chunk — and is what lets the element drop its length field.</t>
      </section>
      <section anchor="delta-state-reset">
        <name>Delta-state reset</name>
        <t>A rawBoxes Object resets the in-group delta chain. On receiving
one, the receiver <bcp14>MUST</bcp14> discard its in-group reference state; the
next moof-header element in the same group <bcp14>MUST</bcp14> be a full header,
and a receiver <bcp14>MUST</bcp14> reject a <tt>locmafDeltaHeader</tt> that follows a
rawBoxes Object without an intervening <tt>locmafFullHeader</tt>. This
rule keeps receivers writer-only: deriving delta state from <tt>boxes</tt>
would require parsing a <tt>moof</tt> out of the raw bytes, which
reconstruction never otherwise needs.</t>
      </section>
      <section anchor="reconstruction-1">
        <name>Reconstruction</name>
        <t>The reconstructed bytes of a rawBoxes Object are <tt>boxes</tt>, verbatim.
This is also its canonical form (<xref target="canonical"/>): no normalization
is applied, and canonical comparison is plain byte equality.</t>
      </section>
    </section>
    <section anchor="field-ref">
      <name>Field Reference</name>
      <t>This section defines the <tt>(field_id, value)</tt> tuples carried inside a
full or delta <tt>locmafHeader</tt> element (element types 2 and 3, see
<xref target="element-sequence"/>). These IDs occupy a namespace distinct from
the top-level element-type IDs; they <bcp14>MUST NOT</bcp14> be confused with them.</t>
      <t>Framing and value encoding follow the parity rule of <xref target="parity"/>,
including its four per-field exceptions. LOCMAF governs these IDs
in this document; they are not LOC properties and are not
registered with IANA (see <xref target="iana"/>).</t>
      <t>The fields are drawn from the boxes inside <tt>moof.traf</tt>. Each symbol
prefix names its containing box, and the table groups them by box in
reconstruction order — <tt>tfhd</tt>, then <tt>tfdt</tt>, then <tt>trun</tt>, then
<tt>senc</tt>. The field IDs are therefore not consecutive: the parity rule
(<xref target="parity"/>) fixes every scalar to an even ID and every list to an
odd ID, and the lowest IDs are held for the common-media fields so
they encode in a single byte. The field IDs are identical across
full and delta headers; only the value encoding differs (absolute in
a full header, delta in a delta header — see <xref target="full-chunk"/> and
<xref target="delta-chunk"/>).</t>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Symbol</th>
            <th align="left">Kind</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">2</td>
            <td align="left">
              <tt>tfhdSampleDescriptionIndex</tt></td>
            <td align="left">scalar</td>
          </tr>
          <tr>
            <td align="right">4</td>
            <td align="left">
              <tt>tfhdDefaultSampleDuration</tt></td>
            <td align="left">scalar</td>
          </tr>
          <tr>
            <td align="right">6</td>
            <td align="left">
              <tt>tfhdDefaultSampleSize</tt></td>
            <td align="left">scalar</td>
          </tr>
          <tr>
            <td align="right">8</td>
            <td align="left">
              <tt>tfhdDefaultSampleFlags</tt></td>
            <td align="left">scalar</td>
          </tr>
          <tr>
            <td align="right">10</td>
            <td align="left">
              <tt>tfdtBaseMediaDecodeTime</tt></td>
            <td align="left">scalar</td>
          </tr>
          <tr>
            <td align="right">1</td>
            <td align="left">
              <tt>trunSampleSizes</tt></td>
            <td align="left">list</td>
          </tr>
          <tr>
            <td align="right">3</td>
            <td align="left">
              <tt>trunSampleDurations</tt></td>
            <td align="left">list</td>
          </tr>
          <tr>
            <td align="right">5</td>
            <td align="left">
              <tt>trunSampleCompositionTimeOffsets</tt></td>
            <td align="left">signed list ‡</td>
          </tr>
          <tr>
            <td align="right">7</td>
            <td align="left">
              <tt>trunSampleFlags</tt></td>
            <td align="left">list</td>
          </tr>
          <tr>
            <td align="right">12</td>
            <td align="left">
              <tt>trunFirstSampleFlags</tt></td>
            <td align="left">scalar</td>
          </tr>
          <tr>
            <td align="right">14</td>
            <td align="left">
              <tt>trunSampleCount</tt></td>
            <td align="left">scalar</td>
          </tr>
          <tr>
            <td align="right">9</td>
            <td align="left">
              <tt>sencInitializationVector</tt></td>
            <td align="left">raw bytes</td>
          </tr>
          <tr>
            <td align="right">11</td>
            <td align="left">
              <tt>sencSubsampleCount</tt></td>
            <td align="left">list</td>
          </tr>
          <tr>
            <td align="right">13</td>
            <td align="left">
              <tt>sencBytesOfClearData</tt></td>
            <td align="left">list</td>
          </tr>
          <tr>
            <td align="right">15</td>
            <td align="left">
              <tt>sencBytesOfProtectedData</tt></td>
            <td align="left">list</td>
          </tr>
          <tr>
            <td align="right">16</td>
            <td align="left">
              <tt>sencPerSampleIVSize</tt></td>
            <td align="left">scalar</td>
          </tr>
          <tr>
            <td align="right">27</td>
            <td align="left">
              <tt>deltaDeletedLocmafIDs</tt></td>
            <td align="left">list</td>
          </tr>
        </tbody>
      </table>
      <t>‡ Signed: elements are zigzag <tt>vi64</tt> values (see <xref target="zigzag"/>) in
both full and delta context (see <xref target="parity"/>).</t>
      <section anchor="sample-flags-carry-the-full-32-bit-value">
        <name>Sample flags carry the full 32-bit value</name>
        <t><tt>trunSampleFlags</tt> (ID 7), <tt>tfhdDefaultSampleFlags</tt> (ID 8), and
<tt>trunFirstSampleFlags</tt> (ID 12) each carry the complete 32-bit ISO
<tt>sample_flags</tt> value (<xref target="ISOBMFF"/> §8.8.3.1): the full value in a
full header, and a difference in a delta header, both as <tt>vi64</tt>
(the difference signed, see <xref target="zigzag"/>).</t>
      </section>
      <section anchor="indexing-and-list-lengths">
        <name>Indexing and list lengths</name>
        <t>The per-sample list fields (IDs 1, 3, 5, 7, 11) carry the
<tt>sample[i].*</tt> values from their source box. The per-subsample list
fields (IDs 13, 15) carry the
<tt>senc.sample[i].subsample[j].*</tt> values flattened in chunk order,
with a total length equal to the sum of <tt>sencSubsampleCount[i]</tt>
over all samples. <tt>sencInitializationVector</tt> (ID 9) is the
concatenation of per-sample IVs, each <tt>per_sample_IV_size</tt> bytes
long (see <xref target="drm"/>).</t>
        <t><tt>trunSampleCount</tt> (ID 14) — always present in a full header, and
carried in a delta header only when it changes — anchors every list
length: the per-sample lists have <tt>trunSampleCount</tt> elements, with
the single exception of <tt>trunSampleSizes</tt> (ID 1), which carries
<tt>trunSampleCount − 1</tt> entries because the last sample size is
derived from the <tt>mdat</tt>-payload length (see
<xref target="sample-size-derivation"/>). The receiver therefore knows the
length of every list field before parsing its bytes.</t>
      </section>
      <section anchor="cenc-fields-stay-inside-the-header">
        <name>CENC fields stay inside the header</name>
        <t><tt>sencInitializationVector</tt> (9), <tt>sencSubsampleCount</tt> (11),
<tt>sencBytesOfClearData</tt> (13), <tt>sencBytesOfProtectedData</tt> (15), and
<tt>sencPerSampleIVSize</tt> (16) are drawn from the <tt>senc</tt> box inside
<tt>moof.traf</tt>. They are therefore <tt>locmafHeader</tt> fields, <strong>not</strong>
genBox. Only boxes outside <tt>moof</tt> are carried as generic boxes (see
<xref target="genbox"/>). The <tt>saio</tt> and <tt>saiz</tt> boxes are not carried at all;
the receiver recomputes them during canonical reconstruction (see
<xref target="drm"/> and <xref target="canonical"/>).</t>
        <t>The CENC fields apply only to protected tracks. A receiver <bcp14>MUST</bcp14>
reject a chunk that carries any of them (IDs 9, 11, 13, 15, 16) on
a track whose CMAF Header does not signal protection
(<tt>tenc.default_isProtected = 1</tt>): the reconstruction of
<xref target="canonical-cenc"/> is defined only for protected tracks, so
implementations could not otherwise agree on what such a chunk
reconstructs to.</t>
      </section>
      <section anchor="deletion-marker">
        <name>Delta deletion marker</name>
        <t><tt>deltaDeletedLocmafIDs</tt> (ID 27) is a control field used only in a
delta header. It carries the list of field IDs that were present in
the previous chunk of the same group but are absent in the current
one. Its elements are <strong>plain unsigned <tt>vi64</tt> values</strong> — not
zigzag, and
not deltas against any prior deletion list. The list length is
determined by the field's byte-length prefix: the receiver reads
unsigned <tt>vi64</tt> values until the prefix is exhausted. This field
<bcp14>MUST NOT</bcp14>
appear in a full header. Its application is specified in
<xref target="delta-chunk"/>.</t>
      </section>
    </section>
    <section anchor="full-chunk">
      <name>Full Chunk Encoding</name>
      <t>A full <tt>locmafHeader</tt> (element type 2) carries an absolute encoding
of one CMAF chunk's <tt>moof</tt>. Any boxes that preceded the <tt>moof</tt> in
the source chunk (<tt>styp</tt>, <tt>prft</tt>, <tt>emsg</tt>, …) are carried as genBox
elements ahead of the header (see <xref target="genbox"/>); the <tt>mdat</tt> payload
follows the header's property block unchanged.</t>
      <t>In a full header, values are absolute, encoded per <xref target="parity"/>. The
first moof-carrying Object of every MOQT group <bcp14>MUST</bcp14> carry a full
header so a subscriber tuning in at a group boundary has a
complete in-group reference (see <xref target="element-sequence"/>).</t>
      <section anchor="emission-rules">
        <name>Emission rules</name>
        <t>The encoder first derives each sample's <em>effective</em> duration,
flags, and composition-time offset from the source <tt>moof</tt> — the
per-sample <tt>trun</tt> value when present, else the <tt>tfhd</tt> default when
present, else the <tt>trex</tt> default (offsets default to 0) — and emits
fields from those effective values. The encoding is therefore
independent of how the source <tt>moof</tt> happened to distribute values
between per-sample entries and defaults: two decode-equivalent
source <tt>moof</tt>s yield the same emitted fields.</t>
        <dl newline="true">
          <dt><tt>trunSampleCount</tt> (14)</dt>
          <dd>
            <t>always.</t>
          </dd>
          <dt><tt>tfdtBaseMediaDecodeTime</tt> (10)</dt>
          <dd>
            <t>always.</t>
          </dd>
          <dt><tt>tfhdSampleDescriptionIndex</tt> (2)</dt>
          <dd>
            <t>emit iff the effective sample-description index ≠ <tt>trex.default_sample_description_index</tt>.</t>
          </dd>
          <dt><tt>trunSampleDurations</tt> (3)</dt>
          <dd>
            <t>emit iff the effective sample durations are not all equal.</t>
          </dd>
          <dt><tt>tfhdDefaultSampleDuration</tt> (4)</dt>
          <dd>
            <t>emit iff the effective sample durations are all equal AND that value ≠ <tt>trex.default_sample_duration</tt>.</t>
          </dd>
          <dt><tt>trunSampleSizes</tt> (1)</dt>
          <dd>
            <t>emit iff sample sizes are not all equal AND <tt>sample_count &gt; 1</tt>; the list carries <tt>sample_count − 1</tt> values (the first <tt>n − 1</tt> in chunk order).</t>
          </dd>
          <dt><tt>tfhdDefaultSampleSize</tt> (6)</dt>
          <dd>
            <t>emit iff all samples in the chunk share one size AND that size ≠ <tt>trex.default_sample_size</tt> AND <tt>sample_count &gt; 1</tt> (see <xref target="sample-size-derivation"/>).</t>
          </dd>
          <dt><tt>trunSampleFlags</tt> (7)</dt>
          <dd>
            <t>emit iff the effective sample flags are neither all equal, nor equal on all samples but the first.</t>
          </dd>
          <dt><tt>trunFirstSampleFlags</tt> (12)</dt>
          <dd>
            <t>emit iff <tt>sample_count &gt; 1</tt> AND the first sample's effective flags differ from the (equal) effective flags of all other samples.</t>
          </dd>
          <dt><tt>tfhdDefaultSampleFlags</tt> (8)</dt>
          <dd>
            <t>emit iff the effective flags shared by the samples it covers (all samples, or all but the first when <tt>trunFirstSampleFlags</tt> is emitted) ≠ <tt>trex.default_sample_flags</tt>; never emitted together with <tt>trunSampleFlags</tt>.</t>
          </dd>
          <dt><tt>trunSampleCompositionTimeOffsets</tt> (5)</dt>
          <dd>
            <t>emit iff any effective composition-time offset ≠ 0.</t>
          </dd>
          <dt><tt>sencPerSampleIVSize</tt> (16)</dt>
          <dd>
            <t>emit iff <tt>senc</tt> is present AND <tt>per_sample_IV_size ≠ tenc.default_Per_Sample_IV_Size</tt>.</t>
          </dd>
          <dt><tt>sencInitializationVector</tt> (9)</dt>
          <dd>
            <t>emit iff <tt>senc</tt> is present AND <tt>per_sample_IV_size &gt; 0</tt>.</t>
          </dd>
          <dt><tt>sencSubsampleCount</tt> (11), <tt>sencBytesOfClearData</tt> (13), <tt>sencBytesOfProtectedData</tt> (15)</dt>
          <dd>
            <t>emit iff <tt>senc</tt> is present AND the samples carry subsample maps.</t>
          </dd>
        </dl>
        <t>These rules produce the minimal encoding and are part of the
canonical encoding (<xref target="canonical-encoding"/>). An encoder <bcp14>MAY</bcp14>
additionally emit a field whose value matches the applicable
default — strict <tt>cmf2</tt> mode (<xref target="scope"/>) does exactly that for the
four <tt>tfhd</tt> defaults — without affecting the decoded effective
values or the canonical reconstruction (<xref target="canonical"/>).</t>
      </section>
      <section anchor="sample-size-derivation">
        <name>Sample-size derivation</name>
        <t>Let <tt>n = trunSampleCount</tt> and let <tt>P</tt> be the chunk's <tt>mdat</tt>-payload
length (the MOQT object length minus the bytes consumed by all
elements). The receiver <bcp14>MUST</bcp14> derive sample sizes as follows:</t>
        <ul spacing="normal">
          <li>
            <t>If <tt>trunSampleSizes</tt> (ID 1) is present, it carries exactly
<tt>n − 1</tt> values. <tt>sample_size[i] = listed[i]</tt> for <tt>i</tt> in
<tt>[0, n−1)</tt>, and <tt>sample_size[n−1] = P − sum(listed)</tt>. The
receiver <bcp14>MUST NOT</bcp14> consult <tt>tfhdDefaultSampleSize</tt>,
<tt>trex.default_sample_size</tt>, or any other source for sample sizes
in this chunk.</t>
          </li>
          <li>
            <t>Else if <tt>tfhdDefaultSampleSize</tt> (ID 6) is present, all <tt>n</tt>
samples have that size.</t>
          </li>
          <li>
            <t>Else if <tt>n == 1</tt>, the lone sample's size is <tt>P</tt>. The encoder
omits all size fields for a single-sample chunk (see below), so
the payload length is authoritative and
<tt>trex.default_sample_size</tt> is never consulted at <tt>n == 1</tt>.</t>
          </li>
          <li>
            <t>Else if <tt>trex.default_sample_size</tt> is non-zero, all <tt>n</tt> samples
have that size.</t>
          </li>
          <li>
            <t>Else if <tt>P == 0</tt>, all <tt>n</tt> samples have size 0 (e.g. an event
track carrying several zero-size samples per chunk).</t>
          </li>
          <li>
            <t>Else the chunk is malformed and the receiver <bcp14>MUST</bcp14> reject it.</t>
          </li>
        </ul>
        <t>Correspondingly, when <tt>sample_count == 1</tt> both <tt>trunSampleSizes</tt>
and <tt>tfhdDefaultSampleSize</tt> <bcp14>MUST</bcp14> be omitted — the single sample's
size is always <tt>P</tt>. When <tt>sample_count &gt; 1</tt> with uniform sizes the
encoder <bcp14>MUST</bcp14> emit <tt>tfhdDefaultSampleSize</tt> (subject to the
<tt>trex.default_sample_size</tt> equality rule) and <bcp14>MUST NOT</bcp14> emit
<tt>trunSampleSizes</tt>; when sizes vary the encoder <bcp14>MUST</bcp14> emit
<tt>trunSampleSizes</tt> with exactly <tt>n − 1</tt> entries and <bcp14>MUST NOT</bcp14> emit
<tt>tfhdDefaultSampleSize</tt>. The receiver <bcp14>MUST</bcp14> reject a chunk in which
<tt>sum(listed) &gt; P</tt>, a chunk whose default-derived sizes do not
satisfy <tt>n × size = P</tt>, and a chunk with <tt>n == 0</tt> whose <tt>mdat</tt>
payload is not empty. Omitting the last sample size shaves one <tt>vi64</tt>
per chunk; using the default for uniform-size tracks (common for
fixed-bitrate audio, e.g. AC-3) collapses <tt>n − 1</tt> <tt>vi64</tt> values into
one.</t>
      </section>
    </section>
    <section anchor="delta-chunk">
      <name>Delta Chunk Encoding</name>
      <t>A delta <tt>locmafHeader</tt> (element type 3) carries only the
differences between the current chunk's <tt>moof</tt> and the most
recently received full chunk in the same MOQT group. Delta encoding
is additive: a field absent from the delta header is unchanged from
the previous chunk.</t>
      <section anchor="field-value-encoding">
        <name>Field value encoding</name>
        <t>Each emitted field's value is interpreted relative to its kind:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Kind</th>
              <th align="left">Wire encoding</th>
              <th align="left">Reconstruction</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">scalar (even ID)</td>
              <td align="left">zigzag <tt>vi64</tt> (see <xref target="zigzag"/>) of <tt>current − previous</tt></td>
              <td align="left">
                <tt>current = previous + delta</tt></td>
            </tr>
            <tr>
              <td align="left">list (odd ID)</td>
              <td align="left">zigzag <tt>vi64</tt> per element, concatenated; element delta = <tt>current[i] − previous[i]</tt></td>
              <td align="left">element-wise sum with the previous list</td>
            </tr>
            <tr>
              <td align="left">raw bytes (odd ID)</td>
              <td align="left">full new bytes, verbatim</td>
              <td align="left">overwrite the previous bytes</td>
            </tr>
          </tbody>
        </table>
        <t>The "previous value" for each field is its value in the in-group
reference state: the represented fields stored from the previous
LOCMAF chunk in the same group (or, after a mid-group full header,
from that re-anchor) — not the expanded effective values. A field
absent from that state has previous value 0, so a delta header <bcp14>MAY</bcp14>
introduce a field the previous chunk did not carry; the same rule
applies per element to lists that grow (see below).</t>
        <section anchor="list-length-changes">
          <name>List length changes</name>
          <t>The length of each per-sample list in the current chunk is the
chunk's effective <tt>trunSampleCount</tt>: the value established by the
in-group reference, changed only when a delta for ID 14 is present
(absence means unchanged, like any delta field).
This covers <tt>trunSampleDurations</tt> (3),
<tt>trunSampleCompositionTimeOffsets</tt> (5), <tt>trunSampleFlags</tt> (7), and
<tt>sencSubsampleCount</tt> (11). <tt>trunSampleSizes</tt> (1) carries
<tt>trunSampleCount − 1</tt> entries, or none when <tt>trunSampleCount</tt> is 0
(see <xref target="sample-size-derivation"/>). The
per-subsample lists (13, 15) have a total length equal to the sum
of the new <tt>sencSubsampleCount[i]</tt>. Consequently the receiver knows
<tt>len(current)</tt> for every list before parsing its bytes.</t>
          <t>When <tt>len(current) ≠ len(previous)</tt> the delta rule extends as
follows:</t>
          <ul spacing="normal">
            <li>
              <t>For indices <tt>i</tt> in <tt>[0, min(len(current), len(previous)))</tt>: the
wire carries <tt>zigzag(current[i] − previous[i])</tt> and the receiver
reconstructs <tt>current[i] = previous[i] + delta[i]</tt>.</t>
            </li>
            <li>
              <t>For indices <tt>i</tt> in <tt>[len(previous), len(current))</tt> (current
longer): the wire carries <tt>zigzag(current[i])</tt>, the absolute
value, equivalent to treating the missing previous entry as 0.
The receiver reconstructs <tt>current[i] = delta[i]</tt>.</t>
            </li>
            <li>
              <t>For indices <tt>i</tt> in <tt>[len(current), len(previous))</tt> (current
shorter): no bytes are emitted for these positions; the receiver
truncates to <tt>len(current)</tt>.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="bmdt-derivation">
        <name><tt>tfdt</tt> BMDT derivation</name>
        <t>The receiver derives a delta chunk's BMDT as <tt>previous_bmdt</tt>
plus the sum of the previous chunk's <em>effective</em> sample durations
(the per-sample values when present, else <tt>sample_count</tt> times the
applicable default). <tt>tfdtBaseMediaDecodeTime</tt> (ID 10) is a
full-header field: it <bcp14>MUST NOT</bcp14> appear in a delta header, and a
receiver <bcp14>MUST</bcp14> reject a delta header that carries it. The
derivation is safe because CMAF (<xref target="CMAF"/>) requires the decode
timeline to be contiguous: each fragment's <tt>baseMediaDecodeTime</tt>
equals the previous fragment's plus the sum of its sample
durations.</t>
        <t>When the source BMDT diverges from this derivation (a splice, a
capture gap, a stream re-anchor), the encoder <bcp14>MUST</bcp14> emit a full
LOCMAF chunk (<xref target="full-chunk"/>): a timeline discontinuity re-anchors
the entire in-group reference, which is also what a recovering or
late-joining receiver needs at exactly that point.</t>
      </section>
      <section anchor="deletions">
        <name>Deletions</name>
        <t>Because delta encoding is additive, a field that was present in the
previous chunk but is genuinely gone from the current chunk cannot
be signaled by mere absence — absence means "unchanged." The
deletion marker <tt>deltaDeletedLocmafIDs</tt> (ID 27, see
<xref target="deletion-marker"/>) provides that signal: it lists the field IDs
present in the previous chunk that no longer apply. The receiver
<bcp14>MUST</bcp14> apply deletions <strong>before</strong> applying deltas, removing each
listed field from the previous-chunk state so the current chunk
falls back to the appropriate default (<tt>trex</tt>-derived or absent).</t>
        <t>The motivating case is <tt>trunFirstSampleFlags</tt> (ID 12). A SAP-1
random-access chunk emits this field to flag its first sample as a
sync sample; the immediately following non-sync chunk must say
"this override no longer applies" so the receiver falls back to
<tt>trex.default_sample_flags</tt> for the first sample. The second chunk
emits ID 27 with a one-element list containing the value 12. The
typical cost is two bytes — one length-prefixed list of one field
ID — versus the tens to hundreds of bytes of re-anchoring with a
full header. In a one-sample-per-chunk stream the same pattern
rides <tt>tfhdDefaultSampleFlags</tt> (ID 8) instead: the sync chunk
emits ID 8 and the next chunk deletes it, falling back to
<tt>trex.default_sample_flags</tt>.</t>
      </section>
      <section anchor="empty-delta">
        <name>Empty delta</name>
        <t>An empty delta property block (<tt>properties_length == 0</tt>) is valid
and means "no field changed since the previous chunk." This is the
steady-state case for sample-level fragmented streams. The on-wire
object reduces to the delta header element plus the <tt>mdat</tt> payload.</t>
      </section>
    </section>
    <section anchor="drm">
      <name>DRM and Common Encryption</name>
      <t>LOCMAF preserves the per-sample Common Encryption (CENC) <xref target="CENC"/>
metadata that EME-based decryption pipelines require. The track's
key identifier, scheme, pattern parameters, and other static
encryption defaults are carried in the CMAF Header's
<tt>tenc</tt> box (inside <tt>schi</tt> inside <tt>sinf</tt>) and signaled in the
catalog through CMSF <tt>contentProtections</tt> and
<tt>contentProtectionRefIDs</tt> (see <xref target="catalog"/>). The per-sample
material that varies chunk to chunk is carried as <tt>locmafHeader</tt>
fields.</t>
      <section anchor="protection-schemes">
        <name>Protection schemes</name>
        <t>LOCMAF is scheme-agnostic. The packaging carries the per-sample
<tt>senc</tt> metadata — initialization vectors and subsample maps — for
any CENC <xref target="CENC"/> protection scheme; the scheme itself is
identified by <tt>tenc.default_isProtected = 1</tt> and the four-character
<tt>scheme_type</tt> of the surrounding <tt>schm</tt> box, both carried in the
CMAF Header, and the reconstruction of <xref target="canonical-cenc"/> does not
depend on it. Schemes with per-sample initialization vectors
(<tt>cenc</tt>, <tt>cbc1</tt>, <tt>cens</tt>) carry them explicitly in
<tt>sencInitializationVector</tt> (ID 9) on every chunk; LOCMAF defines
no IV derivation or prediction rule.</t>
        <t>One scheme has scheme-specific behavior. Under <tt>cbcs</tt> (AES-128-CBC
subsample pattern encryption), the constant initialization vector
(<tt>tenc.default_constant_IV</tt>) and the pattern
(<tt>default_crypt_byte_block</tt> / <tt>default_skip_byte_block</tt>) travel in
the CMAF Header (<xref target="CENC"/> §10.4). No per-sample IV appears in
<tt>senc</tt>: <tt>per_sample_IV_size</tt> is 0, <tt>sencInitializationVector</tt>
(ID 9) is empty and <tt>sencPerSampleIVSize</tt> (ID 16) is 0 or omitted;
the reconstructed <tt>senc</tt> still sets <tt>flags = 0x000002</tt> and carries
the subsample map.</t>
        <t>In practice, CMAF presentation profiles (<xref target="CMAF"/> Annex A) and the
deployed DRM ecosystem <xref target="DASHIF-ECCP"/> use <tt>cenc</tt> and <tt>cbcs</tt>.</t>
      </section>
      <section anchor="box-handling">
        <name>Box handling</name>
        <table>
          <thead>
            <tr>
              <th align="left">Box</th>
              <th align="left">Where in CMAF</th>
              <th align="left">LOCMAF treatment</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>senc</tt></td>
              <td align="left">inside <tt>traf</tt></td>
              <td align="left">per-sample IVs and subsample maps carried via <tt>locmafHeader</tt> field IDs 9, 11, 13, 15, 16.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>saio</tt></td>
              <td align="left">inside <tt>traf</tt></td>
              <td align="left">not carried; recomputed by the receiver to point at the reconstructed <tt>senc</tt> (see <xref target="canonical"/>).</td>
            </tr>
            <tr>
              <td align="left">
                <tt>saiz</tt></td>
              <td align="left">inside <tt>traf</tt></td>
              <td align="left">not carried; recomputed from the per-sample IV size and subsample counts (see <xref target="canonical"/>).</td>
            </tr>
            <tr>
              <td align="left">
                <tt>tenc</tt></td>
              <td align="left">inside <tt>schi</tt> in <tt>moov</tt></td>
              <td align="left">carried verbatim in the CMAF Header.</td>
            </tr>
          </tbody>
        </table>
        <t>The following DRM boxes are not supported. Sources that require
them <bcp14>MUST</bcp14> use plain CMAF packaging:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Box</th>
              <th align="left">Reason for exclusion</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>sgpd</tt> / <tt>sbgp</tt></td>
              <td align="left">Mid-fragment key rotation via <tt>seig</tt> sample groups is out of scope; KID changes <bcp14>MUST</bcp14> align with fragment boundaries (see <xref target="scope"/>).</td>
            </tr>
            <tr>
              <td align="left">
                <tt>pssh</tt> (per-fragment)</td>
              <td align="left">License-acquisition information is signaled via the CMSF <tt>contentProtections</tt> mechanism (see <xref target="catalog"/>), per <xref target="CMAF"/> §7.4.3.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>subs</tt></td>
              <td align="left">Sub-sample information for image subtitle profiles (e.g. <tt>im1i</tt>) is out of scope.</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="event-only">
      <name>Event-Only Tracks</name>
      <t>DASH-IF Ingest <xref target="DASH-IF-INGEST"/> defines a CMAF-based push
interface for live encoders. One of its track shapes is the sparse
event-only track: a CMAF track that carries no media samples (or
zero-size samples) and exists purely to deliver timed events via
<tt>emsg</tt> boxes attached to its chunks. In LOCMAF, each such <tt>emsg</tt>
box rides verbatim as a genBox element ahead of the chunk's
<tt>locmafHeader</tt> (see <xref target="genbox"/>). Multiple events in one chunk
become multiple genBox elements.</t>
      <t>LOCMAF supports event-only tracks with no further extension. A full
header for an event-only group sets <tt>trunSampleCount = 0</tt>, carries
<tt>tfdtBaseMediaDecodeTime</tt>, is preceded by the chunk's <tt>emsg</tt>
genBoxes, and is followed by an empty <tt>mdat</tt> payload (the receiver
reconstructs an <tt>mdat</tt> box with an 8-byte header only). Two
encoder strategies are valid for subsequent chunks in the same
group:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Full header per chunk.</strong> Every event chunk carries a full
header with <tt>trunSampleCount = 0</tt> and its absolute
<tt>tfdtBaseMediaDecodeTime</tt>, since a zero sample count produces
no derivation increment (<xref target="bmdt-derivation"/>). This costs a few
bytes per chunk and is recommended for sparse event-only
tracks.</t>
        </li>
        <li>
          <t><strong>Synthetic per-chunk sample.</strong> The encoder sets
<tt>trunSampleCount = 1</tt> with a <tt>default_sample_duration</tt> equal to
the intended per-chunk advancement and a zero-size sample. BMDT
derivation then works, and subsequent chunks use delta headers.
This matches how DASH-IF Ingest commonly shapes sparse metadata
tracks (<tt>urim</tt>, <tt>stpp</tt>).</t>
        </li>
      </ol>
      <t>For new MOQT deployments, an MSF <tt>eventtimeline</tt> companion track
<xref target="MSF"/> is the preferred mechanism for event metadata. LOCMAF
event-only tracks are intended for gateways that transit-relay CMAF
Ingest content unchanged across MOQT.</t>
    </section>
    <section anchor="canonical">
      <name>Canonical Reconstruction</name>
      <t>This section defines a deterministic CMAF rebuild. Given the same
effective values (<xref target="effective-values"/>), genBox list, <tt>mdat</tt>
payload, and CMAF Header, every conformant implementation that
follows this section produces <strong>byte-identical</strong> output. That
byte-identical output is the <em>canonical form</em> and is the reference
used for conformance and golden-vector comparison.</t>
      <t>A rawBoxes Object (<xref target="rawboxes"/>) needs no rebuild: its canonical
form is its <tt>boxes</tt> bytes, verbatim. The remainder of this section
applies to moof-carrying Objects.</t>
      <t>Because the canonical form is a function of the effective values
alone, it is invariant to every encoder representation choice:
where the group was split into full and delta chunks, field
ordering, redundant fields such as strict-<tt>cmf2</tt> <tt>tfhd</tt> defaults,
and whether a value traveled as a per-sample list or as a default.
Two LOCMAF encodings decode to the same canonical bytes iff they
carry the same media — which is exactly the comparison an interop
harness needs.</t>
      <t>A decoder <bcp14>MAY</bcp14> emit any functionally-equivalent CMAF that suits its
own pipeline — a different legal box order, a different <tt>tr_flags</tt>
packing, or extra <tt>tfhd</tt> defaults are all acceptable for local
playback. The canonical form is not a constraint on what a decoder
feeds its renderer; it is the single byte-comparable reference an
interop harness regenerates and diffs. A receiver <bcp14>MUST NOT</bcp14> assume
that some other endpoint's reconstructed bytes match its own unless
both produced the canonical form.</t>
      <section anchor="effective-values">
        <name>Effective values</name>
        <t>Decoding a chunk — applying deltas and deletions to the in-group
reference, then the derivations of <xref target="sample-size-derivation"/> and
<xref target="bmdt-derivation"/> — yields the chunk's <em>effective values</em>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>n = trunSampleCount</tt> and the BMDT;</t>
          </li>
          <li>
            <t>the effective sample-description index: field 2 when present,
else <tt>trex.default_sample_description_index</tt>;</t>
          </li>
          <li>
            <t>for each sample <tt>i</tt> in <tt>[0, n)</tt>:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>duration[i]</tt>: field 3's element <tt>i</tt> when present, else field 4
when present, else <tt>trex.default_sample_duration</tt>;</t>
              </li>
              <li>
                <t><tt>size[i]</tt>: per <xref target="sample-size-derivation"/>;</t>
              </li>
              <li>
                <t><tt>flags[i]</tt>: field 7's element <tt>i</tt> when present; else field 12
when present and <tt>i == 0</tt>; else field 8 when present; else
<tt>trex.default_sample_flags</tt>;</t>
              </li>
              <li>
                <t><tt>cto[i]</tt>: field 5's element <tt>i</tt> when present, else 0;</t>
              </li>
              <li>
                <t>when CENC is in use: <tt>IV[i]</tt> (field 9) and the subsample map
(fields 11, 13, 15);</t>
              </li>
            </ul>
          </li>
          <li>
            <t>the ordered genBox list (see <xref target="genbox"/>) and the <tt>mdat</tt> payload
<tt>P</tt>, whose length is the MOQT object length minus the bytes
consumed by all preceding elements.</t>
          </li>
        </ul>
        <t>The effective values are the chunk's meaning: they are what a
frame interface consumes directly (<xref target="consumption"/>), and the only
chunk-derived input to the canonical reconstruction below. The
remaining inputs come from the CMAF Header <tt>moov</tt>: the single
<tt>trak</tt>'s <tt>track_ID</tt>, the <tt>trex</tt> defaults, <tt>mdhd.timescale</tt>, and
(when CENC is in use) the <tt>tenc</tt> defaults.</t>
      </section>
      <section anchor="chunk-box-order">
        <name>Chunk box order</name>
        <t>The reconstructed chunk is the concatenation, in this order:</t>
        <ol spacing="normal" type="1"><li>
            <t>each genBox, wrapped per <xref target="genbox"/>, in payload order;</t>
          </li>
          <li>
            <t>the <tt>moof</tt> box;</t>
          </li>
          <li>
            <t>the <tt>mdat</tt> box.</t>
          </li>
        </ol>
        <t>Inside <tt>moof</tt>, the order is <tt>mfhd</tt> then <tt>traf</tt>. Inside <tt>traf</tt> the
order is <tt>tfhd</tt>, <tt>tfdt</tt>, <tt>trun</tt>, and — when CENC metadata is present
— <tt>saiz</tt>, <tt>saio</tt>, <tt>senc</tt> appended in that order. This <tt>saiz</tt>/<tt>saio</tt>/
<tt>senc</tt> order is fixed by this section (see <xref target="canonical-cenc"/>).</t>
      </section>
      <section anchor="mfhd">
        <name>mfhd</name>
        <t><tt>version=0</tt>, <tt>flags=0</tt>. LOCMAF does not carry
<tt>mfhd.sequence_number</tt> and it is not reconstructable from the LOCMAF
object alone; <tt>mfhd.sequence_number</tt> is not load-bearing for CMAF
chunk decode in playback pipelines. The canonical rule is therefore
<tt>mfhd.sequence_number = 0</tt>. (An implementation that needs the real
sequence number can derive it from the MOQT object identity, but
canonical comparison uses 0.)</t>
      </section>
      <section anchor="canonical-tfhd">
        <name>tfhd</name>
        <t><tt>version=0</tt>. The canonical <tt>tf_flags</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> set <tt>default-base-is-moof</tt> (<tt>0x020000</tt>);</t>
          </li>
          <li>
            <t><bcp14>MUST NOT</bcp14> set <tt>base-data-offset-present</tt> (<tt>0x000001</tt>);</t>
          </li>
        </ul>
        <t>so sample-data offsets are relative to the start of the containing
<tt>moof</tt> (<xref target="ISOBMFF"/>). Each optional default sets its flag and emits
its value iff the effective values call for it — wire presence is
irrelevant, so a strict-<tt>cmf2</tt> encoding (<xref target="scope"/>) canonicalizes
identically to its minimal counterpart:</t>
        <ul spacing="normal">
          <li>
            <t><tt>sample-description-index-present</tt> (<tt>0x000002</tt>) iff the effective
sample-description index ≠
<tt>trex.default_sample_description_index</tt>;</t>
          </li>
          <li>
            <t><tt>default-sample-duration-present</tt> (<tt>0x000008</tt>) iff the effective
durations are all equal AND that value ≠
<tt>trex.default_sample_duration</tt>;</t>
          </li>
          <li>
            <t><tt>default-sample-size-present</tt> (<tt>0x000010</tt>) iff the uniform-size
case of <xref target="canonical-sizes"/> places a size here;</t>
          </li>
          <li>
            <t><tt>default-sample-flags-present</tt> (<tt>0x000020</tt>) iff the effective
flags covered by the default (all samples, or all but the first
when first-sample-flags is used, see <xref target="canonical-trun"/>) are
equal AND ≠ <tt>trex.default_sample_flags</tt>.</t>
          </li>
        </ul>
        <t><tt>tfhd.track_ID</tt> is set to the <tt>track_ID</tt> of the single <tt>trak</tt> in
the CMAF Header's <tt>moov</tt>. The field order in the box is the
standard ISO order: <tt>track_ID</tt>, then each present optional in
flag-bit order.</t>
      </section>
      <section anchor="tfdt">
        <name>tfdt</name>
        <t><tt>version=1</tt> always (64-bit <tt>baseMediaDecodeTime</tt>), <tt>flags=0</tt>. The
value is the absolute BMDT — carried in a full header, or derived
per <xref target="bmdt-derivation"/> for a delta chunk. A fixed
version avoids a magnitude-dependent conditional in the canonical
form, and live decode timelines routinely exceed 32 bits anyway
(2^32 ticks is under 14 hours at a 90 kHz timescale, and
wallclock-anchored timelines are past it from the start); the 4
extra bytes exist only in the reconstructed chunk, not on the wire.</t>
      </section>
      <section anchor="canonical-trun">
        <name>trun</name>
        <t><tt>trun.version = 1</tt> iff any effective composition-time offset is
negative, otherwise <tt>0</tt>.</t>
        <t>The canonical <tt>tr_flags</tt>, set and emitted in this order:</t>
        <ul spacing="normal">
          <li>
            <t><tt>data-offset-present</tt> (<tt>0x000001</tt>) — always set;</t>
          </li>
          <li>
            <t><tt>first-sample-flags-present</tt> (<tt>0x000004</tt>) — set iff <tt>n &gt; 1</tt> and
the first sample's effective flags differ from the (equal)
effective flags of all other samples;</t>
          </li>
          <li>
            <t><tt>sample-duration-present</tt> (<tt>0x000100</tt>) — set iff the effective
durations are not all equal;</t>
          </li>
          <li>
            <t><tt>sample-size-present</tt> (<tt>0x000200</tt>) — set iff per-sample sizes are
used (see <xref target="canonical-sizes"/>);</t>
          </li>
          <li>
            <t><tt>sample-flags-present</tt> (<tt>0x000400</tt>) — set iff the effective flags
are neither all equal nor covered by the first-sample-flags case
above;</t>
          </li>
          <li>
            <t><tt>sample-composition-time-offsets-present</tt> (<tt>0x000800</tt>) — set iff
any effective composition-time offset ≠ 0.</t>
          </li>
        </ul>
        <t>The <tt>trun</tt> field layout is <tt>sample_count</tt>, then <tt>data_offset</tt>, then
(if <tt>first-sample-flags-present</tt>) <tt>first_sample_flags</tt> (the effective
flags of the first sample), then the per-sample records populated
from the effective vectors, each carrying its present fields in ISO
order:
<tt>sample_duration</tt>, <tt>sample_size</tt>, <tt>sample_flags</tt>,
<tt>sample_composition_time_offset</tt>. When <tt>trun.version == 1</tt> the
composition-time offset is a signed 32-bit value; when
<tt>trun.version == 0</tt> it is unsigned (reached only when every offset
is ≥ 0).</t>
        <t>When <tt>n == 0</tt> (an event-only chunk, <xref target="event-only"/>) there are no
effective per-sample values: every conditional <tt>tr_flags</tt> bit above
is clear, no per-sample records are emitted, and no optional <tt>tfhd</tt>
default is present (<xref target="canonical-tfhd"/>).</t>
        <section anchor="canonical-sizes">
          <name>Canonical sample-size layout</name>
          <t>Let <tt>n = trunSampleCount</tt> and <tt>P = len(mdat payload)</tt>.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Uniform sizes</strong> (all <tt>n</tt> samples share a single size <tt>s</tt>; a
single-sample chunk is trivially uniform with <tt>s = P</tt>). Place <tt>s</tt>
in <tt>tfhd.default_sample_size</tt> and set its flag per
<xref target="canonical-tfhd"/> iff <tt>s ≠ trex.default_sample_size</tt>; when <tt>s</tt>
equals <tt>trex.default_sample_size</tt>, omit it from <tt>tfhd</tt> and rely
on <tt>trex</tt>. Emit no per-sample sizes in <tt>trun</tt> and clear
<tt>sample-size-present</tt>. Note that while the wire omits a single
sample's size (<xref target="sample-size-derivation"/>), the canonical CMAF
chunk <bcp14>MUST</bcp14> still carry it whenever it differs from the <tt>trex</tt>
default: ISO BMFF has no rule deriving a sample size from the
<tt>mdat</tt> length, so a chunk without it would not be
decode-equivalent.</t>
            </li>
            <li>
              <t><strong>Varying sizes</strong> (<tt>n &gt; 1</tt>, sizes differ). Emit per-sample sizes
in <tt>trun</tt> and set <tt>sample-size-present</tt>; do <strong>not</strong> set
<tt>tfhd.default_sample_size</tt>. On the wire LOCMAF carries <tt>n − 1</tt>
sizes (field 1); the canonical <tt>trun</tt> reconstructs all <tt>n</tt> with
<tt>sample_size[n−1] = P − sum(first n−1 sizes)</tt>.</t>
            </li>
          </ul>
          <t>Malformed cases the receiver <bcp14>MUST</bcp14> reject:</t>
          <ul spacing="normal">
            <li>
              <t><tt>n &gt; 1</tt> with non-uniform sizes and no per-sample size list;</t>
            </li>
            <li>
              <t><tt>sum(listed sizes) &gt; P</tt>;</t>
            </li>
            <li>
              <t>sizes derived from a default with <tt>n × size ≠ P</tt>;</t>
            </li>
            <li>
              <t><tt>n == 0</tt> with a non-empty <tt>mdat</tt> payload.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="canonical-mdat">
        <name>data_offset and the mdat header</name>
        <t><tt>trun.data_offset = moof_size + 8</tt>: it points at the first byte of
the <tt>mdat</tt> sample data, just past the 8-byte <tt>mdat</tt> header, with
<tt>default-base-is-moof</tt> making offsets relative to the <tt>moof</tt> start.
The <tt>mdat</tt> header is always 8 bytes: <tt>uint32be(8 + len(P)) |
'mdat'</tt>. The ISO <tt>size</tt> escapes 0 and 1 are not allowed here
either: an <tt>mdat</tt> payload that does not fit the 32-bit size
(<tt>len(P) &gt; 0xFFFFFFF7</tt>) cannot be packaged as LOCMAF, and a
receiver <bcp14>MUST</bcp14> reject a chunk that would require it.</t>
      </section>
      <section anchor="canonical-cenc">
        <name>CENC senc / saiz / saio reconstruction</name>
        <t>This section applies when the track is protected
(<tt>tenc.default_isProtected = 1</tt>) and the chunk's effective values
(<xref target="effective-values"/>) include per-sample auxiliary information: a
non-zero <tt>per_sample_IV_size</tt>, an effective subsample map, or
both. Wire presence in the current header is irrelevant — under
delta encoding every CENC field may be inherited from the in-group
reference. The receiver reconstructs <tt>senc</tt>, <tt>saiz</tt>, and <tt>saio</tt>
with the following pinned layouts; <tt>saiz</tt> and <tt>saio</tt> are never
carried on the wire (see <xref target="drm"/>) and are recomputed here.</t>
        <t>When a protected chunk has no per-sample auxiliary information —
<tt>per_sample_IV_size</tt> is 0 and there is no subsample map, as under
<tt>cbcs</tt> full-sample encryption with a constant IV — none of the
three boxes is emitted.</t>
        <t><strong><tt>senc</tt>.</strong> <tt>version=0</tt>. <tt>flags = 0x000002</tt>
(<tt>senc_use_subsamples</tt>) iff the effective subsample map is
present, otherwise <tt>flags = 0</tt>. Layout: <tt>sample_count = n</tt>, then
for each sample <tt>i</tt>:</t>
        <ul spacing="normal">
          <li>
            <t>the <tt>InitializationVector</tt>, <tt>per_sample_IV_size</tt> bytes, taken
from <tt>sencInitializationVector</tt> (field 9);</t>
          </li>
          <li>
            <t>when <tt>flags = 0x000002</tt>: <tt>subsample_count[i]</tt> as <tt>uint16</tt> (from
field 11; 0 for a sample without subsamples), followed by
<tt>subsample_count[i]</tt> pairs of <tt>(BytesOfClearData</tt> as <tt>uint16</tt>,
<tt>BytesOfProtectedData</tt> as <tt>uint32)</tt> drawn from fields 13 and 15,
flattened in chunk order. Every sample carries the
<tt>subsample_count</tt> field when the flag is set.</t>
          </li>
        </ul>
        <t><strong><tt>saiz</tt>.</strong> <tt>version=0</tt>, <tt>flags=0</tt>; with <tt>flags=0</tt> the optional
<tt>aux_info_type</tt> and <tt>aux_info_type_parameter</tt> fields are omitted —
their defaults per <xref target="CENC"/> §7.1 are the track's protection scheme
and 0. For each sample, the auxiliary information size is:</t>
        <artwork><![CDATA[
aux_size[i] = per_sample_IV_size               ; flags = 0
aux_size[i] = per_sample_IV_size
            + 2 + 6 * subsample_count[i]       ; flags = 0x000002
]]></artwork>
        <t>so when the subsample flag is set, a sample with
<tt>subsample_count = 0</tt> still counts its 2-byte <tt>subsample_count</tt>
field, matching the <tt>senc</tt> layout above. An <tt>aux_size[i]</tt> above
255 does not fit the 8-bit <tt>sample_info_size</tt> of <xref target="ISOBMFF"/> and
the receiver <bcp14>MUST</bcp14> reject the chunk. If all <tt>aux_size[i]</tt> are
equal, set <tt>default_sample_info_size</tt> to that common value,
<tt>sample_count = n</tt>, and emit an empty per-sample array. Otherwise
set <tt>default_sample_info_size = 0</tt>, <tt>sample_count = n</tt>, and emit
the <tt>n</tt>-entry <tt>sample_info_size</tt> array.</t>
        <t><strong><tt>saio</tt>.</strong> <tt>version=0</tt>, <tt>flags=0</tt>, <tt>entry_count=1</tt>, with a single
<tt>offset</tt> locating the first byte of the first sample's auxiliary
information in <tt>senc</tt> (the first per-sample IV when
<tt>per_sample_IV_size &gt; 0</tt>). Per
<xref target="ISOBMFF"/>, <tt>saio</tt> offsets in a movie fragment are relative to the
same base as <tt>trun.data_offset</tt> — with <tt>default-base-is-moof</tt>
(<xref target="canonical-tfhd"/>), the first byte of the <tt>moof</tt>. genBoxes
preceding the <tt>moof</tt> therefore do not enter into the offset:</t>
        <artwork><![CDATA[
saio.offset = offset_of_senc_within_moof + 16
]]></artwork>
        <t>where <tt>offset_of_senc_within_moof</tt> is the byte offset of the <tt>senc</tt>
box from the start of the <tt>moof</tt>, and the 16 bytes skip the <tt>senc</tt>
box header (8 bytes), the <tt>FullBox</tt> version and flags (4 bytes),
and the <tt>sample_count</tt> field (4 bytes). The 32-bit offset of
<tt>version=0</tt> always suffices, since the offset points within the
<tt>moof</tt>, whose size is bounded by its own 32-bit box size.</t>
      </section>
      <section anchor="canonical-encoding">
        <name>Canonical encoding</name>
        <t>The encode side has an equally deterministic reference form. A
LOCMAF encoding is <em>canonical</em> when:</t>
        <ul spacing="normal">
          <li>
            <t>every full and delta header emits exactly the fields required by
the emission rules of <xref target="full-chunk"/>, with no redundant fields;</t>
          </li>
          <li>
            <t>every delta header carries exactly the fields whose represented
values changed from the in-group reference state — a list field
counts as changed when its length changes, even when the
surviving prefix is element-wise identical, so canonical encoding
never relies on inherited-list truncation alone — plus
<tt>deltaDeletedLocmafIDs</tt> listing exactly the fields that leave
that state (<xref target="deletions"/>);</t>
          </li>
          <li>
            <t>a full header appears only as the first moof-carrying Object of
each group, immediately after a rawBoxes Object (<xref target="rawboxes"/>),
or where <xref target="bmdt-derivation"/> requires one;</t>
          </li>
          <li>
            <t>field IDs appear in ascending order; and</t>
          </li>
          <li>
            <t>every <tt>vi64</tt> uses its shortest form.</t>
          </li>
        </ul>
        <t>Two canonical encoders given the same CMAF input therefore produce
byte-identical LOCMAF Objects, enabling golden vectors on the
encode side as well as the decode side. Canonical encoding is not
required for interoperability: any conformant encoding decodes to
the same effective values and thus the same canonical CMAF.</t>
      </section>
      <section anchor="implementation-note">
        <name>Implementation note</name>
        <t>Canonical reconstruction requires a normalization pass: an
implementation <bcp14>MUST NOT</bcp14> rely on incidental serializer output (e.g.
box order or <tt>tr_flags</tt> packing produced by a general-purpose ISO
BMFF writer) to match the canonical bytes. Golden vectors compare
the reconstructed genBox and <tt>moof</tt> bytes exactly; the <tt>mdat</tt>
payload is passed through unchanged.</t>
      </section>
    </section>
    <section anchor="consumption">
      <name>Consumption: Chunk and Frame Interfaces</name>
      <t>LOCMAF carries the same elementary encoded samples as LOC
<xref target="LOC"/>: the <tt>mdat</tt> payload is the concatenation of coded samples
in decode order, and the moof-header fields give each sample's
size, decode time, composition-time offset, and (when protected)
its CENC metadata. A receiver therefore has two equally valid
consumption paths, matching the two shapes playback interfaces
come in: those that accept ISO BMFF chunks and those that accept
individual media frames.</t>
      <ul spacing="normal">
        <li>
          <t><strong>Chunk interfaces.</strong> Reconstruct a CMAF chunk per <xref target="canonical"/>
and feed it to an interface that accepts ISO BMFF / CMAF input,
initialized with the CMAF Header (see <xref target="cmaf-header"/>). In the
browser this is Media Source Extensions (MSE): append the chunk
to a <tt>SourceBuffer</tt> whose initialization segment is the CMAF
Header. Native media pipelines built around a fragmented-MP4
demuxer consume the same reconstructed chunks.</t>
        </li>
        <li>
          <t><strong>Frame interfaces.</strong> Slice the <tt>mdat</tt> payload into per-sample
byte ranges using the effective sample values
(<xref target="effective-values"/>) and feed each coded frame to a decoder,
using the decode time, composition-time offset, and sample flags
to set the frame's timestamp, duration, and key/delta type. The
CMAF Header supplies the codec configuration, and for
CENC-protected content the effective per-sample IV and subsample
map supply the decryption parameters. In the browser this is
WebCodecs: each frame becomes an <tt>EncodedVideoChunk</tt> /
<tt>EncodedAudioChunk</tt> fed to a <tt>VideoDecoder</tt> / <tt>AudioDecoder</tt>.
Native decoder APIs that accept individual coded frames work the
same way.</t>
        </li>
      </ul>
      <t>LOCMAF is a media container, not tied to any particular playback
interface; neither path is privileged by this document. Producing
the canonical CMAF chunk is required only for golden-vector
conformance, not for playback.</t>
    </section>
    <section anchor="outside-moqt">
      <name>Use Outside MOQT</name>
      <t>This section is informative. LOCMAF is specified for carriage as
MOQT Object payloads, where the transport supplies the framing:
MOQT gives every Object its length, the subgroup gives in-order
delivery, and the group boundary marks where a full header
re-anchors the delta chain. A LOCMAF Object carries no length of
its own, so any use outside MOQT has to restore that framing. This
section sketches the minimal wrapping; a full specification of
such carriage is out of scope for this document.</t>
      <t>A <em>LOCMAF segment</em> is the self-framed equivalent of one MOQT
group: the concatenation of the group's LOCMAF Objects
(<xref target="object-encoding"/>) in decode order, each prefixed by its
length —</t>
      <artwork><![CDATA[
object_length   vi64
LOCMAF Object   object_length bytes
]]></artwork>
      <t>repeated once per Object. The first moof-carrying Object of a
segment carries a full header, exactly as at a MOQT group boundary,
and delta chunks reference the preceding Object in the same segment
(<xref target="delta-chunk"/>).</t>
      <t>The same framing doubles as a storage format. A LOCMAF segment is
directly a file on disk, and segments concatenate into longer
files that remain parseable, since every Object is length-prefixed
and every full header re-anchors decoding. The CMAF Header is
either stored alongside, as for CMAF initialization and media
segments, or carried in-band as a leading length-prefixed rawBoxes
Object (<xref target="rawboxes"/>) holding the <tt>ftyp</tt> + <tt>moov</tt> bytes verbatim.
The in-band form makes the file self-contained: a reader obtains
the initialization bytes exactly as published and decodes every
subsequent Object against them, just as over MOQT.</t>
      <t>The framing also maps directly onto low-latency HTTP delivery:</t>
      <ul spacing="normal">
        <li>
          <t>In low-latency DASH, a LOCMAF segment is delivered progressively
under chunked transfer encoding, each length-prefixed Object
taking the role a CMAF chunk has today, with the CMAF Header
referenced from the MPD as the initialization segment.</t>
        </li>
        <li>
          <t>In low-latency HLS, each part carries one or more
length-prefixed Objects. A part advertised as independent begins
with an Object carrying a full header, so that a client joining
there has a complete decode anchor — the part-level counterpart
of the mid-group full header of <xref target="element-sequence"/>. Because
the framing is part of the payload rather than of the HTTP
envelope, concatenating the parts of a segment yields the same
bytes as the DASH segment and the same file as stored at rest.</t>
        </li>
      </ul>
      <t>The catalog signaling of <xref target="catalog"/> has no MPD or playlist
counterpart defined here: at minimum the packaging, the
<tt>locmafVersion</tt>, the initialization-data reference, and any
content-protection signaling need manifest-level equivalents, and
the segments need a dedicated media type (such as <tt>video/locmaf</tt>,
<tt>audio/locmaf</tt>, or <tt>application/locmaf</tt>) so that clients do not
mistake them for CMAF. Registration of such media types would
accompany a future specification of this carriage.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>LOCMAF is a compact packaging for CMAF media and introduces no new
authentication or confidentiality mechanism. It is carried as MOQT
<xref target="MOQT"/> Object payloads and inherits QUIC's transport security.
Per-sample encryption metadata defined by <xref target="CENC"/> is preserved
through the LOCMAF round-trip; LOCMAF neither weakens nor
strengthens the underlying DRM scheme.</t>
      <t>A receiver expands attacker-influenceable input (the delta state,
the per-sample lists, the genBox payloads) into ISO BMFF
<xref target="ISOBMFF"/> boxes that are then fed to a media pipeline. A receiver
<bcp14>MUST</bcp14> validate that every reconstructed box is well-formed before
passing it onward, and in particular:</t>
      <ul spacing="normal">
        <li>
          <t>The receiver <bcp14>MUST</bcp14> bound the length of every reconstructed
per-sample and per-subsample list against <tt>trunSampleCount</tt> (and,
for the subsample lists, against the reconstructed
<tt>sencSubsampleCount</tt> totals) before allocating or copying.</t>
        </li>
        <li>
          <t>The receiver <bcp14>MUST</bcp14> verify that the sum of reconstructed
<tt>sencBytesOfClearData</tt> and <tt>sencBytesOfProtectedData</tt> for each
sample with a non-zero subsample count equals that sample's size
(a sample whose subsample count is 0 carries no subsample map and
is unconstrained).</t>
        </li>
        <li>
          <t>The receiver <bcp14>MUST</bcp14> verify that every reconstructed
<tt>BytesOfClearData</tt> value fits in 16 bits and every
<tt>BytesOfProtectedData</tt> value fits in 32 bits — the <tt>senc</tt> field
widths of <xref target="canonical-cenc"/> — and <bcp14>MUST</bcp14> reject the chunk
otherwise.</t>
        </li>
        <li>
          <t>The receiver <bcp14>MUST</bcp14> verify that every sample's reconstructed
auxiliary-information size fits the 8-bit <tt>saiz</tt>
            <tt>sample_info_size</tt> (<xref target="canonical-cenc"/>) and <bcp14>MUST</bcp14> reject the
chunk otherwise.</t>
        </li>
        <li>
          <t>The receiver <bcp14>MUST</bcp14> reject the malformed sample-size cases listed
in <xref target="canonical-sizes"/>.</t>
        </li>
        <li>
          <t>The receiver <bcp14>MUST</bcp14> treat an unknown leading element_type as a
malformed object (see <xref target="element-sequence"/>): unknown top-level
element types are not self-delimiting and <bcp14>MUST NOT</bcp14> be skipped.</t>
        </li>
      </ul>
      <t>Each genBox payload is wrapped into an ISO BMFF box of declared
length <tt>4 + box_size</tt>; the receiver <bcp14>MUST</bcp14> ensure <tt>box_size</tt> is at
least 4, at most <tt>0xFFFFFFFB</tt>, and does not exceed the bytes
actually present in the element, and <bcp14>MUST</bcp14> validate the wrapped box
against the structural rules for its <tt>box_name</tt> before use.</t>
      <t>A rawBoxes element's <tt>boxes</tt> content (<xref target="rawboxes"/>) is likewise
attacker-influenceable and is passed onward verbatim. Before use,
the receiver <bcp14>MUST</bcp14> verify that it parses as a sequence of complete
top-level boxes — each declared <tt>size</tt> at least 8, neither ISO
<tt>size</tt> escape used, and the sizes summing to exactly the Object
bytes that follow the element_type — and <bcp14>MUST</bcp14> validate each box
against the structural rules for its type.</t>
      <t>Replay considerations within a MOQT group are inherited from
<xref target="MOQT"/>; LOCMAF adds no new replay attack surface.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="MOQT">
          <front>
            <title>Media over QUIC Transport</title>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <date day="12" month="May" 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-18"/>
        </reference>
        <reference anchor="CMSF">
          <front>
            <title>CMSF- a CMAF compliant implementation of MOQT Streaming Format</title>
            <author fullname="Will Law" initials="W." surname="Law">
              <organization>Akamai</organization>
            </author>
            <date day="3" month="June" year="2026"/>
            <abstract>
              <t>   This document updates MOQT Streaming Format by defining optional
   syntax and semantics for carrying CMAF-packaged media.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-cmsf-01"/>
        </reference>
        <reference anchor="MSF">
          <front>
            <title>MOQT Streaming Format</title>
            <author fullname="Will Law" initials="W." surname="Law">
              <organization>Akamai</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <date day="2" month="June" year="2026"/>
            <abstract>
              <t>   This document specifies the MOQT Streaming Format, designed to
   operate on Media Over QUIC Transport.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-msf-01"/>
        </reference>
        <reference anchor="LOC">
          <front>
            <title>Low Overhead Media Container</title>
            <author fullname="Mo Zanaty" initials="M." surname="Zanaty">
              <organization>Cisco</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Peter Thatcher" initials="P." surname="Thatcher">
              <organization>Microsoft</organization>
            </author>
            <date day="15" month="March" year="2026"/>
            <abstract>
              <t>   This specification describes a Low Overhead Media Container (LOC)
   format for encoded and encrypted audio and video media data to be
   used primarily for interactive Media over QUIC Transport (MOQT).  It
   may be used in the MOQT Streaming Format (MSF) specification, which
   defines a catalog format for publishers to declare and describe their
   LOC tracks and for subscribers to consume them.  Examples are also
   provided for building media applications using LOC and MOQT.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-loc-02"/>
        </reference>
        <reference anchor="CMAF">
          <front>
            <title>Information technology — Multimedia application format (MPEG-A) — Part 19: Common media application format (CMAF) for segmented media</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="ISO/IEC" value="23000-19:2024"/>
        </reference>
        <reference anchor="ISOBMFF">
          <front>
            <title>Information technology — Coding of audio-visual objects — Part 12: ISO base media file format</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="ISO/IEC" value="14496-12:2024"/>
        </reference>
        <reference anchor="CENC">
          <front>
            <title>Information technology — MPEG systems technologies — Part 7: Common encryption in ISO base media file format files</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="ISO/IEC" value="23001-7:2024"/>
        </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="DASHIF-ECCP" target="https://dashif.org/docs/DASH-IF-ECCP-v1.0.0.pdf">
          <front>
            <title>DASH-IF Implementation Guidelines: Encryption and Content Protection (ECCP)</title>
            <author>
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="DASH-IF-INGEST" target="https://dashif.org/Ingest/">
          <front>
            <title>DASH-IF Live Media Ingest Protocol</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="LOCMAF-REPO" target="https://github.com/Eyevinn/locmaf">
          <front>
            <title>LOCMAF — reference implementation, conformance test vectors, golden files, and worked examples</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 1668?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The initial version of LOCMAF was developed as part of the Master
Thesis work of Hugo Björs at Eyevinn Technology, supervised by
Torbjörn Einarsson.</t>
      <t>The author thanks the Media over QUIC working group, in particular
the authors and contributors to <xref target="MOQT"/>, <xref target="MSF"/>, and <xref target="CMSF"/>,
for the prior art this work builds on.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAI1wSmoAA6W923Ib6bUmeP8/RY4qYgqgAYikVAeTLnezdHBxXCppl+Ry
7HHsFpJAkkwLyMTOTFBiSeXoq47u24mOmNuei2m/QT+A95v4SWZ96/AfEglK
3iOHiySQh/+w/nX81lrT6dR1ZbcqTrJ739dvs+c3RXNd5Mvs0bOzp9ll3WTP
imWZZzV9nv3TH84fZaPvn+O78T2XX1w0xQ1u5E/uuWW9qPI1PWrZ5JfdtCir
vGnbupqu63+drurFOr+cHh65Rd4VV3Vze5KV1WXt2u3Fumzbsq662w3dfP7k
1VNXbdcXRXPilnTtiaOXPHB5U+Qn2dmPr9zbunlz1dTbDb1bhvfchnfPvSlu
6fvlicumGb0XP/Bi/FyVN0XWdvScdVld8Sc05RW9olrcOndTVFt6WZbtfXaW
yRDv/ZFGQI/Ifocr8fk6L1f0Ob3wP5ZFdzmrmyt8nDeLa/r4uus27cn9+7gK
H9E4ZnbZfXxw/6Kp37bFfbr/Pu67Krvr7QXd+eS2uCmr6r6uXrnEtxhx20XP
1atmctusrMP19/fvxey6W6/uOZdvu+u6wYLRs7PscrtayTa+qpuLP//b/2qq
7IndzlfQqPOq/DnvaM9OMn159qpYXFf1qr665YsKWZIOz6ibauZH8B8LHW1b
OFfVzZqec8Pr/uz5P72i/Z8+nsmgsUQ83q7Jq3ZTN9306Gu67tGzl08Hr1us
W6YwehSuGLrEX0FEO3wFLc708Jhfc/b0hOdiJ+Sc6JXHW1dZ56eb/f0///fs
2XbVlWsmmHyzWZULuUquz0bPXjz53fRszJe+yJsuO/r1SfaoXq/pmv138UHj
U9gWV+ui6oqlXH2Ph9UWTVm0OEQyTJrOy+f3z5/QxI4fHB4eTuklx4fHD/lL
PkmZ/knXffvs6afP7lG9BLnXl1m+XZb19KZst/kqqy/+XCy6NprV8QmenV3k
baHzuixXhU7oo6M+evjw119O6SHDo3705IdHn74htOJZe9t2xboN39Gbw2i/
8ltADKC53fBjyuqOGfDv7Set/tH0q8FpuNLGLET/+Ozld+dPp08ePXqhc8ub
q4JOtx3uZd5el8IqiMG293HDVO+Y3hzNDul/m+Vlsi56TXa+3qwKEI4s0e+2
5bJYlVXR0rENU84r4vfEfum67EVT02LxxyO8YXwvncADHTJGcP7D7568fPXR
UZ9XV8Su7g8O8HuwZOGzchkPoF7Uq3tyRukETH988uL58FuU4S3q9f2UUyYv
k8fwvjfFZdHQbhdZmSzNJFvUsi/4Duw1u6FlqJt2kl3Vq2VRydZPeLEggOgo
Fu9yPITowU2n0yy/INmSLzrnXl2XbUabtcXzs3ZTLMpLUJ4OZPQxSesgbsb0
LhrVekOPzOg/b/IrnEFcSWJrqmJLbhdCXeQNkeTSFdVy2tVT+pHlbfas/qfs
lTFQ4kTEZMfZcz659NjbVZ0vaVpvaSWzTdFM5Uy72obHI2jyCzoDXZ1110WW
jp7oJieKalgxGM90jk7G0vINPMTF9bZ6k/E966LLiaDoZDX1miZJh+iKHj9f
1/XlPBut65uycJdNzixvjDnQNet8taIz14EJdfnVFa0/remKx36NE7oq8hss
EN7Y8sY4fslovqaf83G2rbp6u7gulrPs2/odj41O9Dq/zdptQ4Kclgv36jCI
D+QuGjmoZ96S/KcRKjdmbYC2ab5pLjv6eNPUy+2ClsJTmYNMGAvR5NVtJmoN
pjAntnRF9xQ3eNC6aNv8qhhnFzwwvIvUHb+htNgXRKbrSVbki2saJY326ppW
5aqglS8XuC0rhJyzEX9MM6TNeEXzuSwbombd8PrS8SNABaLnZLZTOUv+MPZT
WpaLtvjXLR76XDk9rQqtkaP1LaLbb7O6Wt3y6i3LS72/ldc3xaIob3hR6IjR
CdnSc6KF1W3AdJd0xbKY0ivLm3zFCywU1xIp0xPKarPtJsRAF6vt0rY6Yt2e
rho8oiEKudDz8fjHZyRNmde7wPjG2abcCD/ULaLZVHVFYnhFt3YF6U80Cvzp
otHjVdihkga1wcgqIUoZDM2g+bylIWyaojX24hbXdbnQnQVvKC7prUs+zH3G
QxObCUNZl8slUbH7jHhjx7TFz5LFe/8eP375JTpYRdNm1zkxVBypn6HqkpTD
OvH6MoEfHR7yzNqJo1NDhEATzi4KnLEVeCv9MsnAYfBHg60h1oiZYV403gYb
z3/jrW5ZtIumvDCS7WKFmlcUf1+UxBa7YkL0RC/EaYYOAe4mjytbV1/SLUJE
9GnxNqOnL2UDOxDSIxAZZsJTX9LeLjq6lq0S4m8u8Lf370HatCw0SCLlmsiK
6GXbgL4De8s8e2PiA0nfxdXoqfSDHprf1OWyBVktbERN/pYXZ+F4Nq1w0pw2
ryqJZxnLMtpkBjnJruu3dPKbCda/qmkENgGHxcVAhYWxzoO9ph/0fk/hVVEs
lX7EdGiyJ8+eZPezR4+f0a74I0FvJtqfbkSq0x2RDUQ7Teq38DzlYC+Ug7kf
vZx8JRzM+BUEd/aEmdYzZVpyduZbUi7mysDkSMfsE2xWWEW+qqurlk5WxG2J
4FU2LlZ1yw+gU3KVb2bZeYcDk0cSkEnNS8aF3ypaDBdJQ1zG4yjebVZ12Yks
qomlNTeqMeJbHOtisYU6lonk8udJ9hKCwEQUP964P1hWVeQNEaLnEydMS8Jy
5UHQmWN2S5MBWwAnBb+dxFxWGSI92PE1dFZsmqS3dTg6VzTXlik2IwZzU9bb
Vl8krDkLrHnieF9Y+nlJz6Pe5G1bLL0c2VYLOudXEIwxx455XivCIWbb7bbs
WC0AEUK4bas1mQkklEWncZtVfntBu+a5LAlO5QBGs89egmaJcsfMdS6Jqnmb
nAqznOhFDkIbTj0JBWUdU2jpS5UbkA9d0VzmJHb9i/5YXDzC4WzHJM6Kgk4S
prRd8+n45ZdAd7QtKm2zVH3ilZbFw17yTqo0nPFftEw00RbL8DZvRIdI1auw
wKdBUKqocKo0eOUQe+Yv8sKTaJi+IPnbmYYFthl4XK5E708JzjYREDGazfTi
dko/hMdc4mF4NV9Dz3RynWdAYjxhlp6VlrIK/pLZfg2X9UMZn65BeBm+ixQW
pk7inlNhGbrjrVzH1IYLmO6Vwu1Rcg38SMRLruhsXlX5CpxhRD+uIFeZB0NC
viQJOVYJ5kU7U2cq0IWH4TKoClCnWF5Ou6YkHnS2fVeuShBjR8u5Is69Ekbn
jM6U+zVga0MMLhu9f09zp5t4PHjZQiwuV287fzFrtBkdI3qBSmajSnrJ2+ua
jpssl6mEjh5Mi8gf0qNprP8eG8d91MYRvrG9WJXtNUbTiUw084yP0meQmxAN
9LKWH/IYek7Jf4NmiuxNcYsnEyXfe/aHl6/uTeRn9sNz/v3HJ2T5/PjkMX5/
+d3Z99/7X5xe8fK753/4/nH4Ldz56PmzZ09+eCw306dZ8pG79+zsn+/J1O49
f/Hq/PkPZ9/fE6YZkzKmSQzmohBuQjy248X3qs4S93z76MXf/sfRQ1qD/+3H
p4+Oj45+TcdE/vj66KuH9Mfb60KJig+z/ElbfOvyzYaEBtsXK+zyhtjoCotO
LJXUgirDoabVPPgTVuZfTrLfXCw2Rw9/qx9gwsmHtmbJh7xmu5/s3CyLOPDR
wGv8aiaf91Y6He/ZPyd/27pHH/7mP7BkmB59/R9+60AjLJLoTKT7QgrITfnl
wznxA+JXbK3c5E0J+UPnsbqi4479Ip3V5UG9pjV+//6lujOOZg9nR8bCmV7Z
OqpXpKOyMVE0ayHzbSQcd0Zy4iK15sSdZM8rf8h/RZtdBIlbkn5Xs6Shnb6F
vF6w1kbqIwzPmg4gXe8ytSsn8aeqkk2yn4umhmxcg82rFsanXakLMgCO6ZQx
kWE5u5opWxozcSWLorbD3/761ewB/e+YJT89hs1scAaRRUtSwknJg5QX+SLq
80zXwGx0WwYbZqwmENNqzQgVNs5mSctGSfaSNdHsbEESsKX3v6hLmLC9AR7P
jpmz2fsgkeDMW/C6mnaGhXwG38FTvYxs4Dm4DREHbbvqEadYgHs8kmJ5T4Ya
XAYtO+3pr82qpPEtmrptszV8u1DGZXWasN3RVre2KKoeDq6JTYANaVFb6ALo
LrtTfjj2m1L4WbMcvt2wGNsSZ8XEvnv16gXkJBSFWzyYdXQQx3ffv5xePnvx
8JQeQp+rYBaLWh65qBva4U0N3YLYHggv6Ko2o+/YtsSEcGLml+wE+RWvwo1M
XlRpZvUkgn/m8ynvakghoa1btXWG3SqWWOAqO/DXiiqu4znww9+QXs1yikWl
ysAalO7FG8vE3nPYOGKr/+VTrwBkqilgi8LsJjJToWhM7qx3RjyfSBQavjJW
A5XCTddjY2VYBTrJihLHlSwjbCp0fpog7eCAG6eFl4mEfUHcacyLQJJYjF5m
GaDAqRj9dstEmZlwGNE9Yt2fVezosOzoXrtsQhZnahPg1RDnkizDkP9JrCp1
KoGg4E5HtIGv4m+VE+KwRd622E84glGhuodnj8YShQtOhByUxc2yl6zem5JF
A6X5sZ9Phroz292B2lGFzbUiue9HTq9Jta5Jljih6ABgbuqDmZjZAE2o8ZRB
D2FbMKENG3ZQ4Wjg4sJOT50aoAPbPvjU8zCzjnmIukx1ucVzilU3ihSNe5Rf
tPVq2xVjLIbo3rb5fHBJOc2bN2oV1W1pToawjWq2mG5N7+Qd5YnSI4Zp6ile
bh4AE6xnvWMk52xoBUrvvZQvMH96l/dsVpnNy8/GPHZ93zSmCA8BbgN94pqy
mortHjRrjskFw11WypuFNlUMacoP51k+5qv+f05TXpXMU0zJNva9Jo4C1ilw
5CrwD7Upl7Jg6q7PBpwIkSBQKuV3RxP69tnjVzwFRgKUPniZzbvLZTeDdc5B
jccs6eBJYkNIo48wV2A08Hs4kp7dt0V4Rloydun9Z2v57RfPhvOW7Hc1NYP2
ppdJSEFETy0BZeemLIgjH8yGFjWW1TN9/QVsvlxoBpak2JFk9i7rNciftRSi
e9JRSJZEjzV7356rJP/Eu9r1gl3hoGR6a+7sEe+KHb5xTJp97h78LcxHY1aP
wZ3ByxrNujXFgWiAvcR+o5fbRrZO+dYNmaO1xuPtXl4JcRnDiqG/aZhkJa23
7wqSLLTYRcV64p9Zg+u2VTEtK4zjJYnythBNoA1OYDo9HJ+bZBwCYeHk3Zt2
MTxhmTDlVfmmEOcPD96mZLED9mLE1j9Pwh86VUbDAVYHGokhrPweDxrLYNej
e9KmSZnRTZQIAMQHuISocl4VM++h00OUelWutjlRVldA+OA+ZkpsK5rT8YDW
iG89OHF5Zn94tmYxGeJkkF7qXsQu0knnaSnVnT92MrI6cmWKD9iCZ1j1qyY3
A6ji6+EQPHNm9DcZm5/B59Syh4zIIBqIp+4wGmcv1PGL3WKmLIwt8bvoCMyP
BomzSRmu6a9MHHFwi5mlP0a9UJeMhN+HQEfM9swggUMR3JwN/AbEi+dg8B0t
/FXMG3B2WnU/s44QhqjEotx6agqesLk/XhdYfO/QWxYdrxkTsC0g1p6xUPR2
TwXyenZ6u6uc19Tva6s6HUJNPghlC/15q5ssUaeO1wB+FMaa3O7KLzkkp7iU
HshM1tQDESRV8a5zu+tHQzBdy4aWeqXikyWHgYctD2Vz0MaON3jj47Ps5aLe
iAnwwlPhjxLcEyX5/WctLgnSQRACwsd2wuQLEkgn8LI0Xc8ec9jPGnY/LEWO
NcdG7MgCVGYnMqvnL8cTF9n4ngg5bjMQmySyrbM3RbFhvSwENTRcNOmJNdGj
cggc2TUsC4lMWpK8qxtxKpD1Zj42r0z0Tm1RtVt4tojaSCAezbKDg5cadafH
v5nzfMSgmx0c8NGKTD8LsrRmhABewU4KuZn2eSYIqCkfzqDys0PRH75lweIC
d18ID9HRmlY2c8cY2g81OwrPH2ej358/hhCE9zwciUjG0mB/X9xqoJZkIUwC
8VTLksi7I2nufQgj9fgqN5PN5KF5LQA8poTUWNc3qnEg8CYqTnu1Wc5JY5m3
F1cbC3yVjJCTmIFuLe3YORhjW2+bBYRrzfg9O1pC+G0hO9/bNmWQRtwpCkRC
l7zenqNC54OuAK66WdGWaSjGDyYOM4QLlKdmz87+mfa6eFe2XXJmzdW+5Ti8
F5KACbb0bOF9CK7IdarZfUZnlc7VGjHypc1/09B5bTpa3b4DDtyvsRty2T1R
hmXNcIwWpMq2EhXOLradW9b0C2Q/KaD5G52cUfgjflQL7cb8V8BjtKQD0d4S
5Ty6rvH46GPIAgRmmcIlPM38vhLKNydjUJnEz/bw6+zw8JB3hX59893P2dnZ
owme8eWh/+ZL+uXw/tHh4VF2SaoLKyhjpfiXEkqj81S8g5PzMqfT1Ap1F6zY
6ldgCLQ77KoW75TYd8bq1/m7cs0emLdi3nIQoV6XXcfxe9KOWSrGqAHZq+fK
xSwyxWGImKXY5yAS7CFWlYjk4IBeXdLazBfry+M533ZwAAtZ9cWShOjqLUJk
xdrCsJdEDLASrpdhtkREwlttcScMY5i4y1WOmI98OxVHvIH1lsU7L15YMsUT
Y9WSfe+OldZ13tF4ZCX1bAtBkUFFB4Lux3EU6gJDVMlPdOajdKlpG8sIP99o
faHvu7ZYXU7Z2cd7LOqQaJOBG+F1iQsQTkCY8WA4HKO7KDTSBX2bHoL4Dklu
OwA52X4cDl9vaPEuylXZ3dI93duCZq9b12pITf6Ywfva2zgecQWv9bSsfIyS
HpILk6GvDw7odUSYaUwNth578tl53sO1nLr04h6YJnE5+atoHYRecpcSSoio
8AKw0dsKaevWcihKWdZLHx18/5mxJ68tCFNASF5X1hxRA95DJRiLAzjSVFj1
x9RytczmntHOs5t8tS36LkV+IMshuPGq4i2cRM3tJLE9aM2qQvm7H0W+pHfN
78EzdG9OHO5D9gOuzbIP2U94U8a/BtwG/+0+TPWf/yX5Vf6mZ+l6fMjm4nya
069pjPeDc0/YqhGJw8OOVsskROJU0wChkNHSyWqznCIaXOUct95ZMnYn3ZNh
3KNjeibGp7O5i6AMV0RSsYesigfWOlCNRMXxncg+2eeek1i83APPdzI+ixTr
Uv1E1EdUrE418diyLCvebQRzQzbrurwCv3QkP+qwp7Ue4qa4Ak9vmJjWp0Aq
liv8XomxLeA4npjT6OCrvYF2rMKNjInJzoPU4Ds2p9fLp16mz/XieY/AheKg
5fGOa3RJ73I82UkcPrPw9XTpg77gAT4eTO/WpWbqfcqr5f95co4++b5WPPwH
U/qX8sX/8fL5D9mrWzINIgrfR9530H78V3QKdEHCafBbTIciDO+R6d3E0T4w
L6Vl4FPn+vd59TRBSATCtTfK/jiNmpx3XnNWMKFwvfjIlG1MqqYHspUX3cZR
wrdlWwhx2+sMt6EupZi78XMPZw/4BAaz1Wul3lwWOE5smovStrsGkbBqtxsA
SU5lPiIchBpr4eYeZKpaoyiecOSu6JxUjJ6PwS6wbkktIRmEowAm5FQV1rNC
wraq31ZTOaTNdlUIQW5I0e9ucfwBCWxB9CU/vLiBwxh4S2926LKd7pCFSA/S
SIvrnHTVJl+pySL2vWsKDybIWLkWAx8+lFsyrN5NVHOI/AOKCxQ3gWPhhmXi
m0RBAczEOEFsqzEcK/Bx2ZII3qTeQ1LbaH0PDogrY6xluw58aQsInj4nesoJ
NmCOsw1nzfc0j7nIARfF5PxQYzlB7+T7SDzNva2ABCXR09hesEOxyhdMJboV
fLyIjFlV4TMiBDM4jjkQ2XIMrtWZyVR0uaJlV50IaB2ZlKefE3XzQ4Fx0GS+
fMjYbou4LiRLBO6DCdRBhrv1BsDXG5Om+ZpYqZuwriDRC1GRZsGDiFt4wnig
bFN+VTgiT2g/RLQ4gQxT1IhhaX7PZHcUwWwb7/QsNuoY92uhJwpj4W3zIGt8
6Sc1d7yiEWANoFRRWvsCR1UwOFt/fJZoUxazzIfIaWKkyOLIL1JT150Km7li
pEJSSkub2zT5bTZAca5PcTt3E/mdP27nfbGlyShOrze0LLttGIr1/n2UpfPL
L2HvwM9MH1ZHpoNOgTwyoEqbYmo5Uv6Yne6FrdP4adYtOJcBwgbMDcV3yCFa
NmtGfb1SdzaxeC/YhdWxjS6wJralTUGKSBSEY8t/6i6K29o0nB3drCdrBtQg
0wwMpajIdaHwZGggGKUHBqomHKu1w7Iu34n27Gl0xxnhes4IuDvj+DFb2rQ/
bEb3jr76vxmS7pjv+XGwyxUCNXKKwBcQSSCPSPS+V3hL5ISJFRIx5scWFyBD
JOJ9+zh4IlLLtpeQYKeW3Tt6X65abcIVooHZ0X9bb1dLRWNzWgsjOlwcX1Js
x0iTBMz9N1/fwAnBBozYWuzNnzD2OoDM9SAl6Kf5pm2vEacXQHeAdERH2d3A
RWOjTa2wIKaUmezs5Civ3JBUiHlFLIjGE6UJniS8Pv3bVZzE+omHup5GMiOL
ZIbblRl8PBvm25VFjqb6oEXqZ+VVaVSq6yYo7cfXsRqmuxIDQyKHrFMOIf5x
dsh5T45pGeIo+7Fo65X5N5loPm8jcU2EBjk0uLLAD8MVfCHk0R+mKioeDdHc
4smyqEsS5/CD4v6RrJ84SdgVWNnK8l3iJXtq6HB9rg5MMOSGAfdY80j0kFRl
kmefXh3OSYRQcg9m2ZN3nL5nkG84/9gm89lE9MKIHyfOH0k2EEdc7Ffn+eIN
r88fA7myXl4vZ97biE9Sj9/ElhQahthdSW5qSHcdzRHYCHeeePfI788fs+vR
/o6ySc5/EpeaxBVysgzOf5pkLVH/mnFlhQTnNnkHHoeHhHWQ5GWv3smCL+P9
ZjqHu1Y8H23BMEpeFIxB+FHP99OCCIL72Pt+aMsfzrJvyTCuWqVXEEbqUVD/
jY8/Vhb/UqiuxgJUN0rSGdhJF8Ww/Lz60fkQUneP6jUMqshSS6h9xPobJPnY
FHp1v2LN4fubgDkAUYogE4e2QljzBGQqmS7iIffWenryRC/LEk23Wq6CYp+y
zfuJjwNPmmKEQesXl4hpBepd+Mx0vCem473/rI/bifhJQDd0abaEjzanoe/a
o5RcjL+KcDExdD5G5/RTQV0vFRTHJkpBUqBZ9DQP9HdRuoqCJ8z9zGE6HvHe
1A73Cakd2V2pHW4gtSPjbBniMrhanPJPFPrjdX924Jak58CT/f6znWDz7q7Y
SLv8jeHciK7e1ll7nW+KJI5uXCyNp/N1lrkI57BgAxIE44HBFg88TMUpPSJB
LkWnkNj5y1/+4v6kearZvxyoTyXBOtPeTTEQQzsTw+7xDh5IgpaTx0QC8cQC
/h7Oxo8U1cthVDw+W6NMseTf8Par7g6AOeKzW5VjBtDML+qbgmfC0rrlQKyu
Fh9kpf1d5CFtX1WFBFagBF26Nj6e7v/tgBJtXQyT2Iu5h4GF9/uxccphUFKC
aUd0dc0qmmDgXAR9a2+rBd5hgCwAYfy7zWoFLcTAb2eAQzqyzPq8ZaNEGmW8
TBR8t7qccuSNfu/qhk1hvY/PJA1B/0a5jo7GYaldCYjyvFLs2w4pT2KzRehm
rrDGt6yn4QjouNvSJz0PoRpPJFiYzYWS5xbWLuHzqTjiop8McCA7FeWaxVgH
eJMcnjYagpzPSJvkk0h6pGxpvKQ6Zj2pLbJ/bl1vnqmSj/efhtHTXRuyWaE1
qRuMFpJBbEa5FyKQJccVsT/94jXEERnBkqVBuhrie/qdw3dt7MRmB3B8J/yn
t+uLehU7gOnDZ0VeqVf1zn8f2Lhal51MLP3OfTiJnb4nuw7iQa/xvn93XQkn
8lE6ML+48YeM11LsNPic7hxAxHGiGF2pLqBsTp+8hh5hcQbMKzvuvUv2Gmha
2+8Pwv4irhdAvt58HcvtrOaH+PxrYYZzWcPsweC7GF6nL/uwy2KhFCkHkQzW
cfYp73rYe5exw3n0oWeId/NBujKIbeR2krKJNDolvzHc9a92sPI+hEUHLSFU
0jcMTlVKjJ0NR7FIGhQ9qrL8slOURHr42ATzcp9hkSHvUWJpq7reTOianJWu
5M1ytCQG1Yrldn6pYRcI7+RiVR2DYjZ/qIGzCIkaWythhX0diXQZjWlhhFjG
FkklvRE+hEJ6K0wUblIZGL2KNDZYLsWSDbk/ssslkqWvzdk6P5qzL1/Xhi1a
Oz+jpR1xBuncCgn5YzFRIRAOjyVZkuQmNQcW3h8t2rDz3uM5NIT5g+T1acZF
bzMnPb0CaTRwGt6AfYax6kD5/l1yt0HHQHF1x6WY0xke8MqbvrH/klQYOWtk
a3rT4YLG+mZiTiJQfX1pyKQo7WWijsE++YPtR16FHg5dIFUhjbEnZBVS/tze
ANhAiGQxDeWBXlMBmQ7iLOw+zzOSjjamlLgEUYTFvGmnsi9LDreIwpi6pher
bSvbJZqqS6cpxDECacBKk2R9ohD+S9DZZDvh9Nv90cKG5IgUxynnNmjc6cpZ
cYpLVSsiyLp4fKSAQkSMEauf3IljtQFEALf9UFYZIZsq5r62WjlsEatVVXqQ
mIyRAVwpELTtsRE+/68iGwnOVcA8QuQill65hFp6a4oxpMsqRqzUD+nscgYH
ZYeInqzLpUohbCPuF3WXRG9OBlwtEcdPTfTw9wtXOWN2D57BrqvBrVH9MQqi
El3SdjIvEx0zFpPqFmGeS8LA0LdvY4hT7qFf6WixYIE/DIhpv6dazCfLDHH7
cCaJUgmUF8B7hI4FZNxbqGi0p/YwxvAOEnZCLR+naHMLJfTzRa+skC2mWMTq
Aho6yRIvlYyZEMcuK4TA7mFd74kTKKUeMPh7PMvka942vuIK+6OlcojYSMRX
6Xtj94ougID92H5Ua8xAYiw1OKLNh7kfDm7flBuuARHpERph5toeVbatYKZc
VSQSl241pEcIit9Tle5yHvFR9ZbxPMvuVECy6r02rZVHAnLTwHqUgGwajeBJ
3DU8J5d5udrKQzDJC0YPcjzZZ7FV0aa25YoBKw6v2eiI8ophDBL3IdOwXmok
Y52/EfkBr0ZkpTlLiLLKKhNsBE2ckdUejSYVzsoWTtW+D/IJQF7s8LuGwGMf
txRNwWn00onVEASg5mz5PHokSDu6xoSKKO3nj33kzoAH4la9qCVJWdyGB8RJ
D/okoXZfl4zA5zLCxEIiXS2gx24qjiYJpekrwxd47a7ABTN2JKLZDcOKxmnK
uBIPKvZuvenMjJSYw9dT3GfnD69SJPB3qQqxym/hB33/mVw5lb/Ze9UzWL06
2kuMKsUlxD4gdZokZK7/oDTzL9+QscTP4NTGB6yi0XPcjlIW38ST0Y9VpU5V
LJf+Ke/cfaRobfSEEdPB63I5ES85bcOW087ZWzOPZ6BR0QEbCXJWyyGINSCJ
4r2hqDf2cpV3savOzXfGMNdBpFhFj4xR3KdB/4dGJPND3RNmXLssGNVqYnoG
AEK1cXq0DlVYEamx/bxmH/NxaeD+TnV3r67relRvp2Mgb4f4bJxvqUDE3f39
5pvscB7bjHLcDQQ0mEYm5+KFTcGjKUay8IxRGtMJ0X0Q3ba/x4IUyPuHRhJi
P33nZwrHA3/apS6p9mPefRuBRo0YRSXV0f721+PZA3HdC1oggiQ6IJmatUEP
NMRWhiiHMchZCFJuW+/H50udvhKm5RXgWlXr/SOBv+6UdNHVF3Ai6UrsMewM
VwmOahMIGysCR75252c/nE0No8lmxjQ7OEARNKSogC0jmpc3ljkjk49dwLqe
7DarkFqpdIMEt/IdKSVVmsBssaAocXlbtZzdiFxPftqp2F4JfVoI6efy6uf8
yl6rBC4fwjWceVSAJEzKM+KU4V1NeMaTfr5c2pxlClOZgi/Vp0vAZMWWtZFc
9sEJP7Uz80HuUAenB8jlXRReE75SwnyGj5qfNdNpTVcAZGgmO8kllBWvoDV3
nJAf6klxqC+H1bCzmLZCWoxNgAvvOoVS4ZXmw8w+sqZS0IOz6OQZs+xH+N0h
QGSM9IjRvKWlPE9KVvzEJZjIRKBl/fXYymlucjq2hqMIxZ64jAfrCvoWyPwX
co7sRBzAeU5kd8ARxa6A4z3SJK9rsiLyRi1M3ieDsiNqWbCKRRIS54KhyapN
tr1TCokzvGlC/rZ1YeOgXcWHEHylKWx5aPWQQV6ESKzt1pSIkXfnvqww/hY7
rMdlWKHmfO856SjVSw7nPeLEPrYbkYD+/PISVgxtIK33F+OTKJxDp1220x8x
i2QPbfbBAfaByL1fqkw2BhH4i2KRAxW2CEPgTCOAXNmU4kozQoiA7WDQcw/O
PcIp0woE6v4XIJPAEMXL9u1Uq056HTh6GUoua01Vfi2imTyIiuvA0w5D08XB
3k+XvE6/pnVSkkS0TAqI+uq0WXC99qkzG4Eo3xJ9FuYrUY415tfyr2SbosjW
9yzBgM/jdx5/NT7R/WZVFo9s6lXGp15iS1m6eQLq6B9tLxhsAHqOWSpk4mgr
MOEpQkCKRXWv3tZGl5ym4KGoXEBBwKiCCIn8Y2/IIjxxXPvg28HSBzSto8Ox
us5a8VcY67ECrpLoGyXkkj6EOgvM2CWNCsniKOCgZHmxXnZT/iyXqoZsUkjx
x7sXeGcksTBpU3e1lNKko7atGBWT+5XdtXBjIDmbm2q3tsobBHYV6QCMx8bM
2eOrG8e+DLZm3PnjCdlYQXjMvR+Ur6mDVPKZkB7ynhE51A0xK2LJP8CF4jUF
oDM6nwB6wdsMQUY2E8L9U8ulQt5I3jqot4JA6MWhpfgRv0UyODQQ0Ep5pQWZ
0CR+Cm9Kao5MZVld+SWckPKApcGN8B62MQMGU/ldCmyneQvqseR0bxrStpGy
WHE1hN5aa9zSid5y35BCsjSW8Kj6DdceYmHBR68WWJdc6/Ra2QAu0WVE4T0s
6iju3pYLzhfEFpsS6ViNPY3lE98nzocYCyP6Lq9cU9ADGe5DSknQW+FJjJzS
cBs2kjSw9E/XdOCuXkn6Il3lrPjCqfkk20xL4LFfUlXKUFSBrw8wkuBHCBp8
5EWI6tyMw9aWnWj//6fwIrY3iwC1UUGD83fwc7jkwHRKlRiSimpYqFz9Pwn7
AwiDpbRVRwfrr4orga+Kj0L/MNRWLR4lRtkQTyTh322X/mv4piVxGe/J6sVi
u7lVSI5/t1wr9We7a8VNcNo9SsuF8702l4Wf1JcPpxdlSLOdV+o7tfIuivnz
b1KBnVbbzuY/wwQyrwCvzwkpcNk32ajKfvOb7Gic/Sf8+tvfZl8+GGcZESAd
jes1yYFF1pRX12Q3XZeXncs+/o/IxtcrX92efNotWUYvJ5tRR3WcHWTVp9/5
m8zfOeVbs2l25JyI+hNcQRP9GbPjiU7p9/8dv/67B/szMwN9Mv11Pzv+9FuJ
N5xkcitG8iuMBA/w+BSJhKDqt+5ye5Id/v2//PfDSTY9op9Hkww/junPY/r5
YJLhx0P68wH9/GKS4ceXE2L//1N5oh0JoQMQUMXtOrg23Z6TcurzYtmZKu4x
oVS2BrhkRgA+ishijdPK4epJNVJFeBjtNm4lJbasfC3nC7TCufUjkgrxguxU
j1uS49xqsTGF52k/mNXlVAHAXMHIp7Sy0ZzaKnp0WWMUFSw+pzzQBvnhtMPA
cQ+Umt41B4UBXmr9cH0eBIT7ZN17QFsUS927RhmJ+Dv1OEtQYqS9DYhLaqTX
xWFCdVKo2W3OaoVVS1IAizJfig4AHzcAoukXpAvtH3bq0DkpQRe6PIibmrvI
4DW3m2ImVUJtlOYUU4eRixHcehuqa/GED8THcyADm3UN50uo48KeCA/OeQUJ
Txxsu8olLYJrkAhMiBV8DLnNy591qPi9nktFeHUkzfnx5sMrG+mgEcH1kTzF
CzSN/dqtWrbzseD5Qehb6MdE1z1daWQjkLd77FZkGFoAHKktM/ccqulerBM7
q8IisFD9lp227FBOaCO4Ij/iOfbu3+jfN2SPGe05Ax3IV0OX+5q0wfVrIQLi
gFYR0H/E/x7qtfE/TDUmJA0vfAL3HX0Oav188jmIlH6AZukHSPXzSTabzcYe
wyr//KT+/l//rzAW9sLQy9UV0WZ/PH9F2tErC/Z95J/GA2wKirvc6+wOIKcB
H3f0rSRrclWBKPTicXU6sbkHtGolRlHLl77qiicJXLcum6bmHF6tT2c2do6h
f966efxuVkMkrhhqedM5sA3Ti2PD0bHtFFyWusaavRXiYDwyTvQUbib2iZsf
wWVmm/TB09PoITBOOuVRuovjuXnvYWPe9lzwjAH0iwotPFriVcG1RXKMs2xd
AFlkUgYgqaIpHM9b42j2IJ564Zt6Ap1tEOJ0sb3LOmJ7nav9pKmICgwM7sJ6
eTt3CuHUKIN+KVYHR3gznR7WWTHZAdxkXU8QSeTA6A1LBUaVTGL/vT63D14Q
pJgnL5U2yfng9ZC4pC4BLgnnwIVzAGbIa/0rhfOPAZzkNEnfTEPU36Mv+X6S
NC2sIZwXeNaiwlnxGE4SFDpbPJxVK8GP8IjcfHrQv46+DKzKz3CnpKyTI4S1
wxsZKs9Mlyt4qmOI1k/8cy6wZvNdiH/z0l+dRpe5oo1ESPy95p2GrVJn8aeF
pE+y22aWvWALQGxMjLQHf18XeRW2i6s6VYJjN5cFv9YqcTjvsQOMVvOm/RmF
6DiFg5JfuPNoBA2GHx8iSr2IDWevd1JUEcXILkpvu/NiRSsZ50LqJPsZj7kL
kG7t7RJUpAouVqsbu4PYDIWbgtQmuk9Tn2KxpE287Pk9rAvyj4l1hiPDJQg7
1C9rlj25IOCo7wvSa74ngfuQzoXnR8T+v58LLV8K7ujBMToLtScJ2+LUKcZV
zA/fPZV/384TlJgXE0MuB8PIaR1doJWewAtgm6sHd74lC/XB8UUx+n6csmKZ
fyV4P520MPiu7vKVUQgmIwETIIj6h54Yg1cNvvkmE6E9Hye8IAsHmcEoHz3L
4i7kxRmbVAjSJcvY3QGpEOPRA5Q1mn0eWE+YowEUA761aNjEx6ltiuBl6SmE
ZVTBSqmCM13pXpknKMh8XUGwIoFu470Sh9mIS1BbSZ7aYsCoPyezPXIjdS7M
ubmVYqmN98dVabWzz01I4SELNncp/l9zVyK2VhYi20mXR3NMlsJ6Vh8c482m
QWgY66xKeTScZQaFS2CPkryoziNzv8gCaOkuXVwr0ROf9QjjY6xQUxOY1flk
LfZquZ1shdMYJ7InUyGLMhXcQJYEE7wM6WAORHj6VqHrytIjnP6BN6pCD9lm
ZRF6IthjJWMTUFIfdmUzt/GI0t/9lmcjM2Q1K1cDWm99lo4p4OOJM1vIRz3A
fX3QemrVmA0F0M4sP6hTM0DQOolNFXH3FsXVqhNLZTOrx8XGabhZkuBBdnw4
+jgkS0QM8AsGh0qO7ZKLi0VJyaFOTcMlrWQZ2Ar/MX9rFrhpU7DBvXbEltYu
iPyTyqtrL51kPaN66sH9wQ7+odrqcelZZzXQ/6jau6eMeDC9rIvQsyd3fZx3
PjSxptBCJRHWJbTbUoNjdWtZnTxkYVk+vhmX+JY6E1o2jdsC8cmP60wwwtUH
NViPohP3thaPz7ruEP8BKPdE8Ann1fSCO7tGCboHB3ATxClW/lxlA4lVmLth
CPuw0Ot6pdnY1hBCq/nfzE0PFDxyx1ENnUnUyiJ2YYlU9uXWk5YOmlrh2zEZ
EEkACT/5DDTmNDYdzPRMP5MakrrZvFgWJ+Hs87uT0rilU1z4H2gUBBqnVje9
bjtpnwpAG+3gwliGtGvSKgyo+xVlncfVQQdcFrv09nG425AbgrWocGDdRZpT
mHO/T6/Qi8X/0UTDQfOdIxOW/TW/kMH7UggGzlCUgHADdxc3iLmzQjh8O0vW
itlv97aKGMVkKK9y1+YX+hW0Mm5uGdwgYcrtmnUHdcdptEnvh+q+uzFu12gU
6gnle3xmt6gKLGaiDCQr9GOVk0PbD2/lGhJbns+Ao+3GWyXAuE1cbWkI2Vzw
bj5UKggdUM/gwd899vyGyIye9Iop+K86TqP2rSUSVB1z5KHC3KINB1XO/eOq
XKaqnBtQ5cZROXi2XE8il29ZedrkMmlijd6ptGW7SpugXuU5rpeAQof5ZbS5
WbK5e852nBrDDovezb3+Mzs5V3E+jqZcDel96qB2w6FWX1U8qtvq8QFiBigA
2wYwlCwQnYZgEOKPVKY6s+bThB+UIpE6X7HAIRIQVmopJSifLc6/XtxvS6rP
RXm1RVNM6RLaF/MLjsFUTI65ixMVEcmO/fAaM5hE8+AeRhrXdftR42o6sCK8
4PrX8Hf1SwVJ0aIQXFCLjKv2rizPwghh2dSCn4hZjFAbZ3ZMJV+EMzQYtdHb
lv2pG4tr4m4IT4QiG46mf0fGSpquEnJPoiSQkAHSRwHvdFjo1eVXTu4EgLcH
FDCU05Lkh+WuvwAmn7mwTIfc9irKjolyTjRpgaN7TGcRdoBxTA3DkU4EhMPV
z6KEHSlCq5xBnIBmtkX5QUKPWgeE1zmAqvjo9YMmQlBB+WO1fY+j5rqfqO49
AfkOWbCTXUYbxHuA++bo2oXdDhgH8Lk+vZ/gJFcIX/pgZinV6stCmc5gsgU8
mKwRsZlPy5SjPh9bG4LqCMVs338W4kMabW2LuHiwaqL7oe1mLxli2qXZm/uS
DpL8iuyYJ/OAszb3dHrQEjhAjSg2Io8qk1kyIhMKc7CdtJkps3W6XzHK3jVw
wYrUJQeTDdOzBn5C4J48tB4gMnJAx0CrpPBl3E8de82VuQNms3i3KDgO3Xpg
tgFNO5up64O+evBqum8ftDqgqmVOgFobrq3Mqzx43SM03pLouAp21IVW3pcI
ZoiSav+dlgsLONWCpBweE7WYHurKDlUZJDnL95cp1tCrRHnon0sBGHGIgytU
myMDCMDwB1Cd6hWUKKklgMaIe++J4xWLmlKf9LcPCltIHgL2ulUNR9BcXJB1
L3yLv3SC1wpzhqLUdn4w18UqxPYFezqVUku6C20tBdXF15HFLbJxmIcmGCrX
Sd1618PNqrEfldHpEbMV+g7lC2hDUrGhj9rFxbPKPJhpPZSW8QHr5itSfMh+
T/q/Vho+6RfUlioMH4QABPXwOIA3zpEiiCIMujVS20CvfiyoO71Ja973Lv5y
8OKXrJEmF349eOFTVM7vXXl0KJfuAamm1/KlHs+B9/LjmJSkKERygc0iveiL
9KJ9qJAPMYyEtuz/4Zu/Sm/2M/JPPzq2K55C971j4g/74yDbpXfNr3HJfjD0
hyCq5ZFHdv3L7UWbPjUM8IFdBDO/fX75aEVKNRdZTS77onfZC6unuHvpl3bp
i6KRyZz/NEAUx7x4ezDA/nkOS/2Sl34QDv9xMLxjGM8wEH4n31GNJAlUcWsH
DQpy/ALPUMOL3+fc7uYDPvTVeLKf3nHB19Jm2+2hDMZiH4+1WYN/v/dG6BgQ
sJ3Lxr6+lDuFLcVt7LK//fXr2dezB7Oj8UmYhYF1TdcwHiWqbejVt8uuJgKL
gl9YQJyMKojukHNixSP8TsjKMs8xhYC3WIwG7bcSVQOME2hG4NNHEyg3X0yy
ryZE2uOwLrYGfyr/ZXbgKcEkcNlYZVEAlzL/FjsSggtLXkSvOfoifQHNbBbe
4m/+05+TV65QmlCB5tZ9ii0GKUmkUTY1k1in9PWNt2uOWO2eVnrf3NU34vS2
RsCzjydFWOxqx7+VVFy0DKQ5ffpaSen8J0VZSFYjI8vTir7O7XIqptmH4p5R
Z5IVeC97CWRC+0Hp7QvEpIWGpSmKGSrlEILK4GQxVQ9JqaeVZny7Qw3ZV5wy
2QVMnlcoeTN2ZAvPMaqfKAC5/gsY3XIkVUihUlqmDesyKC6iYxR3DqI+kjHh
dUZxPEzNWWVwD9HrtdEMbk7zKnqlB4LOhhR4oYWQLBwpXdYZgq81Q7C0RkZy
bBmsZ+pVl99mURVohU25uyjy12CIQ5JoRCd54vbIn9HRA7tvWOqM6JgqIx2U
N6OjL8dDSrlouqo3c/wq0cxfmX0Q1rBfqEwrOmp5bW07DE/FDh4wwgJGMbWo
N3FIwfXVgbTLh0AgDQ35s7XxMsvFP469iacucYp4nKOaCcttkxYW6EMfNQsY
B1wxjmmxASkEHdGBgI5FIa6zUF/ZOiD2GjM47yERzpj0YmFg6qWMlHnwr8Hj
J8qK6f+0jzUU6qiHQ1LeNDRv4BI6WaiS7qQW7UzTSF6XrSci4CbnKhX7xtOl
i/MkFvQEVCgNWeg8b+7V0ps4PHEOIV7mMdopbMHeljRIll8hvxBFeBjqy51H
ZW1iSw4exsiX1kcWZe8/66eI0Un8SGJVKYV1JGVNjj8b7pZoZRleoY9v3K9Z
M20uIxNKgABFU0Qsn8lxg867cHiqNIzKffv2VZLDdtFGLrjFtmk4+CA1UdpU
8Ts4GE6mEyl8cGC1KJzoHsIgJA0swY6D6DZNKW4WWVRMTQ5fpJsMJ4jz7D/X
yudJxrQnKDuJ+bJ1w4MNzXR8IASO3muSF1yFgJ1JksxkrhYX17bqtZVWx5YC
BOCH8j1UaEN2WyQrMu4Rb05UTTeyQ+GwFYxXygET51N2PL6zn7XTsFqArH/e
elzG2WBVXCtCqXh3EdKix2kT9n2N1//+n//neIDdEn92gYy4YK+So+EdeyXa
EnCJgaJ3i3ztFDYLVXel0GdP9dGNV6LndZr4nBBptGbWiGBW7uwie3ctLiko
pfP7lAJcvepbzlscAy71OypTSHVgbhZLdAi/UBvnvlggSBQfLXctagGt5kHB
zeLom4PQbM/a7Ame2Zvo0yhjOYh3pZOo4iiUn0g7tGRmNoJY0VS+RTuxUk2t
19aN+/QNXRVXSEcrVkmetg9IMh6OfQiFW8aZraHDhSTzM45LpiQ9swIWLuqZ
hf2/VhdqOmepByQ5wHDr0o7jPMrTnTbei/Vl01XFQrai7QgNaY52SM1yyava
7JbFgOfrBtTz8KL3J0gVRdn7b+7Ruhf3fhmyHsh0cCdqOLB9sTdP+eiwf+V+
39boGNcybo0MVIla+bXe17Ix+/t/+x+ysV5pUMsouvQ1XzpPTaHIwzR68NE3
e+pu46iw2IU2sT1uuNHDf/Tp/snZ2Q+PhdMK+e+frL0tnaOZQkfJCCKTZmA2
/E7zVHCiQfZbUr1Ogzph0iO9SA0p8+10HkM6r+y71NIeD66bGgNfJiOOrGmv
dkjDbUD9pZsyDDS/XJK4sG+1xGIenqexyv2m26Aj6auP77F4qAQRqs2wbc0R
2W50+dFaPZoulC6/lvbuAS/UUXp6BiYmi2O74ll4GKcMULxDgUGPeFjjnetq
2RZJ2DBXx9CO2gi/vmOJ5JG8m15p8xveWabMKFoY6VcOlHu8QNrWbniNytYY
3ng/bYhv7lQjpcYgu/pK6plYw5p0//tOlj3Jil+kRE26VFiBfYISA0UxwP1G
c7rtbCyXwZ/DVL7rMOLnJrYWPfv1S38NP372MUfBv+/Vv80O/aMHfQz7fNyf
5GP4+Jhi4hLlKzgY1/lGYbatZOa2htwWpKU0V48qxWgIMsqg+UcS+VPs9tk/
u6Q+iGK4xXbTBtYsB7j9sFp4akVcrApnigwHqXY78o5CDx+xwRN4mkbp3GBD
ZTzRIx+EZhUcZ91bPCU7y+/XoN9eJ8aO08I785nrZoHrkpWzhx07x0keSAnf
UVPYa41vX8wNExXMmdhpZ642lllx6V39PHRskHgNprFdC6OiffKWSt+rp/1p
m0gGqMy1usstI2zP97svI9LletImeq2EXhZJV5/dGEm5P5X/QksDqV0s4ZyW
flclW2l0758OSfLQ7UfjkMkb7uVvcP8LfgXNeSRPGitCPxto58mLQzS4R7Kj
mtF+mSxM3Sc+q/LKaerR+knxqigVitbwCZT88nJviBPL+WW6nBAe8wo5L8YM
2AXt9YfksRXSZ440J4mzA70AVdcw6CypSAxEsLSdXikc0IwJrVPB3bt1Ymon
p5BNhTH3fMvwCG3pKJLd6Ytv3LmqnEjG4kw3R/yQNqd0+e58CMkmlPT0a2cr
R6+/Y+1eSFXDnbvkHl6ZQ1IzZlczgxsge0q8h6HhBiZAXATvF/5gT4Edzss3
9m8NCuIn52tJJZVHKLPTbmou0IJqPaJPJMoUL5oE1naOrdRK2kODhlCrValQ
Y9fiGUZQzghKIzNMV3/cHQcrdayPbKuS4VStVVdzRZwOxGJk78Eg2cfzl+CW
u4MCDFilBSV9gSRLN9q1PLQtr4zrJm/SrkZ+cAMmC8/L5FPgcbHp23/34PyG
WHLPuW0wVVJIAoej1X3BGRsx8l9XZWpBIJnXspa6y3QY20se7L/930LV38gz
OEyrz2H1sdIyn5ZPwIkedsq1qQ5jg2fZc9CKydqdgFSLE9RGta6cPwynUW0s
X5WJqywzrcgRsqq+WhUONTu4BCMi1lLWCN0sJxmfzbNH0wdjYiGrFelIMP/8
rqRuUnQmd9JR2BzhO07L2LkJr+Ugdi51Wz4YR2k32voqRLIRuRNHSeST7rkv
/flf123H4GVuZa7EsYxLosfw0uCvm+l0vKu0DG2eT7yipu7xqL9dXFezDS7H
gN1LXe+aB80PS6FL1kMndtt83obqK76MIlf/Wol40EpHUlPOGQgp+yOnANqW
fOjhP0M/9H6Xmt026c5DRUaKFUMq60eqXCJma9sEMrIlAJzEf/FNWJlfyTrO
GY7CboiRYM9237WJK/5G9TyXpwEGzXvyjX8T9KR4FKwr+c5CU44BIewfSqDZ
uDyUJuB5ooExSaH4moJyfWbah8zXM0yfZ5AgdsHe8x/zFt+T1GyQgJBa2Ua1
8JRmzfvreoBqi3So/uO9fpZX5enV3ml1gHZPhHiXRzXAAYLn7/VF8OhrfShn
v2iDhHFUfrzQnnWx/eD1WC0B59LzBAWDEdJweqfLkx1qplhy4mBV+d7B/pAO
BLyW5dKHam9Pw2wZKikg5DamLRwsgS7wqGj2b2MFjk/xZ9n3UWxK4RGyt1F8
HxvaR9OUA5zMw0SUrYU123HSJsWTWyBRy/Y6FF8YKsNkXCkgOmwlQXWMGIn0
ZzdKixZ4rjbhPg+sxevdWPCxgsHVk7PXDzv5REfKZADKN/oqBhgMeRZmQ4bW
0fhT0SETKWdbFZGbKTE5aYKH7qMORKmxvoNrauHfEDQTK8YfgSA5jYhxacdh
KNIse2TN3juFwnpNiIEmbk4PHymNjedRWSumwTtwJqKPxnezRwkf2LEazyPx
x3BxS8XKrfy62L8oWkAyqYQUF9tULFOyu0fxGybp48djoXKXSY0b75YWaTDa
z9rH8x1TQGzZEMiPBcM38b0miHh99w0+GacM2yZB77bfUb27piPTKKzhI7PQ
ihA+EolyuTjfk6gUH9NHo40pxGHV8t55XldIu+UWTsVenYU7FuDTprxvo5Ip
S/XGRpI9tK9zE4WixG9E8taOfq93BJuGWxbqnNGVkrDoToKbl2q3iRupX+HW
p7nICliQ0xhfUjY35z5zMqfXeBBp2ysrSSmQwF2p0ouR9sM9AsiMeH+osNeP
cybG35zLP4s0CA5AU/SZz32sdjD3bWPwQFyA7cR32Ioqrg7gSu9KAEzlb4Id
KgWx4aJNAfIhvyw88o51jhHaDp89TUqdBm+jw+S5Nzftv2SzdJKsd6LaUZNz
djhU/4uBRXDMTNt0v6Kb+vsKzifL7/zWGROMArpCb1iQqwBqLduYBEd51mK7
UPbQLfINcsezq3wz4QR3OrnrSFOaDJvLhhVI9LNRmpEwhj3ilwkJd9K/js13
36vKyfM5vXlIJbCSD5LAxdgnqVl8w1VCkHpNRkYx/XMt6S+eHqQcBOo8xy7m
DV3WeYBUIQHPAIpC7YdvlQqWiaGVRYbWJNLhgGTKE+wqgwdSvQ4BopJhJVta
ixXq21dR8YRUw5Jiyu6iCP3dSGVaFwZ7Wkh16VT3uRdQJPeUvFPg190gL8sC
260fjtjDDZcNUM8ahsRH1BTPKDnGpcvQV2/5CcgtZ5EjiMDUO+Is/Xd161FW
LcrTsxpwcCBf+UzFFu0l1zWnLuLUOXGd6IB2zAktIiXKu6ajJ2vvpLWvta7W
2EZTbxqu5u9hGwLj8E4YOFPZQjDcoxawEARlK67ZO6H7MDVenr2YHrmG2Fq9
nuaLBWrWyYALTVA3cBfGhiCh5LhFsVSuBuu4ubF8IHJrt9SNVU/mS+Ul6y0/
5tbd4xfhfKFcRG+/iIPes6XzRy1ZtWH3neYbWB5WPGihAO04LdsgE2bK1Pa8
cDBZ/wqFAISUt2BnHElHPnTp1QxN6dkJZIoIeivM3u/4YShFPphs9GkRdhgL
yoo77plVZzTGZQPughI4lpHqWZqv6pDkSmhfFExD1fJQ1Uy5rjf3NsgLaCon
5To+khliJdRFgQsbGhbxa69qci6zmprMCaQiAvaPUwc/voOG1ULVAK2L56sI
CMPsodtG+zoMsfinXSuX7LFWNtZrNwQHZ7UoBpgJsznfycfxEtxq6jifuRCy
0ZxUE67cixsL3lpryCnUXldbern0udfznygSRoBeOO90GiWx8uMzXu9H4tB8
Ui2a243qfoBL++LGzCvRmDzrKWC7d44ApB6TRYefv/zi1kWXczVb5qhPnj2Z
QsUAFMvfsik3LHhb0160cBvcrZ+37k1xGxVImmgDpImRHgwuosSOK2thNhoN
Q7hnAde+vcaHZ2MEpXL/CHCNiqOdB9GPLL+V3srKu/5VVpdzcep7yafylFTt
fFXjpEu7uEfPXj4l+0DKC73w4O12Lsb3zhc/FirtxDDWx3nofFh8t0YDxBJm
rmCeWGdU8VUHH0hc7ypxGTsPZJOGWDoAXeDW7z50Tv5oml9VxKXKhQ7Fiukk
GOpogAoo8CTADZzTKkM3DI+QEEWKK7Diig6+EUbnG01FEHgdmPqfpE0VsZJi
dQlos6caKbl6J1jeMx5E9InZEVHRd42by1O13I7BvEkSA07KtQzogrXWDJWy
2glpuYi0JrEhnWLyswFMviH/ncAigXWCRfBStkcYd3QWh1fWjeYLrUG9uFgc
8U+SDfMoCWwNvyJp2WXHIPk7USySgFVX6vjQ4InVy5KaAI444/lPsR7PyQQk
12W28G4Q0aE0t24ZvJNKYlYJjiyV65yYKEmjP3AZIQwfx+Lsycvp0fHX00ff
PnKBYowZhPOu9gCvc8563sDy9FMo7OrX5z/NQ+9tE3Kjub8OL3nNnVFYdsyz
+5n/El1X4u/GYGVg6wr2jrM7Rp6o//bXo8PZQzrlP9RpIpuvBmNbMz8ZTmqD
P21yR/qcC+lzIgUFwzCIlIKuJwgAbsWqQVifiRPVudBDLkVUGSE8F3waSc53
h/h3PNdiFOI2lAMUHXUBk29w4NjUCyLHCszQgb/kii7e0s3OKtIQsjO/STgk
q/qWBgSpRiNsb0nQrulcPT57+d350+mTR49e0H0wl+REyPSZqkK9QxLlyxXH
jj7w3x+0nJ0VEPtgtM5+I5awFvv5aOhHgj+6Xh/S2u8oJZ1kLw5xRF8BsdyJ
/oWMlZ38olkmr+WUq93XRvlWp3EN+YueCxSZULBIM21gO0gFXmhFUCX/+p//
kdcHiyg5CxyITZdGy3vvf3XXW3AT5VY270NY2KihVu+kzizKFKwSEFqat4by
YPDXLYlLs5OjtXAO6zWOmS3bjSDDobp0J4HwfizyVsLM1jQ9CjQOEFcgsKvN
khlSe3G1wfSelcupqZQZ1CmSfMoFQUltUV4ZzMQKcJStFcphENxp9nviCJaw
KpYv+hxppWR7tuZYlCFd3SB0uhWbtr0mKuE6J3oTAn/fl5BJpF8saJ2s/nMl
rTn6DeQxZNmbfXrVusBAy3a9q0NNNA9Fmcjf/vrV7OHsgZEokRSW6+X2IsjU
MAhsRLnOr5h7dSQsi4gvccx/Xq6PSrEW4sVj0vkM9durbsp5lK8ESfD+s6g1
sHNgVNPzp2R9XaEqiHAu+mB6/sPvnrx8BY1Ai+5IiwzVpDfb9lpaAl7miv/i
3hLWVkmaYKhfTnBCXMzdtxZtEbIoXL9/8Yl14pB7Es8kSXgpTGKwohHJ0h2w
kTDn4h17XzZbFObktI1iJRylBMyIX9tiW53kOdmZ6rp8cS2JHlw3Rjq/wzYV
FmzlCZFeKHdyXcG0cKQ0DtOiwWYTJTlS6nh2fThFL2dqlj0j2V5yRomMWHtq
iQV7Ac5FbNquSd/Yhj4xyiLagXbR2qY0u9w2bML4zmUc3Y3ynaIWbfoE8UWK
9O1H5QRNFoJ2e1zdEw1XSoqacn8PCZH1lVkVamiVBsxUcGevMbXv85vEI/q9
rEMXa/VEVNlQM2tUXPU4rZbhNlelcl62zMWIphMsATwllzgQ73iRpNj5wcHT
qOurhwGhfKm2WbiJvZya/yebkGVxW+Lh9Zb1wQxD+Gl/lGGiroNcWoDHcs3w
1AANSoH/EAogVVfLZQ01I9QUS7iVeOjFWzxCfEB+wraPLHjXBWMLeCGZJUQU
xgXaJf0ZxdkPDl7eVrSwaNwVOYfESaa9aP1uEVXK9HcWyiB5eaQ891J0fCTX
SsSD01WaUajvzZc3Oa2fnG3Gj/VZ0YyjDXhEtIAdAhJv6+aN0vMu9QTfuu/N
yOXWGScpoHJkqfUYt+DD6FQqm9XFNDM4LGU2mm+bcs1debrNZj7WtmwIUjOO
SnRarehAJ4NFHm+KBSvmUtmt4vngoe79e7pKMrrVFXVZNICsBLF4ad3q/Zis
yNiOENAiUrbmuPOKzp5WVIUq2OTEo7opAFS3LC+cXwbpohsQXFKBiqfG/qdH
Hu3eg1O9/yyocXvqziFuJonLqO22yLQM+MW2RLnQ35U3RXTy+3AZnBj/2VQ+
Y+1A2TY8rJMe1FBoJLHm1QauRUmAjZkkx/MCRXm10SzsVCNegCxrX6WLzg6p
DqQC4/jS3em3+p3t7UFaIPAgai8Q4lKOE+C1xLUMdCEq9FW9ogdPxRKOKgTO
hkpZpi1ZQgVzXfKTtGAht1UzwJWVfu2huiycktQJDmvkQUQk/4dShCFTv43q
j/SKJUordqK9uEVynw4ct66ZaKHgsoIPLRdcgOyt8bBewdPFdU0a64mTRkV4
sghghNcQsOROivVOZSZmKhP12Vtnhgm7cUltrnxRIKmY0GpWylSzUnpZJlKs
0zpH5xpVEE+DNtvbgUnVjXyuz5hxv11VTEKhVO20Z+AZrpfqF1f7S0tO2q0L
JZz4OlEKOf/FgqEhplnEVSitImi9cdd5UyGCZOU1z6wlIHdnkRhudes3E8k+
UdKu6qhSaUIKJ0uFanMra0laQ78CX3alHUGsp2j0JUkpjR84GGW8QWyB0cru
JPpY+ilCYBspYMjqd40jQObdLcIUQue75Ml5pOKfavJSWlBp0Fjn7y75lGFS
2tamOY0K20eV/6RnbsMjCEjGvHK6xpmtcVNwfRaGgzBl0sR3K5oInKFF3o4U
xG+h3Gq3qWrJfoDP28GCpywXfa+tbYV+VlKnzHp6DJxWDdX0uTTZR30mTVZS
YclkcRXfNNZqh06DskrJu1hPrRUpwRPTC1pxx+5DpGn1wh2Fi8dxKwc4Vp0P
+kznQFql783Cws3QVk7pqpRp7UvrPlH3z3GKhOFG3W3xqQnfeJ9HzCrXiAFm
1XiOzqVoH67KGSBO9u4Hn/taJnzXACZHLnzI7euGIDt3pmqfyqs1TYteK4b8
vl3Sy/kkx8P86o5hnsbDPDreGac4DEuJCSYXfz3wHL79rqRZGSHJ3nh8X3x8
GQ/lTv6G4yIsuqCrnmTz858YjC0FeeHsNYpKXIk8tpFKm+AtHBvJMV8MzXYE
QN4ziEPbv7SOSIYUnIlma4QkrO6TsgW5sUOSL6gmKcMmgjH9akCYW10rf/IQ
p4VLjSUVfyvs1XEp/iy4TPSVyOZG23ASVki35A83ak2F0A1bQ/wKD6ooKyhl
ymX2pnAy0Nma9VjzB74VVto6AtnEAQLxUZ5EDB8x7/zN/HM29Um+vD5/rFjH
tGRHyxrs9XLG4DcaUCHpNW40QDpjfQC7Su0BWiFNcEEmLodqXcd467TtxMQn
H1oLDbK+mcMIbU24z9TGF4gx8tptknQKu1PozerKn6KJV0SCF9y/9TyqSKwL
IwWDAW1ZswDvFJDMNdHOE480Qgnhci0vbJWFragwaEGUHFtIH+OMMN/SuzZu
uzoxPzkXMVlakDDX1nZqsss99+WW+xZF9YMSEAg7aCKLou/+1iCiZgpj2s7N
ARChi7+BQ0h4I/0622l3w0qd47WaWfGb19V2fQHHmHg2TIGJ6EDUH6NhtSf1
tLOefZrteaQ+C3s9vSjyRmpoN2JNGgbEKh6bWhVgA30Fi9HTaQ/Pofeyo2aW
jc6qIbtNLRwxpUibs5szvZleZ9nKZZS+FLM4Mdu62wlAdW6wFju3xTmcjXmT
QGyx6TvFB78k29afKhGmihNWKqSbCrK4LfkOLuJp2U7lzIzmh+8OjxGTmzOv
97oe38PXgoinUk1hqoSs9+HfEe5zbe1VEZC8VQbKue1LyKNiltVFzTIDDsrp
IY7LuY61cHi9ES3fY9j44YwfA5AsVBuKknl2SmSoSFhAgrDjvtOsfF/JbcEV
KsuGRlzc5JCu2jcptrnikgS+GoBffk6v9sa5OLcxKKt7wB68okG1A9H5dhW4
KeteAyt9jDhCf1o++3q4tM++vOZhXc/TiD1SVa2BwXy9ZzCfXohn79CCfrc7
ItbqdkZzdBiNJk7QhPIAOFUPTcF5p0CNSOOwXGKI4A1D7+TTtPvS48M9S6CV
lIFBDG5zj778aAkWpyom/5GMgZMf21BuOGILJIS0XSJUfL/iH6nSYuVmZl5r
kHZgXnMJ6oTHuYiFKQrHAHxBk0VvktL6KqjErNK+m4J7i7qPijbQ12Aqze5S
fdtzAnoz5sCloUVSKsNcdhF7BIhHksB9y8khOPs4kX1Qx3xGaBcljAg+HUwj
KeebVLyrLQli6UR92bUKpXxB5ACSVD0S4U7HneU3dQn8N2nmV1XZbZc43lYI
DVDT0i9DqmGyl22iBadvCu+4Ud8wd2/rBMWN8r80BW3eCn8KLZQbHf8n+oS4
1xshN/bDHT3Mrutt00rxvF8fZm+++znzOqSokG+JkBcAtyiQFFa9f6tUeAGa
Na5cB0GglQcfOnGniMeA44O+QucutED7A3OJ0dCkWymAjkIqMnE2tL7QzBaY
Aw2fXkSIxEJVXOUCnw9VTedch6cvf81bNOGTZMKpixoQm+ILXvMx4RrXmKaL
mEHtsoaBex/qvTz+Sy7B8VtFtWldjH9fISswmE8oZXUaS7d9cuQIakcyyrvl
SVJoLX7DoFw43nl65P301dvoJewP31GXVUqM4/cML/bDu6chq0TvGaxdxqXL
etJigPdDjjltqRyPqE+ySky7g/y6P0g87R8qofXq2leTFL4ufRKzslfKzjdc
AXG/lodY35URCprcQb9j/bYHvR+ldOHJrk/G48h/F2022EdDDHVTb7ZIuFk6
T9WRgijwyEnUicCyNk38qH+EzjHaEegxnvcVl0lSBij6U/mCC6vlF/w1FtzW
ysqVpCyLeRbjifdyKVZluPJu3LlBqoj0OSAHpcVs8/V6R00hCIuQwyxRD3kD
6jX8/b/9v9nh2Gew2oNGKfpAOfT79xGc5Zex2F96kqMQ3E7+3kkIpHlRFxgr
BJYcBAxogfpm3NpuYMOjzMiJNa73OoTY8r7qV1TlLCk3xjbXL5aPHiKUEeux
kxDLHWEfHyuwheI+nO0Jf4W5NzgNEz1V/xAXpjk4EO0xrgAk9Rt9yx8eyxx1
YxBTHqqQBJUG7dLYOLG6N4JaaLneCtlcL6AW4zFSKEpUxMGKNhwjB+WZKbbh
/NLd1dNqclI1b1+BnFOrFjQ3Jba9u9YVl6lTjUIDMRgRUEUoHlWp+0s7x6cU
Ivy/tLZQgkcFKcEuGZIqgOF2WqLp7XW5KrziYWWqzBuXBZnKGzK6I5l90vMQ
Wi9b3iwx3hlGa/0xeYm4FhXaf2ojplDrn+cLsSkLdhJ6uQJQjeDsdlWEjnmG
1tLyWvoYbh/M7jNxyaodHCrwMNPXbugsky9YVPeL52pf4FwLUBkNqyIysfI/
PImxblJ/h4wE/R6xX2Jof05RSEh7FOAqti/3US73WfT7Z4mgljpuhXn4DGGM
6jw/Um010fYwsBTCpGeU+21kiSwYKgkn4ou/kLfx6X/mi25B8JvXaTdb2CJH
oZgVMuPSglbK93pLyz580SR82SYdABdvwle6Q3HPDh8q9rWYrFoTzrbcFgo0
CZQHQxoCgonGHmkJocIQuKFiqmKmis+9Mh/f+A0jAqQ+5q+yr+ec5MlRydbg
ybLQDCSrL13kJLakcnrcJPszMgnZVsEVCjzTC83I453d41Bb5284s1c9YH3v
l3q52PaZiUYVPzsqW/a1GENkEW9pFg+OL4rR1zQ1yIoX43H2wX2OGz+f97v4
andzwPSlRW+vCy/7OZxooScR3s5c68zgvOP3spSFUH2CnSqjuQwChUjfPZV/
X3H6SCXMQMHLgjkwaOadGe9Rim3arLPsoqYs8NFl9zM4w+VH3Y+oxLTC7u4e
VsgQJG9NSRQkK4t+zf35aA8NT6S7ZWQUQzKMJcqkvWOi7uTbd+WqRGG3CFdM
u+KsVOBgXgcjv6IgcBzIgwuCo+szqVAVXJtpQZxAb8HhydYBm/yulz8u6ljo
iEJvusVGlxVRUZmg83dj6rO7ymS0moqkURFrAFPPna8VFfD1m7LitnSsbbWn
lkMQblITC7BS89FEHoK0s5OvPRvlGOBsmG6bR+1OhD5Vhn5s/7CMbm8+jpFP
U0iUo799uXpdnKY3cVUCvSDKXVTW6pOZzn/SulCC7IYY767RdEWbcvrazTS9
gwNtf0mSMgkl7Obp0GnApa/JRH7tB9oOeT7TecBl4oPUkcfEvwBBJt7Gk355
yMw36RzAHrC8Y0Y6mNA0uaO5Fz00f1OgbqsojHfktFmsHMJMdNKdhTmR7IBo
5BxmR0ol+PXRl3gM6tNlBh84OqXN19qlMh/TpcLCkj4YAahZexh4ySYnUcYV
4Ea7RZ6jEXCx2OFKz3bVg+PxPO4YZQiAByI8vpiIQ3uw1dtMkdFmYISUz4GB
m8/Ac16pAcBOLSVJnOUeSUaO2VNVOOxvCeOqLefmdBJf4wxqWiazhOSz1z4r
2Fpa8eGPiolCJyibgOXSxBBLxvtqduQBBZqJvJt3yhC8wxnX+IlIVysPDXIL
LVdKlP2Xv/zFYcyh8vBA9e/032nmKfOjt7r4xl9lx/T/L7ODbJfCdp+tVM8j
dFzKxMC0/tBH+zlJSdz1aUEA8WrYSK4WDKhjVbb6lCNZyRMBklnJBI2Bq+HN
3gAuBj6PVmGuXoLjL77Y1Wi+lniAvonJRJgFB4tCS0n4S/dp30ENmKEKNWv+
6fuhakmHgjgI+3r3rawf5gYV18pUbog1mkc5pFfEAqlpcpQ9NY7r7nytZoLc
9RZRlKv5VApfDayXvNKOcH3HEUbfIjxFXvQNbEAVY4ZjUQcY4yV9Da5EcR/y
XPtz5ZIUscrnIIZ70txB8YvtKbEPTwiJ4YgWDLThtXuO/6CESxEy3gZi3o6R
sLATmO/2jZe5Lw+/J0rvhvxRkz1rY62mLDPHBbhUZIB4JISW30UVI47RqZ0i
I1OehEnPvKElv7yGtQXNAOMuq9d4LDGUoy+FRwgOer7/2rlF13Ts/HCbAm8b
526l0aJ0jgGBdfSlRo6QaN1/hLW8UoNKF26OdB9aoHnmg270MGF4o4d2qfOQ
tiFZ5q8TDVdtJD+XGKbhQzjby0sUfrMEn7DWZq3KGjHZ2DQFOWdlrTmlUmIF
BqrVN2O2Uj3cJZ7KIhQOHuiiEHeryhj4xP2wKnHBcS2jOK0igIkZp5uduR5c
HGMMeQgHfMhYbRMjYrDbuFYJipHhKqPVEFR1iDXOpNeWsOu4dNfEp831YfSn
fhDJu3tNAeK3y8pHRV+taGCbxUWIE8Mn6xWOVbR56D/KkEaWenl4jLaAbXu1
TifSPt7kLTxS2+ZGvHdRF724zq6Hn7DfbreZBj1DPIjEpaQadDDjptKaXuoD
8qHgWv2YAcrGQK/bU4oLN7KluLuILNdIQeWAXlSBdhRKdlmcLYmm+zIHHFLI
24jh7ekQB78xIwmxD5OkdJQV2r07iwXqLmluwr2Ggve+mh7Qa4BH+yz7qNZf
uyikEojAFFmFMMrTGssM8+KyeFzOse0M9Y78i96ewcV7laQvCeJCQaaekyuc
vp8hpMdTc2TQfw/VbGl0ku3jC66IoexiRkBr/rbAcY2rB/JXsyH2Iqg9548s
w6wk3aBo8osSxe9POOgYZUj5u+XpwOY7P89dRC/zY6sumCaiYJraeTtF79Gg
Cuce7YPh+j2Fp5IG5SuCbPK2PeGcifR5HiTH+cuSeMnrjagQF+AhJtxYahZn
gjuPlgV9RbEsTSkJuRAAOUvLXGLSm22zAQdCuJHd+FzxuhlzChTnVaT+aCkv
m/0u3VmBFxYDpToUzs3WkoJoFYHBpzhuCxkX2MfCcNqGFDSKm0B+xjVzFSZ9
olBhPP8pQ6zPDWKNXI4YUO3ToePKQUIDuvQ++Wrpw1/iXiQVjf77yy8nMfI3
Gm3XhyBDZiQPIr3RiNsSgHype2I0cYFPOYppG0fuODGJwTaTfcF0efJIQfxq
ko8ZuJighpMEnHDEIZlRDs5Es5Qgi9YRlWmu256thDs089RjZT3WvXUMNS8r
LF/daoRL8pdC+EjTX2VZelehTSNJpCXADJLuxXD6VoOYj7T+ub0P9kGU3Wk1
BcSxIDZ3VLKDUQrESoBVKhmYZnliDNSPhtGG0d6PGOSEQ0jq5oGgNbdiUnRH
wR8kzXS3GX16bkL3oqnftrwTUrWNEWRa0SN7Yln5pDk+e/kEpUMZzB2sQ8g9
hNDmcse3W4S8rH9FrwxRW4gdoYSrAUErOfKD2BWyzKFMGjIuYXpANczyqFrc
9NmLhxybW2/fWQObdREO1wCwqpW43dM0JYK37SUqrw6eMtgNUZ0vSSsnYcvV
QUInjZ2mfuoxz/bk34a9F1AGH1pJ1ujqkBY3YRBP2lLrU85h5LpoZY8Y/Hhd
yDvItGSUW0eXTUJ/Vr71TXF7X7RIOJesn1NMU6jrsDJOhhEtWOyVV8lzUM8s
47M/jdzNmiidLlmvBlRc8oYeAacrv9IAp6Gani+HZxTdp2e6/Y/FxSOMMSoB
vOaiwvVaGh3Pnwjz/YkkXc1nep7dh0Kon5+h1Yl+filFOojg+WqBWjZcgYYv
sw+QPK8UbQmeZy/O24QFRcwl2v6W0/RNJcZQ37ITIhSoy/WQKMS8aAQw2JU6
NjTEJpOyXGzRecP4YiibcuqhWmCpEiKigayKqyjXYlkvtjhoM1TLI/kN9Xo3
oB+wF1418i3Vk5RrFyVky3C567qljUK6/oE4xvNtx+oZpxa8/6yWP6fr+l+7
fsCL03nUJwIPWVTAz7fL5kxwSF1Usslbx49V9VgPeDvJQmYzJ/ijZElK4tgX
rlckDV+k2zHrvPqsYN1MzHcoBpNcS/aTpBNpNZjbIIV7/ZpR37fVASUWgwul
mfUQCMiW9h8CNdGE48o1vpeEU4taIA9EIsglr+PlZgkM05Lbfgil6swlWcfZ
0rdvitBl0BIAOLeJrj21gVt1O1NMHKd6++3oFQ7SGrQx5SE7+sBKyYjsOPD5
wMXqcsrnZRkXuddKsZiPlkAZ1pH80n/e9qwIeKQkpyXuxpjtqFEG3vYZSsjS
0NWGx52dRfIgq69KBjZZSC7dqyxLL5LUQPY0kXFeANJHU1owj9R7DIB+V0Px
3Jm0TSu6+Ei/WbO5Yp+j3uNGjeIjivP5IwcA4xC9/83OQWTI6fvdqNew3oox
80VKX7Tn2wtVe3NuOwMKkcMdkXdQIJzPXkTJ7xUyFVHK/I0KP7mujVv8iCCX
kslOCllpuTKkJ3IniwJZXea+Ss932y9MzEsTuX1UkY5O6VJzt2W3YvFJw1f+
qw124Iq4wkGcSAPIxpS8RH2ScrzE+G1rJc0iIPanFxz3xRKu6E1Y1345ZfMR
uOFKF9fEsr079ZLE/zz7lVWOE/PJF7TgPbR3MiRnnb8xfokd4RNqImp5wuXh
pcjRBT6S2oi9KSYmGmay2Vp7GiFFsaN53V1UwkZnk1/hwaxcrBXvkkvJbKvD
8ipwc6lcz7UGPTHVQiNvp4DSVovb7LtXr15YDa9baclZJRegHA6CQjsUanch
27Opr4irtvQnw/ck9YCPAyQ2ZM4lFxsQglHe0t86mSN0OcHhsMlbIzASS2Jh
4sv8djJoDnAzEz3CkYPv2YvH5gkZ1tlnuzP/7vuXxgXhvw4d2MAiiS8x/nx4
ElyEge/KlzeoQd0KoAb5WpYLclFcgUgyXykrkm23gvBL+FmrUSZiVSS36QHa
eUBcq2pg5qw0w8Fn3FxOq2+4iEFpXeoooQ2us0sVdgPNrMRRa55KS5785ZdZ
pjVbLCtBCY/dDMHlb5YG6c7X0hXDiyiQHzx/FQ2IZGTcs8xIAE+SPAVPfFFh
Bq4IZJWwdIdBsv5anzLP3LiUWvXGljpWBnwiiNR6luKEggSL6w0ahgS0pKod
PKcuWkctaCRglBM8n5WHrRa/tLqQEwkRSI26nyTQoMnNKXVKSmZU4YL5X3Xr
1MqYxkFsP2wku9K5r8pLmpxudlAhpD6W+OlMjPAdMMmW0GYKZcPSfHBkBWzm
aMdQ35dRAwrPHRL93+wc04YsGJB9MfaUK3Tru0auafGIozIz8zJhlv1I54Jr
wqkmw68P42kFZebIxOBaWSwgt9xLpK+PibZl+hir4C+LxbZBIxB4umg61osm
MT74waxAW0lsL7FkHJw1bX3VmCaq4q1DZ1px3FqZZLYZ2ZkrzUN90S4y5rpe
NW/W6N6/xw8itZ4Kr29kT3+b/dMfzh993sa6vM5q5l4EOzMCHPl8diNP0uY8
OsKw8w0S38wtCOrQJWHHxLRryo0vDW3W1dsCqBwsQONQ2h6skFsVXBciA6SM
C0qrCsRCilGZb0wa4GlxyDc0cjJ3VsxaOPtcfOSjYAxw6GEiXSPTWkitHB51
idqqjUUlMtdSHA5WaJUwVLGNqmD6pi6a2J8nfULYdZcbolyUpF75HMmUhAd+
qmBgaSXi4H+V3BSSJG/zRpMbRENTk5bl8Ksd4AKrrTzRqIHe7suJHcaogkqK
66UN17wmsdvIbUR3MHRIW2b0OrVNYiVk58WD7ee4lxvthvZUA5hVIQJ8RjYg
ktngjNFr51I76MhY1tLyYuCtA3Aqq4g9jKMyiJoH/ceYZ6ndmJYlznzrpDxC
MCg8ZxRwMxLy7d3L+MHIbk0hd5LZJx1SrYZUsRx/fFWG93++uxiSFntZCvQB
UXdJHVUlfz/cLL3Rck5Nn1CYhgVH35bL7rrdUwKfg6nWvbiPwoEKYsiXT522
34P+/D2qZLqD1rostXmQBxGVP88jrH+EjhkNVOAYmoBP+vjIBKIph8bccSqS
5AsInl+yJwaSGoefzRXMoUXSOCrgCsxAUq2NcXTSpieL3q7FLdSHvqvhjU/8
A7t6I7oEV6IK3YmjgtkwiGAVrEs+3UmnarSVelOiOMxMW/mm3JrZpVaPYbad
VyEowBG4S6i0xB1pbZT/zR+S9UbfWQ5St7MsJI2gGcz9RSzhO3oA0gQeTlhF
Q6+euYfDf6vgFI8602xrA7y0pHp0EsLpdZ3yjXf9xCNBUfjZ0VhczEOFbreN
FjtptcSFlFp8XeXoXKesc9sWaT1HfeXnoS6j+Z97hi8M/PJNwbiyPfJW601q
gFCEU1Tf8Vs/hMkAqC4+nEjfgLfBvB1WbIVDd2KdOE9NKonBG9jWsj22lAjB
H9BSfT3xegdCqknGhNZW8Lo+576QsGBrBPUfI2SDmpliMYgPkGG78RbKaUn4
ld9KHuUn7yFHGJz7sYC5wDGcoHUaXijxTUmF1hia77VCr3/ly6VpnQC44Mmy
p0CYwAHOuu752Q9nPT03e/9ZmVe5eZrNEWmWDd+RL6zH33Q65dZMeNjZAlxg
VSzFYnDvT6R0TrH85t4lCcXinoKR1IDx0CzadB016mkuCzH0WOWNbcRntMWk
XtET2lIDBPTNd9urOvv2z//2v6SAwZPb4qasquwV6dFVTUbZ7QR+bFJd2cC+
uHWv6uYCl1fZk7IiGpQCqK8YwNtd12J8vtECZqzlsfMEGjW/lLEVikCJNTKm
eHmECE0cs6a82HKQnijM9giJs1yyV6gRxen5L2fq1KYpgSNvOrFOeKZcdBWe
hZn7/wBhwW4KTCwBAA==

-->

</rfc>
