<?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.27 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-vos-cfrg-pqpake-00" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="Hybrid PQ-PAKE">Hybrid Post-Quantum Password Authenticated Key Exchange</title>
    <seriesInfo name="Internet-Draft" value="draft-vos-cfrg-pqpake-00"/>
    <author initials="J." surname="Vos" fullname="Jelle Vos">
      <organization/>
      <address>
        <email>jvos@apple.com</email>
      </address>
    </author>
    <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
      <organization>University of California, Irvine</organization>
      <address>
        <email>sjarecki@ics.uci.edu</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Apple, Inc.</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2025" month="April" day="15"/>
    <abstract>
      <?line 96?>

<t>This document describes the CPaceOQUAKE+ protocol, a hybrid asymmetric
password-authenticated key exchange (aPAKE) that supports mutual
authentication in a client-server setting secure against
quantum-capable attackers. CPaceOQUAKE+ is the result of a KEM-based
transformation from the hybrid symmetric PAKE protocol called CPaceOQUAKE
that is also described in this document. This document recommends
configurations for CPaceOQUAKE+.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://example.com/LATEST"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-vos-cfrg-pqpake/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        CFRG Crypto Forum Research Group mailing list (<eref target="mailto:WG@example.com"/>),
        which is archived at <eref target="https://example.com/WG"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/USER/REPO"/>.</t>
    </note>
  </front>
  <middle>
    <?line 106?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Asymmetric (or Augmented) Password Authenticated Key Exchange (aPAKE)
protocols are designed to provide password authentication and
mutually authenticated key exchange in a client-server setting without
relying on a public key infrastructure (PKI) and without
disclosing passwords to servers or other entities other than the client
machine. The only stage where PKI is required is during a client's registration.</t>
      <t>In the asymmetric PAKE setting, the client first registers a password
verifier with the server. A verifier is a value that is derived from the
password and which the server will later use to verify the client
knowledge of the password. After registration, the client uses its password
and the server uses the corresponding verifier to establish an authenticated
shared secret such that the server learns nothing of the client's password.</t>
      <t>OPAQUE-3DH <xref target="OPAQUE"/> and SPAKE2+ <xref target="SPAKE2PLUS"/>
are two examples of specified aPAKE protocols. These protocols provide
security in classical threat models. However, in the presence
of a quantum-capable attacker, both OPAQUE and SPAKE2+ fail to provide the
desired level of security. Both protocols are vulnerable to a Harvest Now, Decrypt
Later attack executed by a quantum-capable attacker, in which the attacker learns the shared secret and uses it
to compromise application traffic. Upgrading both protocols to provide
post-quantum security is non-trivial, especially as there are no known efficient
constructions for certain building blocks used in these protocols (such as the OPRF
used in OPAQUE-3DH). As the threat of quantum-capable attackers looms, the
viability of existing aPAKE protocols in practice diminishes in time.</t>
      <t>This document describes the CPaceOQUAKE+ protocol, an aPAKE that supports mutual
authentication in a client-server setting secure against
quantum-capable attackers. CPaceOQUAKE+ is the result of a KEM-based transformation
from the hybrid symmetric PAKE protocol called CPaceOQUAKE.</t>
      <t>This document fully specifies CPaceOQUAKE+ and all dependencies necessary
to implement it. <xref target="configurations"/> provides recommended configurations.
<!-- and {{test-vectors}} provides test vectors to assist in checking implementation correctness. -->
      </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?>

<section anchor="notation-and-terminology">
        <name>Notation and Terminology</name>
        <t>The following functions and operators are used throughout the document.</t>
        <ul spacing="normal">
          <li>
            <t>The function <tt>random(n)</tt> generates a cryptographically secure pseudorandom
byte string of length <tt>n</tt> bytes.</t>
          </li>
          <li>
            <t>The associative binary operator <tt>||</tt> denotes concatenation of two byte strings.</t>
          </li>
          <li>
            <t>The binary function <tt>XOR(a, b)</tt> denotes an element-wise XOR operation between
two byte strings <tt>a</tt> and <tt>b</tt> of the same length.</t>
          </li>
          <li>
            <t>The functions <tt>bytes_to_int</tt> and <tt>int_to_bytes</tt> convert
byte strings to and from non-negative integers. bytes_to_int and int_to_bytes
are implemented as OS2IP and I2OSP as described in <xref target="RFC8017"/>, respectively.</t>
          </li>
          <li>
            <t>The function <tt>lv_encode</tt> encodes a byte string with a two-byte, big-endian
length prefix. For example, lv_enode((0x00, 0x01, 0x02)) = (0x00, 0x03, 0x00, 0x01, 0x02).
The function <tt>lv_decode</tt> parses a byte string that is expected to be encoded
with a two-byte length preceding the remaining bytes, e.g.,
<tt>lv_decode((0x00, 0x03, 0x00, 0x01, 0x02)) = (0x00, 0x01, 0x02)</tt>. Note that <tt>lv_decode</tt>
can fail when the length of the actual bytes does not match that encoded in the
prefix. For example, <tt>lv_decode((0xFF, 0xFF, 0x00))</tt> will fail.</t>
          </li>
          <li>
            <t>The notation <tt>bytes[l..h]</tt> refers to the slice of byte array <tt>bytes</tt> starting
at index <tt>l</tt> and ending at index <tt>h-1</tt>. For example, given <tt>bytes = (0x00, 0x01, 0x02)</tt>, then <tt>bytes[0..1] = 0x00</tt> and <tt>bytes[0..3] = (0x00, 0x01, 0x02)</tt>. Similarly, the notation <tt>bytes[l..]</tt> refers to the slice of the byte
array <tt>bytes</tt> starting at <tt>l</tt> until the end of <tt>bytes</tt>, i.e.., <tt>bytes[l..] = bytes[l..len(bytes)]</tt>.</t>
          </li>
        </ul>
        <t>All algorithms and procedures described in this document are laid out
in a Python-like pseudocode. Each function takes a set of inputs and parameters
and produces a set of output values. Parameters become constant values once
the protocol variant and the configuration are fixed.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>This document aims to specify two protocols: a symmetric and an asymmetric hybrid PAKE.
In the symmetric PAKE setting, the client and server share a password and use it to
establish an authenticated shared secret. In the asymmetric PAKE setting, the client first
registers a password verifier with the server. A verifier is a value that is derived
from the password and which the client will later use to demonstrate knowledge of the password.
After registration, the client uses its password and the server uses the corresponding
verifier to establish an authenticated shared secret such that the server learns nothing
of the client's password.</t>
      <t>The aPAKE specified in this document is composed of multiple smaller protocols, including
the hybrid symmetric PAKE protocol called CPaceOQUAKE. CPaceOQUAKE is in turn a composition of two other
PAKE protocols: the existing CPace <xref target="CPACE"/> and a new post-quantum PAKE called OQUAKE.
To achieve the asymmetric property, the aPAKE also builds upon a password
confirmation sub-protocol as specified in <xref target="pcp"/>.</t>
      <t>We refer to the fully composed aPAKE as CPaceOQUAKE+.
An abstract overview of the composition of this protocol is shown in the figure below.
In the subsequent sections we break down the sub-protocols into even smaller building blocks.</t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="376" viewBox="0 0 376 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 104,32 L 104,320" fill="none" stroke="black"/>
            <path d="M 128,64 L 128,240" fill="none" stroke="black"/>
            <path d="M 128,272 L 128,288" fill="none" stroke="black"/>
            <path d="M 144,96 L 144,144" fill="none" stroke="black"/>
            <path d="M 144,176 L 144,224" fill="none" stroke="black"/>
            <path d="M 232,96 L 232,144" fill="none" stroke="black"/>
            <path d="M 232,176 L 232,224" fill="none" stroke="black"/>
            <path d="M 248,64 L 248,240" fill="none" stroke="black"/>
            <path d="M 248,272 L 248,288" fill="none" stroke="black"/>
            <path d="M 272,32 L 272,320" fill="none" stroke="black"/>
            <path d="M 104,32 L 272,32" fill="none" stroke="black"/>
            <path d="M 128,64 L 248,64" fill="none" stroke="black"/>
            <path d="M 144,96 L 232,96" fill="none" stroke="black"/>
            <path d="M 80,144 L 96,144" fill="none" stroke="black"/>
            <path d="M 144,144 L 232,144" fill="none" stroke="black"/>
            <path d="M 280,144 L 296,144" fill="none" stroke="black"/>
            <path d="M 144,176 L 232,176" fill="none" stroke="black"/>
            <path d="M 144,224 L 232,224" fill="none" stroke="black"/>
            <path d="M 128,240 L 248,240" fill="none" stroke="black"/>
            <path d="M 144,256 L 232,256" fill="none" stroke="black"/>
            <path d="M 72,288 L 104,288" fill="none" stroke="black"/>
            <path d="M 272,288 L 304,288" fill="none" stroke="black"/>
            <path d="M 144,304 L 232,304" fill="none" stroke="black"/>
            <path d="M 104,320 L 272,320" fill="none" stroke="black"/>
            <path d="M 144,256 C 135.16936,256 128,263.16936 128,272" fill="none" stroke="black"/>
            <path d="M 232,256 C 240.83064,256 248,263.16936 248,272" fill="none" stroke="black"/>
            <path d="M 144,304 C 135.16936,304 128,296.83064 128,288" fill="none" stroke="black"/>
            <path d="M 232,304 C 240.83064,304 248,296.83064 248,288" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="312,288 300,282.4 300,293.6" fill="black" transform="rotate(0,304,288)"/>
            <polygon class="arrowhead" points="288,144 276,138.4 276,149.6" fill="black" transform="rotate(180,280,144)"/>
            <polygon class="arrowhead" points="104,144 92,138.4 92,149.6" fill="black" transform="rotate(0,96,144)"/>
            <polygon class="arrowhead" points="80,288 68,282.4 68,293.6" fill="black" transform="rotate(180,72,288)"/>
            <g class="text">
              <text x="164" y="52">CPaceOQUAKE+</text>
              <text x="184" y="84">CPaceOQUAKE</text>
              <text x="184" y="116">CPace</text>
              <text x="36" y="132">Client's</text>
              <text x="188" y="132">protocol</text>
              <text x="36" y="148">password</text>
              <text x="340" y="148">Verifier</text>
              <text x="188" y="196">OQUAKE</text>
              <text x="188" y="212">protocol</text>
              <text x="188" y="276">Password</text>
              <text x="32" y="292">Session</text>
              <text x="188" y="292">confirmation</text>
              <text x="344" y="292">Session</text>
              <text x="32" y="308">key</text>
              <text x="344" y="308">key</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
            +--------------------+
            | CPaceOQUAKE+       |
            |  +--------------+  |
            |  | CPaceOQUAKE  |  |
            |  | +----------+ |  |
            |  | |  CPace   | |  |
Client's    |  | | protocol | |  |
password -->|  | +----------+ |  |<-- Verifier
            |  |              |  |
            |  | +----------+ |  |
            |  | |  OQUAKE  | |  |
            |  | | protocol | |  |
            |  | +----------+ |  |
            |  +--------------+  |
            |   .------------.   |
            |  |   Password   |  |
Session <---+  | confirmation |  +---> Session
  key       |   '------------'   |       key
            +--------------------+
]]></artwork>
      </artset>
      <t>We note that this standard only specifies the composition of CPace and OQUAKE.
It is not necessarily true that one can securely compose all PAKEs this way.</t>
      <t>The rest of this document specifies CPaceOQUAKE+ and its dependencies. <xref target="CPaceOQUAKE"/>
specifies the CPaceOQUAKE protocol, and <xref target="CPaceOQUAKEplus"/> specifies the CPaceOQUAKE+ protocol,
incorporating the former protocol. Each of these pieces build upon the cryptographic dependencies
specified in <xref target="crypto-deps"/>.</t>
    </section>
    <section anchor="crypto-deps">
      <name>Cryptographic Dependencies</name>
      <t>The protocols in this document have four primary dependencies:</t>
      <ul spacing="normal">
        <li>
          <t>Key Encapsulation Mechanism (KEM); <xref target="deps-kem"/></t>
        </li>
        <li>
          <t>Binary Uniform Key Encapsulation Mechanism (BUKEM); <xref target="deps-bukem"/></t>
        </li>
        <li>
          <t>Key Derivation Function (KDF); <xref target="deps-symmetric"/></t>
        </li>
        <li>
          <t>Key Stretching Function (KSF); <xref target="deps-ksf"/></t>
        </li>
      </ul>
      <t><xref target="configurations"/> specifies different combinations of each of these dependencies
that are suitable for implementation.</t>
      <section anchor="deps-kem">
        <name>Key Encapsulation Mechanism</name>
        <t>A Key Encapsulation Mechanism (KEM) is an algorithm that is used for exchanging
a secret from one party to another. We require an IND-CCA-secure KEM with key
derivation from a seed. It consists of the following syntax.</t>
        <ul spacing="normal">
          <li>
            <t>DeriveKeyPair(seed): Deterministic algorithm to derive a key pair
<tt>(sk, pk)</tt> from the byte string <tt>seed</tt>, where <tt>seed</tt> <bcp14>SHOULD</bcp14> have <tt>Nseed</tt> bytes.</t>
          </li>
          <li>
            <t>Encaps(pk): Randomized algorithm to generate an ephemeral,
fixed-length symmetric key (the KEM shared secret) and
a fixed-length encapsulation of that key that can be decapsulated
by the holder of the secret key corresponding to <tt>pk</tt>. This function
can raise an <tt>EncapsError</tt> on encapsulation failure.</t>
          </li>
          <li>
            <t>Decaps(ct, skR): Deterministic algorithm using the secret key <tt>sk</tt>
to recover the ephemeral symmetric key (the KEM shared secret) from
its encapsulated representation <tt>ct</tt>. This function can raise a
<tt>DecapsError</tt> on decapsulation failure.</t>
          </li>
          <li>
            <t>Nseed: The length in bytes of the seed used to derive a key pair.</t>
          </li>
          <li>
            <t>Nct: The length in bytes of an encapsulated key produced by this KEM.</t>
          </li>
          <li>
            <t>Npk: The length in bytes of a public key for this KEM.</t>
          </li>
        </ul>
        <t>This specification uses X-Wing <xref target="XWING"/>.</t>
      </section>
      <section anchor="deps-bukem">
        <name>Binary Uniform KEM</name>
        <t>A binary uniform KEM supports the same functions as defined above for
a KEM, and it must also be IND-CCA secure, but it must also achieve
two additional security properties. Namely, in addition to IND-CCA
security, a binary uniform KEM requires that:</t>
        <ol spacing="normal" type="1"><li>
            <t>Public keys are indistinguishable from random strings of bytes (of
the same length); and</t>
          </li>
          <li>
            <t>Ciphertexts are anonymous in the presence of chosen ciphertext
attack (ANO-CCA).</t>
          </li>
        </ol>
        <t>These additional properties are crucial for the security of OQUAKE. In
other words, one <bcp14>MUST NOT</bcp14> use a KEM that has no uniform public keys
and no anonymous ciphertexts in place of a uniform KEM.</t>
        <t>This specification uses a variant of ML-KEM768 <xref target="FIPS203"/>, denoted ML-BUKEM768.
This is instantiated with "KemeleonNR - ML-KEM768" <xref target="KEMELEON"/>. Note that, while
Kemeleon provides uniform encoding for KEM ciphertexts and public keys, we only
require uniform enoding for public keys. Future specifications can replace use of
Kemeleon with a binary uniform KEM that is more efficient if one becomes available.</t>
      </section>
      <section anchor="deps-symmetric">
        <name>Key Derivation Function</name>
        <t>A Key Derivation Function (KDF) is a function that takes some source of initial
keying material and uses it to derive one or more cryptographically strong keys.
This specification uses a KDF with the following API and parameters:</t>
        <ul spacing="normal">
          <li>
            <t>Extract(salt, ikm): Extract a pseudorandom key of fixed length <tt>Nx</tt> bytes from
input keying material <tt>ikm</tt> and an optional byte string <tt>salt</tt>.</t>
          </li>
          <li>
            <t>Expand(prk, info, L): Expand a pseudorandom key <tt>prk</tt> using the optional string <tt>info</tt>
into <tt>L</tt> bytes of output keying material.</t>
          </li>
          <li>
            <t>Nx: The output size of the <tt>Extract()</tt> function in bytes.</t>
          </li>
        </ul>
      </section>
      <section anchor="deps-ksf">
        <name>Key Stretching Function</name>
        <t>This specification makes use of a Key Stretching Function (KSF), which is a slow
and expensive cryptographic hash function with the following API:</t>
        <ul spacing="normal">
          <li>
            <t>Stretch(msg, salt, L): Apply a key stretching function to stretch the input <tt>msg</tt>
and salt <tt>salt</tt>, hardening it against offline dictionary attacks. This function also
needs to satisfy collision resistance. The output is a string of L bytes.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="CPaceOQUAKE">
      <name>CPaceOQUAKE Protocol</name>
      <t>The hybrid, symmetric PAKE protocol, denoted CPaceOQUAKE consists of CPace <xref target="CPACE"/>
combined with OQUAKE <xref target="ABJ25"/>. OQUAKE is a PAKE built from a BUKEM and KDF, using a
2-rounds of Feistel network to password-encrypt the BUKEM public key.
The OQUAKE protocol is based on the "NoIC" protocol analyzed in <xref target="ABJ25"/>.</t>
      <t>The CPaceOQUAKE protocol is based on the `Sequential PAKE Combiner' protocol proposed by
<xref target="HR24"/>. A very close variant of this protocol was also analyzed in <xref target="LL24"/>.</t>
      <t>At a high level, CPaceOQUAKE is a two-round protocol that runs between client and server
wherein, upon completion, both parties share the same session key if they agree
on the password-related string (PRS). Otherwise, they obtain random session keys.
This is summarized in the diagram below.</t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="536" viewBox="0 0 536 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 104,32 L 104,192" fill="none" stroke="black"/>
            <path d="M 224,48 L 224,96" fill="none" stroke="black"/>
            <path d="M 224,128 L 224,176" fill="none" stroke="black"/>
            <path d="M 312,48 L 312,96" fill="none" stroke="black"/>
            <path d="M 312,128 L 312,176" fill="none" stroke="black"/>
            <path d="M 432,32 L 432,192" fill="none" stroke="black"/>
            <path d="M 104,32 L 432,32" fill="none" stroke="black"/>
            <path d="M 224,48 L 312,48" fill="none" stroke="black"/>
            <path d="M 80,96 L 96,96" fill="none" stroke="black"/>
            <path d="M 224,96 L 312,96" fill="none" stroke="black"/>
            <path d="M 440,96 L 456,96" fill="none" stroke="black"/>
            <path d="M 224,128 L 312,128" fill="none" stroke="black"/>
            <path d="M 72,160 L 104,160" fill="none" stroke="black"/>
            <path d="M 432,160 L 456,160" fill="none" stroke="black"/>
            <path d="M 224,176 L 312,176" fill="none" stroke="black"/>
            <path d="M 104,192 L 432,192" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="464,160 452,154.4 452,165.6" fill="black" transform="rotate(0,456,160)"/>
            <polygon class="arrowhead" points="448,96 436,90.4 436,101.6" fill="black" transform="rotate(180,440,96)"/>
            <polygon class="arrowhead" points="104,96 92,90.4 92,101.6" fill="black" transform="rotate(0,96,96)"/>
            <polygon class="arrowhead" points="80,160 68,154.4 68,165.6" fill="black" transform="rotate(180,72,160)"/>
            <g class="text">
              <text x="160" y="52">CPaceOQUAKE</text>
              <text x="264" y="68">CPace</text>
              <text x="36" y="84">Client's</text>
              <text x="268" y="84">protocol</text>
              <text x="500" y="84">Server's</text>
              <text x="36" y="100">password</text>
              <text x="500" y="100">password</text>
              <text x="268" y="148">OQUAKE</text>
              <text x="32" y="164">Session</text>
              <text x="268" y="164">protocol</text>
              <text x="496" y="164">Session</text>
              <text x="32" y="180">key</text>
              <text x="496" y="180">key</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
            +----------------------------------------+
            | CPaceOQUAKE  +----------+              |
            |              |  CPace   |              |
Client's    |              | protocol |              |    Server's
password -->|              +----------+              |<-- password
            |                                        |
            |              +----------+              |
            |              |  OQUAKE  |              |
Session <---+              | protocol |              +--> Session
  key       |              +----------+              |      key
            +----------------------------------------+
]]></artwork>
      </artset>
      <t>CPaceOQUAKE composes CPace and OQUAKE by first running CPace between
client and server, and then incorporating the CPace session key into
the password before running OQUAKE between the server and client. We
explain the composition in more detail in <xref target="cpacequake-composition"/>.</t>
      <t>As describes in <xref target="cpace"/> and <xref target="quake"/>, both CPace and OQUAKE take
as input optional client and server identifiers, denoted U and S,
respectively. See <xref target="identities"/> for more discussion about these
identities and how they are chosen in practice.</t>
      <section anchor="cpace">
        <name>CPace Specification</name>
        <t>CPace is a classical elliptic curve-based PAKE <xref target="CPACE"/>. This section wraps the CPace specification in a consistent interface.
We use an interactive version of CPace that takes two rounds, in which there is a designated initiator and responder.
In other words, the responder only starts executing the protocol after it received the first message from the initiator.</t>
        <t>The flow of the protocol consists of three messages sent between initiator and responder, produced by the functions
Init, Respond, and Finish, described below. Both parties take as input a password-related
string PRS, an optional unique shared session identifier sid, and an optional client identifier
U and server identifier S (e.g., a device identifier, an IP address, or URL pertaining to the
client and server). Upon completion, both parties obtain matching session keys if their PRS, sid, key
length (specified by N), and client and server identifiers match. Otherwise, they obtain random keys.
In exceptional cases, the protocol aborts.</t>
        <section anchor="initiation">
          <name>Initiation</name>
          <t>The initiator starts the protocol using its password-related string PRS.
Additionally, it may bind the session to an existing shared session identifier sid.
CPace also allows to bind the session to an existing channel identifier.
To remain consistent with the other PAKEs in this specification, the channel identifier is the concatenation
of optional client and server identifiers.</t>
          <artwork><![CDATA[
CPace.Init

Input:
- PRS, password-related string, a byte string
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- ya, discrete logarithm intended to be stored in secret until the protocol finishes
- Ya, public point, intended to be sent to the responder

Parameters:
- G, a group environment as specified in CPace

def Init(PRS, sid, U, S):
  g = G.calculate_generator(H, PRS, U || S, sid)
  ya = G.sample_scalar()
  Ya = G.scalar_mult(ya, g)
  return ya, Ya
]]></artwork>
        </section>
        <section anchor="response">
          <name>Response</name>
          <t>The responder performs the same actions as the initiator.
Since it already received the initiator's message, it can immediately finish its execution of the protocol.
It outputs the shared secret and a message Yb intended to be sent to the initiator.</t>
          <artwork><![CDATA[
CPace.Respond

Input:
- PRS, password-related string, a byte string
- Ya, public point, received from the initiator
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- ISK, the established shared secret
- Yb, public point, intended to be sent to the initiator

Parameters:
- G, a group environment as specified in CPace
- H, a hash function as specified in CPace

Exceptions:
- CPaceError, raised when an invalid value was encountered in CPace

def Respond(PRS, Ya, sid, U, S):
  g = G.calculate_generator(H, PRS, U || S, sid)
  yb = G.sample_scalar()
  Yb = G.scalar_mult(yb, g)

  K = G.scalar_mult_vfy(yb, Ya)
  If K = G.I, raise CPaceError

  ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(Ya, Yb))

  return ISK, Yb
]]></artwork>
          <t>The functions <tt>lv_cat</tt> and <tt>transcript</tt> are defined in <xref target="CPACE"/>.</t>
        </section>
        <section anchor="finish">
          <name>Finish</name>
          <t>The initiator finishes the protocol by combining the discrete logarithm ya generated by CPace.Init and the message Yb received
from the responder.</t>
          <artwork><![CDATA[
CPace.Finish

Input:
- ya, discrete logarithm that was generated using CPace.Init
- Yb, public point, received from the responder
- sid, session identifier, a byte string

Output:
- ISK, the established shared secret

Parameters:
- G, a group environment as specified in CPace
- H, a hash function as specified in CPace

Exceptions:
- CPaceError, raised when an invalid value was encountered in CPace

def Finish(ya, Yb, sid):
  K = G.scalar_mult_vfy(ya, Yb)
  If K = G.I, raise CPaceError

  ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(Ya, Yb))

  return ISK
]]></artwork>
        </section>
      </section>
      <section anchor="quake">
        <name>OQUAKE Specification</name>
        <t>OQUAKE is a PAKE built on a BUKEM and KDF.  If the BUKEM provides security against quantum-enabled attacks,
then so does OQUAKE. It consists of three messages sent between initiator and responder, produced by
the functions Init, Respond, and Finish, described below. Both parties take as input a password-related
string PRS, an optional session identifier sid, and an optional client identifier U and server
identifier S. Upon completion, both parties obtain matching session keys if their PRS, sid, key length
(specified by N), and client and server identifiers match. Otherwise, they obtain random session keys.</t>
        <t>The shared session identifier has the following requirements. If a client and server identifier are provided:</t>
        <ul spacing="normal">
          <li>
            <t>The session identifier must match between the client and server</t>
          </li>
          <li>
            <t>This session identifier has not been used before in a session between the client and server</t>
          </li>
        </ul>
        <t>If no client and server identifiers are provided:</t>
        <ul spacing="normal">
          <li>
            <t>The session identifier must match between the client and server</t>
          </li>
          <li>
            <t>This session identifier has not been used before by the client or server in any session with any other party</t>
          </li>
        </ul>
        <t>These requirements originate from the security proof for OQUAKE. If these requirements are not met, the proof
does not apply, but this does not mean that the protocol becomes vulnerable.</t>
        <section anchor="initiation-1">
          <name>Initiation</name>
          <t>Init takes as input the initiator's PRS, an optional session identifier sid, and optional client and server identifiers
U and S. It produces a context for the initiator to store, as well as a protocol message that is sent to
the responder. Its implementation is as follows.</t>
          <artwork><![CDATA[
OQUAKE.Init

Input:
- PRS, password-related string, a byte string
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- context, opaque state for the initiator to store
- msg, an encoded protocol message for the initiator to send to the responder

Parameters:
- BUKEM, a BUKEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

def Init(PRS, sid, U, S):
  seed = random(BUKEM.Nseed)
  (pk, sk) = BUKEM.DeriveKeyPair(seed)

  r = random(3 * Nsec)

  fullsid = encode_sid(sid, U, S)

  // T = XOR(pk, H(fullsid, PRS, r))
  prk_T_pad = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || r)
  T_pad = KDF.Expand(prk_T_pad, DST || "T_pad", Npk)
  T = XOR(pk, T_pad)

  // s = XOR(r, H(fullsid, PRS, T))
  prk_s_pad = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || T)
  s_pad = KDF.Expand(prk_s_pad, DST || "s_pad", 3 * Nsec)
  s = XOR(r, s_pad)

  init_msg = s || T

  return Context(PRS, sk, s, T, fullsid), init_msg
]]></artwork>
          <t>The encode_sid function is defined below.</t>
          <artwork><![CDATA[
encode_sid

Input:
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- fullsid, a byte string

Parameters:
- BUKEM, a BUKEM instance
- KDF, a KDF instance

def encode_sid(sid, U, U):
  fullsid =
    bytes_to_int(len(sid), 4) || sid ||
    bytes_to_int(len(U), 4) || U ||
    bytes_to_int(len(S), 4) || S
  return fullsid
]]></artwork>
        </section>
        <section anchor="response-1">
          <name>Response</name>
          <t>Respond takes as input the PRS, the initiator's protocol message, an optional session identifier, and optional client and server identifiers.
It produces a 32-byte symmetric key and a protocol message intended to be sent to the initiator. Its implementation
is as follows.</t>
          <artwork><![CDATA[
OQUAKE.Respond

Input:
- PRS, password-related string, a byte string
- init_msg, encoded protocol message, a byte string
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- ss, output shared secret, a byte string of 32 bytes
- resp_msg, encoded protocol message, a byte string

Parameters:
- BUKEM, a BUKEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

def Respond(PRS, init_msg, sid, U, S):
  (s, T) = init_msg[0..(3 * Nsec)], init_msg[(3 * Nsec)..]

  fullsid = encode_sid(sid, U, S)
  prk_s_pad = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || T)
  s_pad = KDF.Expand(prk_s_pad, DST || "s_pad", 3 * Nsec)
  r = XOR(s, s_pad)

  prk_T_pad = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || r)
  T_pad = KDF.Expand(prk_T_pad, DST || "T_pad", Npk)
  pk = XOR(T, T_pad)

  (ct, k) = BUKEM.Encaps(pk)

  prk_sk = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || k)
  key = KDF.Expand(prk_sk, DST || "sk", Nkey)

  h = KDF.Expand(prk_sk, DST || "confirm", Nkc)

  resp_msg = ct || h

  return resp_msg, key
]]></artwork>
        </section>
        <section anchor="quake-finish">
          <name>Finish</name>
          <t>Finish takes as input the initiator-created context that is output from Init
as well as the responder's reply message resp_msg. It produces a symmetric key
that is output to the initiator. Its implementation
is as follows.</t>
          <artwork><![CDATA[
OQUAKE.Finish

Input:
- context, opaque state for the initiator to store TODO
- resp_msg, encoded protocol message, a byte string

Output:
- ss, output shared secret, a byte string of 32 bytes

Parameters:
- BUKEM, a BUKEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

Exceptions:
- AuthenticationError, raised when the key confirmation fails

def Finish(context, resp_msg):
  (PRS, sk, s, T, fullsid) = context
  ct, h = resp_msg[0..Npk], resp_msg[Npk..]

  try:
    k = BUKEM.Decaps(sk, ct)
    prk_sk = KDF.Extract(PRS, DST || "OQUAKE" || fullsid || k)
    key = KDF.Expand(prk_sk, DST || "sk", Nkey)

    h_expected = KDF.Expand(prk_sk, DST || "confirm", Nkc)
    if h != h_expected:
      return random(Nkey)

    return key
  catch DecapsError:
    return random(Nkey)
]]></artwork>
        </section>
      </section>
      <section anchor="cpacequake-composition">
        <name>Composition of CPace &amp; OQUAKE</name>
        <t>CPaceOQUAKE is a sequential composition of CPace (see <xref target="cpace"/>) and
OQUAKE (see <xref target="quake"/>). Whereas running CPace and OQUAKE in parallel realizes
a worst-of-both worlds PAKE, this sequential composition realizes a
best-of-both worlds PAKE. In other words, CPaceOQUAKE remains as secure
as the strongest PAKE, resisting attacks that break the classical CPace
(e.g. by a quantum-capable attacker) or attacks that break the
quantum-resistant OQUAKE (e.g. by a flaw in the BUKEM). This assumes that
OQUAKE is instantiated with a quantum-resistant BUKEM.</t>
        <t>To be precise, CPaceOQUAKE first runs CPace using password-related string PRS,
establishing a session key SK1 with the associated transcript tr1. It
then initiates OQUAKE using the password-related string <tt>H(fullsid, PRS, tr1, SK1)</tt>;
a secret derived from the the original password-related string and the outputs from
the CPace instance. Here, <tt>fullsid</tt> is the output of encode_sid(sid, U, S).
The final session key is then a hash of fullsid, the original password-related string,
both CPace and OQUAKE transcripts (tr1 and tr2, respectively), and both session keys
output from CPace and OQUAKE (SK1 and SK2, respectively), i.e.,
H(fullsid, tr1, tr2, SK1, SK2).</t>
        <t>This is outlined in the diagram below. In CPaceOQUAKE, CPace is initiated by the
first party, while OQUAKE is initiated by the other party. This results in a protocol
that requires three messages.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="848" viewBox="0 0 848 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 104,32 L 104,56" fill="none" stroke="black"/>
              <path d="M 104,72 L 104,152" fill="none" stroke="black"/>
              <path d="M 104,168 L 104,192" fill="none" stroke="black"/>
              <path d="M 216,64 L 216,128" fill="none" stroke="black"/>
              <path d="M 296,80 L 296,128" fill="none" stroke="black"/>
              <path d="M 376,48 L 376,96" fill="none" stroke="black"/>
              <path d="M 376,128 L 376,176" fill="none" stroke="black"/>
              <path d="M 464,48 L 464,96" fill="none" stroke="black"/>
              <path d="M 464,128 L 464,176" fill="none" stroke="black"/>
              <path d="M 480,80 L 480,112" fill="none" stroke="black"/>
              <path d="M 592,64 L 592,104" fill="none" stroke="black"/>
              <path d="M 592,120 L 592,128" fill="none" stroke="black"/>
              <path d="M 672,112 L 672,128" fill="none" stroke="black"/>
              <path d="M 744,32 L 744,56" fill="none" stroke="black"/>
              <path d="M 744,72 L 744,152" fill="none" stroke="black"/>
              <path d="M 744,168 L 744,192" fill="none" stroke="black"/>
              <path d="M 104,32 L 744,32" fill="none" stroke="black"/>
              <path d="M 376,48 L 464,48" fill="none" stroke="black"/>
              <path d="M 80,64 L 240,64" fill="none" stroke="black"/>
              <path d="M 272,64 L 368,64" fill="none" stroke="black"/>
              <path d="M 472,64 L 488,64" fill="none" stroke="black"/>
              <path d="M 520,64 L 768,64" fill="none" stroke="black"/>
              <path d="M 296,80 L 376,80" fill="none" stroke="black"/>
              <path d="M 464,80 L 480,80" fill="none" stroke="black"/>
              <path d="M 376,96 L 464,96" fill="none" stroke="black"/>
              <path d="M 480,112 L 672,112" fill="none" stroke="black"/>
              <path d="M 376,128 L 464,128" fill="none" stroke="black"/>
              <path d="M 312,144 L 368,144" fill="none" stroke="black"/>
              <path d="M 472,144 L 488,144" fill="none" stroke="black"/>
              <path d="M 72,160 L 112,160" fill="none" stroke="black"/>
              <path d="M 352,160 L 376,160" fill="none" stroke="black"/>
              <path d="M 464,160 L 488,160" fill="none" stroke="black"/>
              <path d="M 728,160 L 768,160" fill="none" stroke="black"/>
              <path d="M 376,176 L 464,176" fill="none" stroke="black"/>
              <path d="M 104,192 L 744,192" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="776,160 764,154.4 764,165.6" fill="black" transform="rotate(0,768,160)"/>
              <path class="jump" d="M 744,168 C 738,168 738,152 744,152" fill="none" stroke="black"/>
              <path class="jump" d="M 744,72 C 738,72 738,56 744,56" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="680,128 668,122.4 668,133.6" fill="black" transform="rotate(90,672,128)"/>
              <polygon class="arrowhead" points="600,128 588,122.4 588,133.6" fill="black" transform="rotate(90,592,128)"/>
              <path class="jump" d="M 592,120 C 586,120 586,104 592,104" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="480,144 468,138.4 468,149.6" fill="black" transform="rotate(180,472,144)"/>
              <polygon class="arrowhead" points="480,64 468,58.4 468,69.6" fill="black" transform="rotate(180,472,64)"/>
              <polygon class="arrowhead" points="376,144 364,138.4 364,149.6" fill="black" transform="rotate(0,368,144)"/>
              <polygon class="arrowhead" points="376,64 364,58.4 364,69.6" fill="black" transform="rotate(0,368,64)"/>
              <polygon class="arrowhead" points="304,128 292,122.4 292,133.6" fill="black" transform="rotate(90,296,128)"/>
              <polygon class="arrowhead" points="224,128 212,122.4 212,133.6" fill="black" transform="rotate(90,216,128)"/>
              <path class="jump" d="M 104,168 C 110,168 110,152 104,152" fill="none" stroke="black"/>
              <path class="jump" d="M 104,72 C 110,72 110,56 104,56" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="80,160 68,154.4 68,165.6" fill="black" transform="rotate(180,72,160)"/>
              <g class="text">
                <text x="36" y="52">Client's</text>
                <text x="160" y="52">CPaceOQUAKE</text>
                <text x="812" y="52">Server's</text>
                <text x="36" y="68">password</text>
                <text x="256" y="68">PRS</text>
                <text x="416" y="68">CPace</text>
                <text x="504" y="68">PRS</text>
                <text x="812" y="68">password</text>
                <text x="420" y="84">protocol</text>
                <text x="156" y="148">H(fullsid,</text>
                <text x="220" y="148">PRS,</text>
                <text x="260" y="148">tr1,</text>
                <text x="296" y="148">SK1</text>
                <text x="420" y="148">OQUAKE</text>
                <text x="532" y="148">H(fullsid,</text>
                <text x="596" y="148">PRS,</text>
                <text x="636" y="148">tr1,</text>
                <text x="676" y="148">SK1)</text>
                <text x="32" y="164">Session</text>
                <text x="156" y="164">H(fullsid,</text>
                <text x="220" y="164">tr1,</text>
                <text x="260" y="164">tr2,</text>
                <text x="300" y="164">SK1,</text>
                <text x="336" y="164">SK2</text>
                <text x="420" y="164">protocol</text>
                <text x="532" y="164">H(fullsid,</text>
                <text x="596" y="164">tr1,</text>
                <text x="636" y="164">tr2,</text>
                <text x="676" y="164">SK1,</text>
                <text x="712" y="164">SK2</text>
                <text x="808" y="164">Session</text>
                <text x="32" y="180">key</text>
                <text x="808" y="180">key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
            +-------------------------------------------------------------------------------+
Client's    | CPaceOQUAKE                     +----------+                                  |    Server's
password ---)-------------+---PRS------------>|  CPace   +<--PRS---------+------------------(--- password
            |             |         +---------+ protocol +-+             |                  |
            |             |         |         +----------+ |             |                  |
            |             |         |                      +-------------(---------+        |
            |             v         v         +----------+               v         v        |
            | H(fullsid, PRS, tr1, SK1)------>|  OQUAKE  +<--H(fullsid, PRS, tr1, SK1)      |
Session <---)-H(fullsid, tr1, tr2, SK1, SK2)--+ protocol +---H(fullsid, tr1, tr2, SK1, SK2)-(--> Session
  key       |                                 +----------+                                  |      key
            +-------------------------------------------------------------------------------+
]]></artwork>
        </artset>
        <t>Unlike OQUAKE, CPaceOQUAKE does not require a shared session identifier sid, although this
is strongly recommended. If no sid is provided, CPace will run without an sid, and OQUAKE
will use a random string generated with random material provided by both parties. If an
sid is provided, both CPace and OQUAKE will use this sid.</t>
        <t>An overview of the protocol flow is shown below. The protocol has four functions. Init and
InitiatorFinish are intended to be called by the initiator, and Respond and ResponderFinish
are intended to be called by the responder. The following subsections specify these functions.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="432" width="520" viewBox="0 0 520 432" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 112,96 L 112,240" fill="none" stroke="black"/>
              <path d="M 112,288 L 112,392" fill="none" stroke="black"/>
              <path d="M 352,56 L 352,144" fill="none" stroke="black"/>
              <path d="M 352,184 L 352,336" fill="none" stroke="black"/>
              <path d="M 72,48 L 392,48" fill="none" stroke="black"/>
              <path d="M 120,128 L 344,128" fill="none" stroke="black"/>
              <path d="M 120,224 L 344,224" fill="none" stroke="black"/>
              <path d="M 120,320 L 344,320" fill="none" stroke="black"/>
              <path d="M 72,400 L 392,400" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="352,320 340,314.4 340,325.6" fill="black" transform="rotate(0,344,320)"/>
              <polygon class="arrowhead" points="352,128 340,122.4 340,133.6" fill="black" transform="rotate(0,344,128)"/>
              <polygon class="arrowhead" points="128,224 116,218.4 116,229.6" fill="black" transform="rotate(180,120,224)"/>
              <g class="text">
                <text x="32" y="36">Client:</text>
                <text x="112" y="36">PRS,sid,U,S</text>
                <text x="240" y="36">Server:</text>
                <text x="320" y="36">PRS,sid,U,S</text>
                <text x="64" y="68">ctx1,</text>
                <text x="108" y="68">(s1,</text>
                <text x="152" y="68">msg1)</text>
                <text x="184" y="68">=</text>
                <text x="120" y="84">CPaceOQUAKE.Init(PRS,sid,U,S)</text>
                <text x="204" y="116">(s1,</text>
                <text x="248" y="116">msg1)</text>
                <text x="264" y="164">ctx2,</text>
                <text x="308" y="164">(s2,</text>
                <text x="352" y="164">msg2,</text>
                <text x="400" y="164">msg3)</text>
                <text x="432" y="164">=</text>
                <text x="324" y="180">CPaceOQUAKE.Respond(PRS,(s1,msg1),sid,U,S)</text>
                <text x="184" y="212">s2,</text>
                <text x="224" y="212">msg2,</text>
                <text x="268" y="212">msg3</text>
                <text x="80" y="260">client_key,</text>
                <text x="148" y="260">msg4</text>
                <text x="176" y="260">=</text>
                <text x="132" y="276">CPaceOQUAKE.InitiatorFinish(PRS,</text>
                <text x="280" y="276">...</text>
                <text x="56" y="292">(ctx1,s1),(s2</text>
                <text x="192" y="292">msg2,msg3),sid,U,S)</text>
                <text x="228" y="308">msg4</text>
                <text x="340" y="356">server_key</text>
                <text x="392" y="356">=</text>
                <text x="336" y="372">CPaceOQUAKE.ResponderFinish(ctx2,</text>
                <text x="496" y="372">msg4)</text>
                <text x="352" y="388">|</text>
                <text x="68" y="420">output</text>
                <text x="140" y="420">client_key</text>
                <text x="316" y="420">output</text>
                <text x="388" y="420">server_key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
Client: PRS,sid,U,S       Server: PRS,sid,U,S
        -----------------------------------------
     ctx1, (s1, msg1) =                    |
CPaceOQUAKE.Init(PRS,sid,U,S)              |
             |                             |
             |         (s1, msg1)          |
             |---------------------------->|
             |                             |
             |                ctx2, (s2, msg2, msg3) =
             |     CPaceOQUAKE.Respond(PRS,(s1,msg1),sid,U,S)
             |                             |
             |       s2, msg2, msg3        |
             |<----------------------------|
             |                             |
    client_key, msg4 =                     |
CPaceOQUAKE.InitiatorFinish(PRS, ...       |
(ctx1,s1),(s2,msg2,msg3),sid,U,S)          |
             |            msg4             |
             |---------------------------->|
             |                             |
             |                       server_key =
             |           CPaceOQUAKE.ResponderFinish(ctx2, msg4)
             |                             |
        -----------------------------------------
     output client_key              output server_key
]]></artwork>
        </artset>
        <section anchor="client-initiation">
          <name>Client Initiation</name>
          <t>The client initiates a CPace exchange with the server using input PRS, an optional session identifier sid,
and optional client and server identifiers U and S. The output of this process is some context for
completing the protocol and a protocol message. The client sends this message to the server.</t>
          <artwork><![CDATA[
CPaceOQUAKE.Init

Input:
- PRS, password-related string, a byte string
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- context, opaque state for the initiator to store
- msg, an encoded protocol message for the initiator to send to the responder

Parameters:
- CPace, parameterized instance of CPace

def Init(PRS, sid, U, S):
  ctx1, msg1 = CPace.Init(PRS, sid, U, S)
  s1 = random(32)
  init_msg = s1 || lv_encode(msg1)

  return (ctx1, s1), init_msg
]]></artwork>
        </section>
        <section anchor="server-response">
          <name>Server Response</name>
          <t>The server processes the client message using its input PRS, an optional session identifier sid, and
optional client and server identifiers U and S. The first output of this function is a context that
is used to finish the protocol later. The second output is a protocol message intended for the client.</t>
          <t>The server responds to the CPace session that the client initiated, and it initiates a new OQUAKE
session using both the PRS and the key established by CPace.</t>
          <t>The server <bcp14>MUST</bcp14> ensure that exactly one of <tt>s1</tt> and <tt>sid</tt> exists. It <bcp14>MUST</bcp14> abort if the message does
not have the correct length.</t>
          <artwork><![CDATA[
CPaceOQUAKE.Respond

Input:
- PRS, password-related string, a byte string
- init_msg, the message received from the client
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- context, opaque state for the responder to store
- msg, an encoded protocol message for the responder to send to the initiator

Parameters:
- CPace, parameterized instance of CPace
- OQUAKE, parameterized instance of OQUAKE
- DST, domain separation tag, a byte string

def Respond(PRS, init_msg, sid, U, S):
  s1, msg1 = init_msg[0..32], lv_decode(init_msg[32..])

  key1, msg2 = CPace.Respond(PRS, msg1, sid, U, S)
  key1A = KDF.Expand(key1, DST || "prskey", Nkey)
  key1B = KDF.Expand(key1, DST || "outputkey", Nkey)

  s2 = random(32)
  prk_extended_sid = KDF.Extract(s1 || s2, DST || "CPaceOQUAKE")
  extended_sid = KDF.Expand(prk_extended_sid, DST || "SID", 32)

  fullsid = encode_sid(extended_sid, U, S)

  prk_PRS2 = KDF.Extract(PRS, DST || "CPaceOQUAKE" || fullsid || msg1 || msg2 || key1A)
  PRS2 = KDF.Expand(prk_PRS2, DST || "PRS2", Nkey)

  ctx2, msg3 = OQUAKE.Init(PRS2, extended_sid, U, S)

  resp_msg = s2 || lv_encode(msg2) || lv_encode(msg3)

  return Context(fullsid, PRS, msg1, msg2, msg3, key1B, ctx2), resp_msg
]]></artwork>
        </section>
        <section anchor="client-finish">
          <name>Client Finish</name>
          <t>The client finishes the protocol by processing the server response. The client obtains a
shared secret and a final message intended for the server. It does so by finishing the
CPace session and responding to the OQUAKE session.</t>
          <t>The client must ensure that exactly one of (s1, s2) and sid exists.
The client should abort when the message does not have the correct length.</t>
          <artwork><![CDATA[
CPaceOQUAKE.InitiatorFinish

Input:
- PRS, password-related string, a byte string
- (ctx1, s1), the context generated by CPaceOQUAKE.Init
- resp_msg, the message received from the server
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- key, an N-byte shared secret
- msg, an encoded protocol message for the initiator to send to the responder

Parameters:
- CPace, parameterized instance of CPace
- OQUAKE, parameterized instance of OQUAKE
- DST, domain separation tag, a byte string

def InitiatorFinish(PRS, (ctx1, s1), resp_msg, sid, U, S):
  s2 = resp_msg[0..32]
  msg2 = lv_decode(resp_msg[32..])
  msg3 = lv_decode(resp_msg[32+len(msg2)..])

  key1 = CPace.Finish(ctx1, msg2, sid)
  key1A = KDF.Expand(key1, DST || "prskey", Nkey)
  key1B = KDF.Expand(key1, DST || "outputkey", Nkey)

  prk_extended_sid = KDF.Extract(s1 || s2, DST || "CPaceOQUAKE")
  extended_sid = KDF.Expand(prk_extended_sid, DST || "SID", 32)

  fullsid = encode_sid(extended_sid, U, S)
  prk_PRS2 = KDF.Extract(PRS, DST || "CPaceOQUAKE" || fullsid || msg1 || msg2 || key1A)
  PRS2 = KDF.Expand(prk_PRS2, DST || "PRS2", Nkey)

  key2, msg4 = OQUAKE.Respond(PRS2, msg3, extended_sid, U, S)

  prk_sessionkey = KDF.Extract(PRS, DST || "CPaceOQUAKE" || fullsid || msg1 || msg2 || msg3 || msg4 || key1B || key2)
  client_key = KDF.Expand(prk_sessionkey, DST || "sessionkey", Nkey)

  return client_key, msg4
]]></artwork>
        </section>
        <section anchor="server-finish">
          <name>Server Finish</name>
          <t>The server finishes the protocol by finising OQUAKE using the client's response, outputting a shared secret of N bytes.
It should abort when the message does not have the correct length.</t>
          <artwork><![CDATA[
CPaceOQUAKE.ResponderFinish

Input:
- ctx, context from the server's Response
- msg4, the message received from the server, a byte string

Output:
- key, an N-byte shared secret

Parameters:
- OQUAKE, parameterized instance of OQUAKE
- DST, domain separation tag, a byte string

def ResponderFinish(ctx, msg4):
  (fullsid, PRS, msg1, msg2, msg3, key1B, ctx2) = ctx

  key2 = OQUAKE.Finish(ctx2, msg4)

  prk_sessionkey = KDF.Extract(PRS, DST || "CPaceOQUAKE" || fullsid || msg1 || msg2 || msg3 || msg4 || key1B || key2)
  server_key = KDF.Expand(prk_sessionkey, DST || "sessionkey", Nkey)

  return server_key
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="CPaceOQUAKEplus">
      <name>CPaceOQUAKE+ Protocol</name>
      <t>CPaceOQUAKE+ is the 5 message aPAKE resulting from applying a KEM-based
PAKE-to-aPAKE transformation to CPaceOQUAKE. At a high level, this
involves running CPaceOQUAKE on a verifier of the client's password.
To ensure that the client does indeed know the password pertaining
to that verifier, there is an additional password confirmation
stage that uses seed derived from the password. Both the verifier and
the seed are derived from the password using a key stretching function.
The seed is later used to derive a KEM public key. We refer to the collection
of the verifier and this public key as 'the verifiers'.</t>
      <t>The CPaceOQUAKE+ protocol can be seen as a close variant (and a specific
instance) of the `augmented PAKE' construction presented in <xref target="LLH24"/> and in <xref target="Gu24"/>.</t>
      <section anchor="registering-clients">
        <name>Registering Clients</name>
        <t>This subsection specifies functions for generating the verifiers and
a protocol for registering clients.</t>
        <section anchor="gen-verifiers">
          <name>Generating Verifiers</name>
          <t>Verifiers are random-looking value derived from password-related strings
from which it is computionally impractical to derive the password-related
string. To make verifiers unique between different users with the same
password or servers that they interact with, we employ a salt, a user
account identifier, and an optional server identifier. The material
required for the verifiers is generated as follows:</t>
          <artwork><![CDATA[
GenVerifierMaterial

Input:
- PRS, password-related string, a byte string
- salt, client-specific salt, a byte string
- U and S, client and server identifiers

Output:
- ss, output shared secret, a byte string of 32 bytes
- resp_msg, encoded protocol message, a byte string

Parameters:
- KEM, a KEM instance
- KSF, a parameterized KSF instance
- DST, domain separation tag, a byte string

def GenVerifierMaterial(PRS, salt, U, S):
  verifier_seed = KSF.Stretch(DST || PRS || U || S, salt, Nverifier + KEM.Nseed)
  verifier = verifier_seed[0:Nverifier]
  seed = verifier_seed[Nverifier:Nverifier + KEM.Nseed]
  return verifier, seed
]]></artwork>
          <t>To derive an actual public key from the verifier material, we use the following function:</t>
          <artwork><![CDATA[
GenVerifiers

Input:
- PRS, password-related string, a byte string
- salt, client-specific salt, a byte string
- U and S, client and server identifiers

Output:
- ss, output shared secret, a byte string of 32 bytes
- resp_msg, encoded protocol message, a byte string

Parameters:
- KEM, a KEM instance

def GenVerifiers(PRS, salt, U, S):
  verifier, seed = GenVerifierMaterial(PRS, salt, U, S)
  (pk, sk) = KEM.DeriveKeyPair(seed)
  return verifier, pk
]]></artwork>
          <t>The server <bcp14>MUST</bcp14> store pk; it <bcp14>MUST NOT</bcp14> store seed.</t>
        </section>
        <section anchor="registration">
          <name>Registration</name>
          <t>The registration phase consists of one message sent from the client to the server. This message
contains the verifier, a public key, and 32-byte salt. The server stores this information corresponding to
the client for future use in the verification flow. This phase requires a secure channel from client to
server in order to transfer the password verifier and public key.
The salt can be sent in plain text.</t>
          <t>We recommend that the salt is a random byte string: <tt>salt = random(32)</tt>. However, in practice this
may require an additional communication flow, used by the server to send the salt to the client
before protocol CPaceOQUAKE+ starts. Instead, one may consider deriving the salt from some
client-specific value that it knows and can retain locally.</t>
          <t>A high level flow overview of the registration flow is below.</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="440" viewBox="0 0 440 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 104,80 L 104,168" fill="none" stroke="black"/>
                <path d="M 328,80 L 328,168" fill="none" stroke="black"/>
                <path d="M 64,48 L 368,48" fill="none" stroke="black"/>
                <path d="M 112,112 L 320,112" fill="none" stroke="black"/>
                <path d="M 64,176 L 368,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="328,112 316,106.4 316,117.6" fill="black" transform="rotate(0,320,112)"/>
                <g class="text">
                  <text x="32" y="36">Client:</text>
                  <text x="84" y="36">PRS,</text>
                  <text x="128" y="36">salt,</text>
                  <text x="164" y="36">U,</text>
                  <text x="184" y="36">S</text>
                  <text x="328" y="36">Server:</text>
                  <text x="376" y="36">N/A</text>
                  <text x="24" y="68">(v,</text>
                  <text x="56" y="68">pk)</text>
                  <text x="80" y="68">=</text>
                  <text x="160" y="68">GenVerifiers(PRS,</text>
                  <text x="256" y="68">salt,</text>
                  <text x="292" y="68">U,</text>
                  <text x="316" y="68">S)</text>
                  <text x="160" y="100">salt,</text>
                  <text x="196" y="100">v,</text>
                  <text x="224" y="100">pk,</text>
                  <text x="252" y="100">U,</text>
                  <text x="272" y="100">S</text>
                  <text x="256" y="148">Store</text>
                  <text x="304" y="148">(salt</text>
                  <text x="348" y="148">v,</text>
                  <text x="376" y="148">pk,</text>
                  <text x="404" y="148">U,</text>
                  <text x="428" y="148">S)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client: PRS, salt, U, S              Server: N/A
       ---------------------------------------
 (v, pk) = GenVerifiers(PRS, salt, U, S)
            |                           |
            |    salt, v, pk, U, S      |
            |-------------------------->|
            |                           |
            |                Store (salt, v, pk, U, S)
            |                           |
       ---------------------------------------
]]></artwork>
          </artset>
        </section>
      </section>
      <section anchor="pcp">
        <name>The Password Confirmation Stage</name>
        <t>In the password confirmation (PC) stage, the client proves knowledge
of its password without revealing it. It uses the registered verifiers from the
previous subsection. To do so securely, it uses the key established by CPaceOQUAKE,
which allows it to realize a confidential but unauthenticated channel.
In other words, this password confirmation stage cannot be used by itself.
This PC stage is parameterized by a KEM, KDF, KSF, and is additionally bound
to the preceding protocol via an agreed-upon transcript (tx); see <xref target="configurations"/>
for specific parameter configurations.</t>
        <t>The password confirmation is a two-round challenge-response flow between the
server and client. In particular, the server challenges the client to prove
knowledge of its password. More precisely, it challenges the client to prove
knowledge of a seed, derived from the GenVerifierMaterial function (and
in turn derived from the password using a key stretching function).
Both client and server share a symmetric key as input. Additionally, the server
has the client's public key and salt stored from the previous registration flow.</t>
        <t>A high level overview of this flow is below.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="568" viewBox="0 0 568 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 104,80 L 104,128" fill="none" stroke="black"/>
              <path d="M 104,160 L 104,208" fill="none" stroke="black"/>
              <path d="M 328,80 L 328,128" fill="none" stroke="black"/>
              <path d="M 328,160 L 328,208" fill="none" stroke="black"/>
              <path d="M 64,48 L 368,48" fill="none" stroke="black"/>
              <path d="M 112,112 L 320,112" fill="none" stroke="black"/>
              <path d="M 112,192 L 320,192" fill="none" stroke="black"/>
              <path d="M 64,256 L 368,256" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="328,192 316,186.4 316,197.6" fill="black" transform="rotate(0,320,192)"/>
              <polygon class="arrowhead" points="120,112 108,106.4 108,117.6" fill="black" transform="rotate(180,112,112)"/>
              <g class="text">
                <text x="32" y="36">Client:</text>
                <text x="80" y="36">SK,</text>
                <text x="112" y="36">tx,</text>
                <text x="152" y="36">seed,</text>
                <text x="196" y="36">sid,</text>
                <text x="228" y="36">U,</text>
                <text x="248" y="36">S</text>
                <text x="328" y="36">Server:</text>
                <text x="376" y="36">SK,</text>
                <text x="408" y="36">tx,</text>
                <text x="440" y="36">pk,</text>
                <text x="476" y="36">sid,</text>
                <text x="508" y="36">U,</text>
                <text x="528" y="36">S</text>
                <text x="100" y="68">ctx,</text>
                <text x="160" y="68">challenge</text>
                <text x="208" y="68">=</text>
                <text x="284" y="68">PC-Challenge(SK,</text>
                <text x="368" y="68">tx,</text>
                <text x="400" y="68">pk,</text>
                <text x="436" y="68">sid,</text>
                <text x="468" y="68">U,</text>
                <text x="492" y="68">S)</text>
                <text x="216" y="100">challenge</text>
                <text x="48" y="148">client_key,</text>
                <text x="132" y="148">response</text>
                <text x="176" y="148">=</text>
                <text x="248" y="148">PC-Response(SK,</text>
                <text x="328" y="148">tx,</text>
                <text x="368" y="148">seed,</text>
                <text x="436" y="148">challenge,</text>
                <text x="500" y="148">sid,</text>
                <text x="532" y="148">U,</text>
                <text x="556" y="148">S)</text>
                <text x="212" y="180">response</text>
                <text x="172" y="228">server_key</text>
                <text x="224" y="228">=</text>
                <text x="292" y="228">PC-Verify(ctx,</text>
                <text x="392" y="228">response)</text>
                <text x="104" y="244">|</text>
                <text x="328" y="244">|</text>
                <text x="44" y="276">output</text>
                <text x="116" y="276">client_key</text>
                <text x="276" y="276">output</text>
                <text x="348" y="276">server_key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
Client: SK, tx, seed, sid, U, S      Server: SK, tx, pk, sid, U, S
       ---------------------------------------
          ctx, challenge = PC-Challenge(SK, tx, pk, sid, U, S)
            |                           |
            |         challenge         |
            |<--------------------------|
            |                           |
client_key, response = PC-Response(SK, tx, seed, challenge, sid, U, S)
            |                           |
            |         response          |
            |-------------------------->|
            |                           |
                server_key = PC-Verify(ctx, response)
            |                           |
       ---------------------------------------
  output client_key            output server_key
]]></artwork>
        </artset>
        <section anchor="server-challenge">
          <name>Server Challenge</name>
          <t>To construct the challenge, the server encapsulates to the client's public
key. From the resulting shared secret, it then derives password confirmation
values and a new shared secret. The challenge message is the ciphertext encrypted
using a one-time pad derived from the shared secret. The password confirmation
values are byte strings of length <tt>Nkc</tt>.</t>
          <t>The implementation <bcp14>MUST NOT</bcp14> reveal server_key from the context.</t>
          <artwork><![CDATA[
PC-Challenge

Input:
- SK, 32-byte symmetric key, a byte string
- transcript, the transcript from previously executed protocols to which this protocol is bound, a byte string
- pk, client-registered public key, a KEM public key
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- context, opaque state for the server to store values to complete the protocol
- challenge, an encoded protocol message for the server to send to the client

Parameters:
- KEM, a KEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

def PC-Challenge(SK, transcript, pk, sid, U, S):
  (c, k) = KEM.Encaps(pk)
  r = KDF.Expand(SK, DST || "OTP", Nct)
  enc_c = XOR(c, r)

  confirm_input = encode_sid(sid, U, S) || enc_c || transcript

  prk_k_h1 = KDF.Extract(SK, DST || "h1" || confirm_input)
  prk_k_h2 = KDF.Extract(SK, DST || "h2" || confirm_input || k)

  // Derive h1 from the full transcript excluding k
  client_confirm = KDF.Expand(prk_k_h1, DST || "client_confirm", Nkc)

  // Derive h2 || SK from the full transcript including k
  server_confirm = KDF.Expand(prk_k_h2, DST || "server_confirm", Nkc)
  server_key = KDF.Expand(prk_k_h2, DST || "key", Nkey)

  challenge = (enc_c, client_confirm)

  return Context(server_confirm, server_key), challenge
]]></artwork>
        </section>
        <section anchor="client-response">
          <name>Client Response</name>
          <t>Upon receipt of the challenge, the client recovers the KEM ciphertext by decrypting
the one-time pad ciphertext included in the challenge, using the key derived from the shared secret.
It then uses the seed to re-derive the KEM key pair, using the same procedure followed during
the registration flow. The client then decapsulates the KEM ciphertext to recover
the shared secret and derive the same password confirmation values and new
shared secret as the server.</t>
          <t>The client then checks that the server-provided confirmation value matches its
own and aborts if not. Otherwise, it returns its own password confirmation value.
The client outputs the new shared secret as its output.</t>
          <artwork><![CDATA[
PC-Response

Input:
- SK, 32-byte symmetric key, a byte string
- transcript, the transcript from previously executed protocols to which this protocol is bound, a byte string
- seed, seed used to derive KEM public key
- challenge, an encoded protocol message for the server to send to the client
- sid, session identifier, a byte string
- U and S, client and server identifiers

Output:
- client_key, a 32-byte string
- response, an encoded protocol message for the client to send to the server

Exceptions:
- AuthenticationError, raised when the password confirmation values do not match

Parameters:
- KEM, a KEM instance
- KDF, a KDF instance
- DST, domain separation tag, a byte string

def PC-Response(SK, transcript, seed, challenge, sid, U, S):
  (enc_c, client_confirm_target) = challenge
  r = KDF.Expand(SK, DST || "OTP", Nct)
  c = XOR(enc_c, r)

  (pk, sk) = KEM.DeriveKeyPair(seed)

  try:
    k = KEM.Decaps(sk, c)

    confirm_input = encode_sid(sid, U, S) || enc_c || transcript

    prk_k_h1 = KDF.Extract(SK, DST || "h1" || confirm_input)
    prk_k_h2 = KDF.Extract(SK, DST || "h2" || confirm_input || k)

    // Derive h1 from the full transcript excluding k
    client_confirm = KDF.Expand(prk_k_h1, DST || "client_confirm", Nkc)

    // Derive h2 || SK from the full transcript including k
    server_confirm = KDF.Expand(prk_k_h2, DST || "server_confirm", Nkc)
    client_key = KDF.Expand(prk_k_h2, DST || "key", Nkey)

    if client_confirm != client_confirm_target:
      raise AuthenticationError

    return client_key, server_confirm
  catch DecapsError:
    raise AuthenticationError
]]></artwork>
        </section>
        <section anchor="server-verify">
          <name>Server Verify</name>
          <t>Upon receipt of the response, the server validates that the password confirmation
value matches its own value. If the value does not match, the server aborts.
Otherwise, the server outputs the new shared secret as its output.</t>
          <artwork><![CDATA[
PC-Verify

Input:
- context, opaque context produced by Challenge
- server_confirm_target, client's response message, a byte string

Output:
- server_key, a 32-byte string

Exceptions:
- AuthenticationError, raised when the password confirmation values do not match

Parameters:

def PC-Verify(context, server_confirm_target):
  (server_confirm, server_key) = context
  if server_confirm != server_confirm_target:
    raise AuthenticationError
  return server_key
]]></artwork>
        </section>
      </section>
      <section anchor="composition-of-cpaceoquake-password-confirmation">
        <name>Composition of CPaceOQUAKE &amp; Password Confirmation</name>
        <t>The composition of CPaceOQUAKE and the password confirmation stage is
strictly sequential. First, the parties run CPaceOQUAKE using the verifier.
The client recovers this verifier using the <tt>GenVerifierMaterial</tt> function.
After that, the parties proceed with password confirmation, which is
initiated by the server using the stored public key. The client uses the
seed that was also produced by <tt>GenVerifierMaterial</tt> to prove knowledge of
the password. This seed <bcp14>MUST</bcp14> remain secret to prevent impersonation. An
overview of the composition is below.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="400" width="584" viewBox="0 0 584 400" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 96,32 L 96,88" fill="none" stroke="black"/>
              <path d="M 96,104 L 96,344" fill="none" stroke="black"/>
              <path d="M 96,360 L 96,384" fill="none" stroke="black"/>
              <path d="M 168,112 L 168,320" fill="none" stroke="black"/>
              <path d="M 200,112 L 200,144" fill="none" stroke="black"/>
              <path d="M 296,208 L 296,240" fill="none" stroke="black"/>
              <path d="M 296,272 L 296,304" fill="none" stroke="black"/>
              <path d="M 312,64 L 312,240" fill="none" stroke="black"/>
              <path d="M 312,272 L 312,288" fill="none" stroke="black"/>
              <path d="M 312,336 L 312,352" fill="none" stroke="black"/>
              <path d="M 328,96 L 328,144" fill="none" stroke="black"/>
              <path d="M 328,176 L 328,224" fill="none" stroke="black"/>
              <path d="M 416,96 L 416,144" fill="none" stroke="black"/>
              <path d="M 416,176 L 416,224" fill="none" stroke="black"/>
              <path d="M 432,64 L 432,240" fill="none" stroke="black"/>
              <path d="M 432,272 L 432,288" fill="none" stroke="black"/>
              <path d="M 432,336 L 432,352" fill="none" stroke="black"/>
              <path d="M 448,208 L 448,240" fill="none" stroke="black"/>
              <path d="M 448,272 L 448,304" fill="none" stroke="black"/>
              <path d="M 472,32 L 472,136" fill="none" stroke="black"/>
              <path d="M 472,152 L 472,312" fill="none" stroke="black"/>
              <path d="M 472,328 L 472,344" fill="none" stroke="black"/>
              <path d="M 472,360 L 472,384" fill="none" stroke="black"/>
              <path d="M 96,32 L 472,32" fill="none" stroke="black"/>
              <path d="M 312,64 L 432,64" fill="none" stroke="black"/>
              <path d="M 136,80 L 280,80" fill="none" stroke="black"/>
              <path d="M 80,96 L 112,96" fill="none" stroke="black"/>
              <path d="M 328,96 L 416,96" fill="none" stroke="black"/>
              <path d="M 136,112 L 280,112" fill="none" stroke="black"/>
              <path d="M 200,144 L 216,144" fill="none" stroke="black"/>
              <path d="M 288,144 L 304,144" fill="none" stroke="black"/>
              <path d="M 328,144 L 416,144" fill="none" stroke="black"/>
              <path d="M 440,144 L 488,144" fill="none" stroke="black"/>
              <path d="M 328,176 L 416,176" fill="none" stroke="black"/>
              <path d="M 296,208 L 312,208" fill="none" stroke="black"/>
              <path d="M 432,208 L 448,208" fill="none" stroke="black"/>
              <path d="M 328,224 L 416,224" fill="none" stroke="black"/>
              <path d="M 312,240 L 432,240" fill="none" stroke="black"/>
              <path d="M 328,256 L 416,256" fill="none" stroke="black"/>
              <path d="M 296,304 L 312,304" fill="none" stroke="black"/>
              <path d="M 432,304 L 448,304" fill="none" stroke="black"/>
              <path d="M 168,320 L 216,320" fill="none" stroke="black"/>
              <path d="M 256,320 L 312,320" fill="none" stroke="black"/>
              <path d="M 432,320 L 488,320" fill="none" stroke="black"/>
              <path d="M 72,352 L 312,352" fill="none" stroke="black"/>
              <path d="M 432,352 L 496,352" fill="none" stroke="black"/>
              <path d="M 328,368 L 416,368" fill="none" stroke="black"/>
              <path d="M 96,384 L 472,384" fill="none" stroke="black"/>
              <path d="M 136,80 C 127.16936,80 120,87.16936 120,96" fill="none" stroke="black"/>
              <path d="M 280,80 C 288.83064,80 296,87.16936 296,96" fill="none" stroke="black"/>
              <path d="M 136,112 C 127.16936,112 120,104.83064 120,96" fill="none" stroke="black"/>
              <path d="M 280,112 C 288.83064,112 296,104.83064 296,96" fill="none" stroke="black"/>
              <path d="M 328,256 C 319.16936,256 312,263.16936 312,272" fill="none" stroke="black"/>
              <path d="M 416,256 C 424.83064,256 432,263.16936 432,272" fill="none" stroke="black"/>
              <path d="M 328,368 C 319.16936,368 312,360.83064 312,352" fill="none" stroke="black"/>
              <path d="M 416,368 C 424.83064,368 432,360.83064 432,352" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="504,352 492,346.4 492,357.6" fill="black" transform="rotate(0,496,352)"/>
              <path class="jump" d="M 472,360 C 466,360 466,344 472,344" fill="none" stroke="black"/>
              <path class="jump" d="M 472,328 C 466,328 466,312 472,312" fill="none" stroke="black"/>
              <path class="jump" d="M 472,152 C 466,152 466,136 472,136" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="448,144 436,138.4 436,149.6" fill="black" transform="rotate(180,440,144)"/>
              <polygon class="arrowhead" points="440,320 428,314.4 428,325.6" fill="black" transform="rotate(180,432,320)"/>
              <polygon class="arrowhead" points="440,304 428,298.4 428,309.6" fill="black" transform="rotate(180,432,304)"/>
              <polygon class="arrowhead" points="320,320 308,314.4 308,325.6" fill="black" transform="rotate(0,312,320)"/>
              <polygon class="arrowhead" points="320,304 308,298.4 308,309.6" fill="black" transform="rotate(0,312,304)"/>
              <polygon class="arrowhead" points="312,144 300,138.4 300,149.6" fill="black" transform="rotate(0,304,144)"/>
              <polygon class="arrowhead" points="120,96 108,90.4 108,101.6" fill="black" transform="rotate(0,112,96)"/>
              <path class="jump" d="M 96,360 C 102,360 102,344 96,344" fill="none" stroke="black"/>
              <path class="jump" d="M 96,104 C 102,104 102,88 96,88" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="80,352 68,346.4 68,357.6" fill="black" transform="rotate(180,72,352)"/>
              <g class="text">
                <text x="156" y="52">CPaceOQUAKE+</text>
                <text x="36" y="84">Client's</text>
                <text x="368" y="84">CPaceOQUAKE</text>
                <text x="36" y="100">password</text>
                <text x="208" y="100">GenVerifierMaterial</text>
                <text x="368" y="116">CPace</text>
                <text x="372" y="132">protocol</text>
                <text x="252" y="148">Verifier</text>
                <text x="532" y="148">Verifier</text>
                <text x="372" y="196">OQUAKE</text>
                <text x="372" y="212">protocol</text>
                <text x="292" y="260">SK</text>
                <text x="452" y="260">SK</text>
                <text x="372" y="308">Password</text>
                <text x="236" y="324">seed</text>
                <text x="372" y="324">confirmation</text>
                <text x="524" y="324">Public</text>
                <text x="568" y="324">key</text>
                <text x="32" y="356">Session</text>
                <text x="536" y="356">Session</text>
                <text x="32" y="372">key</text>
                <text x="536" y="372">key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
           +----------------------------------------------+
           | CPaceOQUAKE+                                 |
           |                          +--------------+    |
Client's   |   .-------------------.  | CPaceOQUAKE  |    |
password --)->| GenVerifierMaterial + | +----------+ |    |
           |   '----+---+----------'  | |  CPace   | |    |
           |        |   |             | | protocol | |    |
           |        |   +--Verifier-->| +----------+ |<---(-- Verifier
           |        |                 |              |    |
           |        |                 | +----------+ |    |
           |        |                 | |  OQUAKE  | |    |
           |        |               +-+ | protocol | +-+  |
           |        |               | | +----------+ | |  |
           |        |               | +--------------+ |  |
           |        |              SK  .------------.  SK |
           |        |               | |              | |  |
           |        |               | |              | |  |
           |        |               +->   Password   <-+  |
           |        +------seed-------> confirmation <----(-- Public key
           |                          |              |    |
Session <--)--------------------------+              +----(--> Session
  key      |                           '------------'     |      key
           +----------------------------------------------+
]]></artwork>
        </artset>
        <t>Upon successful completion of the entire protocol, the client and server will share a
symmetric key that was authenticated by knowledge of the password. The protocol
aborts if the password did not match. The protocol flows are shown below.
Note here that if the client does not know the salt, the server must send
it to the client before the protocol starts, which it can do in plain text.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="608" width="568" viewBox="0 0 568 608" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 104,96 L 104,224" fill="none" stroke="black"/>
              <path d="M 104,272 L 104,432" fill="none" stroke="black"/>
              <path d="M 104,480 L 104,568" fill="none" stroke="black"/>
              <path d="M 384,56 L 384,320" fill="none" stroke="black"/>
              <path d="M 384,384 L 384,448" fill="none" stroke="black"/>
              <path d="M 384,480 L 384,536" fill="none" stroke="black"/>
              <path d="M 88,48 L 400,48" fill="none" stroke="black"/>
              <path d="M 112,128 L 376,128" fill="none" stroke="black"/>
              <path d="M 112,208 L 376,208" fill="none" stroke="black"/>
              <path d="M 112,304 L 376,304" fill="none" stroke="black"/>
              <path d="M 112,416 L 376,416" fill="none" stroke="black"/>
              <path d="M 112,512 L 376,512" fill="none" stroke="black"/>
              <path d="M 88,576 L 400,576" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="392,168 380,162.4 380,173.6" fill="black" transform="rotate(90,384,168)"/>
              <polygon class="arrowhead" points="384,512 372,506.4 372,517.6" fill="black" transform="rotate(0,376,512)"/>
              <polygon class="arrowhead" points="384,304 372,298.4 372,309.6" fill="black" transform="rotate(0,376,304)"/>
              <polygon class="arrowhead" points="384,128 372,122.4 372,133.6" fill="black" transform="rotate(0,376,128)"/>
              <polygon class="arrowhead" points="120,416 108,410.4 108,421.6" fill="black" transform="rotate(180,112,416)"/>
              <polygon class="arrowhead" points="120,208 108,202.4 108,213.6" fill="black" transform="rotate(180,112,208)"/>
              <g class="text">
                <text x="32" y="36">Client:</text>
                <text x="132" y="36">PRS,salt,U,S,sid</text>
                <text x="272" y="36">Server:</text>
                <text x="356" y="36">v,pk,U,S,sid</text>
                <text x="16" y="68">(v,</text>
                <text x="56" y="68">seed)</text>
                <text x="88" y="68">=</text>
                <text x="232" y="68">GenVerifierMaterial(PRS,salt,U,S)</text>
                <text x="24" y="84">ctx1,</text>
                <text x="68" y="84">msg1</text>
                <text x="96" y="84">=</text>
                <text x="216" y="84">CPaceOQUAKE.Init(v,sid,U,S)</text>
                <text x="244" y="116">msg1</text>
                <text x="136" y="164">ctx2,</text>
                <text x="180" y="164">msg2</text>
                <text x="208" y="164">=</text>
                <text x="300" y="164">CPaceOQUAKE.Respond(</text>
                <text x="444" y="164">,msg1,sid,U,S)</text>
                <text x="244" y="196">msg2</text>
                <text x="16" y="244">SK,</text>
                <text x="52" y="244">msg3</text>
                <text x="80" y="244">=</text>
                <text x="204" y="244">CPaceOQUAKE.InitiatorFinish(</text>
                <text x="100" y="260">v,ctx1,msg2,sid,U,S)</text>
                <text x="244" y="292">msg3</text>
                <text x="228" y="340">SK</text>
                <text x="248" y="340">=</text>
                <text x="412" y="340">CPaceOQUAKE.ResponderFinish(ctx2,msg3)</text>
                <text x="228" y="356">tx</text>
                <text x="248" y="356">=</text>
                <text x="276" y="356">msg1</text>
                <text x="308" y="356">||</text>
                <text x="340" y="356">msg2</text>
                <text x="372" y="356">||</text>
                <text x="404" y="356">msg3</text>
                <text x="232" y="372">ctx3,</text>
                <text x="276" y="372">chal</text>
                <text x="304" y="372">=</text>
                <text x="436" y="372">PC-Challenge(SK,tx,pk,sid,U,S)</text>
                <text x="244" y="404">chal</text>
                <text x="60" y="452">tx</text>
                <text x="80" y="452">=</text>
                <text x="108" y="452">msg1</text>
                <text x="140" y="452">||</text>
                <text x="172" y="452">msg2</text>
                <text x="204" y="452">||</text>
                <text x="236" y="452">msg3</text>
                <text x="48" y="468">client_key,</text>
                <text x="116" y="468">resp</text>
                <text x="144" y="468">=</text>
                <text x="300" y="468">PC-Response(SK,tx,seed,chal,sid,U,S)</text>
                <text x="244" y="500">resp</text>
                <text x="300" y="548">server_key</text>
                <text x="352" y="548">=</text>
                <text x="424" y="548">PC-Verify(ctx2,</text>
                <text x="512" y="548">resp)</text>
                <text x="384" y="564">|</text>
                <text x="76" y="596">output</text>
                <text x="148" y="596">client_key</text>
                <text x="348" y="596">output</text>
                <text x="420" y="596">server_key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
Client: PRS,salt,U,S,sid      Server: v,pk,U,S,sid
          ----------------------------------------
(v, seed) = GenVerifierMaterial(PRS,salt,U,S)  |
ctx1, msg1 = CPaceOQUAKE.Init(v,sid,U,S)       |
            |                                  |
            |               msg1               |
            |--------------------------------->|
            |                                  |
            | ctx2, msg2 = CPaceOQUAKE.Respond(v,msg1,sid,U,S)
            |                                  |
            |               msg2               |
            |<---------------------------------|
            |                                  |
SK, msg3 = CPaceOQUAKE.InitiatorFinish(        |
  v,ctx1,msg2,sid,U,S)                         |
            |                                  |
            |               msg3               |
            |--------------------------------->|
            |                                  |
            |              SK = CPaceOQUAKE.ResponderFinish(ctx2,msg3)
            |              tx = msg1 || msg2 || msg3
            |             ctx3, chal = PC-Challenge(SK,tx,pk,sid,U,S)
            |                                  |
            |               chal               |
            |<---------------------------------|
            |                                  |
      tx = msg1 || msg2 || msg3                |
client_key, resp = PC-Response(SK,tx,seed,chal,sid,U,S)
            |                                  |
            |               resp               |
            |--------------------------------->|
            |                                  |
            |                   server_key = PC-Verify(ctx2, resp)
            |                                  |
          ----------------------------------------
      output client_key                 output server_key
]]></artwork>
        </artset>
      </section>
    </section>
    <section anchor="configurations">
      <name>CPaceOQUAKE+ Configurations</name>
      <t>CPaceOQUAKE+ is instantiated by selecting a configuration of a group and hash function
for the CPace protocol, a KEM, KDF, KSF, for password confirmation, and a KEM and KDF
for CPaceOQUAKE, and a general purpose cryptographic hash function H. The KEM, KDF,
are not required to be the same, so they are distinguished by "PC-" and "PAKE-"
prefixes, e.g., PC-KDF and PAKE-KDF are the KDFs for the password confirmation stage
and the CPaceOQUAKE protocol, respectively.</t>
      <t>The <bcp14>RECOMMENDED</bcp14> configuration is below.</t>
      <ul spacing="normal">
        <li>
          <t>CPace-Group: CPACE-RISTR255-SHA512 <xref section="4" sectionFormat="of" target="CPACE"/></t>
        </li>
        <li>
          <t>CPace-Hash: SHA-512</t>
        </li>
        <li>
          <t>KEM: X-Wing <xref target="XWING"/>, where Nseed = 32, Nct = 1120, and Npk = 1216.</t>
        </li>
        <li>
          <t>PC-KDF: HKDF-SHA-256</t>
        </li>
        <li>
          <t>PC-KSF: Argon2id(S = zeroes(16), p = 4, T = Nh, m = 2^21, t = 1, v = 0x13, K = nil, X = nil, y = 2) <xref target="ARGON2"/></t>
        </li>
        <li>
          <t>BUKEM: ML-BUKEM768 <xref target="deps-bukem"/>, where Nseed = 64, Nct = 1514, and Npk = 1172.</t>
        </li>
        <li>
          <t>PAKE-KDF: HKDF-SHA-256</t>
        </li>
        <li>
          <t>H: SHA256</t>
        </li>
        <li>
          <t>DST: "1b3abc3cd05e8054e8399bc38dfcbc1321d2e1b02da335ed1e8031ef5199f672" (a randomly generated 32-byte string)</t>
        </li>
      </ul>
      <t>The <bcp14>RECOMMENDED</bcp14> parameters are (see <xref target="params"/>):</t>
      <ul spacing="normal">
        <li>
          <t>Nverifier = 32</t>
        </li>
        <li>
          <t>Nkc = 64</t>
        </li>
        <li>
          <t>Nsec = 32</t>
        </li>
        <li>
          <t>Nkey = 32, this is achieved by choosing H in CPace with H.b_in_bytes = 32</t>
        </li>
      </ul>
      <t>Other documents can define configurations as needed for their use case, subject to the following requirements:</t>
      <ol spacing="normal" type="1"><li>
          <t>KEM <bcp14>MUST</bcp14> be a hybrid KEM, i.e., one that achieves both classical and post-quantum security.</t>
        </li>
        <li>
          <t>The parameters must be chosen so they correspond with this KEM. E.g., Nseed must have the correct length.</t>
        </li>
      </ol>
      <t>For instance, one possible additional configuration is as follows.</t>
      <ul spacing="normal">
        <li>
          <t>CPace-Group: CPACE-P256<em>XMD:SHA-256_SSWU_NU</em>-SHA256 <xref section="4" sectionFormat="of" target="CPACE"/></t>
        </li>
        <li>
          <t>CPace-Hash: SHA-256</t>
        </li>
        <li>
          <t>KEM: X-Wing <xref target="XWING"/>, where Nseed = 32, Nct = 1120, and Npk = 1216.</t>
        </li>
        <li>
          <t>PC-KDF: HKDF-SHA-256</t>
        </li>
        <li>
          <t>PC-KSF: Scrypt(N = 32768, r = 8, p = 1) <xref target="SCRYPT"/></t>
        </li>
        <li>
          <t>BUKEM: ML-BUKEM768 <xref target="deps-bukem"/>, where Nseed = 64, Nct = 1514, and Npk = 1172.</t>
        </li>
        <li>
          <t>PAKE-KDF: HKDF-SHA-256</t>
        </li>
        <li>
          <t>H: SHA256</t>
        </li>
        <li>
          <t>DST: "b840fa4d4b4caec9e25d13d8c016cfe93e7468d54e936490bd0b0a3ffca1a01b" (a randomly generated 32-byte string)</t>
        </li>
      </ul>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <t>Some functions included in this specification are fallible (as noted by their ability
to raise exceptions). The explicit errors generated
throughout this specification, along with conditions that lead to each error,
are as follows:</t>
      <ul spacing="normal">
        <li>
          <t>AuthenticationError: The PC protocol fails password confirmation checks at the
client or server; <xref target="pcp"/></t>
        </li>
      </ul>
      <t>Beyond these explicit errors, CPaceOQUAKE+ implementations can produce implicit errors.
For example, if protocol messages sent between client and server do not match
their expected size, an implementation should produce an error.</t>
      <t>The errors in this document are meant as a guide for implementors. They are not an
exhaustive list of all the errors an implementation might emit. For example, an
implementation might run out of memory.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This section discusses security considerations for the protocols specified in
this document.</t>
      <section anchor="identities">
        <name>Identities</name>
        <t>Client and server identities are essential to authenticated key exchange protocols,
and PAKEs are no exception. This section discusses the role and importance of
identities in the PAKE protocols specified in this document.</t>
        <section anchor="symmetric-identities">
          <name>Symmetric PAKE identities</name>
          <t>PAKEs are often analyzed in the universal composability (UC) framework,
which imposes several requirements on the protocols: (1) the existence
of a globally-unique session identifer associated with each protocol invocation,
and (2) unique party identifiers. Both are considered as inputs to PAKEs, along
with the password itself. In practice, however, computing or agreeing on session
and party identifiers is non-trivial and cumbersome. For example, agreeing on a
globally unique session identifier requires a protocol to run before the PAKE.
Moreover, assigning identifiers to parties -- especially in symmetric PAKE settings --
is problematic as there are rarely pragmatic choices to be made for each party's
identifier. IP addresses are not always unique, PKI or some other registry
mechanism for assigning names may not exist, and so on.</t>
          <t>Intuitively, in symmetric settings, passwords are the only secret input to the
PAKE protocol; party identities are assumed to be public. As such, an adversary
is assumed to know these identifiers. Fortunately, there exists a UC
model in which symmetric PAKEs such as CPace are proven secure
without requiring party or session identifiers -- the bare PAKE
model <xref target="BARE-PAKE"/>.
The UC bare PAKE model, and proof of security for CPace in this model,
demonstrate that PAKEs are universally composable without relying on
unique party or session identifiers. We believe that the current proof
of security of OQUAKE in <xref target="ABJ25"/> can be extended to show that NoIC,
the basis of OQUAKE, realizes the Bare PAKE model as well, although
we note that that this proof has not been published yet.</t>
          <t>As such, for the PAKEs in <xref target="CPaceOQUAKE"/>, both the party and session identifier
are optional. Applications are free to choose values for these identifiers
if applicable, but they are not required for security.</t>
          <t>[[OPEN ISSUE: adjust the requirements for the identities in OQUAKE on the basis on the bare PAKE analysis]]</t>
        </section>
        <section anchor="asymmetric-identities">
          <name>Asymmetric PAKE identities</name>
          <t>In contrast to the symmetric PAKE setting, party identities in the asymmetric
PAKE setting play a different role. The very nature of the asymmetric PAKE
is that one server, with many different registered passwords, can authenticate
many different clients. Consequently, when the protocol runs, the server
needs some way to determine which password registration to use in the protocol.
Beyond ensuring that the server is authenticating the correct client, the
client's identity is what helps the server make this selection.</t>
          <t>However, the server identifier carries a similar burden. Indeed,
the server identifier is used to distinguish distinct server instances
from each other so, for example, a client cannot mistakenly authenticate
with server A when communicating with server B. This is especially
important if the client re-uses their identifier across server instances,
since a password registration for server A would then be valid for server B
if the server identity were not incorporated into the protocol.</t>
          <t>Based on this, client and server identities are <bcp14>RECOMMENDED</bcp14> for the asymmetric
PAKEs specified in this document (in <xref target="CPaceOQUAKEplus"/>). Both
client and server identities can be long-lived, e.g., a client identity
could be an email address and a server identity could be a domain name.</t>
          <t>Practically, applications should be mindful of what happens when these
identities change. Since they are both included in the password verifier
(see <xref target="gen-verifiers"/>), changing either identifier will require the
veirifer to be re-computed and the client to be re-registered. For a single
client, this change is minimal, but for a single server, which can have
many registered clients, this change can be expensive. Applications therefore
ought to consider the longevitiy and uniqueness of their party identifiers
when instantiating these protocols.</t>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <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="FIPS202" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">
          <front>
            <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="FIPS203" target="https://csrc.nist.gov/pubs/fips/203/final">
          <front>
            <title>Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="CPACE">
          <front>
            <title>CPace, a balanced composable PAKE</title>
            <author fullname="Michel Abdalla" initials="M." surname="Abdalla">
              <organization>Nexus - San Francisco</organization>
            </author>
            <author fullname="Björn Haase" initials="B." surname="Haase">
              <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
            </author>
            <author fullname="Julia Hesse" initials="J." surname="Hesse">
              <organization>IBM Research Europe - Zurich</organization>
            </author>
            <date day="14" month="October" year="2024"/>
            <abstract>
              <t>   This document describes CPace which is a protocol that allows two
   parties that share a low-entropy secret (password) to derive a strong
   shared key without disclosing the secret to offline dictionary
   attacks.  The CPace protocol was tailored for constrained devices and
   can be used on groups of prime- and non-prime order.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-13"/>
        </reference>
        <reference anchor="XWING">
          <front>
            <title>X-Wing: general-purpose hybrid post-quantum KEM</title>
            <author fullname="Deirdre Connolly" initials="D." surname="Connolly">
              <organization>SandboxAQ</organization>
            </author>
            <author fullname="Peter Schwabe" initials="P." surname="Schwabe">
              <organization>MPI-SP &amp; Radboud University</organization>
            </author>
            <author fullname="Bas Westerbaan" initials="B." surname="Westerbaan">
              <organization>Cloudflare</organization>
            </author>
            <date day="21" month="October" year="2024"/>
            <abstract>
              <t>   This memo defines X-Wing, a general-purpose post-quantum/traditional
   hybrid key encapsulation mechanism (PQ/T KEM) built on X25519 and ML-
   KEM-768.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-connolly-cfrg-xwing-kem-06"/>
        </reference>
        <reference anchor="KEMELEON">
          <front>
            <title>Kemeleon Encodings</title>
            <author fullname="Felix Günther" initials="F." surname="Günther">
              <organization>IBM Research Europe - Zurich</organization>
            </author>
            <author fullname="Douglas Stebila" initials="D." surname="Stebila">
              <organization>University of Waterloo</organization>
            </author>
            <author fullname="Shannon Veitch" initials="S." surname="Veitch">
              <organization>ETH Zurich</organization>
            </author>
            <date day="29" month="November" year="2024"/>
            <abstract>
              <t>   This document specifies Kemeleon encoding algorithms for encoding ML-
   KEM public keys and ciphertexts as random bytestrings.  Kemeleon
   encodings provide obfuscation of public keys and ciphertexts, relying
   on module LWE assumptions.  This document specifies a number of
   variants of these encodings, with differing failure rates, output
   sizes, and performance profiles.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-veitch-kemeleon-00"/>
        </reference>
        <reference anchor="ARGON2">
          <front>
            <title>Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications</title>
            <author fullname="A. Biryukov" initials="A." surname="Biryukov"/>
            <author fullname="D. Dinu" initials="D." surname="Dinu"/>
            <author fullname="D. Khovratovich" initials="D." surname="Khovratovich"/>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="September" year="2021"/>
            <abstract>
              <t>This document describes the Argon2 memory-hard function for password hashing and proof-of-work applications. We provide an implementer-oriented description with test vectors. The purpose is to simplify adoption of Argon2 for Internet protocols. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9106"/>
          <seriesInfo name="DOI" value="10.17487/RFC9106"/>
        </reference>
        <reference anchor="SCRYPT">
          <front>
            <title>The scrypt Password-Based Key Derivation Function</title>
            <author fullname="C. Percival" initials="C." surname="Percival"/>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document specifies the password-based key derivation function scrypt. The function derives one or more secret keys from a secret string. It is based on memory-hard functions, which offer added protection against attacks using custom hardware. The document also provides an ASN.1 schema.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7914"/>
          <seriesInfo name="DOI" value="10.17487/RFC7914"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="Gu24" target="https://www.escholarship.org/uc/item/7qm0220s">
          <front>
            <title>New Paradigms For Efficient Password Authentication Protocols</title>
            <author initials="Y." surname="Gu" fullname="Yanqi Gu">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="LLH24" target="https://eprint.iacr.org/2024/1400">
          <front>
            <title>Efficient Asymmetric PAKE Compiler from KEM and AE</title>
            <author initials="Y." surname="Lyu" fullname="You Lyu">
              <organization/>
            </author>
            <author initials="S." surname="Liu" fullname="Shengli Liu">
              <organization/>
            </author>
            <author initials="S." surname="Han" fullname="Shuai Han">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="LL24" target="https://eprint.iacr.org/2024/1630">
          <front>
            <title>Hybrid Password Authentication Key Exchange in the UC Framework</title>
            <author initials="Y." surname="Lyu" fullname="You Lyu">
              <organization/>
            </author>
            <author initials="S." surname="Liu" fullname="Shengli Liu">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HR24" target="https://eprint.iacr.org/2024/1621">
          <front>
            <title>PAKE Combiners and Efficient Post-Quantum Instantiations</title>
            <author initials="J." surname="Hesse" fullname="Julia Hesse">
              <organization/>
            </author>
            <author initials="M." surname="Rosenberg" fullname="Michael Rosenberg">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ABJ25" target="https://eprint.iacr.org/2025/231">
          <front>
            <title>NoIC: PAKE from KEM without Ideal Ciphers</title>
            <author initials="A." surname="Arriaga" fullname="Afonso Arriaga">
              <organization/>
            </author>
            <author initials="M." surname="Barbosa" fullname="Manuel Barbosa">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki" fullname="Stanislaw Jarecki">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="OPAQUE">
          <front>
            <title>The OPAQUE Augmented PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>AWS</organization>
            </author>
            <author fullname="Kevin Lewi" initials="K." surname="Lewi">
              <organization>Meta</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="21" month="November" year="2024"/>
            <abstract>
              <t>   This document describes the OPAQUE protocol, an augmented (or
   asymmetric) password-authenticated key exchange (aPAKE) that supports
   mutual authentication in a client-server setting without reliance on
   PKI and with security against pre-computation attacks upon server
   compromise.  In addition, the protocol provides forward secrecy and
   the ability to hide the password from the server, even during
   password registration.  This document specifies the core OPAQUE
   protocol and one instantiation based on 3DH.  This document is a
   product of the Crypto Forum Research Group (CFRG) in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-18"/>
        </reference>
        <reference anchor="SPAKE2PLUS">
          <front>
            <title>SPAKE2+, an Augmented Password-Authenticated Key Exchange (PAKE) Protocol</title>
            <author fullname="T. Taubert" initials="T." surname="Taubert"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes SPAKE2+, a Password-Authenticated Key Exchange (PAKE) protocol run between two parties for deriving a strong shared key with no risk of disclosing the password. SPAKE2+ is an augmented PAKE protocol, as only one party has knowledge of the password. This method is simple to implement, compatible with any prime-order group, and computationally efficient.</t>
              <t>This document was produced outside of the IETF and IRTF and represents the opinions of the authors. Publication of this document as an RFC in the Independent Submissions Stream does not imply endorsement of SPAKE2+ by the IETF or IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9383"/>
          <seriesInfo name="DOI" value="10.17487/RFC9383"/>
        </reference>
        <reference anchor="BARE-PAKE">
          <front>
            <title>Bare PAKE: Universally Composable Key Exchange from Just Passwords</title>
            <author fullname="Manuel Barbosa" initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author fullname="Kai Gellert" initials="K." surname="Gellert">
              <organization/>
            </author>
            <author fullname="Julia Hesse" initials="J." surname="Hesse">
              <organization/>
            </author>
            <author fullname="Stanislaw Jarecki" initials="S." surname="Jarecki">
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="Lecture Notes in Computer Science" value="pp. 183-217"/>
          <seriesInfo name="DOI" value="10.1007/978-3-031-68379-4_6"/>
          <seriesInfo name="ISBN" value="[&quot;9783031683787&quot;, &quot;9783031683794&quot;]"/>
          <refcontent>Springer Nature Switzerland</refcontent>
        </reference>
      </references>
    </references>
    <?line 1426?>

<section anchor="params">
      <name>Deriving parameters</name>
      <t>This section discusses how to generate parameters, given an upper bound on an adversary's advantage in breaking the hybrid (a)PAKE. The parameters in this standard correspond to a classical hardness of 117 bits (considering the attacker can break CPace) and a quantum hardness of 100 bits. We assume that an adversary can perform at most 2^qq queries to random oracles or (a)PAKE sessions. We use qq = 64. The derivation below uses some approximations, ignoring small constants in the exponent such as 1 and 1.6. We also only study dominant terms in the advantage equations.</t>
      <section anchor="parameters-for-cpaceoquake">
        <name>Parameters for CPaceOQUAKE+</name>
        <t>We have the following requirements:</t>
        <ul spacing="normal">
          <li>
            <t>Nseed * 8 + Nverifier * 8 &gt;= 2 * qq + classical hardness</t>
          </li>
          <li>
            <t>Nverifier * 8 &gt;= qq + classical hardness</t>
          </li>
          <li>
            <t>Nkc * 8 &gt;= qq + classical hardness</t>
          </li>
          <li>
            <t>KEM failure &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>KEM ind vs classical &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>KEM ind vs quantum &lt;= -qq - quantum hardness</t>
          </li>
          <li>
            <t>CPaceOQUAKE vs classical &lt;= classical hardness</t>
          </li>
          <li>
            <t>CPaceOQUAKE vs quantum &lt;= quantum hardness</t>
          </li>
        </ul>
        <t>For ML-KEM we have Nseed = 32.
For consistency, the spec uses Nverifier = 32.
ML-KEM768's failure probability is 2^-165.2 and ML-KEM1024's failure probability is 2^-175.2. Both are slightly too large, but we deem them acceptable: the chance that an adversary encounters a failure is purely statistical and very small.</t>
        <t>The following subsection discusses the parameters and hardness of CPaceOQUAKE.</t>
      </section>
      <section anchor="parameters-for-cpaceoquake-1">
        <name>Parameters for CPaceOQUAKE</name>
        <t>For the security of CPaceOQUAKE+, we require that CPaceOQUAKE provides:</t>
        <ul spacing="normal">
          <li>
            <t>CPaceOQUAKE vs classical &lt;= classical hardness</t>
          </li>
          <li>
            <t>CPaceOQUAKE vs quantum &lt;= quantum hardness</t>
          </li>
        </ul>
        <t>We have the following requirements when CPaceOQUAKE relies on CPace's security:</t>
        <ul spacing="normal">
          <li>
            <t>CPace vs classical &lt;= classical hardness</t>
          </li>
          <li>
            <t>Nkey * 8 &gt;= qq + classical hardness</t>
          </li>
          <li>
            <t>KEM failure &lt;= -qq - classical hardness</t>
          </li>
        </ul>
        <t>We have the following requirements when CPaceOQUAKE relies on OQUAKE's security:</t>
        <ul spacing="normal">
          <li>
            <t>OQUAKE vs classical &lt;= classical hardness</t>
          </li>
          <li>
            <t>OQUAKE vs quantum &lt;= quantum hardness</t>
          </li>
          <li>
            <t>Nkey * 8 &gt;= 2*qq + classical hardness</t>
          </li>
        </ul>
        <t>So, the smallest Nkey = 32.
We ignore the KEM failure following the same reasoning as above.</t>
        <t>The following subsections discuss the parameters and hardness of CPace and OQUAKE.</t>
      </section>
      <section anchor="parameters-for-cpace">
        <name>Parameters for CPace</name>
        <t>We refer to the CPace <xref target="CPACE"/>. This standard requires Nkey, the number of bytes in
CPace's session key, to be 32, so one must set H.bmax_in_bytes = 32.</t>
      </section>
      <section anchor="parameters-for-oquake">
        <name>Parameters for OQUAKE</name>
        <t>We have the following requirements:</t>
        <ul spacing="normal">
          <li>
            <t>BUKEM ind vs classical &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>BUKEM ind vs quantum &lt;= -qq - quantum hardness</t>
          </li>
          <li>
            <t>BUKEM public key uniformity vs classical &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>BUKEM public key uniformity vs quantum &lt;= -qq - quantum hardness</t>
          </li>
          <li>
            <t>BUKEM ciphertext uniformity vs classical &lt;= -qq - classical hardness</t>
          </li>
          <li>
            <t>BUKEM ciphertext uniformity vs quantum &lt;= -qq - quantum hardness</t>
          </li>
          <li>
            <t>BUKEM key * 8 &gt;= qq + classical hardness</t>
          </li>
          <li>
            <t>KEM failure &lt;= -qq - classical hardness</t>
          </li>
        </ul>
        <t>For, ML-BUKEM it is as hard or harder to break public key and ciphertext uniformity as it is to break indistinguishability, so we discuss all three properties at once.</t>
        <t>For ML-BUKEM768, the resistance to classical attacks is approximately <tt>181 - qq</tt> bits of security. So for qq = 64, classical hardness is approximately 117 bits of security. The resistance to quantum attacks is approximately <tt>164 - qq</tt> bits of security. So for qq = 64, quantum hardness is approximately 100 bits of security.</t>
        <t>For ML-BUKEM1024, this would come out to <tt>253 - 64 = 189</tt> bits of security for classical attacks and <tt>230 - 64 = 166</tt> bits of security for quantum attacks.</t>
        <t>The ML-BUKEM key is 32 bytes, so this satisfies the requirements.
We ignore the KEM failure following the same reasoning as above.</t>
        <!--
# Test Vectors {#test-vectors}

This section contains test vectors for the algorithms and protocols specified
in this document. The test vectors correspond to the configuration specified
in {{configurations}}.


## Password Confirmation Protocol Test Vectors {#tv-PCP}

This section contains test vectors for the PCP protocol specified in {{pcp}}.
Each vector consists of the following entries:

- seed: 32-byte seed for KEM encapsulation, encoded as a hexadecimal string;
- salt: 32-byte salt for password verification registration, encoded as a hexadecimal string;
- PRS: password reference string, encoded as a hexadecimal string;
- SID: optional session ID, encoded as a hexadecimal string;
- pk: derived KEM public key from PC-Init, serialized using SerializePublicKey and encoded as a hexadecimal string;
- SK: 32-byte shared secret for the PC protocol, encoded as a hexadecimal string;
- challenge: protocol message output from Challenge, encoded as a hexadecimal string;
- response: protocol message output from Response, encoded as a hexadecimal string; and
- key: derived shared secret output from the Challenge and Response for server and client, respectively, encoded as a hexadecimal string.

For these test vectors, the KSF is SHA-256. The vectors are below.

~~~
seed: 40e5a6554eb988ee21e84a593f744e611ededff48dfb0e43c763b3a8b0315bb
a11af1e05e840a1521987ecf82a37fdbbb0216ecbc85ce51005fc61b83d7c0929
salt:  b33f867d93433ff91557e6ecad9d934935cf8da580538c0e444eee15c86c32
04
PRS:  746573742070617373776f7264
SID:  4c43fe04b479f5b41eab59f18d93d5a9
pk:  67f7248ab55a3a35c6e9e1acece73d69d50a67f87b0a1c4aef942953567b6d7a
101ce75dfe04c5f7979f93d1749fd98c92dcb75c975d2830ac04a387b78a13573b076
ee3505a66c58c3a404a202c1f0b7d4a2b1bdd6696e1caa35bf89df6ec3f54d786b3b7
7f26ab3a3af755ee96c6f155088721966cb732e1c40f2e78a614b8abfc030c6d61399
f804531c90ce50275cec8035b77c3e8b7b049793d51b022690088e7eab901198b6e09
071dc946e67732c7a4bbb394714a61402dc64a28bab16f111ce34149a8150b19fbca9
36c45311020fe357300801ecb8b5513ab12e48592f6d922666a72229c9bfad3c92f15
0e2223154db9b50fb07fc0748fbef872ea9b5e3c22447487c1805ca0af8725573828d
40aacac9759ed48664c12a8641577cb8c5aa1a501fccc2149d123a4c48592fc6c9089
54f0e383996b8687d658a94a18a242274c08839b306b81270b1c717dfcb36c10809b8
ee5b70c724ba761b2c5e4ab43823725fb5fc46b17007038266b258ad19ac4369e8cd4
53c566a6aa85677056933bd926d466a5f4a9b0dcaab0d3f8a5e603681f960b099a5d1
ef8b677a27b02b9ae84a34f1f24445788be59752a68b4777613598786a50d42568675
82ad9a5a79e7663b5b28303959f5c5a69f5173d702bda6b6a0e0656613e58ad9e75aa
b353b8a570b88a79d3e020ad50738a4e17b82b0852544b212990843076a070323a491
8bf1f3144a70ac156232d83773d3d5c1137907e83b0c68165f71a1128122418669565
9293caf20512c73b3fd2a4d85f99d422c5829685138c921468126709187eb408668e6
a9e023565899ca69a53f1f79c70d2c525c7919289247278021387351ead1122fa5c7f
ac0022a0ab4413437d091804e543d3deaace3360978e926cb71bb32280b2948cb061b
7eb6187ee020602037144b93bbdacc1c5f362dc2c7a738057e5c973e0cf77f3023461
1052e949b22e0a32d67d68e5ea28c7e95493419732f249aa28c08e9509b9940845625
5e46fbc46898c61a6408b97b00ee1a868b2128266bcc7bca38e214b43364b408c0c54
67b472e592f1165aa9612b863b511ce31795fe320a0ab6f6851ca4f896675fc02eeb8
4f3d01ba691b51396a42eec0ab32f77eb061a72c902f3f45ba424088444c4857913be
91bb31e161245f3cde1aacfdce5a866224f3db0bcd53529b1da2be6020d1489839e00
04071a5607f33f890b386d6835792788e3c794136503f0c4269afa031ef6305d010b0
35a1325a8909179ce57972375e5b9284cc328b66f6e076d1ba085e38c9cedf29f2913
470f6051f1fa6a3880bd45e5784f019a93f37789880eb01c3fb9cc3ddb096968675a5
d65acb99571de52bf5d282731f34d5e69c070da3795202f65354034e65f35267b74a6
b3ea469936230f493c4235365d4357629e9429c2ab9edcb279be2688f690849e0b1be
d94b7a0d1113c6c372d247cd7b46b9cb492324c9e705692e888a7ffe52ca9f00f5dc8
2888370b09db519e8aa743052142e34294423a29e30428ccc94859693d07b5cdf6115
e176fe8da8dae1b4bc7a5c5b752a52e5ccdced571fbeb3b0f14a5fd2a397406980fd8
078e8786d70b2738187747658f58658b14d2b14d1f04ca18347a044c9b21b0bdb035e
33d2aeee45ab3106c4d8ba8ec9c9dc3eb4167db9965d92765c9b4522bb08cf35fd56c
1a19c426d38a6263c45728
SK:  75e99907f38993c973b58599ca73122e568baa5cfa2736e5049dd079f295362e
challenge:  3a27df1e4b119f391ec2e83cd864658df3b4cec728b32ff704cfc24fb
af3cf72a31c6a115f1fb58269c36d5256e6cf92f62de157b4b3e5669d09982391be43
6038da6950b09b2f6a860b793be2e670b723a5066e854bd505e7634f18fdae30e2ee7
2467132a56bbf22b854286ef7ea3c5b508088d78ebcc0db57ca7afebff377f233f10a
34ab5bbda3c200a0f1127127eaa89c621a39c67335c308869e7c100f9a98d94ebf264
698a6b24ab316347b62e2e4408bbb4241ad2430a156147914132ca937cc43dc2d37ea
1cf7ecf285195ab7dd2d6583b1ddfaed1c3d87bdea64f015e7dfaf6f5ea727b23bce6
3ea5e0614fbd345e01839983291ad7b696d1a08e262efde487e85a44384ed610704b4
9fa9d00c27ceeee88733bcefbb6b5f975eab85069988bc58883ba380c42b0d8dec070
8f9e1c6d0705606c0c0f82d10c9eb2ea17556897ba953819e717e3117f8b0f753bffa
4357d8f94b4b25acba72580682d3cd7d65d28286200bf4d2cd75dd4df4d94baf64fbb
3e57ac127f07164b99db146f29cddc404e313baabbecee1bd8393da7539da7b15f08b
7a8208d29c636257bae5fed04cd3935d1e342bc7eb29ccdc68a71a47c5f06fcbdd492
a0b80fbf23731d501c32c5fc28d974288f2c926b5eec29d4c905518d3e3bab3cdb411
842c3e2e1a3a414aff34f627b11db5f58d5d1e29e21294407c48f44f0b1c01237756f
4ed85032b5acdb7ee5cda80383fc8621b713b17472c549b362f9afd208ca2f6d4bd67
5f8a6af2c047f261b83b6e40bceac3416f7f749b81b780475c0a636d0ddb9eb49fd30
630b07dcd9ef2af3809bd251a94da40881b5116b27ab9f0d84f12072bf050d7d15e86
9770397fcf4508861f76ea461378d236ed99ab903a4026d19a22038e58f349d251e7b
d6148030f530d1c7e84a1a15febd2c21030c11a8bd2fe52bc629b650b330a7431c3e4
d6111eba76abdc95dd3af8f5839317bc2fa737107b9610280841d3af9c5b0dc69032c
f23bee87fdbde6c39a100994e5c2df3b3e70f9f52f388c9d65079ec15154bb731e6b1
3c33f438779572d23a67f5b421db648b27dcab657ba03dd355ee90dff8c4c8ef7bd2f
ed0b0dbbf7db006f0b5c045b92e77b84e9da9fdf4290a00ed8fb4d634f34ff6d84b71
951d2181c990bd374f47fd170b46fe61756b0a6011b41e4577a7e985feefbb312ed12
c2151cdcf633d3ef175ffc2f23ab28f3a80e39eea740683601a6498f4b97ad8f78884
592e3c8524d278a9a26801e813e73d228b76026f236d4cef2165ae9988ada31cca20a
f029d14969ecbd169d01de04ff946db136ecdefcaff840e21b18b6b14a1a1a3315e17
701ff74fb07f4c1d35bb6bc641ccc84a3d37aecb6fee530554d267195119da7f44e1b
a3aed0c67c07395d9e75a4e690ed0164787fa6a63b8cdd38fa090ea23982871fa1e9a
bf90712985d70e965402e1b0d4382b7be3b72e41282fdf44984a8901bdb0c5f3ce602
6d371738970a0ebc12cbe06f495b76b82217eef79908c52b8e557c47ea289255ac477
f3d9e19ff2325ae771d04195d5424c86f40a31869c31f2f585f53e924b6de8db4c812
2f02e76a2d09dc8ae767eddca309fce33f50b770f7dd5cfdd4f46c2112bee16f93499
5fa0b2f5e69dd9958f4fcc73840598e13f
response:  37fb1b659261093758f48f540f337893076b8819ef5f556696fa9ba8f8
717d91
key:  eebae83892d72a88e2d53b2a3b3f5ac0c24c9c69c8416312557f77008db9cc1
e

32 1120 32
32
seed: 3b30129132073b2a61e29403e2d57f60e530fe823ddeed80ee218a6c931f805
7764f38b1eb5665ab5972c9db8a5d8e06388a1296e440d7975639e71a37993d30
salt:  3c8fd7ae7c9aa2b2d1c4789f046f8b3155a76c566829df38d6cff98ca2ef5a
07
PRS:  746573742070617373776f7264
SID:  773d45f4506bff8e1cd2e9d062b8a23e
pk:  8e3292fd769532243b141b0c922b76ec63c6f2128faa9687c2196c7c99347d96
07c765a3e0faaea43829e8134c54a4c7bda82231999c61053cf29b2ef6fa91f5da948
4ac33f0fa510b8b324697686bc1c4dcf2b4ebe636f2957b8626c823a9c92b8b9b2401
2cf65cbda16038a8911c7488c76326b5cc4648a62b8bb476bffa79a523347c7443a2d
7432ca7f016e9100620264eb9e05250e18cbfd02347f3681b513eaadb6d7067984d9b
5692f703273c6e19f16e757a45adabcc4d3a3ef1eab1890a0959a93c88627f057b78f
94940a29a65fbc0ce96276d9c334edbca17d18404a996594efa0672ab2e1bd078e0fa
6611127835e9757b5c8033d67a318b01d07a536732742efbcac9c90830e30b4caa116
39c5681a4c16fe703d2e68b26cb6628a74b039344b6c58ed0d7ab63809940c393c463
6cd8836b9327c052d839d6bc503484303ad84d36fc98625ac457ca2d50969ccd31560
ea465abfa8d0240c20bc17aa95309dae53ec510b78b4143b3f97333aa7166d80a67b9
8f9d78ac64003b90595c330aae1ba15f1c733392ab89c21213e20c273d958311d4314
ad21593859e3bb9c12b26c916c27fad4ccbea3a916bbb481012b8fd6600bf23365b07
6be7f8b3d128426f5269a355bc4c628663e96154a65fa8ea357eca432360979218775
9d248bee2593ae47071486a9b05913534b2f6e94111c76488fca850798715cbb32664
c9352c5793f69fd9f3c9a4604aa86466f6008f94d7c719aac8bc5a2471a50f4a6b3db
010656e3544f1e940e1f6233d7c4595d8355b5055ec7c3c029407d0ac5b40357bf3ca
09a1743ef9d16a3212767b12b388148e94c13612112deeb34078b33ef8976501867b8
2965f1933123910a0da81b396dc32d66485b18748b0e2b0cb760fc42770766a401761
b08c3b7784167fd1983575f94c09b32f38a684f126312a9ab96f29c66812903107bdb
47bcdb226404e50a2c3360a15f95e115654062974322905db67a17eda1c190219e4e9
15a8189bb07a0441e37851312348c488f6514ffe35332ef99da4371025e53bf531202
3b199da26b05af08f54e2280b5594d498519060129117c0c396853f3a4edc42b91cd7
0dd9c53e7843963d033b7cd384e91353526941c7a4ada76a90dfecb0e6cc243393af7
572cda8654b68d99a3c8176c8897ec7076b39e7978bc0427ee8908e9648b75913f610
5e5128aea2552ac547375217aee72104d244cc50585749b9011651c5f408c9b4076c5
a256429f582f58502dea8a12bbb4f644c93845aa72f46109bd3ac3ec224c17a4e7eac
83296c0e803c7090cab15688c78bb733f284bfc03646c8984943c29be0601bb77b604
8c418981a0099221679696ee917cc47e17d5c56ad4c11c02e3b7fd4c1624bec169ab9
16adc07e53870c46a8cba3a4784d9c53af537e6931bf96aa6e3e80cc5be359ab67a01
8797eb5f670f488c103254e5bb539cdd4560e0a2a19e86a3fe0767359014ea57ac9ba
0d5366ce17e3c4a6280136cb3c42960ed0887f1e9019064683d75708c71b9e14118be
bfb6c394c5279d38380a7a920ac08ab8b5477a4174469aad57435792c5e784b0a8005
3a50600891a84a7fb0ceada135936877d6f2fdf320cbd88d62311b60a73d482319811
4d094af545fce5335a145011115721d2bf9ad6e22dd012bf4244733737bf74bfe349b
d2d91e0f8b60c0dd863f2c
SK:  000a7035444b5505dceaabc0494c435631abb144ca0242d450d463f792325e5e
challenge:  afd063e56a36a60fa0520e132f583b75fd82d0c823240e94f85dbf464
098c503af451d9e91d253d1f2ee3da15d00370a80a1f7328e8b4f2135878dcff0a579
86a7617774d64c00aab8e3dca2732857cb3635dc3e788e7ecf07d115db713a8d42a4d
6e17dbb1af37d1dffc789344631cf38ff80534d18e8769bdebe2b2a7d77f7f8cd802e
c644d596186b696144df96a3cd14c5177be93a9c7b2b4cb152f1f3313f69bd5fa206c
317b6d5bbeb578b0241d21d5ccee07aa055dce6f969d921f448ce455287ea6eba1833
6155b4c7fae472445d2f30588084bc7225fa07a887db6e586e4d4f44af1c294cb112d
84536b877c570053a365780e2f3ccfdc92be8cfb527eaa3ac87e2c02aac6d129d04e1
81a404354c9fc2eb4d73513131bb437048e974f3e6907d2b28d56493634e5b9edb8f7
e356854119dbede512f6cc52794d1c15059bbc59d3783b07088c55b48f8b4b69fba9f
5dbe845eeb86034ef3b6d0765f1bcf361952fcd94f9ca33dcf2f5cae6943518fc87ba
aa4acc5d8ef056bd65e60ac52617254681e41b31bdb51803d1a27731dc4183255ebb9
4db1b45e7a84821e358a3ce0bbfc8f982bfb7ad1deb61e6b8718875c6cf6549dab765
45da0d71891f7fb95d51bdb7aa362e7e27706761da2f78a70f00aeec0d6d2f710720e
2431c6c35e3760b93051d2e83c6c68c125e895973555a9de6b736ea8d38d913f2d0ec
9d7d41fd23ae1f999af5e1e3f10d4dd2753f7f83b550139848bf582833bd34248c424
5f01f3131176eec196dc4ecb6c6517a7cec94dde2806af44557c5ec07d63e6efa219a
723bec5f4e2470e5a57b021b395fd1f8d36826d99a9b0eaf1458d25fd52ae499a1587
0197f4ecde53cdd7b076b44bded65e6a291b8a1722af52bfff782173d06f65678a186
095fc48d1be339ce280c21d356c298a60ebfa9ca421ca091ab5e2f28f5167b641c0de
1cba4c5ddcf27950350134701696fe5b6063b3a21d7690a2c2406a949db2f88c2d205
e20f92012618ae0698e071c2fc6d81bad5c791dfb8e391b4138edd92bcbd05cab4566
160421165406b4fe3e17f87e80af03e942396c8dcf590da6b9b30f0d08802df320c84
c88d46251cfb77f3b94a7908caa718ce2deb31209c00dcd0c990c31c1da93f4755cd8
97685c1234e3cb92b08ea6ff7ce035bd2372552e29fa98e7ef9890ae9d61c83c8b275
9f3edee6cebbd97f1b6b063efffcdc792e64343bd368a99166d313f6c7757182d89a2
9c9f6f32947d95dccd47164184c51b555e303fce895f9750f2938d94912fe40e7cf2a
3b5cd9c486906f9f76744de9269c4dd3e1469cd0dd720ddb59f5effe454da764a99f1
1fee3abe86ff00a190c1de28965fc9b3a42ceb6f41659c140773abdc2e0902a8a0c56
117a25c6f7b19c5e5d9c421daae445c402a500c0fdee03dce2f5dfd6d74613de7096a
ac90db5ebbcdd92837f9fad8ae397d7fefdf10aebdf6df4b27f5f61c5ffc47016fd5b
8f0456c858d92aa3f0188dad5b271779ca0ae479d0bcc301be32397aa9905b164b788
7136b5b33a39e49bc6a9f9f57482b2aec082faecadeb0eeceda3fb6ccc07132c37601
f7849711dd4d5d5a27ea3f43f32a1dee7b773fea55cc4b6ca3e46efae52259d1aa079
2fbaa62a0e7f126eb9d80ebe44064e008c
response:  5d30fbc51d341e49c0cdc96ccfe18a25372cea8cd7eed01acae245d402
6bde16
key:  ee7ac0f6a0ab18483d203aae52aa893b746ab54df182ff2e2e0d1d4f73605d5
0
~~~

## OQUAKE Protocol Test Vectors {#tv-OQUAKE}

This section contains test vectors for the OQUAKE protocol specified in {{quake}}.
Each vector consists of the following entries:

- PRS: password reference string, encoded as a hexadecimal string;
- SID: optional session ID, encoded as a hexadecimal string;
- init_msg: output message from Init, encoded as a hexadecimal string;
- resp_msg: output message from Respond, encoded as a hexadecimal string; and
- key: derived shared secret shared between client and server, respectively, encoded as a hexadecimal string.

The vectors are below.

~~~
PRS: 4b6cf40f371bc801e81b8f2b26cd5a0f
SID:  652b728f66e2ee44a5354dfb7236cdca
init_msg:  59fb9e82387ce589dc8e2f4a2759eb9402ad30968545a119419e9a36bd
eb4d712489761cc7cd4e8856289840903e871a12c9ecf199e7e2e4e43816fe6049a6c
9ae29ea00a0bd58411bfd9a789c9b57ad7d7e45a867e7565bdd21ef79a708f27f4b92
918bc8967d35c609e6acae596b994719f9a84388d9c2707bf8db15ed13f42ca327844
c42e331ee892847bda3a21e9b9d56e47374374e94a0bf3301b09bed0d9813af3d7b52
fb85e50063917c63070000213f24e8af110197a1a8186ef62fd59dc3dffc1d0dd7819
722950694195694b97f8d62dab464321433134f4bc140c6e107b282a3e71dfa3645d1
4f7e4da70fd99e89be47f1f26b7c3a33e005a43abb71813a1fef959dc7acb109e3323
e4241f35596dfef0715e0c0106d9530af464c4699b2e3925a6dd6e996e97eb42ce57a
187c8e94d901510d462e02f0092622a67edd3a612b78fad83aa9b557ed42ebc0bcb7e
9b72bfff81916f232085c7b0d618411d39ccbac4c3091f3506d246de2d5ead0a5b184
ca5b36dd408419edc21742d6b141e9cb647a55bb0797fb3308ad49cc567a4d0338049
44cba3303de1bc088f240a45f9526bece4c372c9a50e83a669e1bece4ae92e3736f95
99d4f1f65434db5c5b7cfedbbbb9c2620f2f0e9804046ef53b5c47f0876be57970c93
74eeff829bbeb265afffed437f1c23b60af5a5210bef5f76b334bd269ae17b890320d
5e54051985cd7b67ae9a7472d70fb6eb0575a5bd44b64ab55b2cade147c6f4aa2aefb
dcb4b1662eb6c0fd292877d688cc5df46f39189869cd8c027b405833d10ed3b3f75d0
55f49e4bea1267e2635a0d182df59862fa31bee58318be03310e9d5eabd404fe91e8c
179af9c0a64d4b02d68d4f23ebb01d9674581d06d6211f47afadaf94f94eca7855ad6
10f68e4c39c045f4c41740ae668f203b712cb29607a824bf9d3a7a09455676fbbafd1
c6dc3b35837a7a6f9ae8b47237c2f9d462f9f068135190a9bac33575f8bfdde1d0775
f156db3731619ed0e06f00fb597688bd6d4e5364e02c91870cfdb593c6ed88e072a18
bd13bebe80942db9c317b7d7b9461d168295fe4ceb262a343393c8e76d214236dd807
46a98da9dd89ce75ce70155426b7d79186c526c0bdf37e27b683e9183da95d38d9159
d00a1d6382d18a96a571e2a94dbf0271f04dde59029b7e8c5a606e1833cbbd85e8d07
93b016113049d011a94a0f7530cb152894eee984541efd7d79c67495b11358d270bcd
809734860461989bf21f5cb2b87ae7b59865465eae9275b7ef904d5425d459f0c185a
eaddd3e76b4177b2171bddb9af2568f62c19c5a08491e1c690d7631cd938381488993
4923a0a2f12fd93623b762b6284f7eea3f9e2890970a851d1afe57d617f94d40aab58
85c10cd3dde1b0444ac20368f0e6ec5f3912558c9c2f23ab0a2ced9043a84291cb5c9
41a2ffbab5a7d355fb0b86a888290bcf77414f0aec23ed728803454b1be26b3f365cc
2a5986b8f85359a1d8c205946ca9e7875647cc11d02db5d7a1e588f56f9fcb971be59
246d2aefe07a420d156aedcbdbc8892958d0b7957508f94d1c97d9a80242f383d5da5
5c8dc41ef43f1cac4877b4417ddb0df0c30cfbccb7dc3a15105322ce2ff15e8c00615
9d073af55e8de553bc1b1d3cc1eef9c515e3daa6be4320e076213cafc87c4c9c4dbb3
7c9f31d1a69efa63560091c2b69de070a131755a871913ecc4e7cd9046f9d7e9ad690
45102f34f9896f3b9c66fe6fd57d14830a1bd9e4be02cb3dfa57fde56a53aca03e84d
f1a502c32646852947
resp_msg:  3c69d8f3bdbec6939b033a0cff661a5f90b3ec64dcdf0bdf3adeeae196
08affa26fe752f3e555ecdbe86f94d97429aba9bb0f2919a126b9640d480d5898c0f1
09c2594359298cfae0042d602836f3011bafd355d145999bfec12856f9a268a980cc6
cf0f428048e34b147215b3e710c252730ad3e55992f020c36953e2dad702d53a2b6ba
683d9dad12dcd4b02c8b5db9dbf7947797ab349a3567130bd7c69fa034b366e3b2144
a3be4def379dd68ce5c2127e50d6084f5e602c901af8dc245fca25f211a5c7b52b1c1
bda95dae0c32f457ea4159dbff55c0d30f709d848e0aa099bc769c2f477826b60810b
2be56b85d05f3c2a21a4b992323b3dac596d8386b0b8520d7c382ef0a33066f706464
24087d18907c8cb18c867af40479fb5d0d07440bbecef42ecdd52eb86002af611d34a
239d843e86491e6cac35954dc24a7fce979de6533996e46866e6ef66804ae7f9b3c49
b5372aa4143b08093cfb18057558083788c45cea615d4d44c7ba55938743fc4e7dfeb
eb1558556adcf19a0cdecf56f09da2c56cbe3d94d6157e8425b421080a890ca3cb52b
c909889b6e108f483b46e36e7443944345cc64a8973fbaf0b42359e7d505dc4442273
fe7da0568358a17817b7af22af9344e44cb43a83af27255a04d0a77d7c0c78231c7b1
ac2f0c3bd106ea5243d556ba5b6e0671723238ab82573247030b4f8c65dc3a075d713
2db25843ba711800b7a28dc1301e19d9a5750622149e8892523ae40ca1390e19b3bba
a92b4ffc87dbd2d9c6a3479ff802c02b54d85e91fb94c458fcd1158df8f7b20e274a6
a15866d33926189ce9c02798bf89e15943fbc73d6ca679c0773304aff40eb12836988
75e7ba4bf8058f67ef53cd5e924d8be307a57b037938adb6b198edc2c4c3136de60c6
aedf6df29028576ed39e84f6b4b8c4bff4971123039e3fb2dcb0c742e3bb213740740
52e02cab1f460880ff5335c4b1dcd9335ef213e36a51f6cb94550b3423d72c18df738
283faa8c419186acc853f08eea3e981ec9e131221fd93bd4dec2e7037b39330a5863a
cedbcbf5b069198194405d1498448a17303f0e963cac45ba981ce512b2a2cf1e0b54b
ce01f366b22c366b7bff5a56c094e005f9115ba3e6497274874e3ae62424d9f206d3b
b2e13976c345f1cb6b730f40103a6dad5b5db0689478139240b547926d41854837786
a753f0276e50ad4d8758fb8c59d46829000b81cb3e0a8d8a416008613495086f40d72
ca2d2184f8634c9c24961265dc54fa7bcd64057c0462c3cc476574ab7ec52a28799d4
747b2ea046da24703209a2bb437ebfafe144d87e2af44831fd29e72cf3f991885ac55
72366a7d363520713879bd1294c0f4130870aad78902ef083572672220e4d565e82a1
ea97b99d25954843f0293e64e37a367a08ff46f11bad769e56f41024332ea16085086
244368d75eda13117d37df5e388d2e198704c2e7f9349ac82014fe0da23c74be0a8a2
5c07b48689b92dbf6f328f998c32af4bdfd2f1add5285161983b58e5c86413e15b2b1
410dacf4daa116b9a9663ea40a3383375033ee94893
key:  e795ba6852ff724c76b21a65e3e0c889ec75b5c0f1a59c8abb3ebb414a5b9af
a
~~~

## CPaceOQUAKE Protocol Test Vectors {#tv-CPaceOQUAKE}

This section contains test vectors for the CPaceOQUAKE protocol specified in {{quake}}.
Each vector consists of the following entries:

- PRS: password reference string, encoded as a hexadecimal string;
- SID: optional session ID, encoded as a hexadecimal string;
- respond_seed: 64-byte seed used by the Respond function, encoded as a hexadecimal string;
- client_respond_seed: 32-byte seed used by the Finish function, encoded as a hexadecimal string;
- init_msg: output message from Init, encoded as a hexadecimal string;
- resp_msg: output message from Respond, encoded as a hexadecimal string;
- finish_msg: output message from Finish, encoded as a hexadecimal string; and
- key: derived shared secret shared between client and server, respectively, encoded as a hexadecimal string.

The vectors are below.

~~~
PRS: 95fdc24f9330e38e226b6169c9b76243
SID:  019ffb301f2cd83a7fe4f20cca7b8a1d
respond_seed:  4af73379f88cee47ac4a34a41204603cb673304b00b471777a8ba0
abbadea6481d1f03f00b20571b9b3f9019430a9f6ca807bfd9877844ea2c846b7a691
c4429
client_respond_seed:  a1359fa55ee62e45abc989df0ebbf1f9d6d77799271944b
b7f161b1318edf4ae
init_msg:  0470fb7f997079372fadf64cc0bea52b60a25aa2a75eb613c8c6ecff48
382cbbe1ee710fdd7761b8998d4c81ac001c2e1a186bba88dfe3046b7ba26085714d7
eb4d79c6d58b61b99272ed87b7180bd96c3e9bbe02c59dfeda84c95d06f3a7fdf11
resp_msg:  04d8ac3a98d80ba2e26c9afa92eea9ca6eb28fbd0661a1086a04062432
64b9c021efb7e8a4a81599ca92e0a9d6e713f379c9133fdcce8829510f7106c9007e9
48b3f865a6ce7365c86f540ad587dfc79fc3ef81708ede611e79009fe13fa5a08dead
3b519a73394e1c965aff84a27f83cc28940ae0c517c3450f09761a2b5ecd53069e76c
f63c084c3d0965f4a624cd4c916156b92966cc7a2c78a809a8d611cb387c5f5a4cca5
cd98edd163df78c8c6ed204b3e6defb7f2e8cb5d45157fded7ac8190fe45bb7481401
1c59fc02ce5a91dbb003b8ec39018a1b47d59ce6f748b40523e3a8c4a9625439506f8
56cc4025269c608fa8d6358c292d4e2e2d41e26199b2b61d0b12ce780518c663fe641
b1af74ca57178e1666dcdef7a50d474a47519cf565f5b3045c36c9c8752246cd6d7b1
376c0c7688453b5c120a70503a8d407287bae71e976f3e0ce54ee2ce1e2c7d3fb2937
b34a6c40b4608dcf615e628f0c56fc31921a25a4261593022c5f222bcd9e08f4b3e09
1c466d4f62ffeb48538f79574b04c0d181ad30f9488aee97153bb5b570b40b425a60f
2d42b88cf8a434c7eb9f844358c49a0d6c35dbb87c39da659e4567607f9211ae45b87
303754211bc799952ee027ca93913997547a20d17c70f012f26db4562476010c82101
9825365e732c113695302ae82fad948cefa6c1527b4e7867db3060b9d5106ebc154eb
69d0454d5040789e5593a4a3290305d9f780798e750c6c56f2ef1653e9271aeeee7db
5850b7ee6f54e7e865f485832aecd3a1f75ad2f0fe9f0b0e9db2a84fe2bde39c240b9
b16b4241a585e579444e4212f7f047360b6750bc88d9b682892fc21fac3c6ae27d7fc
46773424f931ffc325e098157899226498beca1ea65370f314c3b78fc963edb7ff1fb
cc1554df08cc46d7438d96ae91b9e5038bbeeabff2fda5d242e678e19959a5d7c4491
9fcc63e41232b4b674f0f9d03777a4d06286e55b6bebc67e6def1c64abf758e5fe2a1
f490312ed5715fe6a3659c1067c69630801d1d75bfe9a4e67b6ea638ee6452cecb96f
8ffbd99ab95b067e1fc25f847024e25822ca42d5676bb66e17e71bf72900134ac3597
5c559faf239ecf1ab465f1613d3cb184186e831c1b8b2448145f05b35e7a0215b2a81
4e53fe4c2108833f050fee8c2239dc1bf67c87dd2c6f1332d06e8f337644ed7685bc6
79d8dd8786915756f2705a4d1f97179943934ae6823b36c8d2096165d70506b595659
ac1452449f1ca3a35fcd08c793df9f8798830dab531e9147d1a7847eb564d1eaf5290
c612b3e282fe661f5530f692ec362eebdf4acf6308f588e9729bebd1d22407541d464
68cc8f85c492e9a575e7a406b01482bde89c60e43720682bb8fd8f14627dc262d1d1c
86ca004672368b4d008cc3d2bb205f62c431f5f29763bb0452058edf265f5a2b14ea7
d65a75ecb763e3581dd5b329b3e7ca9c4cb128c7f4e61abe7c6d9e428f687c261fadd
772bf9db759d7f07c3de34a85fee53bfb9e7acd93dfe597d716f2471c65b3d905a108
4f485e5beb0b5e03de550a476bd2f38455ecf1b324c906caeb3ed38e2135e6817c291
8fa430d1fc042dfea4325f6f0ffe5632277e56bc615f3448dc0f3c22ea154edea2081
31730e1dc06548d92d224e598ded68052276c68833f4018e0e6c2758ad18306a10aae
b2ef65d04f41c948a082a7125129aa55930e4408e807287c89d8938c1c5580d44ac3e
a34629ece428be94edcc530eb481516d99e5796f3c807604cb3b1cbb181323da06b81
6e82555674e2aaad11fd42b0b523fc5ab9534a32591ecead66af7bab26357d6c0a1f7
39ee6ea87cce2ec3a76744fb3420d8973607a82e017d1f815fab2905e6a1daf724326
563e31de4e3be87ab4e7765822bd833c1e80a6704655951519b44db6d04aa4c130991
ec4b0
finish_msg:  ede54396ba16d1bbaa128dec29f4b6c4ae3fcbe358c7e3039c328f3e
d6329be53cc00acbbb29779dafd66ddcf9cc646cae3342c27c268dc1cf30e17cac3d2
7ef67e57be40dc8407fb3604c9953066191cb814829efb83f8dc1eca01e5d11cc2982
0a7bfe2905e48207ed4531413a671f2798771c1b134aae989222590839ee3a9d325ee
364ceb5fe151e79c1ada732ad1f16332b125b80a24338a9198746e5c482208355fd71
1eb9883b7178b0b30d8fbefdfd6476ad59937809ece53dda7159b1fc9681f882e02e3
f7ca4c6d347faab6a3c2bee9fb40b2b128d1515835278bbbb39fd128d09fcb9244bb5
0eaf45a3737851845faeb8be99f56e5133cb9e64247296823ad1957385e521e714ca3
f3bd5a20b2d0d7062a7b1d39ca26b6535ecc8b540748d1e9e1ec7ebe3567ee9d74ac1
3cfafa9c4dbc9ece8e95873f7804d2aaa9c1ae9b258ad9bf235065b9404f6b977dd7d
382f94a7f8222a479f38dbe62d6b6c18725b7cc54f52a8b391f8d4bf2aab5555aaa43
ed39363011975d9c0ee518d1ed101e6972c728c4f7c697d89b3ff30352c85c10574ee
7d25e340c68149d48358aeda8cc0120234613ee5c62be2313a83e6c5dd943ee2b8029
ad5ccab1fac80ba26df5186ea7f077b0ea907fa787624a2bc723c91a0dde8e347eb25
921a8b1fe0c63101b8e95611656d1dcd3950a19412b3e380031131fd11dfbe6b6c5ec
8910e267a997a8141a883c6bb160abca75bf0175b2dd8f5d64cd21b9c824b49e0dbf4
24fb11334c35c9e34b13bb00a6cb4f88e3524b3db4b7a4e412b492dae2f5de34720bf
7165e240113839c390d4152b89c26f6abffb75d7c65e6ccc8b827299c76e26a8767ef
4f7f812345cbc0f87a3ca4185b2cb1d0493d4868c76b82b498d25735cda0d8fa1af98
3a0650da133afb581a73b4c0c2efae82f394269af4826dcf8b5c40b3a3f73ce5c447d
441416fa8429fbee319cc8f3abba7c0942908d6b5f8be4670b418c8ac5a33a24fbd19
471bc9de44f56a0c1b9a02156049c8679c2287a8c99045eb31eb04c9aed7c64d4652f
1b6c230ebbe56e34d2e02f8f9025fd85f254f232a1c9599913513950d24bbee7a9a6c
f49bb5c4bcb90bed2d1745e29c50b858297c1e8efcd7f38a9eb4ee54484f5b3403e77
979900c97296c3b79f4b6c8473496715d1d21e4ece8c2a7c3b0c02c052529ee5460c7
106730c4782a5557caed41f0578056c6d5e894dd14880bb14cf85562b79f18b937576
28a1a61722f6dade684638fb2047576e692b206905749fb362ed7d6e5af17be94b2f8
7e2236e53a7fa521172a7c395a4842d21ad69d0689689c92943669f63f9652b86ecf0
b120ab0bb280934cb67db883f0d2f210224cf3f7f2f1254a689aab54a8366ad264852
8edfb014e0de56aaf2415a50b6d446c83178ba76fdcf86f1c9b336449d346c1d44216
6de28f89b33063ab3f493af1ec393e665fff1ee4acbed39fa9b05169c256a5670ff0d
7d7afbd56308bf997f78e5ec9035117f7495c09d7d6539f63ce4af995eca7d27a4f4c
35bfd9d2def1792cce03c67547618e31c75fa11568c7d
key:  ffd24aec545e3a8c651d25d31dd8ece89aca16c41f4a7688f126702faf27ef5
e
~~~

## CPaceOQUAKE+ Protocol Test Vectors {#tv-CPaceOQUAKEplus}

This section contains test vectors for the CPaceOQUAKE+ protocol specified in {{quake}}.
Each vector consists of the following entries:

- PRS: password reference string, encoded as a hexadecimal string;
- SID: optional session ID, encoded as a hexadecimal string;
- pcp_salt: 32-byte salt used for in PC registration phase, encoded as a hexadecimal string;
- respond_seed: 64-byte seed used by the Respond function, encoded as a hexadecimal string;
- client_respond_seed: 32-byte seed used by the Finish function, encoded as a hexadecimal string;
- pcp_init_seed: 64-byte seed used by the Challenge function, encoded as a hexadecimal string;
- init_msg: output message from Init, encoded as a hexadecimal string;
- resp_msg: output message from Respond, encoded as a hexadecimal string;
- finish_msg: output message from Finish, encoded as a hexadecimal string;
- challenge: protocol message output from Challenge, encoded as a hexadecimal string;
- response: protocol message output from Response, encoded as a hexadecimal string; and
- key: derived shared secret shared between client and server, respectively, encoded as a hexadecimal string.

The vectors are below.

~~~
PRS: 41ac73f17f60eec0ee8cce874a4f9a7c
SID:  0744270cab992ae77c1cbea2ebb4c03f
pcp_salt:  9f5b52b091f6cea43c531ab526c6380ba665482eae33fc5c7e8f321572
3db2cc
respond_seed:  9ca72674368b8e8eb3b8868ac7be437a081a46be2480166e128ebb
048583324c8cc54cf679fd91e98f99567204e49517d745c4ed5d54913fb55c084e9ef
4ecab
client_respond_seed:  9bf12f1a9d1edd3e5aca33042fe51a2d42c37fb2f979812
ab150d8fc3e1811ca
pcp_init_seed:  6e410475f8c923df6420589ff93cc60f21a523f1f4d0de7b4bb62
d7078fc7e74f2c9a84a5b5d893fb75cb89711d8d83ef188f63c64d3106bdaa5331deb
db21f3
init_msg:  042d6e23f15b0ca7c0854f57ef4d12b855b74c04e29f6c73424f1f0100
3d7c26577f39c922ea3cdaf212603f462cd2bd774270c87d1997820c1a05f59ff2fe3
3d7ac9d31530e9fdb4cd0c76c893afb570bd6444f63e9dcee3c3bfea04f3b287da8
resp_msg:  0473c52c05586d8c1fc3c83ea8713c575fcbc176a23d4fdd92408c758c
f2d455da463d75b015cec7bb421c5e9dcb49873f3c4ee92e1dbb66f32c5d480d09971
e1fd6f48b5a7221b97444d46c555fc41cc17c2809afb8cf9c4aabb5d41378e98505ac
c2553b27572898d72c52ba345d24239565b5aaeeb23fedbcf4bd11db9a81088e35438
b196b8c42702111579ef5c66b0df7937aef44b24f8178f0a2d731f8d0eafcb32ab3c8
e0dac5b162a02773e15f280998091d0418c6679093a668f5f3f84877509224dcf84b0
f0aaf79ee5903682c9c3a34c6541dd85fb2e11f640f2f178cbfe963d44d2a41b6bdae
e83d3391a9e84c3b7add5759eec7cc8002d6405ddaca1f84c45d6526826b5db09c49b
d0b2d291777dec859e276304ecdb6dbe0e84c8aa7e564c59c4a36185137163349d779
9f9fbbe584801c7b1e4683f332a4b08e9892172de0bd2f1bbcd213284b1303c5cb6f9
5a1e31b7833be5e0a1330a8a0b03701871c234e0a8c3b5f1471579c05ba6f42283a0d
65d0ca7a5058a5b93a7a11d9d75d08764517fbb07a1ecdeab00d4f6e2058011bcf5ac
94d51ba21fc1dedb59bbd851ac0e6be58485c835ce439b58615080982985aeb73f272
59119384c94630d8a8ec7300d5f0b71db3ef5469b26fe8ee3c6b19cbffbb85531b81e
c4df164fc5e52bac40d084142c39504e55668626886b225fcf263c345c9155d805d1e
679907b8b3cbef82bd3bbfc6ba66047f79f284d7c401f5910c11fd1ac7523057c65c0
8802b525996874f748a529f1d4717827bf202a0ba8dbd3eae5cedf25bfb6b5f7d4e1b
bbe27d00d0fa120584c93899220579270bad126182384e5e42fece3439b9f87302127
de09ef6f0d6f01ecc7e1c779fab4bf3753d77d2a1af21a73d3da03de568dbb533da5c
1319bfc51ad887124bec5742acc2db42d91527c5f03913e8a388341db1f5df395e237
44e5ea29799fca3e2953da5aac19ade8bca6039bcbf4363ba0412d239b9fae4ddf527
ac62d6d060fcf152e84c568b17f232f2755ae6307459935dd761b56f50075188173a0
b1a708e0c463feea1addfd2110d131853596bd24940566c27cf5ace6582a116d72250
f5d2c5cba3939b60364a29e22652c299ec274135cfe1c7483a76b57f51278f342e47b
0efa6b02624a7263184a7148cb500c19b6dcc4d8d0fa4864bcd48d2c982850587b8e4
cc97f1a21e3a1306a9797f00a2e2db20c4a5ba2b3063a231b00bd21b63ffe1856def7
00b583bb1dee0b68e3c5c0713136f4cce803c4e206a18de44e9010138a19eb56efc79
28de6681ef3e7c780bcfe18a120c581ed02980f1f94638281208ddb52f293ccd717be
b4fd1db30467d9c3e0eb6dacfb333479cf984a2f536cedf29b2fe4a060a44026d96d8
522f808a8af156e0da559cf795d5c87cc2aedfa872e4a8f9cbbdd197651f128b1e314
51bd97d1086fb97178a1a35510fe90c56d5fa1692e17a9226134db1de8e00480ab964
f81b8fc07744af32f31d6290d8d62d9c353356d3ce61a76f6f486b6069c92de0826cb
67ec5567fc43b03dd3c3c1213f389d27df91e5b6135518cfc252ef80d26c41b96a738
35c280381dcc2bba3e8174fc953fe9d0beff59bb993a00bf791bf6b8eb1e1deaa541b
f444f3fcb6388612585ca5e0d2b9e3e015a93dffd6f9e8d078310099d3cc848e8df8c
e1b3c574f161ba6c188aba22ebc3578054426e2dd6a587e93fc82c2ba672cd2b5b4d3
ef3a1b15ee89321977074fd413281978049f0404dc3691bb0a05dac4b0448787febea
dcb8fc5389573f95f3070b0119d629aefd228367e25dc0b39e48bdcf9f69be9ceeee8
5265935ce91743bb1f7af5f77a027ade15345c6dc31bfe6b146503ad2c0ebb0d0bffb
cc46f49a0ffe089ad53a70fed545862ae88cb3f05d3801de7c648dc2f5e485a685a25
a9466
finish_msg:  6b5cb16f05cce347ef09985934b84aa864525eed628bf4f629eb5a4e
00e79dc9af0369524728b4b02fb35340735afe1982e9630276cc11507aa867b08f1a8
b4b334b77e5dfc0490b28a37a24db5ee81dc83b7e62ca5309277384191c50491c6239
8113a9a97ea10d394a87a7695960ccbe696ba9ccc66e8798d7f6993cb7166c3782e54
e306cf726afb1e2608c4bc0478ab210d63b99111262ab45da115c44b233a2c5e000e1
b533741ee1ee4fc61663c33f4f642e2e44687334a1ff89eaba2e81d10b0ab62c80379
9846a732cce5aff1e0cfa15ff25c9ef7b736a9bd8e687202b6689971c5c80642386a0
9309dc0c2848b8255d1b8621ad36df2fef748bae6075a7a7a3b5d53cc0dce36ca71b2
70380fb4c27be9327dc0fd6cee07bb626d989e4ed31bfb09247d92fd954fa238b037b
2a1bceca482db496a43e2c1ce75d4897bbabae60b61f9e3720cf912b42f0895326147
f4ecdbd84263a839a8f4279f41d01ca221340141218b6bcbecc0a45fbc1611dc1db20
cf5b6eef0838ca41ffe9ac0ceccf19dcecd8195998f5ab2f79da7b1e32aa64ea39a82
4ea12e9c0f435ee4fc6648a90e6d8fb2d0f68b0d921aa8d3eccbc7ffa06a12c06cf49
6c12eaf93f160ab4cfcf120cbd9561e5a98f15432d25f04c01210c657efb8f195c7db
66fe449e1cdfa806b216d8d3956f683438c323a9f119e69152032f548faaf349288d2
f1be03dd489073ac60ff78013cd36a4d14041a57925065978eef792eb7acf8de709bc
960dda900a362ef2711e07b50613ce91dc5d01900780bd1a5615091993b27aa362516
fe0a9622ee5baaf06584190324d8be291d7f696eef2afcc3df1e9d6b7dd7eee874e30
487ade9bf79e4766976228880bc8a72d23f4550ea6822e071230db6343b833cb44072
ca144ad94fe14283ec2b98c80e6be4aaf518e6a9db3b6bac9cc0b80100968bd614bc4
8109ecc5ebfb56ec3a3455872bcd2d1ce8b30d57c4960f6389d504bb22f0092121132
df9192bff2ef8bd3fd12a6ed1191643e79000bcbde5cd47f1581f46f82ebbba3f0d03
913bca0498ff384be79a485aad91fe75cdbe4dbb6a884f8ea9237ab4f3ac54817f1d8
0b1100d4a022325e8a144e13873c4ce5604f8cdfd3e5b21c04ed0deaaab9406381212
b9be4f1b216fc3790b2abd521ae18ba9fa8375f96a9b4963722864230cbb598902360
798fceb7c7fc8c672c7b6c362fde5f08d04b85e744a870e2d3dc3520bddf38d5bd50d
274571313789d8efd9c32a6155609abcde0287f374c89e60487fd8e4882bd24491996
0c048984e2e14464afe449032b560c3a2a93896dfcea0d04960cda6e2858b0291709e
7a1cc61f33b65f05d4d84ac4e48ee8e86ae11750102dffc96473db257e445b821fa5b
8ca563acbd5711e07c643e2840f4a0491d4e3df82952aaeabf0adce061d2c7d54540c
a22e22dfdf4332fdcc949e6af3a9d1d0c5bb0506e94f63083241ec57a435719850fbf
802187d700d4088694db7e188971a9184f741d70603b5f784cc826835d4da0725fa77
f0e78d787959b4e66be1732b7cfcf0d28323daa3f198b
challenge:  4902871a0bd91409647c036591ccbf0f6a794d0ad20aeed41e1920888
0a8bd5ec184c0206e37257b788417bc1f8fc49d6ae783378859166328f07754548b53
7a08d0b23cb5addbdcadee252524c964da28a518cf57f947358fd7275b10d48cfccc2
506b81858446a8490e62d17596c6a5e508044177bbb0b398fe55e6e4183dcd330dced
4f9fc8db636f14fcb8213a95f79d32e3b4baec543189dcb0f2f1c8a92d406eabc4cc5
301a5f7dd05a0dcdcaffbb0f66ff5d6c862daf56940fbcd658bf738af27285c6bbe29
70439a52912cbe78a1462d1e34553e757809c4a4ea5467dc47b8272f5027f61363212
d8d23e29c6f4d5f701395ab5a67229291e8c6a24f34ace8c6ceeaf71b9f7c5e2f134e
97960bad15746462c35bddcf07bcd0871b0dd1ab40334f160d57d05772244df5be8b6
66add46870abc4579653df10c6e363ee38aa572fa4e31c3c569f1e636c27bcba4c806
3a0b0547c793acef5240602049aa19e4a3524e3382a803f215824e69bca890ec4d838
4582d5739ece314e346cf5b9ed59a252ba84edac83ff10af3b3531ce6d628f9215d7b
21c79001cd81c9cc42d9dd38c2c338c52062990a6858ec6eaee5352c4d35de8f7a6d0
d38ef7b556581bffe57a7ffcb47b62f74b4d5b9d2c2167bba8456326b6a6aaded31bd
6234e6accd4f65602f3cd31f8e4314bea25ff56876b1cc3f6884091c296285c6c6aa0
7ca143282b267064de7d15212388a9b1a8af395ec76f4e699d4e445666ff19c55fba0
ab02bb1cc0ce769c61f4e950c866796fc34d9adf50320f95256fd2bcd498683d1a923
c8155f1afa09a67ef5205bb4337da9b848a3855ca544470fde7426087f46e86584ece
d565cccb803e418c06f76e7fe5c85becf2b3cf2e6ee55bb00d367373619067c9379c0
3017c201a03ba783f183cc7f2d620aca9a58dc9bc0fa3a770859ea021a597a4938ea8
f098edbd3231a2eb9b05e13b4366567097c1bcdeeb4de7ff2f4935028eea7eeab3065
95dddae916057039cca50cf0ed1f392526979a8636aca9d6459536f014a21024fde3e
7d53690cb660f6baa8b93f37d054d59ec7c3d0420de912abbf33e018762ce1c1158e7
3420e520eba03c804cef703add7a9ec9cedcf200b8b8c8a37f7d25d5c60484a067106
aa6900857c6c68a2ec51241352bf9223947ddaa9273429dc5f624d6e6b82ae245e139
c91e3fb26c07e2a50122240401782b982fdabdba1d773d559c3429d68564c379d433e
fb54aa0548de8f115f69b2d6e93a7a9fbc8115e2f17ab2e67fd1583cbbdf71f03561e
2477af18d14d25fc47befc3b6f53dd980bd55cf1607e042d312d8b629101f4be66266
20e21326d1bfd832c1d54035ae1160d1bab5120e2b33b2e3f29e5a94e19dbfd02b7f9
675ae056dd58bf8d62ad8192280b71148e080091efa793b37be7614aec16d0203bf6f
fe68e9d0c33a93226c95758f85f974a5d44800e029380b510d30f20c34519114ad793
8a581d82dea7dc56e3e66d27ac03e6a1350c63043274be8ea4b5a0150d888804b37ec
5ad0ac43846cb4cac7ddfddeccca5ace739febdd9aa7c383d3c47d88f0bfaf43900a2
fd846e0dbdc9065923fe7c97566e112318e0b7acc4430c470cdeae0ce8dd03b74a08f
52b8a2a3dc72c945a00ac470c0934e1820
response:  0302cb4f4b3679b8d66ff3ca9d5c1c7571ab48f3741d69eb8aebccdc36
b1f680
key:  20a66324c9db64f2907bbe5171856e6c38f6575c431535a4c733a4f92d1698d
c
~~~

-->

<!--
# Acknowledgments
{:numbered="false"}

TODO acknowledge.
-->

</section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y9/XbcNpI+/D+vguOc84u06e7w+0OTzK5jO7Emie2x7M3k
zJu1QBKUuGp1K81u2Roney3vtbxX9j5VAEiQ3S3LdjIze87PJ7GlbgIECvXx
VKFQmE6nzrpZz+WRe+/xTbFqKvfZsl1P/7IRi/Xm0n0m2vb1clW59zfrc7lY
N6VYy8r9Vt64j96U52JxJu85oihW8trq4S/TZ/e/fXTPoYfPlqubI7dZ1EvH
qZblQlziXdVK1Ovp9bKdlvXqbHr185W4kFPPc9pNcdm0bbNcrG+u8ODx8xdf
O+g6dBaby0KujpwKfR4513KxwT+ue7Zabq6O3AdfP/8Gv6lGD1Y3V+ul+/Vy
hRk8l60Uq/Lc/YaexDOXopkfuT988x/yjbi8mstZubzEx/TMkXu+Xl+1R59/
bn33+Q/U81mzPt8UR+7Lk0fPP3/+6NlTfDbHUNr17kbf3X/x6OSF4wjQbYlh
u1M0cEGH9sj988z9z2XLvyty/FnO57L7TKoR/jfI8x/iqhuh1cHJzP2zWMny
orE6OVmLRdPOxevBd8vVGT7+u1iDpBj9ormWq7ZZ37jL2n0g5k29XC0aMXGP
V9fNQtrvb/9bdfMfTdnONmUzk9VmMIoHM/f+zP1huaysUTw4XzXtenl1LleD
b4fjuE/TwksX5cx+ZSle/8e5FFfN4qxo1u1sIdeO4yyWq0u0u+b1/vr42Ung
BUfczHDuyeP705AJUIlVdeQ+k6vLzZrfNf1KtGDYx6I9d/E1uHYt8VQxl9On
m/XVZu1+vVmU9GR7T/UpVmfSWtTF9fxqU2AsmNbsbHn9Of1An3xOQ/n8yfHJ
ixn9NMOoZldVzZ0wk0JmziZu4Pkxf9ZxAv+Z6n+ZMkfuEx6smIMkLWa1WUta
IDOjlof+Qpbni+V8eXbjHtBrDztyhENyfL+sNpjfd2INeZWaAhDZ6aNFKa7a
zZxf5n4vSYCb9rJ7z24KlO2q7KfPU6+bq/ZzvBc/YNDbUw6i32vKDmkSix++
2QTRcPZP5GuorZWomrPLlpSA+6ium7KB9tqpzogUz1bL9bJczvfwwOvXr2ey
Lc+Xc7Fqz5urGSbw+ab8vFnLy8/Tny+9IPDaW2eshONHsfi5wZDx8XffPR4P
vB/m/fbm8lKuV03pkiJ1Hywvr5o5JKpeLS/dbx99z8S5/2j3aOXVqlmsZ40o
VzxQWo7P/Qja9Q4jXG7c7242e749Ac3O5o37XbP/iY1oIG0LnuJ4hsY+7FkF
26pAxbj40n35wP16ha7x/MX7TDcJf+vpPn4+no5ZmwKac6UY1mI124wSi+On
RtyiaPbMI/DvMI8/b+aNcB/LtpV7nvi+AV3l3H2+bOUChvQM39//6s9BPBKe
5fGDI8V0Ha+9hulbQlEeVxLS+qAh3X73OcSfB+FdpnC/BmWW7v3VqhFnYt8s
BMz+3P1KrIplu++hbUPoTKdTVxTteiVKWJQX503rAotsLmmhKkj2qilky/z2
4Jko5dO/vAQFPnOvtFqYuMI9V7wrOtF0rjQbT8UAG12Ai6Xh4gNBtDxE12Lt
tpurq+Vq3bowThuoTTFkf3C8cMs5cc+0lSsYareVUOGLM/xbblbSBWFgedfO
z4qtptDmZMlcKHpRXmBVZsPxN2pOKwmdvybtKmhBpwUZBAfEWLRal+LtvNz0
tJ7oSAUZUsBGA6tU9nscnhzeJeZYQEPOSkmwRemZOyQ81maJdyyq1imXi7o5
26yUfLgY1WAiM7WCl01VzaXjfAJ5Wq9g5NhuO46lLg/QEjaI+pfV4V3gq1ki
x8wQ8wCpMY3mbIFnASTxzXVTSdcsuDtaOAi+o5Z0fuPewgy3LLCWMWcl5zf0
O/XqwtTOMSfqA1ZvJcC/mDIxwsGzb48PWeGYhlXTlvNlS23NMFsau3pPC5Pr
LtcEymhs6wbcrn7F2ilFq8blXIryHOqM1gr2eIEJQXNh7K/xsHTxWlrolfx5
06xoibGcmxW91EzsU/r2rCFRI9pg5Y5V/2LEUHrmE+vlbt2s2rVuzxq1mwsA
/6qpGwyYJsxt1MyAQd3uO+JB91rMN9I1PFnhu2uM1LC30y8iUe8catHqDb3P
54zrV+6mlURA7vzGJtHFYvkaInDGeIU+N11iLDW1tAkwmB+6bF0A235aNAjr
9fwAN1iuILVXy0VFxO0miPHA44DMNwxnh8zmtOeCFgXKYiVJ2/DUQAbrBXP4
QhCwBRaf2ay2hvdpPy4s29Nn9//y8tE0fPjYffv239VvXx5PH86a1bpWbtvy
Svy8kb/+yqQ8oVUNPqOH1Y/Pvnt58uXzrx/kYRb++qtDQrV+jfErJ6mld7dX
sqSJYTEGSqZl9gP9e5nUMuiwJiT/BcJUzjFczH2OSawkJnq5rCQ1frx8LTHb
iQERV6ClXJTSYRW4T3tO3AJkcdVUB3Oq4Z3YioD4iBQEUXuON815MnpkM/cr
6maoTq43c2AEfh36gakWWA7w+pPl64n7EAsGj9X5jvlODQd0Qn+kQoqbW8eM
KfZcbD4268wrP+AKmpZmQwcjgQbGQOFyoy18MqPRwLwEZGbuy6szQtJglWI4
qZ4azhUhHT1At18f4rLFFAJ/3QhYUMmLrVQkD4zsGf5fLF0SqIUrDXQia6BU
XWcMSrlaw/S5xaaZq9HMl+VFSzPRdmbILQfM/Oo9WNDnXzvmyZ6tDyGu6gHN
PVjDvYbVnS+Xly0Ls4P5FM1c+9DyDUSdFeCQg+ldVwQ34IG5VXPZAJKcS/54
3VzK2YehkIV+zb8enHCHcML5cDixRZp6Q0xjdEU7HBPxM7oA/a6AJCDk9MRC
loDCYnVDLN6QuuGOGkCQt2+HWAPaS/Nx2wMSDGj41Mz54g8EIfGyt28p6DO9
luV6uRo0p89d/TlLOZQTPiFFdU4wFITvxqKWiLV8uV5gsDN3Ov0TQZsHy8U1
rSKxPr3voYSP3fDvRBjJcECZ93vfvzx5cW+i/nWfPOWfnz/6y8vj548e0s8n
j+9/9133g6OfOHn89OV3D/uf+pYPnn7//aMnD1VjfOoOPnLufX//x3sTHtW9
p89eHD99cv+7e1swj6Ua0y8I8EChQfmSGhOtM4CGXz149v/9v34Eev4BRiLw
/Ry0VL9kfhrhF0COhXob4xD1K1jqxoGqgn5jDp8TC101a2DPCQl8e066hLQL
+Ojf/kaU+enI/aIor/zoT/oDmvDgQ0OzwYdMs+1PthorIu74aMdrOmoOPh9R
ejje+z8Ofjd0tz784t/nQGzu1M/+HRzkfPIJrMq6Q6buC7mC9uEgimKgejmf
L18TO9Ym9KWofAULxcxLK8gKE5pxuTlj749kuUPywOMMEE0H7imkv1peHiwO
T90zSaYO0kD6h0OxsCFX52SoSY6V7rlq5aZaqlbw34qbNSzVeqVByRyON8zN
6eKUv4H8qfdBpJZlw8EfF143JLwbtXv6yy+nUAOANngzxJcw0UKRgWAOoIf1
kq5H3Us/kb8+fX4gAAUO+86gdqUS2+lrspR4RL+WWhRy/VpKCniM3+GeilOm
7GlxaqBWCxdVT282IiKe58m+Wi9fQXJ0U/xEH/A3pzQvKPL1kGJK2yw0yCWr
u5BnikgkgWesye2u+WG7Y45/y149sby6T0+C42f87HHw9OQZfTQQYS2tnp/+
+uuEzAJUNL11fjOemns6v34F5Qx8duqqf4k77FVnXC+IhlP6GCvQnE2hixuO
JWmGgC6pmzczjuppIDlxuWv0eHDgvfG8iYu/ff47ODx0v3T7T0P+e/gExZ+3
RlpJNdIrsWq3Bmo8C/mGpqs8ROg6NSsKdo9mYo29lJXqgYzoJYwvQxlaAOCj
2dlsgtb9+w9uH/lwbubT0xlJv/Z/rLmg5xJ8zEiWNCkPQo9MsybACmCEGg9E
XbKb4MKeGz9CT1EDLvS4czmGE/j6axqY+tvzDiFV7GLROAyTLIy2Uuz/t/ls
dv7TKShUS2VIWW7mBKQwUiapWK3EjX7+lDzUFeEa4mKyt5V8g1Eo+ZHKg+o/
P5/6p6MRn4Fnzdt3E5XtTjdAbzbzf8KD9JwRcPNF+NO+ZTkBCJyL1fxGuYQ7
Zr1/0vQLPcZyumvqLq/2qbsBcpjz45I0em0ehJ8wk7PZxH4bBtr9Ak444F8O
fzqFdr+PJRLzsyWQ/Pmlsg6AOWBfqO72lhAPa5G5AN6jmAQj0Gc363NopHlz
YZQ+scbMfSTAVp3UrcUFCxoQKo26WVxt1vq9gsK/FA5w9DCqTWk/u1TbOOz2
Q889656HVALPkS+toq/6EaAJeILKLdQg9FqsGqHVovK+LfDHcwKbS/KKP3Gf
Qv9eN/L1GKWK5lIFXBin3rAx6LyBIxpuh4AZsy7siIgGyc8Y/uqAyR3iJdSR
gfbk5VkBE+PoAfRiVM7+qMHQP5y57xuucXaFa9yPDNf07sOecI0ewXa4ppKX
7D3iM3d/oMZ530CNe6dAjXO3QI373oEa55ZADeMitUZdOGVLLpuWXf0lgTr0
dQkHroHuc9tL8r9WPadSQKGcb3g2H+a+2b/Qe2ksmxU7ozyCxoZkHIR0hq7z
kdJfxrHm7ghrPHh2/8E4BFVe4UsdgRLw+167g2gEd6zHaLzLF8BK5Xkjr+WY
0TECoLq1VtCKphzT5rBD626uVFjWBO9YTZj4ebspph1ZyBGxF+Pt26vy6tdf
sVo/SKXjjYpXzm23Nvql7Sj8fX/RbV+4S62AuuDdiKq07t1AGuMR6UgYqzXY
EgkPoNc0m6KVP2+IT1qpoehrPLSS4gIs9Lp7amqHN4jFyW4aFhrFZjDX//mf
/3GFaK/Pug0a+vPZdMefzwaP/DL08fWHo0fGHX2245FBR+qT7Uc+s/vY/Qj+
Umyof/nFeWAksX+kI7p+pNMd8Ox3v+iL6dT9T60ytl/qjj/50KH309/3yHjo
7/+iOyyGO7OfmO1aUnqq27PRkz6RnA/kfqG7dQdip1/9J1c/hh4pQNK/9FP7
pZ+6PWHx2F34EkzMUrvoUDVLWKvzFPQeSRec2iGRinNIQxkVdLxW4dF1F6lq
0Ml6ZQzhEu48oXXlK/f6gcMdpCFaNYjX4kYbgBXFnoz0d1r/lpgZGTc7ZkaR
MeuhX391hnOy5cgOSFbDdlfzDcXE9ra1opmAhzCeV0syv9opovChZYw0SFR6
juK7DVFLKRqljJnadohhMCdnpIPVk1M80rIu/kRnipm2D+0Y4ttP7McVlQfR
3SGpz8U1jX9Do28uKaRgj+SIAia867gnA+fg20ffH/4RY6S3TS/kJRZg6n6l
ghMvF5SmdXl7B1+9HHRRbEwn1OohwSrVxKQ74ZUPv+6f76xg1+ZkDXBS8jaR
1ebEanPR1nja2RFS7de/ampYO6JQyYkSeoeXIueDtR2sGwsB4dl206w5JE2b
AMPg6YwjXbeR5O0nHTHh0byb/IxHF73f04FSDoXV7DHyTi5hI2HQGyNVElg4
KusbFYlhVDNz2dbzTin1e/zk4fTBg/tTHQAzmRWsh6p+fbg/6h3+hnu8Zu8F
SKg15r6P3rU3IMUbjsXx+krM8JloVgfU9vAIH6459Ec4qrSntdQwG68hXXmF
NhR4OGgvJu7VBVz0Dn3bcY9T6haOpNoJVr+5OtLJ3H/6RH3WRewUtQ/Q5ZH7
nCN9zd8J49gjMcFCDrJdnWN9V2JOcRD2uKY6QtFjNBrwAQ2N6DfA0bwfTg7y
sKkcLDkTEatK3fAPpGYLYj/zFIdwCrXhe76cg1Jd6E4tODUdbs9iGqdXF6c6
v8H4tDrishK8uQY/X5Hj0Wq1XJ3SBv9wZBQR2VDUmlaT6VauJ2578fyWldy0
RnNaYzttLyjag0HRfsY17/HLnrZ3pCWxAHohM9GPE9+vpNpMNcGLcj2etz1r
Yis1m37aPalH02b2OeKQkF472vHjoEy3ArLSgekdPMx9lOu9PYjFcCrcToUT
KrXimAVIwf1cXezvx07MILXQN1QxAa399D4cu4p/nf5ASwUv5q8/HD/5hr0Y
SPYCwnyjPJk3JNNK8yvVNlb+WCOt0ZRuJ52mo9cb65luV7CLNltRfrL5dUNp
LaJYssFaObyJN9GgAJ4hgIRyeqRRWRqHTGB518NntCPlkCsnqqrRGZ3dJrD2
qBhfPMFYKPhFUSH9KC2jfke3sU+5VjumpRVpy1ILc+rP3GfdKqgdiwbSyC7j
Bk63shqkx9QeQxcq1yHE1j1Y1s4oIg/TRjrECWY6zW0t36xV51Dqi5vL5aYd
5xRQh+U5ZdW5ZdfG0Zv4B/efPKXZHSqYRiLRU6knDr+hXG1of1xzlOyJiBcY
1/p44ai0Hd4AnLDdMTtaHAHhxVSa7VwQxOyI2POsCqQtltacSmu2tHE9F2pi
wl6DW9hbdCE0NPr+uymeTpMM7K7zk2l/QO2mVPQ1YxU8MFMdcpDAJEhKldPk
3vsW+moul4snz91p3+c9kiH8+Oi7R0+fsBhdywYwhSSHH4f49BFwslbNXDqm
r36z1syLY9q8FwayE+1sUnDAsafbhLxiwvuOMet9L30nVoMZkBPnaw1I1ioN
KRWVadXAid0I9e7BDhEwcORyiR67bAm3qZkNVLATY76GRiXunzkdQtoF/7Qu
6XGfwUh7saKK1/UhW/aFOG7bUpi1BfhVXMP71WLugARElEuKzxFnW7knlgKn
wYNsPKsd24Xr1RJ9MDVvYT+Mrw819hDp/rPjURCZkfijNxxKOWjFHCzSXFzC
xurPSLtbW5Os4zElhhTdtuSTNxrldGaS4tXueL6n6PnURHuXV1rsh5gKIzhl
rPTmCg8eXK0uJnxYZuJ+x4O6UpGtrTGd4slTCwB03ZueqZNTHhrBk+9Oe/ul
A+aj0bLVe6OMnn6iBVwzpvfU0IzgoWEBYxUtVtvlNRggDndhpwq5ZCZSgkBr
eZvzMdFBYObFFsvMyoz24gCTr8fe4Dkd++iGu5tBmCP0+w4u2zOALmYLoj+d
U7nREKPth9TLwNJ8zP0qNjhFJ6c8LOpIr/EEY1lBBXIWyNqk3mDCNW/eVw13
SCKvTEc7RlVkb50FAJDaZQDl2pqA6HzecHgE5qghHVqa3E21hopO3cb6d92C
fTJw6c0BCKyVHQVQbq+KAU/2BYF71W73aPstJoTLEVy4jMoVNJpeN3j7lvPR
SX/3wWOhXkUu/9q4Rmw9WKwg9RMtA8IJpqvlZlHxC7+WtCUxdxdyTQcHOFvN
ZGtD4xOP8IKprnqNPeP5jsIcNA6V46QjDpwlf6//XkDubv5uogxmFop2u+Im
Wx2enqjwKymNwaGCT/s2hBY4RFzcwOOmwwhEKd5NARvMKTpk2eBhFPi10MnZ
w5HSAQ0e6H1Se+fN2bnKZpyMQ/hqM5vJ23fK+n+1WbQmA2J7V8phX7FZTFS0
hqJYc6k2W1Q6oVDwR21edWCs1RE/Tnxm9QOpOFtJ6Wh6dWu5kgrKawY/ePb8
5BDsQxCJMjVUupC7LDh50ADBvve2ByDt5vIS5Pt7t70NkcQ7xaWJlb9PNHt3
JHEY6xwEpgfh1WHcdyuKOvy1D0uPmo0C1MNmVrx33KHrnvDafdqOA9h7pj0e
MAW1uy2SWwa//8+tc/5wUlm7AMNmowjzsNk+Un12W9D5buNV/9wpDn1LbHqo
dDlO3G7FnMm/1dn1m8Wi31YzyUtbojsxO55k5cdxWtV2IKZAGc5gv7aQNSE6
8zozDK0qrJ1Oeo96PUXMHJjyudAiaAfS8RFDxEquKYdFpR/x9t/PGzo8bD2r
dFpr5dSq8K+1V/j2Lbciv4Q10Ra9CNg6otUmvUNX2xvv8CaguGkHp+0N4UuV
Pj5xBklRYBeygqoFKT4MpjbQlw5wbBRB4ZurhLtWOv3D3OX58rXWh4SWldtp
ZRqryIGazMkAY739RE1f84vS6n0CvQSMuKLgEnzOa6lTep8ps/wHbbY1ItFb
hO5rYKzWZofB+1T2scIA7KVQKmgtaIg/KKdHLNSHgsnj8rlke8PE8i8ovKCM
+zDffaXnoQ7rsCVQvgflAxK5dJBOrnivc+A660xm9XV30oUCJyrz3vB6b+U5
ZaDhc0uSz5SoDVUSqkvaxDmTfeC0G4aGATVsSJeF0G2eD0K7sG+mHyIyaGaE
Zc+cJqPolRXpwWwbQNjn6lEly19zCvrEyt5Rlk0fV9CmmAjudnwvtkyto00t
LO1k4NbAUwWG6cOIipV76YA3oQdit9Ly1D/mvNwtXO6Je8Apcrzc15QX1X/J
I6FUxaoCdSgusnJfPv/OvVLHBnSMlnLWtuT3kM443IZNNHjgNDiVO9/DB41O
mpUiB8+Q1Ln2Ew/6/Scs0JPDiaXr9qgQ9Z53QRgFXcDR8k0pO1JCZjVf9zxb
UCiQtQIdmmv0CVTFkz1bacYfNFWw2s6BGaMtzHnm3O/iWRzbo3zBGwpemGwZ
RSzeFelTOm5lkpnWUAqwkqPGHs+7+qSdmQUgf98Zp3qoPEtbE3VeoFIHajvV
7OcNlJhOCdrq2ByEGCQZU4rO3cyEwpJqljNaFDojB2k7gh/KfLSH4JNhIiqe
ZobbpuL2g8Ye3T4wx1ElEWggN2LCJomS99358kyoHQfS2Hw+QiW9tuAehZj1
BkSff9gxUq2PvqDTH9GpdrauluhqstUfDU5nxnR6znGeWeGbqfsNzY/rfrhy
cd2slguVgDfKuWH6Ok4la+b8g15EX07ck0MuHuJ+6X4zg/0reUvgld6MWq4O
Hk/UUrx0f/nFVe2o3MKN4BYtJ46+atFSrA7oix/1F/zJK0qvOiAKntF3oAvl
P9HvPwqF2UgclXKGiTcb+NoUQWlRyM8K4Is+fD+yLScNRaApnjBfSVHdDG1T
9yC8AG1ZWEQp/NjAla8o3Dq/0Suk9nqU7TM7Zf0yctKCiinsO1YmOjP4Y3Hb
wtq2sRcEbas+WBa2eaujxbZV/n1l5/jkW6U6uhTAcc4fjbd4D1noB/4xsjB1
H/NJ9kFQbI/YPDKWhV/DH/IW3kRt7VUqiZwx3LWYN5XO46RIA4XUN4TstuRQ
r7ESRVqwjxXHYp84FtviWLA44stvx9+9uq5v+PsfBTU+rvUjx3qy1vSpPZYX
Xz+eER0P5tevYAMOvpk9PDmmwRX3XuH7e3pq3x7SZ3w0Dpjran1Ak/6xOORx
aL3A3PJjoRTDi+F5ENW7zjHvuznVR9TVVh47NwajK92isN7YzBtNPNTPxY1O
zTCId4fah94zG/WMZXrb1SXGWrJvBK/P4rVwuCXyZpSdxO8xOuwJEGf1Y1Do
xDKhuwRqWwH0NuXOCuD95Pp/tXiq9WDDRcQkITvaLy+Kk/8p8mKMqHHWx66u
8u2xdLvjyJzFO4giz3gWVkTYbBN2m7AmYG/OygL1FZRVrKP1E4dDJVT/gg7O
dPu14/ydj3PynIGT5/7jnbwPdutc261zbLfud/C/9D6d87v5X8MQMmvZ/S7N
uYZt/aaT3j0mVdDOiPHErYNiZa85sjoyRy93vInzMtR5LTvOth2Wn5pIzs7B
Ul5qQY0500bH8TieYxrc3ruDGS2W76Dzv8KcCrusB8UMzDhJc950XakdeXyg
HEbO8zPpHPZSoofmjDIcrTiQnQlD28h4SacbTOrjoA9VEoEiSuvOl1/WTncc
j6o03KhMHJ2Aas7pSWH25AfWXacF9AUodkQD2JDrI1hGK4wdiPfSBXdzhHWs
54T1pHWwCyqT8i+6TJheNfJ+65JSkQQdUZjzSQvRz9aAEJMqoTG0M8QgeF07
Porf8NSVjBoPXa/Uv6qLrsk0cVUdForirOUtREMT3t5WeXB8knOLcLtb01nC
d3nlbDgnnWFVCT2ManiXVqVoWJ8+PHkBM7Xk6EwrKUFDHwTcIuKtLjynBH6p
FbNKgp5xIiEhk4OrC0qhpJOy6psdebKMLPoeQvffKBGx5M/pcA5eh28VwV7h
l4P+/fTI55+7L/A9nRqnlz0+0G20w7I6PORzshevXry6EtQToQ2TS8GPgBAE
eu4pbrtHP5v34scVtR+2NYkiqsu+A/4VSOrJ1QU3sobFX5nxtvqL1fZwX3TD
bT9suFyUst093HY43FYPt6e4aw+t7YZMvPgKnIvvWn6HBQYfKBnQnEGrjUlM
zIgOJ13j3r3ql9JKZOkTI63tXqd/1JL/31Giu8UYCcDHSBpLzw72fcni03E4
b0HaNQIO6EiwomHEqFyt8O7nXnZPvdz7zEn3zEm/fvr9u6JiGtfusku82mMD
NdZl77JW72OpOPplWagwUEf7h7nUOlVrrFPvFArbYZOcW2zSx0bLjFhM9pqC
f6gp4z0bnXRm+9OjvsmHCgPFWmhFtuj9JvGPtVmDcFdP8aEBOyCNRRbKPEBV
BHoz9FPf8m/9p7PZT3exT/9MVb7Sqry1Vfk/xRBeXeihvLANIR+vsKBBf1jF
DLS9eP9R8gtJF2yT7MKi1wWNDo/xu85vf1gfd+QWpQ6EKL5Hu3JNz5xbFrEX
CtqJ7PSqCgyY2MhUhQJ/dRz9+W3gf1pSeTRVE4txuUHXWmLZ2WGQbIHyAVbk
opCUSWlUIn3z/9Aox9B/oFCd0Ys+VmluxRvfF0G7L54+fPphiufjdN0/Tm8N
A4vDAs07IoxEJ3UgyjqTS2d62kFIsSO0oZxSfXtQG/G1akBnqNCKJMS0JPUI
wf6p7+tv+FUrxPXqRtUXvrAgP8s1vaVcH/KXHyXc7y3eEPBXXa2g95F0atrU
mPwfvrS6MPWTjbgrt8V6m/5CpZWVHDmxjmAdOfsam5jqg12nl/9Pl6X7yZ6c
q2Eimko77rNadx6JJgesz8tS5/d0e/2VTtI6nLk/ULYPBHuYvmYlbFEWFBh7
PpdzTE/Mm79DbgRl+7Tr6bKeclARv1EhB4oFT/SG/+4xmh5c4RRydwdcKmWQ
UmQTQOUdsC5Sp6ccrRTVgQY6rq1GofK2VQkfDiUr9aqKL6jwlEnSUqF6ToO5
vSroIQWzdnfXFXs0+eJrQ0Cr35qKZ+scPHWuWOd+YSSbS30Iy4qub5/e6cfW
v0fJo0NZGQWfnyo5vmpTrUtRNBmMm0FF4x0ZKJO+tI0qQ2xnJZ586/fpHqZ2
nKlVyRsM+NEnM+LoTEfW+F0A3zpfsW8Ip2MXGh1O6MWHp3/sDwmPqxCr/BMV
Lpzv7dtsrZltdz5s0ifcGQU/cx9LComd6oGcmvwUbWWWO/2/k0OV7M43OAxz
OVuV96m3oihsaWZ4l2FPnD0ZlR3RW/cAVFLTWwXDynE6SM9d2GF2xwYbW30f
0Eqz0/Htdn9U+WriWOvES8RvRjP6Kzg0Z9sU2JibfdXtPHASeotjJ26XTmmY
x2TjOYqZOVysz6G5tsgMn7aDy1rYVJ3VVoXeDcBQmMg6DWnvKH18lvqdU4+H
6eWDZPYdf/YnQe/6szcLfXo4HAX+h8zZH/3JSon/7Ivh1zuIcDC9W7J6/1vf
SV/KAh9+tufx/qM79b7rPargym/b++DPZ1skGa3Ubb1f7/jpltXe8fi4970K
tV/h7tgEVnjv46Z3O7v/cHq7Ghit6vRdjx/c8RDA7VS/q0h8xFmBO/7RRwpe
Lrhc30DFaZp3+01dZYt3pvzO6YaCs3PGWw6XziEENL+x6y3zdthiyUHGpqv2
Xhn1ynXeAAu6u0ioOI7ZbNK3UPAz6gz04Mi3lTXCWEB/2Z3SNO8iRWzvPKud
2YWzNaTd5q17vYKVlMdKZbvG1br6tEjKCO/Kc2nj8sJ+4pz92M2q3/GfuSbl
xjk2zql24NUB+EGgUdc90/al82YV0Ux01fpZ6r6cd/ZlbaW9GJYkoUpiOjuh
K4TIm5z9HNhGKROljMgRCy4t58vJiWZspf0H33SMf2duVi3K9RuI60GLv+As
+uRd7hIw232ZdbtN+t2H44d3Cec+0d33sDWkvQ/fNr0//TbD0H9ApoDIFPCY
1N/hod4YGDWzSWUHOWlGPKGObr/BCIcj2vfwF7dR6gMIpULXr6Bw+b3Rbq7Z
wTaWUKqYwmw26x4+YGZsQSAiNM+KybyDz24bMw9oe8z9r/84ttF/VHj/FYdG
9rfYwTdG6Rwo/qOZfSDTvKda0P5Ev87Dfk2ErpuXsowcS1Vqa+s8hUl66pxI
oa1EdwHQqBiqOWPBIde75lc4d9+1crv8ihcDb9AcDqbSc2yCdJVck3ThmGSs
rSNQOze4VPd6JJQroKvTdckYS2vOdgLo/82veI/8CqbYpK9koY8qqxBAF1O7
PVlCmULS0FBnffLs+FHa9/GtlIjgcLQL71O4sqvofsAq39qCUFrOJTU32n9n
8VG2fXT+QS+F5kpTSFEtlSFefyTp/USGAdOHiIzy4EeCYycNiMGeiGNqxWEt
9ZmKgfhwoeKZznQrCX3ZRRr27xsbptGnZAcE0/zSlQwfHs3t8sFGuqnq6j3Z
2orK52owbTpQJGfEqzfeu6gUX21mJUJ3aeGD8XF1IrloNyudlSXfiHIN8M9l
X2r3tPV1ejtHrvg4V8u7QtySD7DpNM+OMOSDOOSDcNk5dRKLL1LpLlbY0jG/
3X65PZDtBHN9Rdg/US/1B4k+RC8NW1t6ae8JlDvqpWnnTe5/UvPe77PP3vaa
z95pD4Of+AYJfWNB91UYzGY/sVIDn6umQac0By+kTkfak5rcH+71qF7MTs/V
qsUH3S6RavHVbS2UprAb0ZyCsZamLSX5RumNVyo1wN7kUpqbELXp1xKSe9TB
zsbdbpX9bd/HyTFdGEQD2JeTMGzXJc9Rl6BhcNtWnD3A0X4cL6f6N+D9OSI7
TWLQZzd4+rTvl36zadnhzxAtR24gvtgzA2srvg22rGJwuPVReLgje20YwVIM
1bs8E8UdEx7iYb/v2W/ua0Bqn/rpSvTvOfKjDW1fP9KyJu0Q0qncd9oK23Xm
T+0f7LVZpuw/FDqHjqiwoDlxqF/uDG2WdfyhP7htoiz6odlgkpwjfouNYUe7
DdSFmcQ72srYfbTny8280vam29q2LY77fhZn5At+sOWxwZQ+dMyAY/s8lg2n
7RyF2y1Wlz7/O1os9qJhfp7orLnRUch/Pmr+Pa3TzqCAvar9So0sVjBKe4Ct
clxjiXqb1T2ibZZrtNjORz6jXEzWTbaB60xb7413OkgftvxHGbX/RSbsX8uC
4d+gC1ZtR+c6a3KLMdbib2e4fNyEmBPVv5GZ4Ff6BwYsVvxlOzemG42VW9N9
Zk9d29Nx0K63kNrntC2kVll7LSR/YZUu6nMBrJuOlbk0CV1rnYIwMJNQHU9M
1b3j38HQjKP3Vnrb+s2kj+sMFT5G3zngrIGjuxmKWxLbbtXyI738uzsDdlxR
hxU55ex9oBbnV74xotUL1Y6I5T9NfuzA60fLzzjaOagR+dmeIpF85cMg+6u7
KTbu2Enda6MyGriCJpdypLNsSmT6a+npwel6OdUX3Q4vqYe5H1w1tFW4UO0x
Lq6X82s5ShbTYsyHf7t7mvbfq/RiOYCUVhCFZZRuk6Ma4gtVkKuve9bXHHIY
nIh19zaWMF2zajGoBG0a22mUjrp4nXvgKrd81Gkrk6i/fPwrE6XpZkdxLyW6
dFKZSwbsaW2qaO6rdDrTKlPyXmh349awEPuolqY7vuuIipWq3UFzn5U9Uh2W
7kuri9b91H6o/XS7pqa1Xa8r+bd0ylOo6mZ2UcwD5a6YAj+O0TWHXYVbsTnT
d18S633q2tdQ63Lf67505mOqnamiaPTBNxtdS5PPsKgb0Zj1mGdaU/e22x+1
rsjoD3QTztW43tiabvK8mFaUkJ5dWS9SzGlqPX3T9/KfXQ9vP0Hn065HCG3/
HXGHiiRM58slX1asSgYMWGaP19KqSg+6Mm9329jGFIaiHG1VoU7MLY7ZlVen
j57DAV1yXWCLALrCmDkG3N8sAkbE1/3mCixKnzXUHettO0G+6QrPcSMu6y0v
r+ZLyn1UxX8Fd+qIkmslbJ0aGgadR66Pcp5NfoGpFd67xP2MGrukRZ+1fqSM
PNbQrM/3prMP3ibhWZnbwLUMdHP9X3p8RyfBj1PgTzgFfogs8OFHHOTZsRJ6
z4QJ2HlsZmVf6VOpeOvMVJbWBpgi6PqYnNt18KTTg5+5gwOs3edfDvv+m3fU
tfmpPwU7fKZ74mhn/z/1dr83UPSFPirZK/aFuRrWvvfCWJCua8PwLE4qEWbX
XdPbzN3+X65+F1ePubC9lf0mhh/uwrfDY9L7DknvYJWri/5Mrb3Zo07KXF38
kSxBdzmF+pRvNTIHPfu7N00JtP4T9+ocaHBQPIWCeQZO8hnK0abLaJ9Z5dDq
BnRVowpi2iw7GVzlojR7d7ITFDJbdeqCVZqA3tmm2voGko6vAnKsEZHGr9UN
EHwV68J6vS5WU+u8L4I+POUutVfogwNdAUKebzdXpy9WAVHRIIvRsr7xZ/su
VjG4zkJDOipR30En3iJ0dQFeeI3mwkqdp9dDYW7G25Y6nc5i6CNV8n6wNXE6
cx8vX0t2IK16tQqvU8lI66IsCxjTe2H2LVpNdAWPGzts3UUDzcgM4FS7cbrc
RyeHA/yoal9SZh2QFJ0iZD4TN4r3iLCsBrtAuTCF6ClrwhnrHvs22zV7B6pu
r7rxg2vIzJd8swWlB1qui64QO8oWHIiEyRi0Tqhvp9FZoj1MaDEZdU8+v++8
X8aM4x5c88VgQ42yrYNuSRPel7TTPam64ffYox89eeespvd8+4BQrKkOtgb0
AdO7K4FNbgTrm+7+ywf2mboTdgbffkL3yDrm4tadfqN78OzBocvO4+BOY0pg
hVrpLkUmH2xwxbHJrV2BH8VcpVrwxk132bHxN2RlgVijhh24SNcN3SbUezkM
46sl7fqYuyy5AmXX474kAh0fcpRLoavAqmtj9NEslXtRK9tN16psqPro8J5l
rTl3FX9u2j3UU1435FWVDOrUDUgl57W+MODZA/0cd2MDTT4/xSacj2IqMLpg
r1lYpXLdgspZO1pP0Vkoyfajv5K8EawL6dqDaqouu+xPLR2s3xz+0dXH50aX
LzpkdTqF1I1ueKm5KVu1mwajKx9AxjmFH+XUBDyVLrIKMhlrZBdzP16oVGqq
5qhiH0Zfdx22I/vNPOoM7u22WXTmfq8UOR8d07z0Pp2pexUn23GQHUipT/Sh
0IFjrrH+4BDK4czhCM3+u9tH1SR0mtPMHdZYtjbtTGmxPnxlRU/M/TO6Rm8/
XiOmW8ZlbJKG1ohSn95lgbhA4puJpnK3v6AVq7ZA5iFGneaR97ZJ3R8V5TZM
ABv17MH0gfn1YOfLPspSqZd279vz5C35yO9jqewdjU74eIomen8wpHk3sN90
ut2r9z35Oxhm+jOIbmPSLKM3KqZvxvQ72uV3ZAnvyRG29ps6PmR/ugsoKqHt
V8pSjdYNle0Qxnbi7XBw9WurpqkOqo+81GatznEqjbXH3jmMWFudzEEZgINe
dCJIx+1dnodWPN1lea6+VklWjtGDANLTdXNJGnJH3HrHa24f4GpwHS27hN19
bBflqTZoo7Junf+pQI3NUL37qHbI9NaarT2swARJ2c6qP9uRht5Oq5W17LYK
omoFDBSgym1bMQJec3O/hX2FE2ldMsbbryPNpt0QC58N/NpRZP6fmZ5oeWyM
s/XqrpemAqgcbMRSf72c3CVHZOwSDjzBuwUQf4vaP9tGyOKKoTHifclSF6MZ
laJRdXSsfT3qqqtS8eIZbeKpshYgzKtSF7opqfAcJ7UpQXql8qX3lAmivlTr
Qe1ds6d58ercH+1m2oM493kPc/Cmw77pODNi0DTYbqrrbDhcqU5Foly8vxNW
2iu1JUq+Kecbhs4XfTaB7nF7R5TmYtXbGDxtFdixXs27sCff7h9As7AHoPXL
bQMI7M1Y++m+7sdtm7rDHkb7uDYMOuA1nYxosiv9cDiMifX6QwtQbKUb9gn8
XMGXMwau1t2W6tC8afWhr6RW1mN43Sq5TpVkI8Kbp+dyaEGsJxXN+yP61rv6
LA2i3jusDuVjsIns/FEOnLKTObU2qWig5pZp+xV8OwNnUlYUqFPBbtqk3azM
FLZBtp1aqe2zbfK36dLf5O1sTYH1sTVSNaKdTp1l6GHmx7mcraU8h9mVPMby
XHa1RPoHp93Z2e03qaK9fNlr69ARV0YYfB8N5fPDux5UWeZ7lYgruYFLDW6Z
xiB1076VYgvAsBu1NiWkehvfM+//AhOv3akdt59vGfbf0lr+vjDB8mysgoqm
wz616i7T6J1+exqmHvUH1LS6VYSqpaq4TAz+j4UUQ6fPYsJbnD+GFzttwau1
WJ3JNec5dVr+7ojDoA3dt0Icd9hLGtfpGlfp0nWsPha7fBR6+Q3wy4chmN8M
w3wMivmtcMzt6Z23IhkufTYixR++3M3AXUk0vnxih3wPCqPZimc48Fvqpe3t
eezxqwjFbkjU6zRL9fL1HNr0m+Lt+/1g26qykVTm0NxeoVN2uprw9PDgbeZC
uOH9BubbD7KkZsZ7qyqaDFT7tsLexZ6OFkGv6aSPenTBpzvUVuyQ6w6j8g+0
A0Zfm3iVocjOqeoysPtB+KAeIsRiJJwQi539vot196d97i4CqBMo/8/uHSqN
Gfe3M+dGb9t2aVrO/+LDO31lvpn7NR3E1fch6HtBqBqM3X2Pys3W1AAkWo4H
cFa3Jd63Ot2xBXBq5T/e5+s/SUaH42D4b2rL7Jxbf2W9s1X1a1AIgD9Q0Xo7
jdKahfFTHOWnmHuR+KpEW7x2T8bsibj2nsjg1t7uild0w6EzfX2i1gDcgbzm
NIHLK1Bzqe4+nLn3F85473pwee9gz2C7QNl71jEa3KX9y3A//11/fhm23ftn
NKTPVFur7Bm1ne0Y3GyrINovqq1VyOyQyljt2nOiWl/bpb+2xvwpfzkd1DT7
lL4a3Ai+u233w7hM2OCu63e0xXvN2Lkk13DMtPlxMJ12qad7uxn+2XUZ+f4h
jB++A9n2th3cDv4ebT/jV1lk40pwd2v7y/aYf7l72y32vGtboMAh2874s7uP
efuD37/tZ9M/4e/O7rjuF/vprClDOkzP8E9DU8Nbc8Sez3rHeVdH2392M6hV
YG5Yn3BbgdgzUoPYWT7utk2sT+1OP7UfH83jvXWqKv1GuLXdlHQ4GE6CdS+X
0etkk61sqkF4z3L7uR6a3tl2hjvbvd0aZGvAbg0268eGydoV6ONIA0RRNVWP
yEbV1GpOIaHh2BXXnCdLAEQ+laGStuzzID2Q7o55qKwgy3Lz2WMKOjjNKO3M
3DJlb2fobLNJnypPiWHAkeOsu90l0ujlLydclUytsdlSv57A7dbfWDxw17V3
KMGLnfNbkkbN2w95X3qrkox9ZP56XM/q7nvAd2rA7721wTun/B7b0nuG1B3/
CkYkMGcur7kW2u5SaL8FCYLbG9xaEY3/fAAJKPyhTxffVvjMHtL1hJmFD9nt
Lqd350m/dwO7YtzuBv8ARhn84bsw31kHTRWKuKWb9Rt0s+uw4C2N0HOoYoQ7
kmTWb0iF/D68yq+8tcHvwqvq372U2m4wTrbZTrQBlTjSSjP6nYjFL761wT+a
ZfnP/kwcXXD7o8jwzinpP7rJO2r3ubeU7xs6iw8GOZF0ucEwmXL7WOug1H1B
UQo+0sgJL4PGKt1Q3f1LsGhwra9jNi6Us9Zjqa3cUXpwT1RBpexYt9hyr4Pi
5OoRdcaMju+sruhIJO+xLs9W4gooZHTf8GMFm7pROOZCyu4YmyoIazYbJ5Tb
u6YzdXy+VF1lsOmSee+BVe7xMO7xwd57lCVcN28kMBDdNzAhXqJtEXqEn+Bf
NGzCz223x3NL3MgxsSXb7e6JateD13ubzx89ePr994+ePHz0cLRsVqhClw+Z
fkOLeOTyFdvT58cnL54HcTw9eXw/9gP37dsTfaIzUhEvvoe7a/sY1D1y8ewU
D6v9oSP3r9MfiGPevv3DX384fvLNl8fThzOMYrGcz2+mZb06m76hM1PTC3n5
668EFgmfPtGHesKAd2Dwk+8HnlrjJ3zHkR/4yYwOUTFJj9zH+JuGOQ3iRH98
go/vr86Wi6CpDk7Q5u9yBZB74CeHE5cUXjThiwOfnMPO49/gvwKqek2dT9xr
/OO98WFEyIgtGpD2r+YHUgvBIU3p/vNvnj4Jvnz+9YPc9xImBd/8cOR+/92U
f0qTDA9W8qqdFpudc0yibo6xHw3m6KcBz1HzytYsHzO11c8PT14cuff8IhRF
GZaVF8vMiyOZhXmOD7KqLovSDwO/CqRfeEElwjCWlY+nQl/WsZ/ndZIG99wD
c8xlfmMd2ByGlw+3GavLvVZ+h77ThD9tf/31kK+97Y/m0crSBxclE4B+bGXZ
f8yalxZ/rS8qEOV5I6+VnJXnyyXHEB93d3qriOTjWfGqWbzi02mqLxX7h9NR
btSVs+yC8O2HoxxxivgvsCD92dWGT32jBW0ctJviv6kyhfZ6dt9vjEn6M1ZS
HE8sKM/5/KZYwYNhHcOXM/CZG/a/9JxaVXKwv/qEjy4t2/VUXyvimot1Z05g
kgc7YrNPRkWrz6HtFp2C6k9qmbPCICJtPrqPWBMp5uPG+6tvfL1cdVu4atwY
Vtvw7Sv2uaWRShlcSbVTrzwDy7766/cPjzQrvzo5+eHlqycvX00VO99d0Sje
/xdQNCdsaA6ecF8Q+glvLWdK0fisLE4ePP/x2QtSFmnuR/8CyqLIIq8WURUV
USlkmcsgrvywykrPT8pa5qFMoySroEXyMIlyr6i8whNhXZfCF55f3FlZfOIe
D1NVH+jzZkr2HOeEqvL2tQGGOU9N2x3xUK1JwdTA88yJB+rG626boaGNv2YO
caETJ2pHSHabYYdKgOSbq3lTNmtX0u6QdTLdWZ+vqID/0tw5PXgzFfhfgsdY
pKioaaPGy+I8l4IBg4Rcq34VoBicdd+5FXekzkI9sAI4dKvYHhSg05PU/mmX
B9if/f8j6d3yCvzlfCVvlgottFtzngzR4TCXWClKvcvC31ktZ6wY5BtBTSYU
RhrnqujLqM2Zme2A2WA3US1ad21Y2/xdZcKM0pt1MSEzKEqVoeFokKMX0jCM
0fjMK3Rd+FrVyQBcq1QqTdc7zYgW4Ka7j1wsHPnmXEA5UkLBvGl5V1tQFkH/
pu0BXjZn56DRJZ0kG1AI/e18lLb1lqra7qW8XK4IsNHmur5GfSwkertK6UWg
z3LTqlIp+vly8HyPJbtcLFOGg+TKGZBJ1fI45uwl3ul7+0nT/UKewZ5MJ36W
yEZ1jNXZNEjAMNTJx95MVfBuMKq2Nykrcw98L6Xdztx4qpxYsJyruyhA0uXK
lFByrPHoRMlnNjAeTt7dnjzo3sVtuWVjE6OL6U4HZOmHv6zXVIoF9vDm732u
5mbR0D5sd9+aVkzuwcsHh25NNhzifWFO/tGE1IJeswtjQwt3uRgu5pF7AKvC
/EgFHiVlWSkvbL4s6PDUVJcQGWW0UV5EfzkYKzJWWH1m3uJ6qbUdL9EBkK7u
ii9sGlwVrOrwEAEM86niHpwexMl/TCKtN52ubEmn2fRJQz4/p89JT9xzc3pa
F1ahugMrdTyQf16YSfEAt0ZFGGSxXEzXdJRZ4ymsdEF7uJdyLJtWr8IxxHN3
E6/hsqHdmfWOZmRoNgs7CM6X5jl0gm+pComhnzOuz2QPlPaY9db6dOqy59ao
GjILKyvzmSoGyhXX6EFHJVLC+JFFKHU+K1karmtDB0+JmGfqWwDDplSnDgpK
qdHqTy06ke7T1rHruRw/I3C3UoXJO404fy1uTFUa+LHfHrO9Iautzprq1N8b
51KSpDftJb+ln/ZC0F16dNac+mOeVegFiJVrnB4D6jbKb50M52+m3hfLaDuv
ebng7AnesdfXuTICdgbS/8cBk3RKS93wZ7x8lYYwc+/ToV5KJeLj+Sy/mFd3
ISA/bvZIqNCBLQ5grfVmAdHShxdXWjyJW14+cC6XlSQJ01siwyVWr6XV1Pft
qI2na7nQ54md/tAysaC6LJCmxaZ/zKjMUkSigjqiF+jXv33771/dfw4Qjo++
fPj0eOZ7+M9LP8/TbBpO4Q5OkyxM82n0KqEqT2RdXz7ou3G5G7V4GB9Vq6h7
I9SFZTo1qx53Kli4BWeHa/enV56dmpzfdIpyLq0z2qpyGuR9oIh2T5tLcRVy
Tq5Vn2aG0a30wXAYC3vAXfk9Vdvq/ld/DuJffzVlIkz9SE63PedFR49PlscP
Jo4ibtu0fR+T/jJN+varIc1cfWdwf0+U85rlqxuoWHd50ujzXEFbjAM8wOzJ
oaYbyuZ3OjY1dl7RkydhITtyIbqS9opuyoqPCcdY1RR6ghRcEeYzvjEBbrp8
j44ukffdnWXSLx/KgQNIKFT7gnRssVn3YbNBfI2Pb3ferfO3vz199uiJe3xy
8vLREYTvv8k/VdmElinsKuQOTH5f8s5al8VQApSBxjc//aRs/v32FqMv9lj9
4wWnqK1E29dh2amsJ9tqRwODvmvHbkD7onSmvi/3RWhHuSyQEOhOwQVW9Iax
GL7WabQnQp66qWDJJvdSLG7sTq2jc0ajTpjjbeTmjFqZomuMS1W+2pwve5RD
aMJXmg6OblNcRd+8AjOiMvrx+kuKwihN2OGBwRESPGiVkjH9z4xbwyULVS7Z
4KQGxyAsL8tUMtXhDTUPHqDT5V3qJeILQV9Td+dyfmWfE1EF2vQ1urqyHzi2
K/Riv74HC6VYrRpV36a5bOZiBVlY4WsCPFRTceLsbmddrmGFmfXP5bproYMz
uiYd23Rlj9ulUgw9zjFemK72cEkX1V5IMp+DRWd+0d3fV4trFaYxvq9+4CuN
1PFfD14cA8zHGQYrOTU5fc1gtqJcLdt2a1ITp20I3Ys97FF3Li+NlJ1DPr9T
SJVobD/wlaPHMnRfbqCPtU7Cq5YrDFyouoddtQrDdM5XVLJTqZSm3X/4o0MX
dnTUqKyR3N/mlbgHY1XOxUfpfmgC3c6t79fWi0D3dE6nwswORMcGhgBOyYQr
lEN9KZq5gX96Q2VMsP55c5yDoB3o88xUPSStIGzzoT13gp/NoqJMGygwJWV4
DmLcKZFW2o6c8hln7gmzQWdB2JyNj8VtVYBydAh6WAbyV3XKb3FGrCwblhWL
E9Xdi7o8EymIa7Bqo8t6FmSHpsonkVWX49ufx1EP9NpVuRok+4uzuVE2Oqat
/WHCR82iuaRScmQma6tBr8NZR9KaUqxW6WVLh2vFPOy4wy9EX3DAyKIzNiVv
xSEYslZnknUNKJoUcY68xjIouKBw14K4QtmeZrXtdzmv1b3SZtNQK97W8lo5
wHF8/8n93cGNjvcV8lFPiu4uxSkQbSHKC+rkoSlUZcXC336i9xv2xkoYwS27
cJ/VeOKeNdfswrsb8ORKHU9jr9ByAz6lyjbXmJ66/0FdNW4MjA71H4hDdWX6
KFLfxTJBnkpwVK+L0VPQxNoBOMfXhti+n7oFnUU4MAtk3mduQFdrzZees7Y4
1JJrtg8GvXke98YoWTk0ejPCmqUK/skVFX6jOOPlEkgn+K+ff0aXku0ZR1a5
FhoUZjnHJ+BbPXGDLdU7yICjIUWuFUX4MJ9S4Lz3qOv9EjiAMlgt3zQqzokV
geu45Nm2lxR845ISYrHuUBSYG1CHLrTQjpO6F9ufJWp6c/YtyUFcb6obUlfN
gswSYY8einXrCbHv6gUBG/ZnHNzRXvNnXCmu2zfZuxk01WH7f3Mz9zNr94t+
/9OXboAfQJrPdiz8YLNMP37Loxflux+ibSkKKxN+/OJLd4onp/ufhJ52r1vr
+zs3MVzXNRizodnF0YB9/Jad/Y8aWO/Y6p2D099/N6Uhvdar1O/yqNi1LrUo
F6WpMQQzrBhxuEc5c1RPaZJB9A35KPhiQnkQ6OC/pn4SzwJmPvW87wXR7Q1S
NLDCZ+2cIsJzAsdLd05HWpQ9eE0CI/kcG0SxpAAp+VRHyvKcC2UYx/JLxwc3
C7UZ2w2CC05zcIiqVBCSNJuN7FqwjOlg+q5LbkdhWHu/lzM+eh1jZ3w57xAl
tVwKmPUOuS1rXGK1N8mY6ijxgQ5lK2n7Xdnq3RKvUIzd54rCEOyG8qef9sH6
frx3Gylvif9mMv6Rk1EfjGfzPoS/G82H0w7+bd/EnZOlFmPiYQlj1WUQzGiq
bEf66gaGQv3ETYIPRW/aJccrabeoWF7LWySiNSJxJ4Gw7s++RSp0DVKrkLxq
TI4A74GbvREDIrpw9BNO5aMWC45104tVJkSzcHr2U2Ef9SwjVtr5ZjspTX73
mhIpLsWbYS7F7kFrKb6jOeRN7ve1LYNGd7EuqoFVHg7olaAMKZf3fu/ebu4+
Equ8xceMZG83dx/Jb6tEvqZDpCZ1QZfCh9jQAwQH6V/tODE2HdXr2z0dPnfL
FbdMMyx8HwHRRpQ59rXs5E9tzVKAEvaALqVgH5wCYXxFp0YEJsViokOKBAGU
AV3a2TeMqlXSUYdHyWqe+plPxP35VOFxK4gMF3XJ4qCR7mQXlt/qsEP2g55e
bI3NLOctI0uiO49syyvYHpf2EQb9DKlI+Eb7myrwUvJWkNp+OQ3iEMNJ6Gom
P8u3B8UD2qY434wahF7XNkn2tB1RROvojhWJxTAyU6hcp22S1iTcw/dQjIPK
v4WdcL74w3QK1/QFWaD/hI1Ysk+KEayn1+rXsWfal+qmNvqhPlo0P4P/sz6/
bM1my3gv29nay2b+GfQ2dDNVJNTO2Bp0tl1itdP7uyr1drfkjOd8PX324Nn7
zRYNrLNDdlxM57PMnEcU4FTtBuXSh2YHZCAnlS0OAf+jPiFJ6j0HWt6++iBn
9pi6K5wmci7fiAojuKQyepzF9Eddgv9oUDV9mLI8KHZuhyrv1Puz5ydHdqST
w+6lyaK6Uxcnxw+Ptm+IPn54p8ZXF0ddDamR5ePo8rMHUzr6wqf1G97kMmVg
T8wH6pDht1rD32XA31r0HBRg6LnCSm6+Q49dcZej7Qo6OlGeZ/OgLx9zh15N
WYZ3dPq8K3rxrj75hhu+Rqwn+ugqNatfxoFduTOi7fOuOHEf4+7rEQ/TwN85
mlnnhbVD3aEsJd8n0pp0S7MbpYSX47H9aXdHyVvkyVgkcRzJIs8yKQNfZpGI
87BOo0gmvk95tnUdZVVdeDIKyzQJi1BkhRf6cVE4wvdF7UvKYY484ceBn2ep
LOssEGFaV0VReIGfyLIos7iUMQxWXJeJX2RhlZZeHuSOElW3CMM6S9IqDyP8
VOd+HKcSDUWV02d5GKPTSsSZF4dZiaFgeFL6cZklZRg4XuSwVLpplMRpmEaB
l3qJj5/CNE3qNEgih2XOjcoorKUXFVGa13ER+VIUcV77GV5TxSJ3SLrcJEWb
KMNXsQgFXp7IXPqA5qVMwyrJq9gTeCZLC8y6jISs8yjI4zBO0iKpUuH4no9H
44peVcZ1muNteIGfRnld5VmZB1VZpHGZ45kgCz1RepEI0V+aCT/EFAovTRwp
w9jDAiVlnJWhiPBM4AWlX3tFWuHnwi+qKknyRPqlwDCLOsurGmQL6ziq0iwp
wiJ10jpIBFYtFHUax1LmSZnUILCXZSkWDL0XaRigi8irA4kBJH5UYO516YVe
mVSJH+a5U2deFId+mXtYSC/A2GWZeXhnmpahzAqQIsIsQUTKWg+S3EP/MgV5
c88HWxSJ9HLHS/2qzKNEJineWaYiAo+EeZT6Eb3WA1kSTCwrROFjkD6oGEZ+
lIvMj73Cz+uixBqFSUljAbjxaknUwrs8H2yWYcH8EG0DGWVxHtRJlWMsSSLS
IAjyMi9qUYWgPubveBKfgY+jqsiL2AOHp5hyGmV1IbG0gRT4WIZlEEQRPk1L
H9xXCk/Ql+DPMAuyygHfi1LQQuayirIkiUo/EFkS+TEoU2RlLIQvYs+vy7IM
MJXKD7CUpRpfmYCgWe7EUe3JkM4AJEWWZGmVxJnII+FnIoiCII1KUDPMi9DD
936QghZl6qd0WADE8DH9vMjAL1gOrwTrFiKFmAVlLCNRRBhpiCHXBaQvSgo/
9SAe+DBJigDvqfxcQCySXGZlFTlxWMagWCJEBn5OvTjJw7AAIZMqwudxHYEw
XgWOw98QWxHLxAuTzK/zxCu8PBdx5TsgYYHWIgBjBEUuSLGEUe3XoGYUp1lW
yBhEC0SSQRYhpWB7KI8ML/CqCPoL6iB2oEgq9CfSXKYJdE9ckLSEOUQ2BmUT
/AMpr1K8ohJJkQhPeglG74eSJoZWIL9ThHEIjo5BtixDX1UowToCUoxFFJH0
0yILCi+LgziKisAPcixKFEIEBRGK1iv3nazA6EM/ikQKefXjJAiDKoOCCStw
fen7YZp7qcwguyWokUDsfSjIAOsVRD44I4+T2IHSC0tRB17sg/+hTesqEFGV
xXWeY95YsizIkwxsTFrCj9BTkKRe7kOxFpGHbjKZOCLHDKBu4izPS5BBxCEG
l+Zl6lXoIojLNPfzIMuDKA3SDFoYyiWMoe0qjCioBR6oHWgdiCo4uogiH5o3
reg9XiTjiOYkwdkyDBMvTzOJ5Yee8CGtQZB5RZBHWVlAxxYOxpXQ6IimCf4P
IcxRkYcFlqQsfai/MIFck7SD3B4UO+k9LEFZp2kdYh5R4kNjxoHMo7wIAukJ
UBbWAFONJbRBmco8hhGIfLQLwEG5oE89jCoG4+c56BJhPWIH/J5AR4BqULKJ
LxJ8U+RgQQ/WAlKZ0eoy45dlCl0SZrB5MAaYZUTULb0yjhxocZBNkoD6WEch
8sQPIJfgP9ZIfprHUDxgIZAuqWm1ShFB+SbgWeiQQEpIY1SHlecXWB0f7cI8
ERG+KNEEc0hBNVAPegkKIKjDOooLfI8hZJAP0g5YwLCQTk4k96WPEUSgZFlh
HqKsK2hhzCcBa+E1hVeUFcxPkBd+BbsgaR0qPwIVQnCKBwMJzSviBCqOLG3u
FWEGzZ5BeebgjwxqLs3BA0nshbVXRtDfohZ84igJvRjzgGQ7YQzjFOC9OfgE
zCbROoVqiaF3wGxRCVsMqQdFJGSnwtwhU5IYuQSMCHL854dOlHp1AvYHw0LJ
hBm4qYrQRZpBCUIVAX1AqDD0zAONfBizIkfPFWaZw9aRXhCxAw0pSix9DIsi
46CoyZAGaQgRjSpopByq3KsAQ/IYNrNOQJ3ICwFqQMQYElWksDjQDFJESZ6D
Q0OvBoth6lAWSVxFIE0S5JIMexnAiklY7CDNCxkkWVYnpCFAWphg6VR5VKQC
BIcOgEaHrq0gd2UFNkow9iLKoSqiEtqIlGkgM9JCdY1hw5rVnoexl5kT4OMw
JQ1agV+gjIVIoYQAqsA3IYYRYWwCQwq9CNxfwo7ChkA5V15axCUMvw+rBmWW
1BJYCf9Jv4gKiB1UZUGqFhIWlyVYpwLVYOUAD7waljcmHRTmaeQleebVVQY7
nUlSxtCsmHSYQb7TKIW6qeMMfxd+VAX0F6BIVMJKhRHmD76F+ML8F1iqMJZO
GKJf4LQoBs/7Hqx2BcueSfBDXgE1AH5ByrGIoDfYMIFeKKI4CAAbsxLLVFdx
UjpQojlxZAVdnQQJlihOg8whl8QF6+VQ1uBqKMKQ1EoRgyjQieAEaBKYkUJg
/jXsUJgAuMD+glzEiVjlQDqWG+KCuLCovowKAJY6zIEosFYQOVhzTLqqwyIC
6sHLSYLrFFOvS8gfcDAEE4hRAB8lUPkxWBvjgBCVYVJBGwPvlDXBkQDiG4Mt
wHewUjn0bQ7bDBkHuHZgRbFoMBPEAwWehoAD6UGTygCACT9i/WMvSWQWRwWs
VwyjSDY1q7HWIfCMlKkTREkKKYWwF0UNWuLZIEtkDSgGww6gk0HHABxKqEAP
nJaCVqKWRU1SVwdQD74nnBC4ISYNDvzjQc9BEQYp/oNNyPIyCXzwS5mkIbBx
iP6AHYCPwMkQX0Bp+BM1YW6wE6xyENHyY6QAxwEGGZFSLgpoO19AUELyHAD+
6LAVBg6RCNMSeAQmowrxQscHbeFUBFCzOTgpraqA8FEIXVfVQlZQERWgM+xV
QhoEVMHHdVLDdsD4FUFYlDCZkPQY4MDHelUh9I3nE9zKQugkAUmFZql86CuI
dyDrCvgRpjwWEcBTJIGBoU1gIZy8Flg1rwzSEowNSQYJ0H1dFAnQFQANAG+G
NULPWQFbDpEuoONIpQItZfDn0JGT1XAnAK09UgiQC6/04DNVvgcdUQB4+gDq
MGFpIcCmGXQBsB7Mjg+XAxKbAs3UtXBIRVXoCuMCjoM2xHThISXoCUxLGJJU
YpZgAYsaAovP4qqKKvyMNqAQSFGALnEKOBOkNUwErCBgCCQ7gYSUVQWfIMKL
MQdRFPB+oFEAeaByBAaR4+8CzI7VdFKRBV5WoVECuQKLCwkTWUFEKjwOQEga
DLoI08tJBSXQgL6AkkTzBCgW48oDRwCgAYiDCyG+YHCsLNAMhAw8BacOehfm
MgClYUcDwCXYTgD+DHgOIywwaWgUALUogHKBRwOXB86DAGdHED2M1Qe/Q4NV
NB4oUkJ6YMYU5raOwDoA1R7QeZrGSe1g1bGQYVCAslUBeAMVK+DxZGENrxNq
DlIGKA2gAMgAZJ4EYH4oUqguQY4HJDRJnRj4OAHcg39Hfhi5vvCEIthrKUoA
Gjin8LUB3tEfkBfcKniWUBoezB14gdzF0HNgg+GdVCUAbR1A2RDcr4LYh4tQ
CcIMhDB8SFoKQ1WDz6AU4ALDKnpA02kFmcgSJweYh5avS4ANklkAxoTMH4Ar
Vg7qsQJ2h7tGnibULUxxADQHDJaBgDm9T6YFDC9wBTzDOg5h8bCiAPZQ0Vht
DAkeDjmNPrAWfiMLV0BZ5AVwBVx8jwwa1lRG1IvvS3JTRAGPEHwJ95SsC7gF
cLwERIXvDqkrgL08IM4s8umRHCoMvgfMLzjDAaMUEEIKNVRQsWEuoIMAB7FW
AanrEBa3ho8AgJUBhUAioPslsDu8vgJery/hDTlhCaUHOU+BFch0h+Tbx9BP
YJckAmQE5YHziKk9wJCQnWivquusjMoMmpWm6kg6dFlB58KieeBpDzYZLjOA
kUzhX0QS4oLVrGHIoU89cFddRBXpb/wHfsmAIXwnj/0q8DP42XSMM0yjGnxT
wWMDlKhlAsWQFOAQuNQUu4AlBKiWObwHSToINg/qMHCwDICkVQnwBiAvazSr
IUUgl4ADVYfgYwlgCP0Ik58B4RNSziEEwMoCAwMizOAIYuhhCa8IuiOFOyqA
fOBmZ3Cu4PPADShS4ExoCvArDGMdEFaWpPlERaYQcgBLUnuQVPi9MBEQc5+M
HhCbhznnUQJVA74DqK3hE9VZBBvmFz4wJFQQcZUI4aAD0jgpHGgICjvp8LCx
CKRxS7jZAELkWoJWAi8AkSQYM4ZXD5AHewFTDjUF8YbqcqAQsEywW9DCcCKV
fwhMmGM5PCi/FKwEcQXQhycMvAEIjK8ELDT0KCCT8GUOd7IG4oDqyGLAIwnw
AnGhs/oVOdpFWkAZwXuIyNGg9QZhI4LMPsEi8oZKgucO8Ay0OnALvEkAXWjg
soB9AggFWIOXHwTQ+WAu8kXh0RWQQ9jqKCWHKA9iaCW4zQ7AP0xJXmMRYALA
aT50LqZdweqDOdEdnCk4n0AicL0hX9B/IZy5qEgqoEQAGviXToBFApYQAQAJ
oCj6SVIJ7S9CL6/JB6whv9Ae4G14ujWUdR0lYDJ4RTAJSU0huhy6Dvob7wA9
K6gSqI2ohpsFA+rBtZd+WDt9fNYN0xrgOQGTQcBh8ulxKIDIg4cC9E/eN7x1
2L4aQyawlMD0Aj3WmUORDzjkHJR14WsJoDTQpAICgysTwBMqgMXgWoNIMNUw
E1AY4BJgEJ8iN/C+PBgrcit8RzpOGPBpcipEgP/0VkQRwhbAX4Eepe4Sshjw
IKj7FP4LcRlwdgCFgOchT+BcqPoS6quGk+ukKcxrCKQsCww+pigj+XoVxSGq
DAsNjSTwgoTgUAU/Kk5CsvPkscC+Qunr0CgksK7A22lJXm8BlICFz6DloRAA
RH1wQppQxCaDnOGNFaBmnZMRAuUEkPxdQ6MUyICLCduQAF5gvcoKHnnlJeA9
iIBUoVG4igGQbJUCp4bwPmEDI/A+zDJYH6IMfA6NAN6vyW3O0pJCjCUGDx7B
qiUYUAmkL+D/4wmYH8hMTjolghkVEbxyWFmKywHXw4P3YiBrGBBMhtbfh6sE
owfnWpDSRhcxPFPC4/DiUviGkCN4GWhSAINKWFJC+lC/cBxKLJaA54HpFOgw
8nwngIaMoZWET9gbQgr3Po1gKoCrCWYAhsIACKIA8GpKdBFpDj8qxGTwZASX
oXJg1IBagZ/8ROYwQABcoKqE/YbzFnvSz8qirijOAT8lYVsNMCoqChV7SQr1
UOWFQ55hTdGmFBQkkUZvKaAZnKdKAKtHMH+kygEw/YxMSB6Tr1zCkBN2iyl2
XDt5BCaFkyjg5xZgfqgnOFYVxB++b1XAVwMayCiSTF4XLCVkNoHcFKTBKnL7
QFMnIesMnQ8nDoxJ3iUsfgg8Q7oEPjkeFPCfUgwWvikFZcml8zL4IEAq8Ajh
BAFxw1hjulhUqAhYYtgMSRGYBGo6CQAAI7iJYAvoIiBlaGCweZEQuMEcYMzh
6SXwiuB/wUQVOV5WgqCEPyusM7BZREG6EAYLtAGIzEEJUovk0kBKKVoAqAkJ
STyHcA6EsIZb7GHp4dSAU1JB+BoqD2A1lCWxUprBrkakO+BLhiFccD+BbaZw
f5ETbofnJGB2PC8EUopzuD+ANeRpEwQC96BRDnLCSYIQYJ0D8hWgpIFsAD8B
fyIHTo8f5yH8VFgKKCFoUdAk96FRYX5gSmEIYKnwAXlJme9R8KmukoRwPFgv
AQRKnaSQ5A6EsPcAvPB2KGYDbFIAlIC6SQI1nwDnECfA58ZXcKIgbgEH9PKA
XPrYAawDwoHywoCEjFIYtihLKMAbQ/fFYUR+qMwjCsVDowGBlyIjFAVzCMmB
4CVQINB6MWAwXNU6oQ0O2LgcBAeXUSScAkLQt7D3FYQGsFKU5BuJIKKYlFdj
iJhG4Xg+xW5lGAOLw9ACDPiA7SHtFUWgNBY+Jv8V8Av6JCw90sdp5QlAQihm
sCleC4UHEAiJlFgqPxEhVgHGrAAJoXAxN/RbAnP4ZLyguYsQfYCKeB6WGPgQ
thLqwoFixnLmgB/knkPaoJX8IoSTWFJsEpSIIYbQFQUgC9QfQaEaTh4sS5ok
ANB+mvgOxTEABlIyPQTjcgq4wU2MSgD4kFCpSBirk2ESBL7Z70oo6AuES/AX
dIHfDA8kgE6h0Cyku6SgLPFbDmwE9obRBMgmNYRWMfRKChJIaLXSzz3oXwnw
6fgxZpDlBXiHQjVwyFKKMmN+EXAshbRi+Ma0nxKGkGm4gWAWIPAgluRvxngS
qAXqnr6BcvRiAc8PBltyQDiGMoEPRz66l7Dl9CGukOIki0MgTmgf8oFzWJXU
gXcD3QAYCQHOk7CCcilSiCqhZOI64mUgOyg/6D7gEkLbAHceMD7MOSSM9rIc
gHVyyTD9IsnId4EyBNmhEXOwOi1EQSY1x/oCiQdAU9CbYADC9Cmxdw374mB6
kCBYIiCDALwUwTDGwF5CyhTeDHBkBIkE22UxOWq0mwVKAcdRuDgH55H1ddA6
AbIHwGKQ5YG3BNl3kmA42oAgmFwMdRIAOfnkvoWwYJI2l0gPRbRTVjoUjUhK
j2o9Yfy5B7cDy0v2KCN3Jawh6rwvB6EqMxiOPArhCBNuBLwEoxWQOQfLiYWG
4iVfCDASJob2CEFaiqukgNMAcXFCmgZSDeQH4tf0SwJYCO8oIUZ0IDwVYDIW
P0s9aGIBK0YOdUrmCosnwBIpoF7oAw8nQkBwMW5QCvgXlomYEBY2A/mBgOoE
4JEMK9zDACwD9B6HFGCIoJwlWFpQwBPiWlPkOEUHnh9JQZEJYD7wC6xNUkqK
gpRQF2A4yHBZULg2Twi8Z0Du0BkecV+U0P5ynGJ9Uh9WGAAFVksCtxfkIwJo
BLQHBMwIh1TkAe2+ZoI2D4GoRQTtATAB+4z15vh4GROjwu3KPAA7DsFBneXw
cSNYfQi/BJfS9hWMe5pWEGHAfuBGAIsMcAxYBjgXrwK8ygjYZL7vREDaEUgI
wFWCxBRZB/CClvXB1XABQVNRJRCtqiL1D68xAmMSaIODCR6QQNzwxQPgYFhs
OExeCaHKErBIqUKjnodXeqRMIwgn1AKGKUgQctoDB9r0RQHsBmMNgxhgIeC/
oHlKsWrIxDA0KoBfEopZihDuESACDDHUc0jMDu6J6yqD70AIC8YVKraGb4RB
wzR4gKIw1QK40oerkmNuMWxWHUgZgmpxBUuaEmmFXwNPZBIGGPgxjLM0A46r
PTABDG9CG5ppmsJjhvKExYU/FMJBCagNDH4RJmFMMeWUd53LGpYBtKwoSgOb
H9Eem5MQ62PSog7xLRz4khwNrDacVejimoB7GAEfyQzwtqiAIGGaRVqlcBng
7QMHUMgY4lzFsK1Am5ArkLAiAQhLeLnAEBBCmRPQTAuA0BICHNC+YUjqBn3C
GAdeUjoU5UgqyAGkA9KNNSDHH4JZSoiAAIFpxeBawZmCsYYbmZXw92P4oRKy
VlDQHeAI8B8vAWyA7QaLxBWMClQVxUuKMg0C8slSeEWYdyLjDN4G+W7gPB96
g0YHK+hAMwFggXdhwsHiwJlwFeDSoK+StpoAmWVW1kXM8V8oLowhgOKAIU8A
P+AjwLt2COl54CzouroMZAFrH5KBgYIoYEk8sr3w4ENyt1NweJBV0JkQmpD0
QQ50mkGpQ3nAYkTktheyIt1cQ+mTxGJhSh+MDBNWxpDflHZaIeTgL9AAfmEB
O5DXhchrBwsvMSvah0to16cOC4q2kk0vsNQJPOSgLiswag4nNySHoY5LgaFh
Aj5ATpZC7QjYH7wb7hrwdVJUCe10w0TAY02hxWCl4eXDBStowwY6u/LBjxS5
JAUMKYol4B1EHX4uxoJlgPzD7sYZmEV6BTQ5QFEG6S5SAX6kfVRJ6+BjveIy
IeckgrEFtogdLC1ACL6CDwSlQx4+vRecQvsYWI+UfImEtv9qQFSoW0gJbTdW
CXiCImkQWCeg+BuUYAzrn3jA1B7Fm2iTIykTaGdIfga/AgsHtzKvMBraNoEA
wa8kgwkhlyVAY1pFfk2RMkA0OGpQZBITq33okKoKUlh8yEtIescPYaayggxj
RmkEITQZDFQQOTEcpprYAzYbA/UJW0UUwilhX1ORlrLEmlcSyj6B+ogo/BFT
/LyCJkrguADZCCelECBZYwk4SelMMSUcEFSDUoIrDs8gCxJCB8C0EnwfxRlU
UF3B2MsIH/vQNICeeYouSjAc5LhKKf2mgOKsJC86HCofTjBWPcBUsWA1aBxQ
5oEHbBsnlLWTwbXNKcEiq3yYQFg3Gjm8gAocDWED1PMkHBAwXBT40LowIEUM
GYOrHPuUOATE41XS8WFnoUgqYso0h+4kImJuPoVAICmJx0lY6BhKitAgVC4g
EjgFWB3SEFQBzBQcjxqmDdDSB7ihjT2oFQh9DZEFkoV1oxSBqiY9mlMwMYQH
Bk1TwGpRmgs4NkkAAgCcCPDgFdDLMPG0B5HC0AP8hbQ5CvxWkqKGxaYMDEpR
qT2yx16gjGAG9wBmMIJvBi1b0JZ/AdOXUliL3CuoNYAlCl16OTR7VcKO5IA+
YFQwMzyKKI1jqF6H/Pu4JLwKEFDklLABTYiVgCyFcVFxjkscyID2aMgIQLZA
Hwlv0S/B4RTIhcMDBQTcDzBRFBUWHaa5INOGJS0rkAQuahRGxKhJBh+ZvD9W
3SW8JQwW7mcuAgfebp1gejnFNKCoyyqizRN41rAAYHvIlxfCskOYaFPIA6on
CYpyqDMJC5libQXANCaWg2OwjtD0NZAPjAmlWuDDqgKxAURK2guA8FYVJarF
GCjMQESwmHz42nf8GqZUQN+BFpB5ICAQDrxHHgzQEyBbgMkmNXyQGM4mAGsa
UtA9kECYAVCqBzDoQAqBYcukhq8EeCdjGhh4DL4tRK+M8GTs0T4ViAdNh0Wr
4wpOaZXSBkIF9x420AFcoz1F0LYkZsrCFNOCgy7AZDCjtQQygjcli6pOqhrO
ZVoDGxKahuAQi0MuC7jZHrivzCCp8KUBCuGVZRVYFs/DvuaUhAV7B7tTlGXo
kbiBD8mbh/tT0CYWUIADy58UMVw7AS8AaKmEkNBmAJw2surQJMDqgnIMJTSD
LOEwhYQQS6gY2ockDek7EPQoT+G6Q7NB5woygbRbgMUXILNMwdFArSKmYBFa
i1BGpJxkDOMLFxSWHPglgFkCbBVYefL2ZJFTyLCg2F8SSaDJ0g6NxhWECEYO
qoOC/BALsCbkrKwlJYQBd2NFgccruDSAhwKGK4B9iCiqDJXlJ11oFPjZqxNK
UwFrAhUHQGI0NNrFBW4DqgfoxZKAEjVtzXowQxFwWAK8GDted/WWPgd2Sxq5
rmLzXpnko6LI42TynzfiQn5YOvk/O0eb7tR6ddmeHZn04O5yUEoTVunZd0xn
3t+NrtL/WyQx69/2FoJ8/0Tl25KPeXVIWGqK9sNHK9W+EgAgh8IgZl6to9IJ
zG0KE5kklN4A5EqJPDBbsPt4sBROT2oX+hE4Ek5IBpsQZ7SVATUVQWbjHCJH
OgySRREJuOJAmBGczhz4qagchqs+oAmsjF+WKRS6zLIYnibgC/QkfFvK5gvK
HL6Fn+eEuGQkozCj2CasZC4A6nNB28qCEiaA9DOg2KKucgEvA4oYzixwU0rZ
MFmSyjROYLSA+WmPB3gNc09pAw7GBd4qvPskrSjz2MuBPyDh8Dgo0y31ocSA
JENoxLwMUg8OYQaESTWioZcCKKAAKgtGl7KGQp+CHkEWUVidMIPMoXpiuAG0
FYD/YMIxVrgn0KJeXlAQFv4p3DV40MD7DvABbIEHC0nRgyQE4MafgKAgCAQ4
5RN0Ej7FlqD2Eri+MeX2kHPls+XK/BwgLcgpKYJ2pvB3AbtLjjGgLVzEMPAj
co/glxRknij6jVkFlEQuU0AUrFBEKaVQTJIMH2wQFiDDaKOUEkoBUkso+RB6
NBYRbBucPpoDDGOd02igBQsfdAxhJhxJeSc1AC7wJh6Aro8l7JrvASTGIXAN
hlRSTlgB+uVBLJIKjnie43/KwAwo6004PliMYolV7vkxwV6AcC+A/YXxBkjk
7bNQUNpgmpEBhNoFB8T4GMsCLxwwK5VOXqQMJkEjn/ZRAw8IB+ATiIWYpwKI
BBgsIxi5nMaMMQZRUtEelBQVXGNS606Jf0OMkrIgfcpTAzKFR097qFhvAOoo
hXmiwB/oTtvwmahgVGD1U3jFXhhmYF8niii+A9gCA1JQujFW2BMRBRlBYZjH
iBLbyhwwAP6CSJIcz9HHQFigFGwGnnQoiRVrAsAIR7rgxDNYLToJUIBbE4BS
EEnmeKNHZjImCIRV9OBwF5xOCPAXOuBL4JwsyMk9DpJYgEagHNAEEGxIwZQa
QD/wvYJ2BynOFwKrUwCcc3kpOcCrKLIXwb/JQVNK8EkxUEH5GhU4CN5w4cWU
SVhUtAFB6U6AFwQG/AiMDq0hgBHqwqlK+JWAgVi2hOBPAHGiKA+QNkA6uIUy
xaAlCKllcIrTAi+Fq1P5nqxoIyGNK8+J4aEAhRRSUDqvDJIwpoRB4Ekg5wxi
I+BGSkm7BFkBgBWidU6rjOF5AN459GPp+NAU8Fg9kVAxaCDsBMAafAO85fkV
NAacG0hdAtnyfQBnAdZDA3i58G2ghuDUVYB6gAQZLWdOCQo1uB38AkSVJFhz
D7CAtqIprkZJPVFRw9cWKfwVeGDwMOuiEPCsnJJC4QWc2RC+GnA4pXhT2myY
wsnISSAAtjz4yCGFhGnrtgw5+g1nEF4d7SEBjtd+nFQFpfskxLqUvk0JkbRb
CgrD5YYejkPCSGA9nyKRNeFg2iKrMnJpgMIyp6goVxYQGIMMaF+XoivQtdD5
8Ih92hqNAZtLYiZoFY4gQ3xTiJMfUfoC0FjqAA3lgJk5fsvp9Ab+h3DHESmY
Cs5SlpDrD9mFY0MOd5FkcIHg6aNNrDzkOHcqwuBwUSmfCx5EAofUlwFl6hQ1
uIMyJjF9uEvgbjhSlMXuQeOBY0p4JNC2GSjjAJ0BDft+SBmLnk+ZPoIzvzyO
KGU5nX+BaYoh4jWZFcrGo9QBn0JnFZ0QKCsH9EhDuBeQNYhBXtSBX8dY2yKj
DeWCOC+O4OCSCKcQVehLjA4zBpiEMYUjkcXCgaohZ4Q8YopuQbvQuZMCrEhp
+tD5JXkMghJifUprgwuQUkityinG6kcZ5WY6lAQLIPr/t3d2u9rs2FU+r6vY
hMOoke2yyzYCJATn4Q4il39AImlaBMQBN8/z1Nfp3jvqkA4nkBYHW91a31rv
W2VPzznG/BlO4F/8tw23b33SS4TVrwuqu6Ql2A/RgL5xQHY5ZxBOKwum/Eq7
ZICgYavuBKwMHpjJ4QOcymMagLMICbTj+Ee3i/x446QJCy3D4if+Bl8XeQ4g
+VuGQbacN7ztGa1hKCzcqTXHfDgSeJsN+YLN3iy1zb4YA9j/Ae1fMCIWENDS
ihnvyPGHeWNyc4APGgEeTzJx4xzUtyyiJOcbsi/Vg8CyipiB/Zp2yZr4hqnh
E8oz7DVer4UMDBd7eO1MKj9KaHHCpEAAZm0PCwwrGeUqknBtAWYSJyEDH2VX
f7VterGTGA6UgqjDqR2GLKv3srhjcxjE+4lWA0M1sa8R7oJznvElCvES+GP2
mF/F2KH5AJ8UTNWDBOYwXTbtssDGX7w35Ph2AwkRZ+DpHsIijvt9+uJvOB63
DY4DRNXjveFN8GH36LG8uk1893BlnjHZG4XhPuYM5iPSAl9UO9vtGoXA61Jx
DS+Ag4MGOWX1yg1eErHlhX8hXsHlklWBIl+/fg+qf8KNQMT48EUke/rdXzwv
fPgAN/nDY588/5DXZAk99oQHDku0jQHwc0aysG172Zbzz/WxcFEBAbiPd1hu
s+u96/bf/mSQQgtAw86Sw90DdlrMObLRbcIaQzByB5gz72yXF74WA+WNSweS
nD1jalqQzVi4qzDnc80TQH7NDCtxkPiVYrH3jZOSSqos1fIBe7fPB1OwdQMM
MZybWawWO/OOy6pJ54cx8bpGl9mwWuDiC0DN0O463jtbY7bBmOUgTHaHBDLo
49k3jgHYOXDEeW08JH70adNWPPuGC6AGD2F3kK4c1goEnM40TBgtjik6kwLk
fOOMOHRdKsvBzp0MbBoZ38qTYJszSI9rYOd4YfxC8OaU+njkeczGQvNNYIMr
ccA4n8Rfu64S8HfY3wrOInCtMYWAeKjH0184esDIloCEwiCMrVpKypdDGTZN
9ADkw/u2CXwHJgZHCFmhwKGBx3/9sWwDVrBK+hLP8A2b8mHx40q3z4tRPnpJ
XMRk02EyLMGoZwIuTbeW2xGwja2youLph13FVZ9uratfr9x/jK9FwaGvm0Pt
WBrHqQUiMaAkE7cAnnhwgA0rCvTDDwP2j+cMyPtCdghrgAErfJAZDB76pl+y
FSKBC+fLOceM+Rj7O9PXDMn32cYGwZhu08UmdjzUK1y3d+sGzO/72bbFdP7j
QRzmg1HduFrOj6MVOMb1FaNw3QnTvDg/a4TiKIoJ1mbgJrCwclZmtqhU341X
Sqb3BvEpDPCXxeVqOY1XjBdRQB8HDiCWggwzbpGtB909IIoaq3tujS+Vepso
tk3ltPlYMxoBiIZJX7jpBGu731Ejq4rbHQkjxdiJa91BNJww8D4C5fTNxQQ4
hAWH1gO/8d6vVYOe+Gx94not0M0HxIGpHFw2+NCEC1EePP9aiSvtTCtVbZ12
CK4BYOFkinlpc4+3/XHikS627M0Zzx31Gbhzh1EnZMNhl4rR2uucA9ur/+jm
wAphHqO3skWkriJu6LUNgAucedvHA9/gsLI6y7bL3iQQUo4ILuKw4l+IR6br
iI3W2kBeN++fD3jgxd44lF+GLDmYt3ksZ1vZHPnni1OAZXJAgMAyJCvaYGbz
w5xlxwdwWDY2e8uRdT8saBQIBAESvIn/xWqIwCCRdertlMx9xrDELSAbc9pe
EJoAAjwUvR3FpgaADp8JeF4OcbDf9QXz4QlZ1Xtc016o95QXUmpB1jZwnSyI
KmuGZm9t7bwNpQU/3qLzy+YN03TimV3kBGwrGE5REmH4n6p/GhwfYKhk9HQ2
FlK1OfM1OUOaNxbzELkJEWBt9ve9bL26gbuTE0Psfq254M9hpLCsL+uJFwZI
44MB0+ycX16/cUzgWXYCsbFHFl2wEIdcoHer2VDp+KlQXFiDOfMShAVO8Wq4
EIvYD7QbZv71ibLKl41TCU55WCUDesqOvnlKSj7DPhRCWOHsAe/nbTfBUzBX
kCPQmMNS5X/Qt+oUA7+0xnfYUiBefVVAKyBnWzO1hmhZB8Yjqdrs8QEDsqtg
zlmKlR0Hd5eV3WRKlk9/LTdmQmfmUMIGBjEMn6TTtrUGapUSRwgMC6ptcAPA
a6/ONCS9LWfbdmQ3BMY6bnsU2pHDGWmtpxAw+Oxgk4lzGBiqq0MMyIDMxXGy
0h+BVTeu1Nm25j1dvTkMlPTTRsjZUgA/7sDr3xyE1zUfCZAWAGWNrXw7vuar
IIDpiPy3SwHAWMDjYfwAAQvZHWfaTrnzvpx6kHsEvPK58+T1ddkBw7u9XsNG
X+DgjYu6b7hBboDu3+aBgY/vEP8c59qJlRzLwQo5hIkj2xPwXwQkINqJm3xl
lI5OFFH+NX6XB/65ztj/Jhn8c13zf1RG+A/dlfcnlBb+rb7LX/5oMX7yz9RO
PhnpHzcj/W1i93cXLf1xgho/Lp785Vf8QlDl51/x42LXf9w3/L+V1OaTzvcS
f/9n/XjJf6L5cevXThcatbZzyuLa+JhJhnbl+7f58WDzv73qJ03TjPXsTGSZ
E29NJFvXLw3iJyCCfUTdSvHeuRLfgCeEg4S7DkC75wMSL+EiW2yro70jXPiE
8Q3YtejQJ240gFWK/VX2yvIUzvF14jbMtJr1brY95k28bJmQ5hj0BepL/fqD
lvrT10EFiSubAPmNjM6unAVwxsH7bqkREtJTNVoTNuvBRb54YxDLAST/vBIQ
HDLmN3qvAWxT0xlAmDxneIWHZhBTMcOHR2dVb4D9AwQGxV5QgAmWh/HCn85a
ShO8DSe9nJVwZB4qu6MFf9YE/38cyDX4Q8kIFzXmVX/UE4B+UD0+X9JR03ZK
sUbnnTvRfpvdBBERoQ9hpWXHoAIxgT1cBKSfE1VQb4MxmJ/iz0faNgyPA9QE
+KgAsJ3reflzeCtw/CH4Bq0kXY70AR3jPqabRlZKwwHZ7pw9q8prOnCNXcX7
xuTmNgsC+bZpRHmKACW/cntVaCnjUQLlMSQ5qwE6aapQYE/TFtpYgWLrU46p
/GU/Tn0Mc0MYz7LgDd3AwMBHcfYvsdusz5wGmDCrFeR8JVbBUICPsPggB6l1
gZOpAjGvAyyDSs57BWvc9gPm6TAg9gDoh0o/z5xgdwgC1tjBOzwQ0Kc5blgG
ZjDKBea04yE+N8CyfQawOAOEPmCvtpM2bM9EWPwSC4ujAlAMlt/fFzAXnSCI
bJ8T/47j97ig++F+254Qgsjx4wwtQuqGTLKCQKcEwBW9ErRTgSfBJ067gIxW
2G17ndiQXeqAnjYTMCFvdhuox5ZHixKY0wogfPYBUA8bJfofAA2kGU5d8zTh
WNuOD/TByar6KWqA0nJl9eV5LAIeA352s7/wlJJSfqYHzGm46jyq2df8Zedx
DKMGW/g4AaEmO6OwGQgrprpVg8l78zQ84AQWAf85bxe4HVPJjq0F20PYGY51
O/YaYCqxA0A4gZmXgp4GdS8gfel1xFE2KU7trG7mJRzePPDWDNSHI/Xi4AAg
EE4eLegdsE4bQJ4aeeIXKOO4nHzT3OqB1uX04u4O1g+qBYPi/QB0LDBgLSz7
odg5rMOR1geOmk10B9yHaQn3u9ULSlCLzTDQrt47bIbDW51W7grk8G9YHM9U
p71XMR0Auk00AOAHLA8mjNhLh4FyfLbqNzF+mZiQxrYTYSmpYcJsxmIVgf11
Oh6zD9bsZLYv/5Qh8A7R2QRS1HUAv0nxOdm3TePwmI5B26K/wYLT2SBsGWf5
DX7V6EQ+pPu97FN2sNWTvPENnqVW2m1vxLJ8VssAkGLxHfZuPQL6AzfY6V37
lhzwYFjd82OUu1gprF1pJpYpnXrwwjcP//AYJjNXf2EiTdkb6BnuDGYM2131
zCsrCJS/cBfhzragBkhX4e1U8IGYvRueTQQqN+t7x2xjPdwZjgaXq8eR+2tO
8/XEjObkzqrZpDxf0m0DxoQbHncPWFo6a5QFD9uPR6U7S1OcM1DohQM9+VRC
4p3sKayZNWDFb6NhdiCqwbIKRI0NgVPrL6KpjpcVa849SzwgxeGbx+Q48iM7
Z22/CY9ps+dWsWhFGMXL8jqDWN+HtyPQc5YL52k6DHDBTt4fY7ly1boja1ew
3gpF2ak0Dg6HaGmv7/vY4MrZ5DkkfHC7L8tUIR7F2HrS/ZWvLbsWo+e9bhNa
qtPsZsPV216oDq6tnICPsGkxmExk3yEeG4q5szO+rTl9hYfeOMlkbou/Pbxa
czpffSn4Eyu1m9N8Dyax7N5iua7aV1tLcYnO9mqb1bItqILzy8nKjgRBkptJ
OnvLII/gHmctnUwrquj0a0yekUftZruV6Dpz2e/d8eacboy/3dCkt9x4qogX
jgM4Yiv6w1dtu/h6uKYF2ns7qLmJnKc41KdCx7Sp0i4lVlAFFCeTbV+11x4O
unCYgRMflwnCB2uzCIA3SftLErFsNsxBAptnRcUE5dNqcjj/dZinnQiFrsua
KJ8X59WATgEgIe0lVCybgghx/Do4yyJL5mTgJLsabPg/OLFDU7gZY5pqHHvU
TxaF73ce5bbTNEImX/yC6WB81bTlV0Gdo7zbePnhYxLdBgtn9VgD6OdVLUtz
3CvYRF0AnmOzKd+YscMgnCaioZJpRxWnVa1eAxfnw5etzn5iIlfWnezCigUi
uIXlUsJwjM4uZcJL0RjfTxoFpDE2D7k+RR4M7wFLEP8iJwCvjV89znDwfY4w
sR4cSb77uVOq1SwvW1nOje0ueKyiXbB33BqwIwVs9zansyP/+JRsW5lbyLM3
OzyJo3yMHbCaNWG9bUdNUv3EsTCkh/cZIMxvDBGQxptF5VfANUDImEpMfXyJ
1vCpW+z2BcoJfoWFN0WQSiMIex73Bd5WWWa67C9EfQO6MDwDXIT229yAHyW6
Tj7mIdK99wt8eW1qSPcanwbYxdlKxYosfmAMdZ2OcY6lTveZRY9xGxKKOiaA
r+cBHbzjtfRciXlfw/3lFLgNvhXcp9mPrwfxmHYLy9TtjyrwDs4Ngu/K4RPY
YPxZXMNswp0e8AvGFtfO+353q8PgpVoMAX1Z2PT28vFUrJs1Ak/F/ubs/KMT
Ys5jhc5O70lcv35O6n6yA9wRoXdE9YTeMbBeU3r92D+En+BdHThRI8r8owpE
wBLOgUZvN6/TAiweTw174JFZCFtru8lpje7mVZXzSI+p3nk0k2p6fqWrbnOm
pb47hwWPCfZPuCPduI3HsKBohZPtPG+7LWmw2iPEXdiQadtvusBPOPlv1fjN
YA8IbilHdQaiPb5QJX2v/ppYRYC0dTAo3QRY7MtguK/7sX7NCYzqMBBJHI0i
VrMtYFgiFWb4ssymrtowq1kzYWrylcnkGHSyglc/pUdr/A4dAC7WJ3dnJycH
EzjfQW9g5u1UyuIbgGdvNMw2tl9DSPu+DguU8RxOtI7xOvzgJHg/wi6fpC01
FvjW5OSSEn/HOcUVvsonfhuYdtmODc9zqKUBZIk5uABPRAej7hKtiHeioRpm
3XigUp26ezgV+AxEC9d/Wb3D//G9DpASnBUlsXPGITVln/a0kGUOmqdSx3EL
AZ0zAPvg3ziUakAc6ZQVTFu8ttJird4Cqbw8Xy44jO3Ty7OQbjNOsafMPDim
BVFccsdjb/NhzdMw6Q8AeQG+i0eZUd3Al5NWMuEHXg1yxGIyn2Zx25Z7TsN9
mV+/H6t/ykNC3nC60WdfIMj9OEeOd5n5iCQqpxRqhtk6gvmVx4vtM1ddmM2d
Py263Ff+CizyzKnIyQ/VtVtVk4etS7djMlAf+84JwSB6bAmubp/4l7OH/Eg8
n3WKaMFx51rtqFd9idhqTmKo8JJuiBiomrDH1yv4ouidgiDxQBeem5d4Xd7H
vnJO9VIipti4nL9ofDc4FNgYfxZtUN+uHbt4tR4DLKgO0DZ4BMjZHFzAMULn
3znEUvgp0Ar44hQnhVYC+U27WBTrciTpUrCJT4cI3IWttmBqPMU/TUtCPDS4
wnlUNb2yKFD9rjW+hmffCFM7FxGvbGfIo6qN0j0omioNdjmdR4z5WlWajg8o
UfG2hBV3iBWvgL+1FmNHGz41WSp7lQCqHKRhVv9NxGm8Y3dm7HEeXYVCUPCy
gKUSjQd3QPh6u24iAhRv8FJD3SmgjkpVYSb7kDFJ6PYn6JadhIAG2XMVVAQ9
9bZAm8FHV85ROZqvTYJFx593YY3tdEOxVnVLoKWvDTw7K0eVLYUOQg3f66py
Oq9sN2cnEmDizwh4tf4hSDskrZuyPARGjLB3IIxt/1su17HMaqGdCJHOFdnx
ZES0gMuar6+5rp0enNwAhsCdbZcbRGHr4vYYaUMgehE+FmI3Jgj89VVf3Eh4
Yffqr7JrfRYLvjjtamTaQEcFxIZ6OxwIMESWICv2UOvVVeAIU+z3yDl+RB6w
5J07/ruIBiORb4qEWSnlHy30Feh89+Me2PQl7r+Dyg0JnOCE+naEJjhnBft/
loM3ednZwDkDzLFNBPfk98X2qo9Rnys1ttzhIwWGxgIkZRgDlFvlICwL6Mr/
f7ouoBuqoB/E+l3GiY6lOc3diGpJtZ9ioskuOj7P5+6gcDaft7EBY1lxemxc
TfiD5+nA4NPtxm1mygK8L3HqeNZkHTqbOFywbGgB6A6K4GTrcQ7Ijh/H0FvX
y4EiLeus5Ah1ukSw4mQOp60bUBSO0WB/oP3OuN7GKUDJ0W6hFQ40EAlxaPiv
Cf6Gaj6XLZEgcP8tPFjsrZSfysSqCIDsy4Ef7o2nf3Wu55tvN5eabBdxNpWn
xmNWzg9cCrz/mjrE+28cDzyuqL1lfxUH4VPWul0Pmx/5vWJv3Up4i5PnpQzv
6hibsjs9TadTYImF8AqutF5NnHNqm1O9flugOQfLhXUXzNP00ONUVllAqtU0
rD7gvsCdCB8xM3M+TdAko7Oke+0/VKD58z+yQvNdV/h/WqX58z/FMs1v5m/+
8g9oyH/1E9eA9/sP/+6Xd1z+5j+NP0ZO/J98Dcil+fLs/8Dj/14F/f+XmP7U
FO//bwyLxDFB4/FTXtoi4mahwqT26QSvvy2GwV1TVTah96QaFoTu3SNZzZ7h
PtfvT/ZPyr8TzWysf6ZZBTi4E5mJaHyLdR8zBWnLEOHTCt2dOzmefwEO8et/
t7Km6Chu2UYB8G1TXbWB3Xhw2yXtNIgjP2Dt3EI0VZf4nfcKX87VJIgN5cRM
QNJxrL/bGkBwIrhvIg8EvDqItx1Dyw7jvvbCKZkhkiQGvX9PZQ26Eu0r6FII
OwGHM88hq88Xh9nxqRgX1AUqGtOl6ITwct47NljsuP7Oqf/pARYLOY4a1beV
NZNR/ZwO334C4V+NpEO4gpNt9U7fJ12wMzO2ddesjqPyCfa2tH6LlSHS35xd
W02ZIwVJbhGhwrHvGqPcZhjei7WP5/5lsS8plcD3FbCXYLXJsIiMeSmdUyBd
bH92MvSZP9LMQK8YwqW2THqKQ6kinaRG6hrqVz2Yi00uK72r1s+q7AIEFUDh
4YKhnKLs2oEO39aGukpDYFY2D2NbllBm6x8iBytDRoDEavKsCbYGJR4bZCCv
wGFI2S+LfcDyIoQs7VltQr9vkJBZmsg/KDGteNEzWPp8nLNUiqSWpiDiyqUs
7EwFDICVMv1VrdUIherOMnRp7Y0dObZhxeqxDQXeZ2Nq4P3itaFeD2zB9ugk
g+JYCc0nyPVMJffMzVlZs8PowJqVB+UTVJJUjTBgYhfgSiG2qlovxEWdzPSO
O39599s0Lp8/NgTxdkJk2gCjQqdi/+HjYfluwEwl8VXWgUaojqEg3Hweu5qt
7A52GVibrT22EzBnNaDbMrkwXyjCy9pdtuJMR0MTbKRWe2mOL9D571PMs4xW
O0B2OAVRAK7NFuoSMAr1xNqXmgoA1Cqo7/acY8POHWXgWhaplWMrF+7EixTw
Vcp+2UMGSFXj3UljaOS1221bH+dxt6+KYcOPE2rKGsGyHeuwG20J+vjiyYqB
ux1j/zrBWG6lP0x4pG6FHneqllSqAFdn2MHO7w5+uBLSwOo8i3t0A0DhSdV0
EQC61n45ECvJavokOyltPcU8WLfsfLXJKOjB2sGcbXSsN8VbFZp4A2uLgov9
KiMCbN/qgD+A2Qbv246nYGdhiM258zvbBMXrlhMhicWeRZuSToYQwmDXZWJV
LWKldmw8cugEe+iq1joflHGB55Mvig7qwz2CpcGt67FTeir3d0GiSnwHPsIp
aGdFvqkKC/f7+fGmhcPEuch3hyw/UUXk3pRzHPvlbMDTr9JjVLHHuyrMkSla
7TUTq3j3BkaKi4LZ9dcG8OaBtnVyyvr1NyxGi/uajtY++ThOnZzjcjAemp0k
W2o5qdr3qCduCyFH6yhvbTbAC1BWsyVxX48EtCpyN72YAn90Kx3xGKFUlVXN
uimtlUPEJ0XlV88yYOKDbdZ7CBOXA/kEN9jyQ9i0HI2Lhls6uI5Lq+9JgcPx
jrb4AqJe+TTbi6I57Fldn4AmtpLqYh0CHMaF/4SNLNGFT0mev1+f5EBSy6ls
Y4xXeLDUVmXuYC/4hTl19fwCXsZ7OwgJGB/vMYgUB6qL84JQmd5IJjOWSW/L
Bw8P9xII1ijzincksk22drXm7KY6EHjqMWfCBSuNU9InMGyFdjel5m8O6quI
IP6+EDLqlfN3x4As/zi8rTA4Hz/GjB2g0t45CAXdblEi+/3itKMasb7Q2DD2
w5dcY5rjgzMHNpGv9fCpPR5V1IYOO+6wnZ60jf/mbNtUUp5TQqiFWBcrR8AC
vv0Tqi3hEvewFRBmGGNYtrk4ZWLtRIk/LMektSa/TbTbCrjUe8FLFa+AcJjP
gQav5siqxifiXJqp980f4qmL0+SqHZrzJ0adouLfITruXIElVqLfkEzrVfXJ
FDuKXvqgDAAr/yw1CZuWkNuT8Qy58cUqpXqCMdidrzmVWHDu9MYpKFPhDGII
drAQyHlTTvpI70fbE8cm6GjwlPdx1r1YWq0XP1Rm6HXePryPtxWUb0g/3vgP
gWAwoCXrNM3ck0JQId5NVSmWedugclk4UFltH2thtTno4zw9djwLP14hqX4f
1aX1bpeooDUOJCneMOeqplCul4jr+bdSp6wijpalGNPBStu8CYd2tJxyPz8u
PXhVfBhYxsifrLIzB1dJ6bSAWxkOwBmdCi7a3oZVHKaZyZ7r4S00eYADHQ0D
fNTHaxOSqqIKCaoA0wEl9u86T6QMiRKA0ZK9nRaqDUXrmVGdq2S373IVm3Mm
Lag3l6/zDV7bQa4ukKp0cT2pq1b+2L6uIBwfpWxtNBMjMnDEwlY0I0NT0BEv
xekDrYIP7veTSQa0qICoNP9SWB9IW+y1UrFb4XxOCWuwknkNHsTLQS6sMqmx
HTGu9No6zdHAgXYrz+o97HP06ByioRpi7ZadMTVWJHphCZH4vY5Yy8KQIqtP
TAWXr/g7WK7b8xrLsHQpyOnfuF27P91oJ52cKbEXf4KCXtFW/trM7MpobWCr
ju/eX9oOrkH0WesZmPvu6oJzwPjV+sHG8gJeL6xtRMezN2AwRTW4+UihEhbW
LS8o5RrAGLcXhbwBZIk52eECAGn1bAiMQ6hsUWEpCxGqg0+CN0WoksRWgYGU
Y74dLC1rBmXvQG9WudSc2v2HVj1W9xSv0lIJLnueTh3Oz1rkr06+FmOPc52s
qtLY2ftABqfaVCxO3/h22VpxbJzhiIaGkzSRiMXBSginNrPgJOwOWLc9DpaY
rcoqDEzstQ15pHINTtnzy2Kfgqte+xQUwbJ0cARoPHF+2w8lyWIljDduOONj
DfVVvhn/sCvYtqtJ8/RivUgxqJCON//kUO9i0zmuSThmk7xjeUWZLdUeQ8NF
gTTzN0ZsOXlZbO4gLIJGHclJZtYPo7RytmEFQ9lQgaQT10BrfjsSAu5+QZju
0fFzuO+w7s7xrUOx3P4EhT0fi5l9QpOebZvCgtJ6dcWr0Cg8jGcs+do4RG+U
eEDYdn4F5yzUkMcEE59LIOpdjVbW+1UaiteZ4mBT8cCNwJJEp4VuXP22mTF7
8drz/NA6l7B9FzE83l+QgZlOlWjdvqV3vQwIm6KvYsSWPZxmMu3Xi17co/gk
4GB21c/rrWDoaptPA0RAKJo0YqoayxfddiNeXZ1VaxKqQVm5XlFVXhu4HC05
++uQI0gSEIcTxSDF9ZVvIUz4UoLPmy6vrQoHfpU+lTUbKALH+NNMk2PiXpty
l0sLBion9XmcN3V8gScRkL4X0fKdiqE2gYIX8xD3548b21SAwPF8T4K3wkHY
tsFJsg6UDgZf7uRtFdenF8Vr4wWsnUFbwLKWByAUkGaIE6YXQQufnjlbz7s4
Tw93cygMeEoAvAjh77O/+YVm7efYDqRw73Q0i3efCz8BaoCVsPen/rh1YYPQ
x5Phq3xvgv4TxhwRAqSUH5utcHEH81rgTcuRb06whTjVvPj0d9aj+K+iFhpb
7hc+DgYMiT9fRc3rTbxHYBJlyhPtcOSkwMqSAlp24PFuAXhZLX7ztGXaVuaY
Zs5ecGEEC84a8BDW+LwqCSzouANn5OC9tk1AKagjmFWM9qKB5EzFBdmwZcT9
cCbVrILFWAgwBmO7ED4zqg2YLMR6Q5U6GjhnqDj0Tz2iFzbwBHhUB3BYCwGH
xail8Cd8kGKE07uN7HG1K9cbknALHZYvcf2k1UrES9kp++D5CWA8I9/nseep
vyEqSNh3iN3FBOlU/CKqOuVNJVXH69hPuHDn+Nhu0AJhPepVJ+/8sTdufPcO
HCeeNh7SO7CqA1VwOcWovuFwb6pwQscbyFSu2xCJpoTo2xsnTXaDl7Q8uzmP
QBSnOqGo00s1jG+P8/QRP5LxUpb4cRSckuKFgfJyopgNmCqMg3v5cvXmWcHz
GMLxcS8s5ZO4UD33TpcxvStgYSSHNVjjH8+GxXdoz/21AKt0sbw7Q60OYJbD
Ns2E3Kuu0wr35T1XE1iNcdkV9PJnw0DBS0ana52qdbDY+Wxo/gbJ3LaYEFgn
VgPEjt5Y9AKTIYSEsk/AsrlO+7v2bGY8F1RJBcdj/guLNB1kbmqMYRGfN+Sd
0vUqKoLpYbJnep/bi39dhVMDUlRZkIOugK8Oj6XBNaSmi+OMOE3fg+rKF279
TCyRE2ZfsfV6lUcVR9lel7JYylYclCQ4BCDETcjlGIDxbBgo3u2zLlB6+TBu
tY2IEG9zi5OdvEsfbNQOCXyAh5/4PN7PezAA3U2KaGscZvxcgTdVw8b7UPD3
IDwP53evCQGJaDEkcLjguSHhwf2ei00ExatKCVLAUi44NxFLGcv3sTXQAbMM
SuHbsG+VW3eMtWBmSeUXYGU1SYpnyHbP2u6prhdxE1+JQZQfB3FqJUQENaAN
oZBMDo/t50lt+PeEgQfksC57i8EXOcxLCJb4mnUc0rJjvWc1co69MvjeqdQJ
J1wZUkt5HNMoMxyquaoG4g0zl3fitbqqNvNdYJS95CWqHRxHdwSOyGk/STBl
Ub3cDKDbbl99BG9THF6/APLwMiWAOwYBvXiB2qxt1XUGr/a0YQtL9wbMXyiq
Zocp+SqHAfBlrpi6vvB3XPNRtEvFS94/KeNo/zdHjQfF0r1bpeyp2JxX7hmg
PvV3nFIluByML+N+xjYhw4+LKnb2Ram4wRo2cMFlPtocksO80EzAorPtyap1
dv/WAPx8SL0owACE8hoCVSJUuxHAg9Cv8vWiYSpZgeBsvLHKXrxjdCgc1JSa
rtWbYEGl7exSttnjdtv2cRvc15UVRGj6uudEYpcGw2Z6b+q6nSLN71cchYSa
wvyya/hMm+Md91XxfJbrDo7s43OD0ipqQ5mNYSWfYzOIl/Ys3CM7rbiaN0i9
TpR+g8UQhMfcRgdh5FuF//7dxyGjyr7S1j/eCvI3E3BDcWIZ4Mz16+w43ol6
iCqPiuPX8kIdOw1AypCwqgymd0DIDVJPn5rLY9OELbr+fxDMOE7THEUueb8b
XAtZfr6MCizk+SYuVYxS2/a127V658iymzfcXgP26LF5+1q9snQBLHDjz2W1
3RnQapNMtrOwGKHUWeJp92YJiKMJGm912ss/Cc1enSDI+rQoCeI2mXCqvPUA
6jX3KapOYn7exajC+LBtZt8QZy9JOglfn7xZBdeOW9ymCuB3MATvz7ANWQa7
LeKfT/y1dFgB5MnbtgY4+6gT6BU+Xjq7VbRptuOXJX6L09AShUYGOHM9Xtcy
VUb3shTl0HuQarTNaw67VkvyCoUC+YX1PCtctpqCXou3aIIWVRvxVj4CrfeU
qbLM1r39u9ToERN6x6TXQnx3o64PY67rMbPpHLK5SFyqmrnLDPRW69/iE0i5
POobcbLv41zFp4YBoNDqMAPQcTWsc0SVP1N2APyyvE45eUtIf6OJAjNWE/7t
qvblaHx5tG3FV0CV35AW6NuvAT6qh4DDzl6RiemrAU5Eywu+drzWKqjrBCJb
hnxir+oP0dB6zUaIgRF5+c34RsZTKA7v3hUoBRUzk1Zk1NBsxbgIZDKUSmh3
iKDZC3M5gYuLAHrYSd+AmN42BZ2FFWCY3tDhzR44g/1pU8GVHi8leVTwrrM7
kRQ803UmDnZwKB+riA4K1ZOwhzAmRKtALbvNUwMWWoOJcBuOBpBwZELbhtnB
I9s2rZnuaDHQ7g+gwWtfi90f9gEZTx3a4hFxL944jX/2hiQHBmBj5fKSquUs
wcMRs9WUFYAYBPDOUSgsgegA4xwcH2w93llwm+DMw3YYSP++bcvjhz14BQau
CThpc4961MF5jv5dbUAYTmATXNB41WbzrjrA4gRSqxSw62V77laC2yupOJ9e
v1Sl6quOvr/7NllcR75fe7TuemwHXMrJ5WY2ytmuCwbhNc2miL2QLXkFRjI1
aPe3Xf2wJ6IXRNfrJ8HKcO68HjWK0yc56eD6NXv8pv4f1eJVCY3J9nivQGhi
U2ct3vUOomlVlgEY46dxOB8lxTBl3vA6tgaNYHM2J9Q7FM2uq7xmHcCLn2HW
n2esXlbyXadQ2qeZdBRVumUoV1LB3du8vaDSWhU0EbN/n2M3axfkY7m6yrot
G94xAeHxFjFwVmDnUMjnUoQBfGvHMYjKSZ3l5aFFkIOTjQoHRX/pBQ8Rn07q
kqOsSMR304uTh5f3lO5QnuUM4Kd3N6Ry320JwB+1S5rCONs7ZXB0PGoFng8V
+Jf36DogDvd4mpkvPBtILTn3Vxzt98LgmgdwJPMp26l2b2GInziKIi+5gML5
uMWHX4RyiH3zVgJilj11vKotS2AOW7lvB4VuQl9yWp1Dk4lV4SsDy1AyT7fn
VdScm96IaK/kHGCypZbX9CgMBwO7t8DhY+wns8zFBvAJJzj1T1w18XuxpNmU
p/e+Sd0s/1Uv0LYmjsez+14WN3P+OuZUJ3EqcDdCu6Klzuxf5buVaAAjFKXL
RdHF75dtRgPHQa1/pqgabkWCVBjEy+DDlo7z9piWaUdWNYo2sXRcT998tNdj
mpO73ojPDr9t1MLpCKWyFzk9WUWMavksVnPV3kDnNRpQlmwt2EnDyrYBb5IX
n7V1zR+NWr/61b+5rn/1z371q+uf//Rv53/+9X/5H3+113/86/3r//Y31//8
l7/+73/97v+617/+szP+6m/2n9mc9Rf//i9+Gr/7zf0vvo/4X1pVeyEpcwEA

-->

</rfc>
