<?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.34 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cpace-19" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="CPace">CPace, a balanced composable PAKE</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-19"/>
    <author initials="M." surname="Abdalla" fullname="Michel Abdalla">
      <organization>Nexus - San Francisco</organization>
      <address>
        <email>michel.abdalla@gmail.com</email>
      </address>
    </author>
    <author initials="B." surname="Haase" fullname="Bjoern Haase">
      <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
      <address>
        <email>bjoern.m.haase@web.de</email>
      </address>
    </author>
    <author initials="J." surname="Hesse" fullname="Julia Hesse">
      <organization>IBM Research Europe - Zurich</organization>
      <address>
        <email>juliahesse2@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="22"/>
    <workgroup>CFRG</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 161?>

<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>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Crypto Forum Research Group mailing list (cfrg@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/search/?email_list=cfrg"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/cfrg/draft-irtf-cfrg-cpace"/>.</t>
    </note>
  </front>
  <middle>
    <?line 169?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes CPace which is a balanced Password-Authenticated-Key-Establishment (PAKE)
protocol for two parties where both parties derive a cryptographic key
of high entropy from a shared secret of low-entropy.
CPace protects the passwords against offline dictionary attacks by requiring
adversaries to actively interact with a protocol party and by allowing
for at most one single password guess per active interaction.</t>
      <t>The CPace design was tailored considering the following main objectives:</t>
      <ul spacing="normal">
        <li>
          <t>Efficiency: Deployment of CPace is feasible on resource-constrained devices.</t>
        </li>
        <li>
          <t>Versatility: CPace supports different application scenarios via versatile input formats, and by supporting applications with and without clear initiator and responder roles.</t>
        </li>
        <li>
          <t>Implementation error resistance: CPace aims at avoiding common implementation pitfalls already by design, such as avoiding incentives for insecure execution-time speed optimizations. For smooth integration into different cryptographic library ecosystems, this document provides a variety of cipher suites.</t>
        </li>
        <li>
          <t>Post-quantum annoyance: CPace comes with measures to slow down adversaries capable of breaking the discrete logarithm problem on elliptic curves.</t>
        </li>
      </ul>
      <section anchor="outline-of-this-document">
        <name>Outline of this document</name>
        <ul spacing="normal">
          <li>
            <t><xref target="ApplicationPerspective"/> describes the expected properties of an application using CPace, and discusses in particular which application-level aspects are relevant for CPace's security.</t>
          </li>
          <li>
            <t><xref target="CipherSuites"/> gives an overview of the recommended
cipher suites for CPace which were optimized for different types of cryptographic
library ecosystems.</t>
          </li>
          <li>
            <t><xref target="Definition"/> introduces the notation used throughout this document.</t>
          </li>
          <li>
            <t><xref target="protocol-section"/> specifies the CPace protocol.</t>
          </li>
          <li>
            <t>The appendix provides code and test vectors of all of the
functions defined for CPace.</t>
          </li>
        </ul>
        <t>As this document is primarily written for implementers and application designers, we would like to refer the theory-inclined reader to the scientific paper <xref target="AHH21"/> which covers the detailed security analysis of the different CPace instantiations as defined in this document via the cipher suites.</t>
      </section>
    </section>
    <section anchor="requirements-notation">
      <name>Requirements Notation</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" 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.
<?line -6?>
      </t>
    </section>
    <section anchor="ApplicationPerspective">
      <name>High-level application perspective</name>
      <t>CPace enables balanced password-authenticated key establishment. I.e. with CPace the parties start the protocol with a shared secret octet string, namely the password-related string (PRS).
PRS can be a low-entropy secret itself, for instance a clear-text password encoded according to <xref target="RFC8265"/>, or any string derived from a common secret, for instance by use of a key derivation function.</t>
      <t>Applications with clients and servers where the server side is storing account and password information in its persistent memory are recommended to use <em>augmented</em>
PAKE protocols such as OPAQUE <xref target="RFC9807"/>.</t>
      <t>In the course of the CPace protocol, A sends one message to B and B sends one message to A.  We use the term "initiator-responder" for CPace where A always
speaks first, and the term "symmetric" setting where anyone can speak first.</t>
      <t>CPace's output is an intermediate session key (ISK), but any party might abort in case of an invalid received message. A and B will produce the same ISK value if and
only if both sides did initiate the protocol using the same protocol inputs, specifically the same PRS and the same value for the input parameters CI, ADa, ADb
and sid that will be specified in section <xref target="OptionalInputs"/>.</t>
      <t>This specification considers different application scenarios. This includes applications aiming at anonymous key exchange and applications that need to
rely on verification of identities of one or both communication partners.
Moreover, when identities are used, they may or may not need to be kept confidential. Depending on the application's requirements, identity information
regarding the communication partners may have to be mandatorily integrated in the input parameters CI, ADa, ADb and the protocol
may have to be executed with clear initiator and responder roles (see <xref target="sec-considerations-ids"/>).</t>
      <t>The naming of ISK as "intermediate" session key highlights the fact that it is RECOMMENDED that applications process ISK by use of a suitable strong key derivation
function KDF (such as defined in <xref target="RFC5869"/>) before using the key in a higher-level protocol.</t>
      <section anchor="OptionalInputs">
        <name>CPace inputs</name>
        <t>For accommodating different application settings, CPace offers the following inputs which, depending on the application scenario, MAY also be the empty string:</t>
        <ul spacing="normal">
          <li>
            <t>Party identity strings (A,B).
In CPace, each party can be  given a party identity string which
might be a device name, a user name, or an URL.
CPace offers two alternative options for authenticating the party identifiers in the course of the protocol run
(see <xref target="sec-considerations-ids"/>).</t>
          </li>
          <li>
            <t>Channel identifier (CI).
CI can be used to bind a session key exchanged with CPace to a specific networking channel which interconnects the protocol parties.
CI could for instance include networking addresses of both parties or party identity strings or service port number identifiers.
Both parties are required to have the same view of CI. CI will not be publicly sent on the wire and may also include confidential
information.
Both parties will only establish a common session key if they initiated the protocol with the same view of CI.</t>
          </li>
          <li>
            <t>Associated data fields (ADa and ADb).
These fields can be used for authenticating associated data alongside the CPace protocol.
The ADa and ADb will be sent in clear text as part of the protocol messages.
ADa and ADb will become authenticated in a CPace protocol run as
both parties will only agree on a common key if they have had the same view on ADa and ADb.
Applications that need to rely on the identity of the communication partner may have to integrate identity information in ADa and/or ADb
(see <xref target="sec-considerations-ids"/>).  </t>
            <t>
In a setting with clear initiator and responder roles, identity information in ADa
sent by the initiator can be used by the responder for choosing the appropriate PRS (respectively password) for this identity.
ADa and ADb could also include application protocol version information (e.g. to avoid downgrade attacks).</t>
          </li>
          <li>
            <t>Session identifier (sid).
If both parties have access to the same unique public octet string sid being specific for a communication session before starting the protocol,
it is RECOMMENDED to use this sid value as an additional input for the protocol as this provides security advantages
and will bind the CPace run to this communication session (see <xref target="sec-considerations"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="optional-cpace-outputs">
        <name>Optional CPace outputs</name>
        <t>If a session identifier is not available as input at protocol start CPace can optionally produce a unique public session identifier sid_output
as output that might be helpful for the application for actions subsequent to the CPace protocol step (see <xref target="sec-sid-output"/>, <xref target="BGHJ24"/>).</t>
      </section>
      <section anchor="responsibilities-of-the-application-layer">
        <name>Responsibilities of the application layer</name>
        <t>The following tasks are out of the scope of this document and left to the application layer</t>
        <ul spacing="normal">
          <li>
            <t>Setup phase:
The application layer is responsible for the handshake that makes parties agree on a common CPace cipher suite.</t>
          </li>
          <li>
            <t>This document does not specify which encodings applications use for the mandatory PRS input and the inputs
CI, sid, ADa and ADb. If PRS is a clear-text password or an octet string derived from a clear-text password,
e.g. by use of a key-derivation function, the clear-text password SHOULD BE encoded according to <xref target="RFC8265"/>.</t>
          </li>
          <li>
            <t>The application needs to settle whether CPace is used in the initiator-responder or the symmetric setting along the
guidelines of <xref target="sec-considerations-ids"/>. In the symmetric
setting, transcripts ordered string concatenation must be used for generating protocol transcripts.
In this document we will provide test vectors for both the initiator-responder and the symmetric setting.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="CipherSuites">
      <name>CPace cipher suites</name>
      <t>In the setup phase of CPace, both communication partners need to agree on a common cipher suite.
Cipher suites consist of a combination of a hash function H and an elliptic curve environment G.</t>
      <t>For naming cipher suites we use the convention "CPACE-G-H". We RECOMMEND the following cipher suites:</t>
      <ul spacing="normal">
        <li>
          <t>CPACE-X25519-SHA512. This suite uses the group environment G_X25519 defined in <xref target="CPaceMontgomery"/> and SHA-512 as hash function.
This cipher suite comes with the smallest messages on the wire and a low computational cost.</t>
        </li>
        <li>
          <t>CPACE-P256_XMD:SHA-256_SSWU_NU_-SHA256.
This suite instantiates the group environment G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P256_XMD:SHA-256_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P256, and hash function SHA-256.</t>
        </li>
      </ul>
      <t>The following RECOMMENDED cipher suites provide higher security margins.</t>
      <ul spacing="normal">
        <li>
          <t>CPACE-X448-SHAKE256. This suite uses the group environment G_X448 defined in <xref target="CPaceMontgomery"/> and SHAKE-256 as hash function.</t>
        </li>
        <li>
          <t>CPACE-P384_XMD:SHA-384_SSWU_NU_-SHA384.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P384_XMD:SHA-384_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P384 with H = SHA-384.</t>
        </li>
        <li>
          <t>CPACE-P521_XMD:SHA-512_SSWU_NU_-SHA512.
This suite instantiates G as specified in <xref target="CPaceWeierstrass"/> using the encode_to_curve function P521_XMD:SHA-512_SSWU_NU_
from <xref target="RFC9380"/> on curve NIST-P521 with H = SHA-512.</t>
        </li>
      </ul>
      <t>CPace can also securely be implemented using the cipher suites CPACE-RISTR255-SHA512 and CPACE-DECAF448-SHAKE256 defined in
<xref target="CPaceCoffee"/>. <xref target="sec-considerations"/> gives guidance on how to implement CPace on further elliptic curves.</t>
    </section>
    <section anchor="Definition">
      <name>Definitions and notation</name>
      <section anchor="group-environment-g">
        <name>Group environment G</name>
        <t>The group environment G specifies an elliptic curve group (also denoted G for convenience)  and associated constants
and functions as detailed below. In this document we use additive notation for the group operation.</t>
        <ul spacing="normal">
          <li>
            <t>G.calculate_generator(H,PRS,CI,sid) denotes a function that outputs a representation of a generator (referred to as "generator" from now on) of the group
which is derived from input octet strings PRS, CI, and sid and with the help of a hash function H.</t>
          </li>
          <li>
            <t>G.sample_scalar() is a function returning a representation of an integer (referred to as "scalar" from now on) appropriate as a
private Diffie-Hellman key for the group.</t>
          </li>
          <li>
            <t>G.scalar_mult(y,g) is a function operating on a scalar
y and a group element g. It returns an octet string representation of the group element Y = y*g.</t>
          </li>
          <li>
            <t>G.I denotes a unique octet string representation of the neutral element of the group. G.I is used for detecting and signaling certain error conditions.</t>
          </li>
          <li>
            <t>G.scalar_mult_vfy(y,g) is a function operating on
a scalar y and a group element g. It returns an octet string
representation of the group element y*g. Additionally, scalar_mult_vfy specifies validity conditions for y,g and y*g and outputs G.I in case they are not met.</t>
          </li>
          <li>
            <t>G.DSI denotes a domain-separation identifier octet string which SHALL be uniquely identifying the group environment G.</t>
          </li>
        </ul>
      </section>
      <section anchor="hash-function-h">
        <name>Hash function H</name>
        <t>Common choices for H are SHA-512 <xref target="RFC6234"/> or SHAKE-256 <xref target="FIPS202"/>. (I.e., the hash function
outputs octet strings, and not group elements.)
For considering both variable-output-length hashes and fixed-output-length hashes, we use the following convention.</t>
        <t>We use the following notation for referring to the specific properties of a hash function H:</t>
        <ul spacing="normal">
          <li>
            <t>H.hash(m,l) is a function that operates on an input octet string m and returns the first l octets of the hash of m.</t>
          </li>
          <li>
            <t>H.b_in_bytes denotes the <em>minimum</em> output size in bytes for collision resistance for the
security level target of the hash function. E.g. H.b_in_bytes = 64 for SHA-512 and SHAKE-256 and H.b_in_bytes = 32 for
SHA-256 and SHAKE-128. We use the notation H.hash(m) = H.hash(m, H.b_in_bytes) and let the hash operation
output the default length if no explicit length parameter is given.</t>
          </li>
          <li>
            <t>H.bmax_in_bytes denotes the <em>maximum</em> output size in octets supported by the hash function. In case of fixed-size
hashes such as SHA-256, this is the same as H.b_in_bytes, while there is no such limit for hash functions such as SHAKE-256.</t>
          </li>
          <li>
            <t>H.s_in_bytes denotes the <em>input block size</em> used by H. This number denotes the maximum number of bytes that can be processed
in a single block before applying the compression function or permutation becomes necessary. (See also <xref target="RFC2104"/> for the corresponding block size concepts).
For instance, for SHA-512 the input block size s_in_bytes is 128 as the compression function can process up to 128 bytes,
while for SHAKE-256 the input block size amounts to 136 bytes before the permutation of the sponge state needs to be applied.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-section">
        <name>Notation for string operations</name>
        <ul spacing="normal">
          <li>
            <t>bytes1 || bytes2 denotes concatenation of octet strings.</t>
          </li>
          <li>
            <t>len(S) denotes the number of octets in an octet string S.</t>
          </li>
          <li>
            <t>This document uses quotation marks "" both for general language (e.g. for citation of notation used in other documents) and
as syntax for specifying octet strings as in b"CPace25519".  </t>
            <t>
We use a preceding lowercase letter b"" in front of the quotation marks if a character sequence is representing an octet string sequence.
I.e., we use the notation convention for byte string representations with single-byte ASCII character encodings from the python programming language.
b"" denotes the empty string of length 0.</t>
          </li>
          <li>
            <t>LEB128 denotes an algorithm that converts an integer to a variable sized string. The algorithm encodes 7 bits per byte starting with the least significant bits in bits #0 to #6.
As long as significant bits remain, bit #7 will be set. This will result in a single-byte encoding for values below 128.
Test vectors and reference code for LEB128 encoding are available in the appendix.</t>
          </li>
          <li>
            <t>prepend_len(octet_string) denotes the octet sequence that is obtained from prepending
the length of the octet string to the string itself. The length is encoded using LEB128.
Test vectors and code for prepend_len are available in the appendix.</t>
          </li>
          <li>
            <t>lv_cat(a0,a1, ...) is the "length-value" encoding function which returns the concatenation of the input strings with an encoding of
their respective length prepended. E.g., lv_cat(a0,a1) returns
prepend_len(a0) || prepend_len(a1). The detailed specification of lv_cat and reference code is available in the appendix.</t>
          </li>
          <li>
            <t>sample_random_bytes(n) denotes a function that returns n octets, each of which is to be independently sampled from a uniform distribution between 0 and 255.</t>
          </li>
          <li>
            <t>zero_bytes(n) denotes a function that returns n octets with value 0.</t>
          </li>
          <li>
            <t>o_cat(bytes1,bytes2) denotes a function for ordered concatenation of octet strings. It places the lexicographically larger octet
string first and prepends the two bytes from the octet string b"oc" to the result. Reference code for this function is available in the appendix.</t>
          </li>
          <li>
            <t>transcript(Ya,ADa, Yb,ADb) denotes a function outputting an octet string for the protocol transcript.
In applications where CPace is used without clear initiator and responder roles, i.e. where the ordering of messages is
not enforced by the protocol flow, transcript_oc(Ya,ADa, Yb,ADb) = o_cat(lv_cat(Ya,ADa),lv_cat(Yb, ADb)) SHALL be used.
In the initiator-responder setting, the implementation transcript_ir(Ya,ADa, Yb,ADb) = lv_cat(Ya,ADa) || lv_cat(Yb, ADb) SHALL be used.</t>
          </li>
        </ul>
      </section>
      <section anchor="notation-for-group-operations">
        <name>Notation for group operations</name>
        <t>We use additive notation for the group, i.e., 2*X  denotes the element that is obtained by computing X+X, for group element X and group operation +.</t>
      </section>
    </section>
    <section anchor="protocol-section">
      <name>The CPace protocol</name>
      <t>CPace is a one round protocol between two parties, A and B. At invocation, A and B are provisioned with PRS,G and H.
Parties will also be provisioned with CI,sid,ADa (for A) and CI,sid,ADb (for B) which will default to the empty
string b"" if not used.</t>
      <t>Party identifiers SHALL be integrated into CI and/or ADa and ADb following the guidelines in <xref target="sec-considerations-ids"/>.</t>
      <t>A sends the public share Ya and associated data ADa to B.
Likewise, B sends the public share Yb and associated data ADb to A.
Both A and B use the received messages for deriving a shared intermediate session key, ISK.</t>
      <section anchor="protocol-flow">
        <name>Protocol flow</name>
        <artwork><![CDATA[
                        public: G, H

  A: PRS,ADa,CI,sid         B: PRS,ADb,CI,sid
    ---------------------------------------
 compute Ya    |      Ya,ADa      |  compute Yb
               |----------------->|
               |      Yb,ADb      |
 verify inputs |<-----------------|  verify inputs
 derive ISK    |                  |  derive ISK
    ---------------------------------------
 output ISK                          output ISK

]]></artwork>
      </section>
      <section anchor="cpace-protocol-instructions">
        <name>CPace protocol instructions</name>
        <t>A computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar ya = G.sample_scalar() and group element Ya = G.scalar_mult (ya,g). A then transmits Ya and associated data ADa to B.</t>
        <t>B computes a generator g = G.calculate_generator(H,PRS,CI,sid), scalar yb = G.sample_scalar() and group element Yb = G.scalar_mult(yb,g). B sends Yb and associated data ADb to A.</t>
        <t>B then computes K = G.scalar_mult_vfy(yb,Ya). B MUST abort if K=G.I.
Otherwise B calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K)||transcript(Ya,ADa,Yb,ADb)). B returns ISK and terminates.</t>
        <t>Likewise upon reception of the message from B,  A computes K = G.scalar_mult_vfy(ya,Yb). A MUST abort if K=G.I.</t>
        <t>Otherwise A calculates
ISK = H.hash(lv_cat(G.DSI || b"_ISK", sid, K) || transcript(Ya,ADa,Yb,ADb)). A returns ISK and terminates.</t>
        <t>The session key ISK returned by A and B is identical if and only if the supplied input parameters PRS, CI and sid match on both sides and the transcript views of both parties match.</t>
      </section>
    </section>
    <section anchor="implementation-of-recommended-cpace-cipher-suites">
      <name>Implementation of recommended CPace cipher suites</name>
      <section anchor="common-function-for-computing-generators">
        <name>Common function for computing generators</name>
        <t>The different cipher suites for CPace defined in the upcoming sections share the following method for deterministically combining the individual strings PRS, CI, sid and the domain-separation identifier DSI to a generator string:</t>
        <ul spacing="normal">
          <li>
            <t>generator_string(DSI, PRS, CI, sid, s_in_bytes) denotes a function that returns the string
lv_cat(DSI, PRS, zero_bytes(len_zpad), CI, sid).</t>
          </li>
          <li>
            <t>len_zpad = MAX(0, s_in_bytes - len(prepend_len(PRS)) - len(prepend_len(G.DSI)) - 1)</t>
          </li>
        </ul>
        <t>The zero padding of length len_zpad is designed such that the encoding of DSI and PRS together with the zero padding field completely
fills at least the first input block (of length s_in_bytes) of the hash.
As a result for the common case of short PRS the number of bytes to hash becomes independent of the actual length of the password (PRS). (Code and test vectors are provided in the appendix.)</t>
        <t>The introduction of a zero-padding within the generator string also helps mitigating attacks of a side-channel adversary that
analyzes correlations between publicly known variable information with a short low-entropy PRS string.
Note that the hash of the first block is intentionally made independent of session-specific inputs, such as sid or CI and that there is no limitation
regarding the maximum length of the PRS string.</t>
      </section>
      <section anchor="CPaceMontgomery">
        <name>CPace group objects G_X25519 and G_X448 for single-coordinate Ladders on Montgomery curves</name>
        <t>In this section we consider the case of CPace when using the X25519 and X448 Diffie-Hellman functions
from <xref target="RFC7748"/> operating on the Montgomery curves Curve25519 and Curve448 <xref target="RFC7748"/>.
CPace implementations using single-coordinate ladders on further Montgomery curves SHALL use the definitions in line
with the specifications for X25519 and X448 and review the guidance given in <xref target="sec-considerations"/>.</t>
        <t>For the group environment G_X25519 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X25519.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_X25519.field_size_bits = 255</t>
          </li>
          <li>
            <t>G_X25519.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X25519(y,g)</t>
          </li>
          <li>
            <t>G_X25519.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X25519.DSI = b"CPace255"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X25519 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 32 bytes of output. It is RECOMMENDED
to use G_X25519 in combination with SHA-512.</t>
        <t>For X448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_X448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_X448.field_size_bits = 448</t>
          </li>
          <li>
            <t>G_X448.sample_scalar() = sample_random_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.scalar_mult(y,g) = G.scalar_mult_vfy(y,g) = X448(y,g)</t>
          </li>
          <li>
            <t>G_X448.I = zero_bytes(G.field_size_bytes)</t>
          </li>
          <li>
            <t>G_X448.DSI = b"CPace448"</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_X448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 56 bytes of output. It is RECOMMENDED
to use G_X448 in combination with SHAKE-256.</t>
        <t>For both G_X448 and G_X25519 the G.calculate_generator(H, PRS,sid,CI) function shall be implemented as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) SHALL BE calculated using the input block size of the
chosen hash function.</t>
          </li>
          <li>
            <t>This string SHALL then BE hashed to the required length
gen_str_hash = H.hash(gen_str, G.field_size_bytes).
Note that this implies that the permissible output length H.maxb_in_bytes MUST BE larger or equal to the
field size of the group G for making a hashing function suitable.</t>
          </li>
          <li>
            <t>This result is then considered as a field coordinate using
the u = decodeUCoordinate(gen_str_hash, G.field_size_bits) function from <xref target="RFC7748"/> which we
repeat in the appendix for convenience.</t>
          </li>
          <li>
            <t>The result point g is then calculated as (g,v) = map_to_curve_elligator2(u) using the function
from <xref target="RFC9380"/>. Note that the v coordinate produced by the map_to_curve_elligator2 function
is not required for CPace and discarded. The appendix repeats the definitions from <xref target="RFC9380"/> for convenience.</t>
          </li>
        </ul>
        <t>Code for the functions above is available in the appendix.</t>
        <section anchor="verification-tests">
          <name>Verification tests</name>
          <t>For single-coordinate Montgomery ladders on Montgomery curves, verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving u coordinate values that encode a low-order
point on either the curve or the quadratic twist.</t>
          <t>In addition to that, in case of G_X25519, the tests SHALL also verify that the implementation of G.scalar_mult_vfy(y,g) produces the
expected results for non-canonical u coordinate values with bit #255 set, which may also encode low-order points.</t>
          <t>Corresponding test vectors are provided in the appendix.</t>
        </section>
      </section>
      <section anchor="CPaceCoffee">
        <name>CPace group objects G_Ristretto255 and G_Decaf448 for prime-order group abstractions</name>
        <t>In this section we consider the case of CPace using the Ristretto255 and Decaf448 group abstractions <xref target="RFC9496"/>.
These abstractions define an encode and decode function, group operations using an internal encoding
and an element-derivation function that maps a byte string to a group element.
With the group abstractions there is a distinction between an internal representation
of group elements and an external encoding of the same group element. In order to distinguish between these
different representations, we prepend an underscore before values using the internal representation within this
section.</t>
        <t>For Ristretto255 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_Ristretto255.DSI = b"CPaceRistretto255"</t>
          </li>
          <li>
            <t>G_Ristretto255.field_size_bytes = 32</t>
          </li>
          <li>
            <t>G_Ristretto255.group_size_bits = 252</t>
          </li>
          <li>
            <t>G_Ristretto255.group_order = 2^252 + 27742317777372353535851937790883648493</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_Ristretto255 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 64 bytes of output.
It is RECOMMENDED to use G_Ristretto255 in combination with SHA-512.</t>
        <t>For decaf448 the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>G_Decaf448.DSI = b"CPaceDecaf448"</t>
          </li>
          <li>
            <t>G_Decaf448.field_size_bytes = 56</t>
          </li>
          <li>
            <t>G_Decaf448.group_size_bits = 445</t>
          </li>
          <li>
            <t>G_Decaf448.group_order = l = 2^446 -
  1381806680989511535200738674851542
  6880336692474882178609894547503885</t>
          </li>
        </ul>
        <t>CPace cipher suites using G_Decaf448 MUST use a hash function producing at least H.b_max_in_bytes &gt;= 112 bytes of output.
It is RECOMMENDED to use G_Decaf448 in combination with SHAKE-256.</t>
        <t>For both abstractions the following definitions apply:</t>
        <ul spacing="normal">
          <li>
            <t>It is RECOMMENDED to implement G.sample_scalar() as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>Set scalar = sample_random_bytes(G.group_size_bytes).</t>
              </li>
              <li>
                <t>Then clear the most significant bits larger than G.group_size_bits.</t>
              </li>
              <li>
                <t>Interpret the result as the little-endian encoding of an integer value and return the result.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Alternatively, if G.sample_scalar() is not implemented according to the above recommendation, it SHALL be implemented using uniform sampling between 1 and (G.group_order - 1). Note that the more complex
uniform sampling process can provide a larger side-channel attack surface for embedded systems in hostile environments.</t>
          </li>
          <li>
            <t>G.scalar_mult(y,_g) SHALL operate on a scalar y and a group element _g in the internal representation of the group abstraction environment. It returns the value Y = encode(y * (_g)), i.e. it returns a value using the public encoding.</t>
          </li>
          <li>
            <t>G.I = is the public encoding representation of the identity element.</t>
          </li>
          <li>
            <t>G.scalar_mult_vfy(y,X) operates on a value using the public encoding and a scalar and is implemented as follows. If the decode(X) function fails, it returns G.I. Otherwise it returns encode( y * decode(X) ).</t>
          </li>
          <li>
            <t>The G.calculate_generator(H, PRS,sid,CI) function SHALL return a decoded point and SHALL BE implemented as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated using the input block size of the chosen hash function.</t>
              </li>
              <li>
                <t>This string is then hashed to the required length gen_str_hash = H.hash(gen_str, 2 * G.field_size_bytes).  Note that this
implies that the permissible output length H.maxb_in_bytes MUST BE larger or equal to twice the field size of the group
G for making a
hash function suitable.</t>
              </li>
              <li>
                <t>Finally the internal representation of the generator _g is calculated as _g = element_derivation(gen_str_hash)
using the element derivation function from the abstraction.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Note that with these definitions the scalar_mult function operates on a decoded point _g and returns an encoded point,
while the scalar_mult_vfy(y,X) function operates on an encoded point X (and also returns an encoded point).</t>
        <section anchor="verification-tests-1">
          <name>Verification tests</name>
          <t>For group abstractions verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving
encodings of the neutral element or receives an octet string
that does not decode to a valid group element.</t>
        </section>
      </section>
      <section anchor="CPaceWeierstrass">
        <name>CPace group objects for curves in Short-Weierstrass representation</name>
        <t>The group environment objects G defined in this section for use with Short-Weierstrass curves,
are parametrized by the choice of an elliptic curve and by choice of a suitable encode_to_curve function.
encode_to_curve must map an octet string to a point on the curve.</t>
        <section anchor="curves-and-associated-functions">
          <name>Curves and associated functions</name>
          <t>Elliptic curves in Short-Weierstrass form are considered in <xref target="IEEE1363"/>.
<xref target="IEEE1363"/> allows for both, curves of prime and non-prime order. However, for the procedures described in this section any suitable
group MUST BE of prime order.</t>
          <t>The specification for the group environment objects specified in this section closely follow the ECKAS-DH1 method from <xref target="IEEE1363"/>.
I.e. we use the same methods and encodings and protocol sub steps as employed in the TLS
 <xref target="RFC5246"/> <xref target="RFC8446"/> protocol family.</t>
          <t>For CPace only the uncompressed full-coordinate encodings from <xref target="SEC1"/> (x and y coordinate) SHOULD be used.
Commonly used curve groups are specified in <xref target="SEC2"/> and <xref target="RFC5639"/>. A typical representative of such a Short-Weierstrass curve is NIST-P256.
Point verification as used in ECKAS-DH1 is described in Annex A.16.10. of <xref target="IEEE1363"/>.</t>
          <t>For deriving Diffie-Hellman shared secrets ECKAS-DH1 from <xref target="IEEE1363"/> specifies the use of an ECSVDP-DH method. We use ECSVDP-DH in combination with the identity map such that it either returns "error" or the x-coordinate of the Diffie-Hellman result point as shared secret in big endian format (fixed length output by FE2OSP without truncating leading zeros).</t>
        </section>
        <section anchor="suitable-encodetocurve-methods">
          <name>Suitable encode_to_curve methods</name>
          <t>All the encode_to_curve methods specified in <xref target="RFC9380"/>
are suitable for CPace. For Short-Weierstrass curves it is RECOMMENDED to use the non-uniform variant of the SSWU
mapping primitive from <xref target="RFC9380"/> if a SSWU mapping is available for the chosen curve. (We recommend non-uniform maps in order to give implementations
the flexibility to opt for x-coordinate-only scalar multiplication algorithms.)</t>
        </section>
        <section anchor="definition-of-the-group-environment-g-for-short-weierstrass-curves">
          <name>Definition of the group environment G for Short-Weierstrass curves</name>
          <t>In this paragraph we use the following notation for defining the group object G for a selected curve and encode_to_curve method:</t>
          <ul spacing="normal">
            <li>
              <t>With G.group_order we denote the order of the elliptic curve which MUST BE a prime.</t>
            </li>
            <li>
              <t>With is_valid(X) we denote a method which operates on an octet stream according to <xref target="SEC1"/> of a point on the group and returns true if the point is valid and returns false otherwise. This is_valid(X) method SHALL be implemented according to Annex A.16.10. of <xref target="IEEE1363"/>. I.e. it shall return false if X encodes either the neutral element on the group or does not form a valid encoding of a point on the group.</t>
            </li>
            <li>
              <t>With encode_to_curve(str,DST) we denote a mapping function from <xref target="RFC9380"/>. I.e. a function that maps
octet string str to a point on the group using the domain separation tag DST. <xref target="RFC9380"/> considers both, uniform and non-uniform mappings based on several different strategies. It is RECOMMENDED to use the nonuniform variant of the SSWU mapping primitive within <xref target="RFC9380"/>.</t>
            </li>
            <li>
              <t>G.DSI denotes a domain-separation identifier octet string. G.DSI which SHALL BE obtained by the concatenation of b"CPace" and the associated name of the cipher suite used for the encode_to_curve function as specified in <xref target="RFC9380"/>. E.g. when using the map with the name P384_XMD:SHA-384_SSWU_NU_
on curve NIST-P384 the resulting value SHALL BE G.DSI = b"CPaceP384_XMD:SHA-384_SSWU_NU_".</t>
            </li>
          </ul>
          <t>Using the above definitions, the CPace functions required for the group object G are defined as follows.</t>
          <ul spacing="normal">
            <li>
              <t>G.DST denotes the domain-separation tag value to use in conjunction with the encode_to_curve function from <xref target="RFC9380"/>. G.DST shall be obtained by concatenating G.DSI and b"_DST".</t>
            </li>
            <li>
              <t>G.sample_scalar() SHALL return a value between 1 and (G.group_order - 1). The sampling SHALL BE indistinguishable from uniform random
selection between 1 and (G.group_order - 1).
It is RECOMMENDED to use a constant-time rejection sampling algorithm for converting a uniform bitstring to a uniform value between 1 and (G.group_order - 1).</t>
            </li>
            <li>
              <t>G.calculate_generator(H, PRS,sid,CI) function SHALL be implemented as follows.  </t>
              <ul spacing="normal">
                <li>
                  <t>First gen_str = generator_string(G.DSI,PRS,CI,sid, H.s_in_bytes) is calculated.</t>
                </li>
                <li>
                  <t>Then the output of a call to encode_to_curve(gen_str, G.DST) is returned, using the selected suite from <xref target="RFC9380"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>G.scalar_mult(s,X) is a function that operates on a scalar s and an input point X. The input X shall use the same encoding as produced by the G.calculate_generator method above.
G.scalar_mult(s,X) SHALL return an encoding of either the point s*X or the point (-s)*X according to <xref target="SEC1"/>. Implementations SHOULD use the full-coordinate format without compression, as important protocols such as TLS 1.3 removed support for compression. Implementations of scalar_mult(s,X) MAY output either s*X or (-s)*X as both points s*X and (-s)*X have the same x-coordinate and
result in the same Diffie-Hellman shared secrets K.
(This allows implementations to opt for x-coordinate-only scalar multiplication algorithms.)</t>
            </li>
            <li>
              <t>G.scalar_mult_vfy(s,X) merges verification of point X according to <xref target="IEEE1363"/> A.16.10. and the the ECSVDP-DH procedure from <xref target="IEEE1363"/>.
It SHALL BE implemented as follows:  </t>
              <ul spacing="normal">
                <li>
                  <t>If is_valid(X) = False then G.scalar_mult_vfy(s,X) SHALL return "error" as specified in <xref target="IEEE1363"/> A.16.10 and 7.2.1.</t>
                </li>
                <li>
                  <t>Otherwise G.scalar_mult_vfy(s,X) SHALL return the result of the ECSVDP-DH procedure from <xref target="IEEE1363"/> (section 7.2.1). I.e. it shall
either return "error" (in case that s*X is the neutral element) or the secret shared value "z" defined in <xref target="IEEE1363"/> (otherwise).
"z" SHALL be encoded by using
the big-endian encoding of the x-coordinate of the result point s*X according to <xref target="SEC1"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>We represent the neutral element G.I by using the representation of the "error" result case from <xref target="IEEE1363"/> as used in the G.scalar_mult_vfy method above.</t>
            </li>
          </ul>
        </section>
        <section anchor="verification-tests-2">
          <name>Verification tests</name>
          <t>For Short-Weierstrass curves verification tests according to <xref target="verification"/> SHALL
check for proper handling of the abort conditions, when a party is receiving an
encoding of the point at infinity and an encoding of a point not on the group.</t>
        </section>
      </section>
    </section>
    <section anchor="verification">
      <name>Implementation verification</name>
      <t>Any CPace implementation MUST be tested against invalid or weak point attacks.
Implementation MUST be verified to abort upon conditions where G.scalar_mult_vfy functions outputs G.I.
For testing an implementation it is RECOMMENDED to include weak or invalid point encodings within the messages of party A and B and introduce this
in a protocol run. It SHALL be verified that the abort condition is properly handled.</t>
      <t>Corresponding test vectors are given in the appendix for all recommended cipher suites.</t>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>A security proof of CPace is found in <xref target="AHH21"/>. This proof covers all recommended cipher suites included in this document.
The security analysis in <xref target="BGHJ24"/> extends the analysis from <xref target="AHH21"/> by covering the case that
no pre-agreed session identifier is available. <xref target="BGHJ24"/> also shows how a unique session id sid_output can be generated along with the protocol
for applications that do not have a session identifier input available.</t>
      <section anchor="sec-considerations-ids">
        <name>Party identifiers</name>
        <t>The protocol assures that both communication partners have had the same view on the communication transcripts and the inputs CI and sid.</t>
        <t>If CPace is instantiated without identity strings for A or B in its inputs it will anonymously create a key with any party using the
same PRS and sid values and cannot give any further guarantee regarding the identity of the communication partner.
A protocol instance running on a party P might even be communicating with a second protocol instance also running on P.</t>
        <section anchor="guidance-regarding-party-identifier-integration">
          <name>Guidance regarding party identifier integration</name>
          <t>If an application layer's security relies on CPace for checking party identities, it SHALL integrate the party identifiers that are
to be checked in the CPace protocol run within CI or ADa/ADb as specified below.</t>
          <ul spacing="normal">
            <li>
              <t>If CPace is used in initiator-responder mode, identity strings that are to be authenticated and that are available for
both communication partners at protocol start SHOULD be integrated as part of CI.  </t>
              <t>
If both party identifiers are integrated into CI, the encoding MUST associate the initiator and responder roles with the respective identity strings. It is recommended to place the initiator`s identity first
and the responder`s identity second.  </t>
              <t>
Party identity information included in CI will be kept confidential.</t>
            </li>
            <li>
              <t>Party identities that are not included in CI identity and are to be authenticated by CPace SHALL be integrated in ADa/ADb, such that
A integrates its party identifier in ADa and B integrates its party identifier in ADb. In this case, the application layer SHALL make the recipient
check the party identifier string of the remote communication partner.  </t>
              <t>
Note that identities communicated in ADa or ADb will not be kept confidential.</t>
            </li>
          </ul>
          <t>If ADa and ADb are not guaranteed to be unique, then CPace SHALL be used in initator-responder mode.</t>
          <t>If CPace is to be run in the symmetric mode without initiator and responder roles, the application can always enforce uniqueness of ADa and ADb for all sessions by adding further information such as random data.</t>
        </section>
        <section anchor="rationale-for-the-above-guidance">
          <name>Rationale for the above guidance</name>
          <t>Incorporating party identifier strings is important for fending off attacks based on relaying messages.
Such attacks become for example relevant in a setting where several parties, say, A, B and C, share the same password PRS.
An adversary might relay messages from an honest user A, who aims at interacting with user B, to a party C instead.
If no party identifier strings are used and B and C share the same PRS value, then A might be using CPace for
establishing a common ISK key with C while assuming to interact with party B.
If a party A is allowing for multiple concurrent sessions, the adversary may also mount an attack relaying messages of A looped back to A such that A actually shares a key with itself <xref target="HS14"/>.</t>
          <t>Integration of party identity strings in CI is to be preferred. This way, the identities may be kept confidential.
If both identities are to be integrated in CI, this is only possible if clear initiator and responder roles are assigned and the encoding of the identities associates the role with the identity string.</t>
          <t>Integration of identity strings in CI also avoids the need of the security-critical subsequent check for the identity strings,
which might be omitted or implemented incorrectly without notice. Integration of identities into CI also strengthens the security properties with respect
to attacks based on quantum computers <xref target="sec-quantum-annoying"/>.</t>
          <t>Applications that integrate identity strings in ADa and/or ADb shall carefully verify implementations for correctness
of the implemented identity checks that the application must carry out after the CPace run.</t>
          <t>When adding randomness guaranteeing for unique values of ADa and ADb then a party running the application can detect for loopback attacks by checking
that the received remote value of ADa/ADb doesn't show up in the list of active local concurrent protocol sessions <xref target="HMSD18"/>.</t>
          <t>If no unique value in ADa and ADb is available or if maintaining state information regarding the list of concurrently active local protocol instances for
verification is impractical in a given application setting, then the loopback attack may be
prevented by assigning initiator and responder role and mandating that a given party implements either the initiator or responder role
for a given PRS password but not both roles with the same (PRS,sid) value set.</t>
          <t>Note that the requirement on party identifiers may differ from what might be intuitively expected as information on the application service
such as service identifiers, port-ids and role information (e.g. client or server role) should be included as part of the party identity.</t>
          <t>For instance, if computers A and B allow for running a protocol with different roles (e.g. both might run several client and a server instances concurrently
on different ports) then a relay attack may successfully generate protocol confusion. E.g. a client instance on A may be maliciously redirected
to a second client instance on B while it expects to be connecting to a server on B. This will work if client and server instances on B share the same
PRS secret and the identity strings do not include information on the respective roles.</t>
        </section>
      </section>
      <section anchor="hashing-protocol-transcripts">
        <name>Hashing protocol transcripts</name>
        <t>CPace prepends the length of all variable-size input strings before hashing data.
Prepending the length of
all variable-size input strings results in a so-called prefix-free encoding of transcript strings, using terminology introduced in <xref target="CDMP05"/>. This property allows for disregarding length-extension imperfections that come with the commonly used Merkle-Damgard hash function constructions such as SHA256 and SHA512 <xref target="CDMP05"/>.</t>
      </section>
      <section anchor="key-derivation">
        <name>Key derivation</name>
        <t>A CPace implementation SHALL output ISK but MUST NOT expose K, because a leaked K
may enable offline dictionary attack
on the password, and a matching value for K does not provide authentication of ADa and ADb.</t>
        <t>As noted already in <xref target="protocol-section"/> it is RECOMMENDED to process ISK
by use of a suitable strong key derivation function KDF (such as defined in <xref target="RFC5869"/>) first,
before using the key in a higher-level protocol.</t>
      </section>
      <section anchor="sec-key-confirmation">
        <name>Key confirmation</name>
        <t>In many applications it is advisable to add an explicit key confirmation round after the CPace protocol flow. However, as some applications
might only require implicit authentication and as explicit authentication messages are already a built-in feature in many higher-level protocols (e.g. TLS 1.3), the CPace protocol described here does not mandate
key confirmation.</t>
        <t>Already without explicit key confirmation, CPace enjoys weak forward security under the sCDH and sSDH assumptions <xref target="AHH21"/>.
With added explicit confirmation, CPace enjoys perfect forward security also under the strong sCDH and sSDH assumptions <xref target="AHH21"/>.</t>
        <t>Note that in <xref target="ABKLX21"/> it was shown that an idealized variant of CPace
also enjoys perfect forward security without explicit key confirmation. However this proof does not explicitly cover
the recommended cipher suites
in this document and requires the stronger assumption of an algebraic adversary model. For this reason, we recommend adding
explicit key confirmation if perfect forward security is required.</t>
        <t>When implementing explicit key confirmation, it is recommended to use an appropriate message-authentication code (MAC)
such as HMAC <xref target="RFC2104"/> or
CMAC <xref target="RFC4493"/> using a key mac_key derived from ISK.</t>
        <t>One suitable option that works also in the parallel setting without message ordering is to proceed as follows.</t>
        <ul spacing="normal">
          <li>
            <t>First calculate mac_key as mac_key = H.hash(b"CPaceMac" || sid || ISK).</t>
          </li>
          <li>
            <t>Then let each party send an authenticator tag calculated over the protocol message that it has sent previously. I.e.
let party A calculate its authentication tag Ta as Ta = MAC(mac_key, lv_cat(Ya,ADa)) and let party B calculate its
authentication tag Tb as Tb = MAC(mac_key, lv_cat(Yb,ADb)).</t>
          </li>
          <li>
            <t>Let the receiving party check the remote authentication tag for the correct value and abort in case that it's incorrect.</t>
          </li>
        </ul>
      </section>
      <section anchor="integrating-cpace-in-higher-level-protocols-such-as-tls13">
        <name>Integrating CPace in higher-level protocols such as TLS1.3</name>
        <t>When integrating CPace into a higher-level protocol such as TLS1.3 <xref target="RFC8446"/> it is recommended to use ISK
as shared secret (which might otherwise be generated as part of a Diffie-Hellman key exchange output for other cipher suites).</t>
        <t>Note that unlike the shared secret of a Diffie-Hellman protocol run, ISK will also provide mutual implicit authentication of the protocol partners.
For providing explicit authentication, it is recommended to add a key confirmation round along the lines in <xref target="sec-key-confirmation"/>,
such as e.g. done in the "Finished" messages in TLS1.3 <xref target="RFC8446"/>.</t>
        <t>If an embedding protocol uses more than two messages (e.g. four message TLS1.3 <xref target="RFC8446"/> flows involving
a hello-retry message and a repeated client-hello message) it is suggested
that the CPace layer only considers the two messages used for the CPace run. I.e., it is suggested that
authenticating the full message sequence involving also the additional messages that might precede the two CPace messages
is done under the responsibility of the embedding application protocol.
This could be done by integrating the full protocol transcript as part of a final explicit key confirmation round (as commonly done by TLS 1.3 as part of the "Finished" messages).
Alternatively, information on communication rounds preceding the CPace flows can also be integrated as part of the CI field, as this will authenticate
the information and will not require both communication partners to keep state information regarding preceding messages in memory until after the CPace run.</t>
        <t>In case of TLS 1.3 <xref target="RFC8446"/> it is suggested to integrate Ya into the client-hello message and Yb into the server-hello message. Also party identifiers
might best be added to the client-hello and server-hello messages as part of extension fields.
It is recommended to use the full octet stream encoding of the
client-hello message as parameter ADa. Likewise it is recommended to use the encoding of the server-hello message for the parameter ADb.
This approach has the drawback that the public points Ya and Yb might show up redundantly duplicated in the hashing operation for
CPace's transcript strings but has the advantage of simplicity and the advantage that all meta-information in the extension fields within the
client- and server hello fields will always become authenticated as part of the ISK.</t>
      </section>
      <section anchor="sec-sid-output">
        <name>Calculating a session identifier alongside with the CPace run</name>
        <t>If CPace was run with an empty string sid available as input, both parties can produce a public session identifier string
sid_output = H.hash(b"CPaceSidOutput" || transcript(Ya,ADa,Yb,ADb)) which will be unique for honest parties <xref target="BGHJ24"/>.</t>
      </section>
      <section anchor="sampling-of-scalars">
        <name>Sampling of scalars</name>
        <t>For curves over fields F_q where q is a prime close to a power of two, we recommend sampling scalars as a uniform bit string of length field_size_bits. We do so in order to reduce both, complexity of the implementation and the attack surface
with respect to side-channels for embedded systems in hostile environments.
<xref target="AHH21"/> demonstrated that non-uniform sampling did not negatively impact security for the case of Curve25519 and Curve448.
This analysis however does not transfer to most curves in Short-Weierstrass form.</t>
        <t>As a result, we recommend rejection sampling if G is as in <xref target="CPaceWeierstrass"/>. Alternatively an algorithm designed along the lines of the hash_to_field() function from <xref target="RFC9380"/> can also be
used. There, oversampling to an integer significantly larger than the curve order is followed by a modular reduction to the group order.</t>
      </section>
      <section anchor="preconditions-for-using-the-simplified-cpace-specification-from-cpacemontgomery">
        <name>Preconditions for using the simplified CPace specification from <xref target="CPaceMontgomery"/></name>
        <t>The security of the algorithms used for the recommended cipher suites for the Montgomery curves Curve25519 and Curve448 in <xref target="CPaceMontgomery"/> rely on the following properties <xref target="AHH21"/>:</t>
        <ul spacing="normal">
          <li>
            <t>The curve has order (p * c) with p prime and c a small cofactor. Also the curve's quadratic twist must be of order (p' * c') with p' prime and c' a cofactor.</t>
          </li>
          <li>
            <t>The cofactor c of the curve MUST BE equal to or an integer multiple of the cofactor c' of the curve's quadratic twist. Also, importantly, the
implementation of the scalar_mult and scalar_mult_vfy
functions must ensure that all scalars actually used for the group operation are integer multiples of
c (e.g. such as asserted by the specification of the decodeScalar functions in <xref target="RFC7748"/>).</t>
          </li>
          <li>
            <t>Both field order q and group order p MUST BE close to a power of two along the lines of <xref target="AHH21"/>, Appendix E. Otherwise the simplified scalar sampling specified in <xref target="CPaceMontgomery"/>
needs to be changed.</t>
          </li>
          <li>
            <t>The representation of the neutral element G.I MUST BE the same for both, the curve and its twist.</t>
          </li>
          <li>
            <t>The implementation of G.scalar_mult_vfy(y,X) MUST map all c low-order points on the curve and all c' low-order points on the twist to G.I.</t>
          </li>
        </ul>
        <t>Algorithms for curves other than the ones recommended here can be based on the principles from <xref target="CPaceMontgomery"/> given that the above properties hold.</t>
      </section>
      <section anchor="nonce-values">
        <name>Nonce values</name>
        <t>Secret scalars ya and yb MUST NOT be reused. Values for sid SHOULD NOT be reused since the composability
guarantees established by the simulation-based proof rely on the uniqueness of session ids <xref target="AHH21"/>.</t>
        <t>If the higher-level protocol that integrates CPace is able to establish a unique sid identifier for the communication session,
it is RECOMMENDED that this is passed to CPace as sid parameter.
One suitable option for generating sid is concatenation of ephemeral random strings contributed by both parties.</t>
      </section>
      <section anchor="side-channel-attacks">
        <name>Side channel attacks</name>
        <t>All state-of-the art methods for realizing constant-time execution SHOULD be used.
Special care is RECOMMENDED specifically for elliptic curves in Short-Weierstrass form
as important standard documents including <xref target="IEEE1363"/> describe curve operations with
non-constant-time algorithms.</t>
        <t>In case that side channel attacks are to be considered practical for a given application, it is RECOMMENDED to pay special
attention on computing the secret generator G.calculate_generator(PRS,CI,sid).
The most critical substep to consider might be the processing of the first block of the hash that includes
the PRS string.
The zero-padding introduced when hashing the sensitive PRS string can be expected to make
the task for a side-channel attack somewhat more complex. Still this feature alone is not sufficient for ruling out power analysis attacks.
The mapping algorithm that
converts the generator string to a elliptic curve point SHALL execute in constant time. In <xref target="RFC9380"/> suitable constant-time methods
are available for any elliptic curve.</t>
        <t>Even though the calculate_generator operation might be considered to form the primary target for side-channel attacks as information on long-term secrets might be exposed,
also the subsequent operations on ephemeral values, such as scalar
sampling and scalar multiplication should be protected from side-channels.</t>
      </section>
      <section anchor="large-characteristic-finite-fields">
        <name>Large-characteristic finite fields</name>
        <t>This document intentionally specifies CPace only for use on elliptic curve groups and the security proofs in <xref target="AHH21"/> only cover this case explicitly.
For group environments built upon safe primes additional security analysis will be required. For instance exponential equivalence attacks
may become practical when short exponents are used.</t>
      </section>
      <section anchor="sec-quantum-annoying">
        <name>Quantum computers</name>
        <t>CPace is proven secure under the hardness of the strong computational Simultaneous Diffie-Hellmann (sSDH) and strong computational Diffie-Hellmann (sCDH)
assumptions in the group G (as defined in <xref target="AHH21"/>).
These assumptions are not expected to hold any longer when large-scale quantum computers (LSQC) are available.
Still, even in case that LSQC emerge, it is reasonable to assume that discrete-logarithm computations will remain costly. CPace with ephemeral pre-established session id values
sid forces the adversary to solve one computational Diffie-Hellman problem per password guess <xref target="ES21"/>.
If party identifiers are included as part of CI then the adversary is forced to solve one computational Diffie-Hellman problem per password
guess and party identifier pair.
For this reason it is RECOMMENDED to use the optional inputs sid if available in an application setting.
For the same reason it is RECOMMENDED to integrate party identity strings A,B into CI.</t>
        <t>In this sense, using the wording suggested by Steve Thomas on the CFRG mailing list, CPace is "quantum-annoying".</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>No IANA action is required.</t>
    </section>
    <section anchor="reference-implementation-and-test-vector-generation">
      <name>Reference implementation and test vector generation</name>
      <t>The reference implementation that was used for deriving test vectors is available at <xref target="REFIMP"/>.
The embedded base64-encoded test vectors will decode to JSON files having the test vector's octet strings encoded as base16 (i.e. hexadecimal) strings.</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>We would like to thank the participants on the CFRG list for comments and advice. Any comment and advice is appreciated.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="SEC1" target="http://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author>
              <organization>Standards for Efficient Cryptography Group (SECG)</organization>
            </author>
            <date year="2009" month="May"/>
          </front>
        </reference>
        <reference anchor="IEEE1363">
          <front>
            <title>Standard Specifications for Public Key Cryptography, IEEE 1363</title>
            <author>
              <organization/>
            </author>
            <date year="2000"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC7748">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC9496">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="ES21" target="https://eprint.iacr.org/2021/696">
          <front>
            <title>The 'quantum annoying' property of password-authenticated key exchange protocols.</title>
            <author initials="E." surname="Eaton">
              <organization/>
            </author>
            <author initials="D." surname="Stebila">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ABKLX21" target="https://eprint.iacr.org/2021/1218">
          <front>
            <title>Algebraic Adversaries in the Universal Composability Framework.</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="J." surname="Katz">
              <organization/>
            </author>
            <author initials="J." surname="Loss">
              <organization/>
            </author>
            <author initials="J." surname="Xu">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="AHH21" target="https://eprint.iacr.org/2021/114">
          <front>
            <title>Security analysis of CPace</title>
            <author initials="M." surname="Abdalla">
              <organization/>
            </author>
            <author initials="B." surname="Haase">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HS14" target="https://eprint.iacr.org/2014/585.pdf">
          <front>
            <title>The SPEKE Protocol Revisited</title>
            <author initials="F." surname="Hao">
              <organization/>
            </author>
            <author initials="S." surname="Shahandashti">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BGHJ24" target="link.springer.com/chapter/10.1007/978-3-031-68379-4_6">
          <front>
            <title>Bare PAKE: Universally Composable Key Exchange from Just Passwords</title>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="K." surname="Gellert">
              <organization/>
            </author>
            <author initials="J." surname="Hesse">
              <organization/>
            </author>
            <author initials="S." surname="Jarecki">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HMSD18" target="https://arxiv.org/abs/1802.04900">
          <front>
            <title>Analysing and Patching SPEKE in ISO/IEC</title>
            <author initials="F." surname="Hao">
              <organization/>
            </author>
            <author initials="R." surname="Metere">
              <organization/>
            </author>
            <author initials="S." surname="Sahahandashti">
              <organization/>
            </author>
            <author initials="C." surname="Dong">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CDMP05" target="https://doi.org/10.1007/11535218_26">
          <front>
            <title>Merkle-Damgaard Revisited: How to Construct a Hash Function</title>
            <author initials="J.-S." surname="Coron" fullname="Jean-Sebastien Coron">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="Y." surname="Dodis" fullname="Yevgeniy Dodis">
              <organization>New York University</organization>
            </author>
            <author initials="C." surname="Malinaud" fullname="Cecile Malinaud">
              <organization>University of Luxembourg</organization>
            </author>
            <author initials="P." surname="Puniya" fullname="Prashant Puniya">
              <organization>New York University</organization>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="In" value="Advances in Cryptology - CRYPTO 2005"/>
          <seriesInfo name="pages" value="430-448"/>
          <seriesInfo name="DOI" value="10.1007/11535218_26"/>
        </reference>
        <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="SEC2" target="http://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters</title>
            <author>
              <organization>Standards for Efficient Cryptography Group (SECG)</organization>
            </author>
            <date year="2010" month="January"/>
          </front>
        </reference>
        <reference anchor="REFIMP" target="https://github.com/cfrg/draft-irtf-cfrg-cpace/tree/master/poc">
          <front>
            <title>CPace reference implementation (sage)</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="September"/>
          </front>
        </reference>
        <reference anchor="RFC8265">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC9807">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC5246">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC5639">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC4493">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
      </references>
    </references>
    <?line 970?>

<section anchor="cpace-function-definitions">
      <name>CPace function definitions</name>
      <section anchor="definition-and-test-vectors-for-string-utility-functions">
        <name>Definition and test vectors for string utility functions</name>
        <section anchor="prependlen-function">
          <name>prepend_len function</name>
          <sourcecode type="python"><![CDATA[
def prepend_len(data):
    "prepend LEB128 encoding of length"
    length = len(data)
    length_encoded = b""
    while True:
        if length < 128:
            length_encoded += bytes([length])
        else:
            length_encoded += bytes([(length & 0x7f) + 0x80])
        length = int(length >> 7)
        if length == 0:
            break;
    return length_encoded + data
]]></sourcecode>
        </section>
        <section anchor="prependlen-test-vectors">
          <name>prepend_len test vectors</name>
          <artwork><![CDATA[
  prepend_len(b""): (length: 1 bytes)
    00
  prepend_len(b"1234"): (length: 5 bytes)
    0431323334
  prepend_len(bytes(range(127))): (length: 128 bytes)
    7f000102030405060708090a0b0c0d0e0f101112131415161718191a1b
    1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738
    393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455
    565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172
    737475767778797a7b7c7d7e
  prepend_len(bytes(range(128))): (length: 130 bytes)
    8001000102030405060708090a0b0c0d0e0f101112131415161718191a
    1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
    38393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354
    55565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071
    72737475767778797a7b7c7d7e7f
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJwcmVwZW5kX2xlbihiJycpIjogIjAwIiwgImInMTIzNCciOiAiMzEzMjMzMzQiLC
 #AicHJlcGVuZF9sZW4oYicxMjM0JykiOiAiMDQzMTMyMzMzNCIsICJwcmVwZW5kX2xl
 #bihieXRlcyhyYW5nZSgxMjcpKSkiOiAiN0YwMDAxMDIwMzA0MDUwNjA3MDgwOTBBME
 #IwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGMjAyMTIyMjMy
 #NDI1MjYyNzI4MjkyQTJCMkMyRDJFMkYzMDMxMzIzMzM0MzUzNjM3MzgzOTNBM0IzQz
 #NEM0UzRjQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NEE0QjRDNEQ0RTRGNTA1MTUyNTM1NDU1
 #NTY1NzU4NTk1QTVCNUM1RDVFNUY2MDYxNjI2MzY0NjU2NjY3Njg2OTZBNkI2QzZENk
 #U2RjcwNzE3MjczNzQ3NTc2Nzc3ODc5N0E3QjdDN0Q3RSIsICJwcmVwZW5kX2xlbihi
 #eXRlcyhyYW5nZSgxMjgpKSkiOiAiODAwMTAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQj
 #BDMEQwRTBGMTAxMTEyMTMxNDE1MTYxNzE4MTkxQTFCMUMxRDFFMUYyMDIxMjIyMzI0
 #MjUyNjI3MjgyOTJBMkIyQzJEMkUyRjMwMzEzMjMzMzQzNTM2MzczODM5M0EzQjNDM0
 #QzRTNGNDA0MTQyNDM0NDQ1NDY0NzQ4NDk0QTRCNEM0RDRFNEY1MDUxNTI1MzU0NTU1
 #NjU3NTg1OTVBNUI1QzVENUU1RjYwNjE2MjYzNjQ2NTY2Njc2ODY5NkE2QjZDNkQ2RT
 #ZGNzA3MTcyNzM3NDc1NzY3Nzc4Nzk3QTdCN0M3RDdFN0YifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="lvcat-function">
          <name>lv_cat function</name>
          <sourcecode type="python"><![CDATA[
  def lv_cat(*args):
      result = b""
      for arg in args:
          result += prepend_len(arg)
      return result
]]></sourcecode>
        </section>
        <section anchor="testvector-for-lvcat">
          <name>Testvector for lv_cat()</name>
          <artwork><![CDATA[
  lv_cat(b"1234",b"5",b"",b"678"): (length: 12 bytes)
    043132333401350003363738
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-1">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJzEyMzQnIjogIjMxMzIzMzM0IiwgImInNSciOiAiMzUiLCAiYic2NzgnIjogIj
 #M2MzczOCIsICJsdl9jYXQoYicxMjM0JyxiJzUnLGInJyxiJzY3OCcpIjogIjA0MzEz
 #MjMzMzQwMTM1MDAwMzM2MzczOCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="definition-of-generatorstring-function">
        <name>Definition of generator_string function.</name>
        <sourcecode type="python"><![CDATA[
def generator_string(DSI,PRS,CI,sid,s_in_bytes):
    # Concat all input fields with prepended length information.
    # Add zero padding in the first hash block after DSI and PRS.
    len_zpad = max(0,s_in_bytes - 1 - len(prepend_len(PRS))
                     - len(prepend_len(DSI)))
    return lv_cat(DSI, PRS, zero_bytes(len_zpad),
                           CI, sid)
]]></sourcecode>
      </section>
      <section anchor="definitions-and-test-vector-ordered-concatenation">
        <name>Definitions and test vector ordered concatenation</name>
        <section anchor="definitions-for-lexiographical-ordering">
          <name>Definitions for lexiographical ordering</name>
          <t>For ordered concatenation lexiographical ordering of byte sequences is used:</t>
          <sourcecode type="python"><![CDATA[
   def lexiographically_larger(bytes1,bytes2):
      "Returns True if bytes1>bytes2 using lexiographical ordering."
      min_len = min (len(bytes1), len(bytes2))
      for m in range(min_len):
          if bytes1[m] > bytes2[m]:
              return True;
          elif bytes1[m] < bytes2[m]:
              return False;
      return len(bytes1) > len(bytes2)
]]></sourcecode>
        </section>
        <section anchor="definitions-for-ordered-concatenation">
          <name>Definitions for ordered concatenation</name>
          <t>With the above definition of lexiographical ordering ordered concatenation is specified as follows.</t>
          <sourcecode type="python"><![CDATA[
  def o_cat(bytes1,bytes2):
      if lexiographically_larger(bytes1,bytes2):
          return b"oc" + bytes1 + bytes2
      else:
          return b"oc" + bytes2 + bytes1
]]></sourcecode>
        </section>
        <section anchor="test-vectors-ordered-concatenation">
          <name>Test vectors ordered concatenation</name>
          <artwork><![CDATA[
  string comparison for o_cat:
    lexiographically_larger(b"\0", b"\0\0") == False
    lexiographically_larger(b"\1", b"\0\0") == True
    lexiographically_larger(b"\0\0", b"\0") == True
    lexiographically_larger(b"\0\0", b"\1") == False
    lexiographically_larger(b"\0\1", b"\1") == False
    lexiographically_larger(b"ABCD", b"BCD") == False

  o_cat(b"ABCD",b"BCD"): (length: 9 bytes)
    6f6342434441424344
  o_cat(b"BCD",b"ABCDE"): (length: 10 bytes)
    6f634243444142434445
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-2">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJ0FCQ0QnIjogIjQxNDI0MzQ0IiwgImInQkNEJyI6ICI0MjQzNDQiLCAiYidBQk
 #NERSciOiAiNDE0MjQzNDQ0NSIsICJvX2NhdChiJ0FCQ0QnLGInQkNEJykiOiAiNkY2
 #MzQyNDM0NDQxNDI0MzQ0IiwgIm9fY2F0KGInQkNEJyxiJ0FCQ0RFJykiOiAiNkY2Mz
 #QyNDM0NDQxNDI0MzQ0NDUifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="definitions-for-transcriptir-function">
          <name>Definitions for transcript_ir function</name>
          <sourcecode type="python"><![CDATA[
def transcript_ir(Ya,ADa,Yb,ADb):
    result = lv_cat(Ya,ADa) + lv_cat(Yb,ADb)
    return result
]]></sourcecode>
        </section>
        <section anchor="test-vectors-transcriptir-function">
          <name>Test vectors transcript_ir function</name>
          <artwork><![CDATA[
  transcript_ir(b"123", b"PartyA", b"234",b"PartyB"):
  (length: 22 bytes)
    03313233065061727479410332333406506172747942
  transcript_ir(b"3456",b"PartyA",b"2345",b"PartyB"):
  (length: 24 bytes)
    043334353606506172747941043233343506506172747942
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-3">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJzEyMyciOiAiMzEzMjMzIiwgImInMjM0JyI6ICIzMjMzMzQiLCAiYidQYXJ0eU
 #EnIjogIjUwNjE3Mjc0Nzk0MSIsICJiJ1BhcnR5QiciOiAiNTA2MTcyNzQ3OTQyIiwg
 #ImInMzQ1NiciOiAiMzMzNDM1MzYiLCAiYicyMzQ1JyI6ICIzMjMzMzQzNSIsICJ0cm
 #Fuc2NyaXB0X2lyKGInMTIzJyxiJ1BhcnR5QScsYicyMzQnLGInUGFydHlCJykiOiAi
 #MDMzMTMyMzMwNjUwNjE3Mjc0Nzk0MTAzMzIzMzM0MDY1MDYxNzI3NDc5NDIiLCAidH
 #JhbnNjcmlwdF9pcihiJzM0NTYnLGInUGFydHlBJyxiJzIzNDUnLGInUGFydHlCJyki
 #OiAiMDQzMzM0MzUzNjA2NTA2MTcyNzQ3OTQxMDQzMjMzMzQzNTA2NTA2MTcyNzQ3OT
 #QyIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="definitions-for-transcriptoc-function">
          <name>Definitions for transcript_oc function</name>
          <sourcecode type="python"><![CDATA[
def transcript_oc(Ya,ADa,Yb,ADb):
    result = o_cat(lv_cat(Ya,ADa),lv_cat(Yb,ADb))
    return result
]]></sourcecode>
        </section>
        <section anchor="test-vectors-for-transcriptoc-function">
          <name>Test vectors for transcript_oc function</name>
          <artwork><![CDATA[
  transcript_oc(b"123", b"PartyA", b"234",b"PartyB"):
  (length: 24 bytes)
    6f6303323334065061727479420331323306506172747941
  transcript_oc(b"3456",b"PartyA",b"2345",b"PartyB"):
  (length: 26 bytes)
    6f63043334353606506172747941043233343506506172747942
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-4">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJiJzEyMyciOiAiMzEzMjMzIiwgImInMjM0JyI6ICIzMjMzMzQiLCAiYidQYXJ0eU
 #EnIjogIjUwNjE3Mjc0Nzk0MSIsICJiJ1BhcnR5QiciOiAiNTA2MTcyNzQ3OTQyIiwg
 #ImInMzQ1NiciOiAiMzMzNDM1MzYiLCAiYicyMzQ1JyI6ICIzMjMzMzQzNSIsICJ0cm
 #Fuc2NyaXB0X29jKGInMTIzJyxiJ1BhcnR5QScsYicyMzQnLGInUGFydHlCJykiOiAi
 #NkY2MzAzMzIzMzM0MDY1MDYxNzI3NDc5NDIwMzMxMzIzMzA2NTA2MTcyNzQ3OTQxIi
 #wgInRyYW5zY3JpcHRfb2MoYiczNDU2JyxiJ1BhcnR5QScsYicyMzQ1JyxiJ1BhcnR5
 #QicpIjogIjZGNjMwNDMzMzQzNTM2MDY1MDYxNzI3NDc5NDEwNDMyMzMzNDM1MDY1MD
 #YxNzI3NDc5NDIifQ==
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="decoding-and-encoding-functions-according-to-rfc7748">
        <name>Decoding and Encoding functions according to RFC7748</name>
        <sourcecode type="python"><![CDATA[
   def decodeLittleEndian(b, bits):
       return sum([b[i] << 8*i for i in range((bits+7)/8)])

   def decodeUCoordinate(u, bits):
       u_list = [ord(b) for b in u]
       # Ignore any unused bits.
       if bits % 8:
           u_list[-1] &= (1<<(bits%8))-1
       return decodeLittleEndian(u_list, bits)

   def encodeUCoordinate(u, bits):
       return ''.join([chr((u >> 8*i) & 0xff)
                       for i in range((bits+7)/8)])
]]></sourcecode>
      </section>
      <section anchor="elligator-2-reference-implementation">
        <name>Elligator 2 reference implementation</name>
        <t>The Elligator 2 map requires a non-square field element Z which shall be calculated
as follows.</t>
        <sourcecode type="python"><![CDATA[
    def find_z_ell2(F):
        # Find nonsquare for Elligator2
        # Argument: F, a field object, e.g., F = GF(2^255 - 19)
        ctr = F.gen()
        while True:
            for Z_cand in (F(ctr), F(-ctr)):
                # Z must be a non-square in F.
                if is_square(Z_cand):
                    continue
                return Z_cand
            ctr += 1
]]></sourcecode>
        <t>The values of the non-square Z only depend on the curve. The algorithm above
results in a value of Z = 2 for Curve25519 and Z=-1 for Ed448.</t>
        <t>The following code maps a field element r to an encoded field element which
is a valid u-coordinate of a Montgomery curve with curve parameter A.</t>
        <sourcecode type="python"><![CDATA[
    def elligator2(r, q, A, field_size_bits):
        # Inputs: field element r, field order q,
        #         curve parameter A and field size in bits
        Fq = GF(q); A = Fq(A); B = Fq(1);

        # get non-square z as specified in the hash2curve draft.
        z = Fq(find_z_ell2(Fq))
        powerForLegendreSymbol = floor((q-1)/2)

        v = - A / (1 + z * r^2)
        epsilon = (v^3 + A * v^2 + B * v)^powerForLegendreSymbol
        x = epsilon * v - (1 - epsilon) * A/2
        return encodeUCoordinate(Integer(x), field_size_bits)
]]></sourcecode>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test vectors</name>
      <section anchor="test-vector-for-cpace-using-group-x25519-and-hash-sha-512">
        <name>Test vector for CPace using group X25519 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-x25519">
          <name>Test vectors for calculate_generator with group X25519</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 109 ; DSI = b'CPace255'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      0843506163653235350850617373776f72646d000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572107e4b4791d6a8ef019b936c79fb7f
      2c57
    hash generator string: (length: 32 bytes)
      03998087bdb1a2617bbe25ef5a7c18cd4f84f902328701790958755e
      e4aed1d3
    decoded field element of 255 bits: (length: 32 bytes)
      03998087bdb1a2617bbe25ef5a7c18cd4f84f902328701790958755e
      e4aed153
    generator g: (length: 32 bytes)
      d04bf6d41f6a289632a2e929fa29bebd51092512a7829fdde7d314b6
      2f05a73f
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-5">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDksICJEU0kiOiAiNDM1MDYx
 #NjM2NTMyMzUzNSIsICJDSSI6ICIwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQyNU
 #Y3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0NzkxRDZBOEVGMDE5Qjkz
 #NkM3OUZCN0YyQzU3IiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0ksUFJTLENJLHNpZC
 #xILnNfaW5fYnl0ZXMpIjogIjA4NDM1MDYxNjM2NTMyMzUzNTA4NTA2MTczNzM3NzZG
 #NzI2NDZEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODBCNDE1RjY5NkU2OTc0Njk2MTc0Nk
 #Y3MjBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjEwN0U0QjQ3OTFENkE4RUYwMTlCOTM2
 #Qzc5RkI3RjJDNTciLCAiaGFzaCBnZW5lcmF0b3Igc3RyaW5nIjogIjAzOTk4MDg3Qk
 #RCMUEyNjE3QkJFMjVFRjVBN0MxOENENEY4NEY5MDIzMjg3MDE3OTA5NTg3NTVFRTRB
 #RUQxRDMiLCAiZGVjb2RlZCBmaWVsZCBlbGVtZW50IG9mIDI1NSBiaXRzIjogIjAzOT
 #k4MDg3QkRCMUEyNjE3QkJFMjVFRjVBN0MxOENENEY4NEY5MDIzMjg3MDE3OTA5NTg3
 #NTVFRTRBRUQxNTMiLCAiZ2VuZXJhdG9yIGciOiAiRDA0QkY2RDQxRjZBMjg5NjMyQT
 #JFOTI5RkEyOUJFQkQ1MTA5MjUxMkE3ODI5RkRERTdEMzE0QjYyRjA1QTczRiJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080
  Outputs
    Ya: (length: 32 bytes)
      1d13c89278cdadd826f6d8d7f887701430f8380ddc17611cdd6dc989
      ce0c9f32
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a
  Outputs
    Yb: (length: 32 bytes)
      248cccf6d5cdc3646f0ad593f9e6cef4e69d4945f8372e623512ecea
      32185623
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      5b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c37e43ee
      71322c6b
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      5b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c37e43ee
      71322c6b
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      201d13c89278cdadd826f6d8d7f887701430f8380ddc17611cdd6dc9
      89ce0c9f320341446120248cccf6d5cdc3646f0ad593f9e6cef4e69d
      4945f8372e623512ecea3218562303414462
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 137 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c57205b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c3
      7e43ee71322c6b201d13c89278cdadd826f6d8d7f887701430f8380d
      dc17611cdd6dc989ce0c9f320341446120248cccf6d5cdc3646f0ad5
      93f9e6cef4e69d4945f8372e623512ecea3218562303414462
    ISK result: (length: 64 bytes)
      6e19b875f7a561d6b3ca3dbb9ef42ac55de3e717881018204b8922b4
      d5e53bb2aa82c300bea7b65d2b671da71922ddf6472301b79bc270ad
      fa8bf413285f2263
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f6320248cccf6d5cdc3646f0ad593f9e6cef4e69d4945f8372e6235
      12ecea3218562303414462201d13c89278cdadd826f6d8d7f8877014
      30f8380ddc17611cdd6dc989ce0c9f3203414461
    DSI = G.DSI_ISK, b'CPace255_ISK': (length: 12 bytes)
      43506163653235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 139 bytes)
      0c43506163653235355f49534b107e4b4791d6a8ef019b936c79fb7f
      2c57205b067effbdc0b2a0e1d907b21ebb25cfedb96a852179a847c3
      7e43ee71322c6b6f6320248cccf6d5cdc3646f0ad593f9e6cef4e69d
      4945f8372e623512ecea3218562303414462201d13c89278cdadd826
      f6d8d7f887701430f8380ddc17611cdd6dc989ce0c9f3203414461
    ISK result: (length: 64 bytes)
      eef745e2f6e7ae2b1a1e53da340e777167a07fe150436648c51fb199
      c11f3cbabfc683a2b48e1af5881940dc398d375c95e6b4ae9948a45b
      8770de0656382be4
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      cbc73f62589bbc96ab6a95ec2363df621e93bc3b0cea83ba6b9571d0
      05fa8f5d2d08f7165622777fa484c02a9e6b20a84ee2dbebae8c53be
      757dcfc0eebdeb5f
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      3a504e9c7f1f7fa7314861e2c487d13f28566f3043f0ca760d22c491
      1aca0dd8b1f12a7ad0862eb92d08a76120140412ae6b8322e99d75cf
      1d20d8cfde2b40fe
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0xd0,0x4b,0xf6,0xd4,0x1f,0x6a,0x28,0x96,0x32,0xa2,0xe9,0x29,
 0xfa,0x29,0xbe,0xbd,0x51,0x09,0x25,0x12,0xa7,0x82,0x9f,0xdd,
 0xe7,0xd3,0x14,0xb6,0x2f,0x05,0xa7,0x3f,
};
const unsigned char tc_ya[] = {
 0x21,0xb4,0xf4,0xbd,0x9e,0x64,0xed,0x35,0x5c,0x3e,0xb6,0x76,
 0xa2,0x8e,0xbe,0xda,0xf6,0xd8,0xf1,0x7b,0xdc,0x36,0x59,0x95,
 0xb3,0x19,0x09,0x71,0x53,0x04,0x40,0x80,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x1d,0x13,0xc8,0x92,0x78,0xcd,0xad,0xd8,0x26,0xf6,0xd8,0xd7,
 0xf8,0x87,0x70,0x14,0x30,0xf8,0x38,0x0d,0xdc,0x17,0x61,0x1c,
 0xdd,0x6d,0xc9,0x89,0xce,0x0c,0x9f,0x32,
};
const unsigned char tc_yb[] = {
 0x84,0x8b,0x07,0x79,0xff,0x41,0x5f,0x0a,0xf4,0xea,0x14,0xdf,
 0x9d,0xd1,0xd3,0xc2,0x9a,0xc4,0x1d,0x83,0x6c,0x78,0x08,0x89,
 0x6c,0x4e,0xba,0x19,0xc5,0x1a,0xc4,0x0a,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x24,0x8c,0xcc,0xf6,0xd5,0xcd,0xc3,0x64,0x6f,0x0a,0xd5,0x93,
 0xf9,0xe6,0xce,0xf4,0xe6,0x9d,0x49,0x45,0xf8,0x37,0x2e,0x62,
 0x35,0x12,0xec,0xea,0x32,0x18,0x56,0x23,
};
const unsigned char tc_K[] = {
 0x5b,0x06,0x7e,0xff,0xbd,0xc0,0xb2,0xa0,0xe1,0xd9,0x07,0xb2,
 0x1e,0xbb,0x25,0xcf,0xed,0xb9,0x6a,0x85,0x21,0x79,0xa8,0x47,
 0xc3,0x7e,0x43,0xee,0x71,0x32,0x2c,0x6b,
};
const unsigned char tc_ISK_IR[] = {
 0x6e,0x19,0xb8,0x75,0xf7,0xa5,0x61,0xd6,0xb3,0xca,0x3d,0xbb,
 0x9e,0xf4,0x2a,0xc5,0x5d,0xe3,0xe7,0x17,0x88,0x10,0x18,0x20,
 0x4b,0x89,0x22,0xb4,0xd5,0xe5,0x3b,0xb2,0xaa,0x82,0xc3,0x00,
 0xbe,0xa7,0xb6,0x5d,0x2b,0x67,0x1d,0xa7,0x19,0x22,0xdd,0xf6,
 0x47,0x23,0x01,0xb7,0x9b,0xc2,0x70,0xad,0xfa,0x8b,0xf4,0x13,
 0x28,0x5f,0x22,0x63,
};
const unsigned char tc_ISK_SY[] = {
 0xee,0xf7,0x45,0xe2,0xf6,0xe7,0xae,0x2b,0x1a,0x1e,0x53,0xda,
 0x34,0x0e,0x77,0x71,0x67,0xa0,0x7f,0xe1,0x50,0x43,0x66,0x48,
 0xc5,0x1f,0xb1,0x99,0xc1,0x1f,0x3c,0xba,0xbf,0xc6,0x83,0xa2,
 0xb4,0x8e,0x1a,0xf5,0x88,0x19,0x40,0xdc,0x39,0x8d,0x37,0x5c,
 0x95,0xe6,0xb4,0xae,0x99,0x48,0xa4,0x5b,0x87,0x70,0xde,0x06,
 0x56,0x38,0x2b,0xe4,
};
const unsigned char tc_sid_out_ir[] = {
 0xcb,0xc7,0x3f,0x62,0x58,0x9b,0xbc,0x96,0xab,0x6a,0x95,0xec,
 0x23,0x63,0xdf,0x62,0x1e,0x93,0xbc,0x3b,0x0c,0xea,0x83,0xba,
 0x6b,0x95,0x71,0xd0,0x05,0xfa,0x8f,0x5d,0x2d,0x08,0xf7,0x16,
 0x56,0x22,0x77,0x7f,0xa4,0x84,0xc0,0x2a,0x9e,0x6b,0x20,0xa8,
 0x4e,0xe2,0xdb,0xeb,0xae,0x8c,0x53,0xbe,0x75,0x7d,0xcf,0xc0,
 0xee,0xbd,0xeb,0x5f,
};
const unsigned char tc_sid_out_oc[] = {
 0x3a,0x50,0x4e,0x9c,0x7f,0x1f,0x7f,0xa7,0x31,0x48,0x61,0xe2,
 0xc4,0x87,0xd1,0x3f,0x28,0x56,0x6f,0x30,0x43,0xf0,0xca,0x76,
 0x0d,0x22,0xc4,0x91,0x1a,0xca,0x0d,0xd8,0xb1,0xf1,0x2a,0x7a,
 0xd0,0x86,0x2e,0xb9,0x2d,0x08,0xa7,0x61,0x20,0x14,0x04,0x12,
 0xae,0x6b,0x83,0x22,0xe9,0x9d,0x75,0xcf,0x1d,0x20,0xd8,0xcf,
 0xde,0x2b,0x40,0xfe,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-6">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0
 #NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImciOiAiRDA0QkY2RDQxRjZBMj
 #g5NjMyQTJFOTI5RkEyOUJFQkQ1MTA5MjUxMkE3ODI5RkRERTdEMzE0QjYyRjA1QTcz
 #RiIsICJ5YSI6ICIyMUI0RjRCRDlFNjRFRDM1NUMzRUI2NzZBMjhFQkVEQUY2RDhGMT
 #dCREMzNjU5OTVCMzE5MDk3MTUzMDQ0MDgwIiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEi
 #OiAiMUQxM0M4OTI3OENEQUREODI2RjZEOEQ3Rjg4NzcwMTQzMEY4MzgwRERDMTc2MT
 #FDREQ2REM5ODlDRTBDOUYzMiIsICJ5YiI6ICI4NDhCMDc3OUZGNDE1RjBBRjRFQTE0
 #REY5REQxRDNDMjlBQzQxRDgzNkM3ODA4ODk2QzRFQkExOUM1MUFDNDBBIiwgIkFEYi
 #I6ICI0MTQ0NjIiLCAiWWIiOiAiMjQ4Q0NDRjZENUNEQzM2NDZGMEFENTkzRjlFNkNF
 #RjRFNjlENDk0NUY4MzcyRTYyMzUxMkVDRUEzMjE4NTYyMyIsICJLIjogIjVCMDY3RU
 #ZGQkRDMEIyQTBFMUQ5MDdCMjFFQkIyNUNGRURCOTZBODUyMTc5QTg0N0MzN0U0M0VF
 #NzEzMjJDNkIiLCAiSVNLX0lSIjogIjZFMTlCODc1RjdBNTYxRDZCM0NBM0RCQjlFRj
 #QyQUM1NURFM0U3MTc4ODEwMTgyMDRCODkyMkI0RDVFNTNCQjJBQTgyQzMwMEJFQTdC
 #NjVEMkI2NzFEQTcxOTIyRERGNjQ3MjMwMUI3OUJDMjcwQURGQThCRjQxMzI4NUYyMj
 #YzIiwgIklTS19TWSI6ICJFRUY3NDVFMkY2RTdBRTJCMUExRTUzREEzNDBFNzc3MTY3
 #QTA3RkUxNTA0MzY2NDhDNTFGQjE5OUMxMUYzQ0JBQkZDNjgzQTJCNDhFMUFGNTg4MT
 #k0MERDMzk4RDM3NUM5NUU2QjRBRTk5NDhBNDVCODc3MERFMDY1NjM4MkJFNCIsICJz
 #aWRfb3V0cHV0X2lyIjogIkNCQzczRjYyNTg5QkJDOTZBQjZBOTVFQzIzNjNERjYyMU
 #U5M0JDM0IwQ0VBODNCQTZCOTU3MUQwMDVGQThGNUQyRDA4RjcxNjU2MjI3NzdGQTQ4
 #NEMwMkE5RTZCMjBBODRFRTJEQkVCQUU4QzUzQkU3NTdEQ0ZDMEVFQkRFQjVGIiwgIn
 #NpZF9vdXRwdXRfb2MiOiAiM0E1MDRFOUM3RjFGN0ZBNzMxNDg2MUUyQzQ4N0QxM0Yy
 #ODU2NkYzMDQzRjBDQTc2MEQyMkM0OTExQUNBMEREOEIxRjEyQTdBRDA4NjJFQjkyRD
 #A4QTc2MTIwMTQwNDEyQUU2QjgzMjJFOTlENzVDRjFEMjBEOENGREUyQjQwRkUifQ==
]]></sourcecode>
        </section>
        <section anchor="test-vectors-for-gx25519scalarmultvfy-low-order-points">
          <name>Test vectors for G_X25519.scalar_mult_vfy: low order points</name>
          <t>Test vectors for which G_X25519.scalar_mult_vfy(s_in,ux) must return the neutral
element or would return the neutral element if bit #255 of field element
representation was not correctly cleared. (The decodeUCoordinate function from RFC7748 mandates clearing bit #255 for field element representations for use in the X25519 function.).</t>
          <artwork><![CDATA[
u0: 0000000000000000000000000000000000000000000000000000000000000000
u1: 0100000000000000000000000000000000000000000000000000000000000000
u2: ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u3: e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800
u4: 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157
u5: edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u6: daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
u7: eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
u8: dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
u9: d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ua: cdeb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880
ub: 4c9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7

u0 ... ub MUST be verified to produce the correct results q0 ... qb:

Additionally, u0,u1,u2,u3,u4,u5 and u7 MUST trigger the abort case
when included in message from A or B.

s = af46e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449aff
qN = G_X25519.scalar_mult_vfy(s, uX)
q0: 0000000000000000000000000000000000000000000000000000000000000000
q1: 0000000000000000000000000000000000000000000000000000000000000000
q2: 0000000000000000000000000000000000000000000000000000000000000000
q3: 0000000000000000000000000000000000000000000000000000000000000000
q4: 0000000000000000000000000000000000000000000000000000000000000000
q5: 0000000000000000000000000000000000000000000000000000000000000000
q6: d8e2c776bbacd510d09fd9278b7edcd25fc5ae9adfba3b6e040e8d3b71b21806
q7: 0000000000000000000000000000000000000000000000000000000000000000
q8: c85c655ebe8be44ba9c0ffde69f2fe10194458d137f09bbff725ce58803cdb38
q9: db64dafa9b8fdd136914e61461935fe92aa372cb056314e1231bc4ec12417456
qa: e062dcd5376d58297be2618c7498f55baa07d7e03184e8aada20bca28888bf7a
qb: 993c6ad11c4c29da9a56f7691fd0ff8d732e49de6250b6c2e80003ff4629a175
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-7">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkwIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMSI6ICIw
 #MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwIiwgIkludmFsaWQgWTIiOiAiRUNGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsIC
 #JJbnZhbGlkIFkzIjogIkUwRUI3QTdDM0I0MUI4QUUxNjU2RTNGQUYxOUZDNDZBREEw
 #OThERUI5QzMyQjFGRDg2NjIwNTE2NUY0OUI4MDAiLCAiSW52YWxpZCBZNCI6ICI1Rj
 #lDOTVCQ0EzNTA4QzI0QjFEMEIxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIy
 #NEVEREQwOUYxMTU3IiwgIkludmFsaWQgWTUiOiAiRURGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RiIsICJJ
 #bnZhbGlkIFk2IjogIkRBRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNyI6ICJFRUZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRjdGIiwgIkludmFsaWQgWTgiOiAiREJGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbn
 #ZhbGlkIFk5IjogIkQ5RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZMTAiOiAiQ0RFQj
 #dBN0MzQjQxQjhBRTE2NTZFM0ZBRjE5RkM0NkFEQTA5OERFQjlDMzJCMUZEODY2MjA1
 #MTY1RjQ5Qjg4MCIsICJJbnZhbGlkIFkxMSI6ICI0QzlDOTVCQ0EzNTA4QzI0QjFEME
 #IxNTU5QzgzRUY1QjA0NDQ1Q0M0NTgxQzhFODZEODIyNEVEREQwOUYxMUQ3In0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-x448-and-hash-shake-256">
        <name>Test vector for CPace using group X448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-x448">
          <name>Test vectors for calculate_generator with group X448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 117 ; DSI = b'CPace448'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 178 bytes)
      0843506163653434380850617373776f726475000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000180b415f
      696e69746961746f720b425f726573706f6e646572105223e0cdc45d
      6575668d64c552004124
    hash generator string: (length: 56 bytes)
      e129c967efb40a175ac2bf4443dfb8c2360d7fba99922b04c19e0986
      a3ef779a6fcf6942c9497adcc90c6db1f03cc0b8680f87df1fd88c35
    decoded field element of 448 bits: (length: 56 bytes)
      e129c967efb40a175ac2bf4443dfb8c2360d7fba99922b04c19e0986
      a3ef779a6fcf6942c9497adcc90c6db1f03cc0b8680f87df1fd88c35
    generator g: (length: 56 bytes)
      9ccb9b0468ea5a8a8193d9d915620f2847565d92449e939b314e76cc
      b1f88b00e5e803e5b65643c17fdba0c2ba839b09ed5873e811ff5a98
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-8">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExNywgIkRTSSI6ICI0MzUw
 #NjE2MzY1MzQzNDM4IiwgIkNJIjogIjBCNDE1RjY5NkU2OTc0Njk2MTc0NkY3MjBCND
 #I1RjcyNjU3MzcwNkY2RTY0NjU3MiIsICJzaWQiOiAiNTIyM0UwQ0RDNDVENjU3NTY2
 #OEQ2NEM1NTIwMDQxMjQiLCAiZ2VuZXJhdG9yX3N0cmluZyhHLkRTSSxQUlMsQ0ksc2
 #lkLEguc19pbl9ieXRlcykiOiAiMDg0MzUwNjE2MzY1MzQzNDM4MDg1MDYxNzM3Mzc3
 #NkY3MjY0NzUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODBCND
 #E1RjY5NkU2OTc0Njk2MTc0NkY3MjBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjEwNTIy
 #M0UwQ0RDNDVENjU3NTY2OEQ2NEM1NTIwMDQxMjQiLCAiaGFzaCBnZW5lcmF0b3Igc3
 #RyaW5nIjogIkUxMjlDOTY3RUZCNDBBMTc1QUMyQkY0NDQzREZCOEMyMzYwRDdGQkE5
 #OTkyMkIwNEMxOUUwOTg2QTNFRjc3OUE2RkNGNjk0MkM5NDk3QURDQzkwQzZEQjFGMD
 #NDQzBCODY4MEY4N0RGMUZEODhDMzUiLCAiZGVjb2RlZCBmaWVsZCBlbGVtZW50IG9m
 #IDQ0OCBiaXRzIjogIkUxMjlDOTY3RUZCNDBBMTc1QUMyQkY0NDQzREZCOEMyMzYwRD
 #dGQkE5OTkyMkIwNEMxOUUwOTg2QTNFRjc3OUE2RkNGNjk0MkM5NDk3QURDQzkwQzZE
 #QjFGMDNDQzBCODY4MEY4N0RGMUZEODhDMzUiLCAiZ2VuZXJhdG9yIGciOiAiOUNDQj
 #lCMDQ2OEVBNUE4QTgxOTNEOUQ5MTU2MjBGMjg0NzU2NUQ5MjQ0OUU5MzlCMzE0RTc2
 #Q0NCMUY4OEIwMEU1RTgwM0U1QjY1NjQzQzE3RkRCQTBDMkJBODM5QjA5RUQ1ODczRT
 #gxMUZGNUE5OCJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-1">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      21b4f4bd9e64ed355c3eb676a28ebedaf6d8f17bdc365995b3190971
      53044080516bd083bfcce66121a3072646994c8430cc382b8dc543e8
  Outputs
    Ya: (length: 56 bytes)
      d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef974003ad9d
      3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4cf82eebe0
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-1">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      848b0779ff415f0af4ea14df9dd1d3c29ac41d836c7808896c4eba19
      c51ac40a439caf5e61ec88c307c7d619195229412eaa73fb2a5ea20d
  Outputs
    Yb: (length: 56 bytes)
      89aaf7f3f3b708cecf0e1d2c0fab82817ac6c741291106414a25a474
      187abca5214ca8a3f0b55f6809cbd5316e139b2721afa70dcb0971d3
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-1">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      0fa58f732254a0708032d764d19b734b5cc890df45ec244d6d522767
      af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0bc028e
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      0fa58f732254a0708032d764d19b734b5cc890df45ec244d6d522767
      af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0bc028e
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-1">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      38d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef974003ad
      9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4cf82eeb
      e0034144613889aaf7f3f3b708cecf0e1d2c0fab82817ac6c7412911
      06414a25a474187abca5214ca8a3f0b55f6809cbd5316e139b2721af
      a70dcb0971d303414462
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 209 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      4124380fa58f732254a0708032d764d19b734b5cc890df45ec244d6d
      522767af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0
      bc028e38d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef97
      4003ad9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4c
      f82eebe0034144613889aaf7f3f3b708cecf0e1d2c0fab82817ac6c7
      41291106414a25a474187abca5214ca8a3f0b55f6809cbd5316e139b
      2721afa70dcb0971d303414462
    ISK result: (length: 64 bytes)
      ff3f4fa2f91e0badf5780ed2b795b97e48bb36d34c3e48cdfa1e7f79
      39ad0d6987a7fda8857b3cca3c311eaab94ce05e6d9bd111bb417ba0
      c91baf14b967eafb
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-1">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f6338d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48aef9740
      03ad9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d0a4cf8
      2eebe0034144613889aaf7f3f3b708cecf0e1d2c0fab82817ac6c741
      291106414a25a474187abca5214ca8a3f0b55f6809cbd5316e139b27
      21afa70dcb0971d303414462
    DSI = G.DSI_ISK, b'CPace448_ISK': (length: 12 bytes)
      43506163653434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 211 bytes)
      0c43506163653434385f49534b105223e0cdc45d6575668d64c55200
      4124380fa58f732254a0708032d764d19b734b5cc890df45ec244d6d
      522767af6bdc802868688b543f1a93990a5b05dd536c49d57290f2f0
      bc028e6f6338d8b2cc0fab9298a7a5c6219fb9c2e77dbdb22625f48a
      ef974003ad9d3d5b58ca4e73a6b7033a3d083cd747b55c6f7345467d
      0a4cf82eebe0034144613889aaf7f3f3b708cecf0e1d2c0fab82817a
      c6c741291106414a25a474187abca5214ca8a3f0b55f6809cbd5316e
      139b2721afa70dcb0971d303414462
    ISK result: (length: 64 bytes)
      0ab598d085cd0bcdca64b58630e53287ef5aa7dbfc209dc9d2e50e0c
      6eb8e5e5ac27987d48e5608a45228c24532821d00fe66c7acc72fccf
      2d14d95d4ee645ed
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-1">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      6ef5882a6a9a323789e418a27c254513412e3c75945e1c0777dc2725
      0a122bc1c64106aedc800a0cd51d35203d2ae09471c1a81448b70a2e
      3715376d9f03b79b
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      5784ff2c7c3dce998db4976cbeccfe0ec3a253a2caf64ae4132f5394
      0390ab5938dbd3c0fddc6d070f8fde384d49898873146b2921ee92a6
      74ac1ca45ca365f4
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-1">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0x9c,0xcb,0x9b,0x04,0x68,0xea,0x5a,0x8a,0x81,0x93,0xd9,0xd9,
 0x15,0x62,0x0f,0x28,0x47,0x56,0x5d,0x92,0x44,0x9e,0x93,0x9b,
 0x31,0x4e,0x76,0xcc,0xb1,0xf8,0x8b,0x00,0xe5,0xe8,0x03,0xe5,
 0xb6,0x56,0x43,0xc1,0x7f,0xdb,0xa0,0xc2,0xba,0x83,0x9b,0x09,
 0xed,0x58,0x73,0xe8,0x11,0xff,0x5a,0x98,
};
const unsigned char tc_ya[] = {
 0x21,0xb4,0xf4,0xbd,0x9e,0x64,0xed,0x35,0x5c,0x3e,0xb6,0x76,
 0xa2,0x8e,0xbe,0xda,0xf6,0xd8,0xf1,0x7b,0xdc,0x36,0x59,0x95,
 0xb3,0x19,0x09,0x71,0x53,0x04,0x40,0x80,0x51,0x6b,0xd0,0x83,
 0xbf,0xcc,0xe6,0x61,0x21,0xa3,0x07,0x26,0x46,0x99,0x4c,0x84,
 0x30,0xcc,0x38,0x2b,0x8d,0xc5,0x43,0xe8,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd8,0xb2,0xcc,0x0f,0xab,0x92,0x98,0xa7,0xa5,0xc6,0x21,0x9f,
 0xb9,0xc2,0xe7,0x7d,0xbd,0xb2,0x26,0x25,0xf4,0x8a,0xef,0x97,
 0x40,0x03,0xad,0x9d,0x3d,0x5b,0x58,0xca,0x4e,0x73,0xa6,0xb7,
 0x03,0x3a,0x3d,0x08,0x3c,0xd7,0x47,0xb5,0x5c,0x6f,0x73,0x45,
 0x46,0x7d,0x0a,0x4c,0xf8,0x2e,0xeb,0xe0,
};
const unsigned char tc_yb[] = {
 0x84,0x8b,0x07,0x79,0xff,0x41,0x5f,0x0a,0xf4,0xea,0x14,0xdf,
 0x9d,0xd1,0xd3,0xc2,0x9a,0xc4,0x1d,0x83,0x6c,0x78,0x08,0x89,
 0x6c,0x4e,0xba,0x19,0xc5,0x1a,0xc4,0x0a,0x43,0x9c,0xaf,0x5e,
 0x61,0xec,0x88,0xc3,0x07,0xc7,0xd6,0x19,0x19,0x52,0x29,0x41,
 0x2e,0xaa,0x73,0xfb,0x2a,0x5e,0xa2,0x0d,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x89,0xaa,0xf7,0xf3,0xf3,0xb7,0x08,0xce,0xcf,0x0e,0x1d,0x2c,
 0x0f,0xab,0x82,0x81,0x7a,0xc6,0xc7,0x41,0x29,0x11,0x06,0x41,
 0x4a,0x25,0xa4,0x74,0x18,0x7a,0xbc,0xa5,0x21,0x4c,0xa8,0xa3,
 0xf0,0xb5,0x5f,0x68,0x09,0xcb,0xd5,0x31,0x6e,0x13,0x9b,0x27,
 0x21,0xaf,0xa7,0x0d,0xcb,0x09,0x71,0xd3,
};
const unsigned char tc_K[] = {
 0x0f,0xa5,0x8f,0x73,0x22,0x54,0xa0,0x70,0x80,0x32,0xd7,0x64,
 0xd1,0x9b,0x73,0x4b,0x5c,0xc8,0x90,0xdf,0x45,0xec,0x24,0x4d,
 0x6d,0x52,0x27,0x67,0xaf,0x6b,0xdc,0x80,0x28,0x68,0x68,0x8b,
 0x54,0x3f,0x1a,0x93,0x99,0x0a,0x5b,0x05,0xdd,0x53,0x6c,0x49,
 0xd5,0x72,0x90,0xf2,0xf0,0xbc,0x02,0x8e,
};
const unsigned char tc_ISK_IR[] = {
 0xff,0x3f,0x4f,0xa2,0xf9,0x1e,0x0b,0xad,0xf5,0x78,0x0e,0xd2,
 0xb7,0x95,0xb9,0x7e,0x48,0xbb,0x36,0xd3,0x4c,0x3e,0x48,0xcd,
 0xfa,0x1e,0x7f,0x79,0x39,0xad,0x0d,0x69,0x87,0xa7,0xfd,0xa8,
 0x85,0x7b,0x3c,0xca,0x3c,0x31,0x1e,0xaa,0xb9,0x4c,0xe0,0x5e,
 0x6d,0x9b,0xd1,0x11,0xbb,0x41,0x7b,0xa0,0xc9,0x1b,0xaf,0x14,
 0xb9,0x67,0xea,0xfb,
};
const unsigned char tc_ISK_SY[] = {
 0x0a,0xb5,0x98,0xd0,0x85,0xcd,0x0b,0xcd,0xca,0x64,0xb5,0x86,
 0x30,0xe5,0x32,0x87,0xef,0x5a,0xa7,0xdb,0xfc,0x20,0x9d,0xc9,
 0xd2,0xe5,0x0e,0x0c,0x6e,0xb8,0xe5,0xe5,0xac,0x27,0x98,0x7d,
 0x48,0xe5,0x60,0x8a,0x45,0x22,0x8c,0x24,0x53,0x28,0x21,0xd0,
 0x0f,0xe6,0x6c,0x7a,0xcc,0x72,0xfc,0xcf,0x2d,0x14,0xd9,0x5d,
 0x4e,0xe6,0x45,0xed,
};
const unsigned char tc_sid_out_ir[] = {
 0x6e,0xf5,0x88,0x2a,0x6a,0x9a,0x32,0x37,0x89,0xe4,0x18,0xa2,
 0x7c,0x25,0x45,0x13,0x41,0x2e,0x3c,0x75,0x94,0x5e,0x1c,0x07,
 0x77,0xdc,0x27,0x25,0x0a,0x12,0x2b,0xc1,0xc6,0x41,0x06,0xae,
 0xdc,0x80,0x0a,0x0c,0xd5,0x1d,0x35,0x20,0x3d,0x2a,0xe0,0x94,
 0x71,0xc1,0xa8,0x14,0x48,0xb7,0x0a,0x2e,0x37,0x15,0x37,0x6d,
 0x9f,0x03,0xb7,0x9b,
};
const unsigned char tc_sid_out_oc[] = {
 0x57,0x84,0xff,0x2c,0x7c,0x3d,0xce,0x99,0x8d,0xb4,0x97,0x6c,
 0xbe,0xcc,0xfe,0x0e,0xc3,0xa2,0x53,0xa2,0xca,0xf6,0x4a,0xe4,
 0x13,0x2f,0x53,0x94,0x03,0x90,0xab,0x59,0x38,0xdb,0xd3,0xc0,
 0xfd,0xdc,0x6d,0x07,0x0f,0x8f,0xde,0x38,0x4d,0x49,0x89,0x88,
 0x73,0x14,0x6b,0x29,0x21,0xee,0x92,0xa6,0x74,0xac,0x1c,0xa4,
 0x5c,0xa3,0x65,0xf4,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-9">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjUyMjNF
 #MENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImciOiAiOUNDQjlCMDQ2OEVBNU
 #E4QTgxOTNEOUQ5MTU2MjBGMjg0NzU2NUQ5MjQ0OUU5MzlCMzE0RTc2Q0NCMUY4OEIw
 #MEU1RTgwM0U1QjY1NjQzQzE3RkRCQTBDMkJBODM5QjA5RUQ1ODczRTgxMUZGNUE5OC
 #IsICJ5YSI6ICIyMUI0RjRCRDlFNjRFRDM1NUMzRUI2NzZBMjhFQkVEQUY2RDhGMTdC
 #REMzNjU5OTVCMzE5MDk3MTUzMDQ0MDgwNTE2QkQwODNCRkNDRTY2MTIxQTMwNzI2ND
 #Y5OTRDODQzMENDMzgyQjhEQzU0M0U4IiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEiOiAi
 #RDhCMkNDMEZBQjkyOThBN0E1QzYyMTlGQjlDMkU3N0RCREIyMjYyNUY0OEFFRjk3ND
 #AwM0FEOUQzRDVCNThDQTRFNzNBNkI3MDMzQTNEMDgzQ0Q3NDdCNTVDNkY3MzQ1NDY3
 #RDBBNENGODJFRUJFMCIsICJ5YiI6ICI4NDhCMDc3OUZGNDE1RjBBRjRFQTE0REY5RE
 #QxRDNDMjlBQzQxRDgzNkM3ODA4ODk2QzRFQkExOUM1MUFDNDBBNDM5Q0FGNUU2MUVD
 #ODhDMzA3QzdENjE5MTk1MjI5NDEyRUFBNzNGQjJBNUVBMjBEIiwgIkFEYiI6ICI0MT
 #Q0NjIiLCAiWWIiOiAiODlBQUY3RjNGM0I3MDhDRUNGMEUxRDJDMEZBQjgyODE3QUM2
 #Qzc0MTI5MTEwNjQxNEEyNUE0NzQxODdBQkNBNTIxNENBOEEzRjBCNTVGNjgwOUNCRD
 #UzMTZFMTM5QjI3MjFBRkE3MERDQjA5NzFEMyIsICJLIjogIjBGQTU4RjczMjI1NEEw
 #NzA4MDMyRDc2NEQxOUI3MzRCNUNDODkwREY0NUVDMjQ0RDZENTIyNzY3QUY2QkRDOD
 #AyODY4Njg4QjU0M0YxQTkzOTkwQTVCMDVERDUzNkM0OUQ1NzI5MEYyRjBCQzAyOEUi
 #LCAiSVNLX0lSIjogIkZGM0Y0RkEyRjkxRTBCQURGNTc4MEVEMkI3OTVCOTdFNDhCQj
 #M2RDM0QzNFNDhDREZBMUU3Rjc5MzlBRDBENjk4N0E3RkRBODg1N0IzQ0NBM0MzMTFF
 #QUFCOTRDRTA1RTZEOUJEMTExQkI0MTdCQTBDOTFCQUYxNEI5NjdFQUZCIiwgIklTS1
 #9TWSI6ICIwQUI1OThEMDg1Q0QwQkNEQ0E2NEI1ODYzMEU1MzI4N0VGNUFBN0RCRkMy
 #MDlEQzlEMkU1MEUwQzZFQjhFNUU1QUMyNzk4N0Q0OEU1NjA4QTQ1MjI4QzI0NTMyOD
 #IxRDAwRkU2NkM3QUNDNzJGQ0NGMkQxNEQ5NUQ0RUU2NDVFRCIsICJzaWRfb3V0cHV0
 #X2lyIjogIjZFRjU4ODJBNkE5QTMyMzc4OUU0MThBMjdDMjU0NTEzNDEyRTNDNzU5ND
 #VFMUMwNzc3REMyNzI1MEExMjJCQzFDNjQxMDZBRURDODAwQTBDRDUxRDM1MjAzRDJB
 #RTA5NDcxQzFBODE0NDhCNzBBMkUzNzE1Mzc2RDlGMDNCNzlCIiwgInNpZF9vdXRwdX
 #Rfb2MiOiAiNTc4NEZGMkM3QzNEQ0U5OThEQjQ5NzZDQkVDQ0ZFMEVDM0EyNTNBMkNB
 #RjY0QUU0MTMyRjUzOTQwMzkwQUI1OTM4REJEM0MwRkREQzZEMDcwRjhGREUzODREND
 #k4OTg4NzMxNDZCMjkyMUVFOTJBNjc0QUMxQ0E0NUNBMzY1RjQifQ==
]]></sourcecode>
        </section>
        <section anchor="test-vectors-for-gx448scalarmultvfy-low-order-points">
          <name>Test vectors for G_X448.scalar_mult_vfy: low order points</name>
          <t>Test vectors for which G_X448.scalar_mult_vfy(s_in,ux) must return the neutral
element.
This includes points that are non-canonicaly encoded, i.e. have coordinate values
larger
than the field prime.</t>
          <t>Weak points for X448 smaller than the field prime (canonical)</t>
          <artwork><![CDATA[
  u0: (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  u1: (length: 56 bytes)
    0100000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  u2: (length: 56 bytes)
    fefffffffffffffffffffffffffffffffffffffffffffffffffffffffe
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff
]]></artwork>
          <t>Weak points for X448 larger or equal to the field prime (non-canonical)</t>
          <artwork><![CDATA[
  u3: (length: 56 bytes)
    fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff
  u4: (length: 56 bytes)
    00000000000000000000000000000000000000000000000000000000ff
    ffffffffffffffffffffffffffffffffffffffffffffffffffffff

All of the above points u0 ... u4 MUST trigger the abort case
when included in the protocol messages from A or B.
]]></artwork>
          <t>Expected results for X448 resp. G_X448.scalar_mult_vfy</t>
          <artwork><![CDATA[
  scalar s: (length: 56 bytes)
    af8a14218bf2a2062926d2ea9b8fe4e8b6817349b6ed2feb1e5d64d7a4
    523f15fceec70fb111e870dc58d191e66a14d3e9d482d04432cadd
  G_X448.scalar_mult_vfy(s,u0): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u1): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u2): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u3): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
  G_X448.scalar_mult_vfy(s,u4): (length: 56 bytes)
    0000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000
]]></artwork>
          <t>Test vectors for scalar_mult with nonzero outputs</t>
          <artwork><![CDATA[
  scalar s: (length: 56 bytes)
    af8a14218bf2a2062926d2ea9b8fe4e8b6817349b6ed2feb1e5d64d7a4
    523f15fceec70fb111e870dc58d191e66a14d3e9d482d04432cadd
  point coordinate u_curve on the curve: (length: 56 bytes)
    ab0c68d772ec2eb9de25c49700e46d6325e66d6aa39d7b65eb84a68c55
    69d47bd71b41f3e0d210f44e146dec8926b174acb3f940a0b82cab
  G_X448.scalar_mult_vfy(s,u_curve): (length: 56 bytes)
    3b0fa9bc40a6fdc78c9e06ff7a54c143c5d52f365607053bf0656f5142
    0496295f910a101b38edc1acd3bd240fd55dcb7a360553b8a7627e

  point coordinate u_twist on the twist: (length: 56 bytes)
    c981cd1e1f72d9c35c7d7cf6be426757c0dc8206a2fcfa564a8e7618c0
    3c0e61f9a2eb1c3e0dd97d6e9b1010f5edd03397a83f5a914cb3ff
  G_X448.scalar_mult_vfy(s,u_twist): (length: 56 bytes)
    d0a2bb7e9c5c2c627793d8342f23b759fe7d9e3320a85ca4fd61376331
    50ffd9a9148a9b75c349fac43d64bec49a6e126cc92cbfbf353961
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-10">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJJbnZhbGlkIFkxIjogIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiSW52YWxpZCBZMiI6ICIwMT
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwIiwgIkludmFsaWQgWTMiOiAiRkVGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsICJJbnZh
 #bGlkIFk0IjogIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCAiSW52YWxpZCBZNSI6ICIwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZG
 #RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk
 #ZGRkZGIiwgIlZhbGlkIChvbiBjdXJ2ZSkiOiB7InMiOiAiQUY4QTE0MjE4QkYyQTIw
 #NjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0YxNU
 #ZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FERCIs
 #ICJ1X2N1cnZlIjogIkFCMEM2OEQ3NzJFQzJFQjlERTI1QzQ5NzAwRTQ2RDYzMjVFNj
 #ZENkFBMzlEN0I2NUVCODRBNjhDNTU2OUQ0N0JENzFCNDFGM0UwRDIxMEY0NEUxNDZE
 #RUM4OTI2QjE3NEFDQjNGOTQwQTBCODJDQUIiLCAicmVzX2N1cnZlIjogIjNCMEZBOU
 #JDNDBBNkZEQzc4QzlFMDZGRjdBNTRDMTQzQzVENTJGMzY1NjA3MDUzQkYwNjU2RjUx
 #NDIwNDk2Mjk1RjkxMEExMDFCMzhFREMxQUNEM0JEMjQwRkQ1NURDQjdBMzYwNTUzQj
 #hBNzYyN0UifSwgIlZhbGlkIChvbiB0d2lzdCkiOiB7InMiOiAiQUY4QTE0MjE4QkYy
 #QTIwNjI5MjZEMkVBOUI4RkU0RThCNjgxNzM0OUI2RUQyRkVCMUU1RDY0RDdBNDUyM0
 #YxNUZDRUVDNzBGQjExMUU4NzBEQzU4RDE5MUU2NkExNEQzRTlENDgyRDA0NDMyQ0FE
 #RCIsICJ1X3R3aXN0IjogIkM5ODFDRDFFMUY3MkQ5QzM1QzdEN0NGNkJFNDI2NzU3Qz
 #BEQzgyMDZBMkZDRkE1NjRBOEU3NjE4QzAzQzBFNjFGOUEyRUIxQzNFMEREOTdENkU5
 #QjEwMTBGNUVERDAzMzk3QTgzRjVBOTE0Q0IzRkYiLCAicmVzX3R3aXN0IjogIkQwQT
 #JCQjdFOUM1QzJDNjI3NzkzRDgzNDJGMjNCNzU5RkU3RDlFMzMyMEE4NUNBNEZENjEz
 #NzYzMzE1MEZGRDlBOTE0OEE5Qjc1QzM0OUZBQzQzRDY0QkVDNDlBNkUxMjZDQzkyQ0
 #JGQkYzNTM5NjEifX0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-ristretto255-and-hash-sha-512">
        <name>Test vector for CPace using group ristretto255 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-ristretto255">
          <name>Test vectors for calculate_generator with group ristretto255</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 100 ;
    DSI = b'CPaceRistretto255'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      11435061636552697374726574746f3235350850617373776f726464
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572107e4b4791d6a8ef019b936c79fb7f
      2c57
    hash result: (length: 64 bytes)
      da6d3ddc8802fca9058755ffd3ebde08a9c2c74945901a258482a288
      b6663af06bf645c93cd1c51512307199c80e84908916d983b34af772
      05f90851a657ee27
    encoded generator g: (length: 32 bytes)
      222b6b195fe84b1652badb6f6a3ae3d24341e7306967f0b8115b40d5
      698c7e56
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-11">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiAxMDAsICJEU0kiOiAiNDM1MDYx
 #NjM2NTUyNjk3Mzc0NzI2NTc0NzQ2RjMyMzUzNSIsICJDSSI6ICIwQjQxNUY2OTZFNj
 #k3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdF
 #NEI0NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImdlbmVyYXRvcl9zdHJpbm
 #coRy5EU0ksUFJTLENJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjExNDM1MDYxNjM2NTUy
 #Njk3Mzc0NzI2NTc0NzQ2RjMyMzUzNTA4NTA2MTczNzM3NzZGNzI2NDY0MDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODBCND
 #E1RjY5NkU2OTc0Njk2MTc0NkY3MjBCNDI1RjcyNjU3MzcwNkY2RTY0NjU3MjEwN0U0
 #QjQ3OTFENkE4RUYwMTlCOTM2Qzc5RkI3RjJDNTciLCAiaGFzaCByZXN1bHQiOiAiRE
 #E2RDNEREM4ODAyRkNBOTA1ODc1NUZGRDNFQkRFMDhBOUMyQzc0OTQ1OTAxQTI1ODQ4
 #MkEyODhCNjY2M0FGMDZCRjY0NUM5M0NEMUM1MTUxMjMwNzE5OUM4MEU4NDkwODkxNk
 #Q5ODNCMzRBRjc3MjA1RjkwODUxQTY1N0VFMjciLCAiZW5jb2RlZCBnZW5lcmF0b3Ig
 #ZyI6ICIyMjJCNkIxOTVGRTg0QjE2NTJCQURCNkY2QTNBRTNEMjQzNDFFNzMwNjk2N0
 #YwQjgxMTVCNDBENTY5OEM3RTU2In0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-2">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 32 bytes)
      da3d23700a9e5699258aef94dc060dfda5ebb61f02a5ea77fad53f4f
      f0976d08
  Outputs
    Ya: (length: 32 bytes)
      d6bac480f2c386c394efc7c47adb9925dcd2630b64f240c50f8d0eec
      482b9157
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-2">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 32 bytes)
      d2316b454718c35362d83d69df6320f38578ed5984651435e2949762
      d900b80d
  Outputs
    Yb: (length: 32 bytes)
      3ea7e0b19560d7c0b0f5734f63b955286dfa8232b5ebe63324e2d9e7
      433f7258
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-2">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      80b69a8a76457ab6a4d7f887a4bf6b55a2f80ac19c333f917a05fc98
      87c8b40f
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      80b69a8a76457ab6a4d7f887a4bf6b55a2f80ac19c333f917a05fc98
      87c8b40f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-2">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 74 bytes)
      20d6bac480f2c386c394efc7c47adb9925dcd2630b64f240c50f8d0e
      ec482b915703414461203ea7e0b19560d7c0b0f5734f63b955286dfa
      8232b5ebe63324e2d9e7433f725803414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 146 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c572080b69a8a76457ab6a4d7f887a4bf6b55
      a2f80ac19c333f917a05fc9887c8b40f20d6bac480f2c386c394efc7
      c47adb9925dcd2630b64f240c50f8d0eec482b915703414461203ea7
      e0b19560d7c0b0f5734f63b955286dfa8232b5ebe63324e2d9e7433f
      725803414462
    ISK result: (length: 64 bytes)
      b69effbf61b51d56401c0f65601abe428de8206feaaf0e32198896dc
      ae7b35cd2b38950a39dfd5d4a79164614c2984f7daa460b588c1e80c
      3fa2068af7900447
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-2">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 76 bytes)
      6f6320d6bac480f2c386c394efc7c47adb9925dcd2630b64f240c50f
      8d0eec482b915703414461203ea7e0b19560d7c0b0f5734f63b95528
      6dfa8232b5ebe63324e2d9e7433f725803414462
    DSI = G.DSI_ISK, b'CPaceRistretto255_ISK':
    (length: 21 bytes)
      435061636552697374726574746f3235355f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 148 bytes)
      15435061636552697374726574746f3235355f49534b107e4b4791d6
      a8ef019b936c79fb7f2c572080b69a8a76457ab6a4d7f887a4bf6b55
      a2f80ac19c333f917a05fc9887c8b40f6f6320d6bac480f2c386c394
      efc7c47adb9925dcd2630b64f240c50f8d0eec482b91570341446120
      3ea7e0b19560d7c0b0f5734f63b955286dfa8232b5ebe63324e2d9e7
      433f725803414462
    ISK result: (length: 64 bytes)
      544199d71f62f8d9a1fee55727e24fe4a45844593c2b6013c4fa3969
      d0e5debb2244675c0b43397cbb68d342b01fc0f98fc961469a25134d
      e9f0f813c1a57476
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-2">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      bb1c449b35f0ea79a65c209f329a693d475e0ce2387bed9fe4b78f60
      b2a27c219813fb2cfe175ef40d2222d9261e66da7d78f7c55a303b1b
      8611dcdfab880c47
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      10d5941d4933497fe31b9188d690b84465e2a2d158332a7267284a07
      1a8d0876fc5c8c329dc735d59a9f8ef6623ee23924704a2f929dd631
      ca981227ee82fff2
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-2">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x22,0x2b,0x6b,0x19,0x5f,0xe8,0x4b,0x16,0x52,0xba,0xdb,0x6f,
 0x6a,0x3a,0xe3,0xd2,0x43,0x41,0xe7,0x30,0x69,0x67,0xf0,0xb8,
 0x11,0x5b,0x40,0xd5,0x69,0x8c,0x7e,0x56,
};
const unsigned char tc_ya[] = {
 0xda,0x3d,0x23,0x70,0x0a,0x9e,0x56,0x99,0x25,0x8a,0xef,0x94,
 0xdc,0x06,0x0d,0xfd,0xa5,0xeb,0xb6,0x1f,0x02,0xa5,0xea,0x77,
 0xfa,0xd5,0x3f,0x4f,0xf0,0x97,0x6d,0x08,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd6,0xba,0xc4,0x80,0xf2,0xc3,0x86,0xc3,0x94,0xef,0xc7,0xc4,
 0x7a,0xdb,0x99,0x25,0xdc,0xd2,0x63,0x0b,0x64,0xf2,0x40,0xc5,
 0x0f,0x8d,0x0e,0xec,0x48,0x2b,0x91,0x57,
};
const unsigned char tc_yb[] = {
 0xd2,0x31,0x6b,0x45,0x47,0x18,0xc3,0x53,0x62,0xd8,0x3d,0x69,
 0xdf,0x63,0x20,0xf3,0x85,0x78,0xed,0x59,0x84,0x65,0x14,0x35,
 0xe2,0x94,0x97,0x62,0xd9,0x00,0xb8,0x0d,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x3e,0xa7,0xe0,0xb1,0x95,0x60,0xd7,0xc0,0xb0,0xf5,0x73,0x4f,
 0x63,0xb9,0x55,0x28,0x6d,0xfa,0x82,0x32,0xb5,0xeb,0xe6,0x33,
 0x24,0xe2,0xd9,0xe7,0x43,0x3f,0x72,0x58,
};
const unsigned char tc_K[] = {
 0x80,0xb6,0x9a,0x8a,0x76,0x45,0x7a,0xb6,0xa4,0xd7,0xf8,0x87,
 0xa4,0xbf,0x6b,0x55,0xa2,0xf8,0x0a,0xc1,0x9c,0x33,0x3f,0x91,
 0x7a,0x05,0xfc,0x98,0x87,0xc8,0xb4,0x0f,
};
const unsigned char tc_ISK_IR[] = {
 0xb6,0x9e,0xff,0xbf,0x61,0xb5,0x1d,0x56,0x40,0x1c,0x0f,0x65,
 0x60,0x1a,0xbe,0x42,0x8d,0xe8,0x20,0x6f,0xea,0xaf,0x0e,0x32,
 0x19,0x88,0x96,0xdc,0xae,0x7b,0x35,0xcd,0x2b,0x38,0x95,0x0a,
 0x39,0xdf,0xd5,0xd4,0xa7,0x91,0x64,0x61,0x4c,0x29,0x84,0xf7,
 0xda,0xa4,0x60,0xb5,0x88,0xc1,0xe8,0x0c,0x3f,0xa2,0x06,0x8a,
 0xf7,0x90,0x04,0x47,
};
const unsigned char tc_ISK_SY[] = {
 0x54,0x41,0x99,0xd7,0x1f,0x62,0xf8,0xd9,0xa1,0xfe,0xe5,0x57,
 0x27,0xe2,0x4f,0xe4,0xa4,0x58,0x44,0x59,0x3c,0x2b,0x60,0x13,
 0xc4,0xfa,0x39,0x69,0xd0,0xe5,0xde,0xbb,0x22,0x44,0x67,0x5c,
 0x0b,0x43,0x39,0x7c,0xbb,0x68,0xd3,0x42,0xb0,0x1f,0xc0,0xf9,
 0x8f,0xc9,0x61,0x46,0x9a,0x25,0x13,0x4d,0xe9,0xf0,0xf8,0x13,
 0xc1,0xa5,0x74,0x76,
};
const unsigned char tc_sid_out_ir[] = {
 0xbb,0x1c,0x44,0x9b,0x35,0xf0,0xea,0x79,0xa6,0x5c,0x20,0x9f,
 0x32,0x9a,0x69,0x3d,0x47,0x5e,0x0c,0xe2,0x38,0x7b,0xed,0x9f,
 0xe4,0xb7,0x8f,0x60,0xb2,0xa2,0x7c,0x21,0x98,0x13,0xfb,0x2c,
 0xfe,0x17,0x5e,0xf4,0x0d,0x22,0x22,0xd9,0x26,0x1e,0x66,0xda,
 0x7d,0x78,0xf7,0xc5,0x5a,0x30,0x3b,0x1b,0x86,0x11,0xdc,0xdf,
 0xab,0x88,0x0c,0x47,
};
const unsigned char tc_sid_out_oc[] = {
 0x10,0xd5,0x94,0x1d,0x49,0x33,0x49,0x7f,0xe3,0x1b,0x91,0x88,
 0xd6,0x90,0xb8,0x44,0x65,0xe2,0xa2,0xd1,0x58,0x33,0x2a,0x72,
 0x67,0x28,0x4a,0x07,0x1a,0x8d,0x08,0x76,0xfc,0x5c,0x8c,0x32,
 0x9d,0xc7,0x35,0xd5,0x9a,0x9f,0x8e,0xf6,0x62,0x3e,0xe2,0x39,
 0x24,0x70,0x4a,0x2f,0x92,0x9d,0xd6,0x31,0xca,0x98,0x12,0x27,
 0xee,0x82,0xff,0xf2,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-12">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0
 #NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImciOiAiMjIyQjZCMTk1RkU4NE
 #IxNjUyQkFEQjZGNkEzQUUzRDI0MzQxRTczMDY5NjdGMEI4MTE1QjQwRDU2OThDN0U1
 #NiIsICJ5YSI6ICJEQTNEMjM3MDBBOUU1Njk5MjU4QUVGOTREQzA2MERGREE1RUJCNj
 #FGMDJBNUVBNzdGQUQ1M0Y0RkYwOTc2RDA4IiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEi
 #OiAiRDZCQUM0ODBGMkMzODZDMzk0RUZDN0M0N0FEQjk5MjVEQ0QyNjMwQjY0RjI0ME
 #M1MEY4RDBFRUM0ODJCOTE1NyIsICJ5YiI6ICJEMjMxNkI0NTQ3MThDMzUzNjJEODNE
 #NjlERjYzMjBGMzg1NzhFRDU5ODQ2NTE0MzVFMjk0OTc2MkQ5MDBCODBEIiwgIkFEYi
 #I6ICI0MTQ0NjIiLCAiWWIiOiAiM0VBN0UwQjE5NTYwRDdDMEIwRjU3MzRGNjNCOTU1
 #Mjg2REZBODIzMkI1RUJFNjMzMjRFMkQ5RTc0MzNGNzI1OCIsICJLIjogIjgwQjY5QT
 #hBNzY0NTdBQjZBNEQ3Rjg4N0E0QkY2QjU1QTJGODBBQzE5QzMzM0Y5MTdBMDVGQzk4
 #ODdDOEI0MEYiLCAiSVNLX0lSIjogIkI2OUVGRkJGNjFCNTFENTY0MDFDMEY2NTYwMU
 #FCRTQyOERFODIwNkZFQUFGMEUzMjE5ODg5NkRDQUU3QjM1Q0QyQjM4OTUwQTM5REZE
 #NUQ0QTc5MTY0NjE0QzI5ODRGN0RBQTQ2MEI1ODhDMUU4MEMzRkEyMDY4QUY3OTAwND
 #Q3IiwgIklTS19TWSI6ICI1NDQxOTlENzFGNjJGOEQ5QTFGRUU1NTcyN0UyNEZFNEE0
 #NTg0NDU5M0MyQjYwMTNDNEZBMzk2OUQwRTVERUJCMjI0NDY3NUMwQjQzMzk3Q0JCNj
 #hEMzQyQjAxRkMwRjk4RkM5NjE0NjlBMjUxMzRERTlGMEY4MTNDMUE1NzQ3NiIsICJz
 #aWRfb3V0cHV0X2lyIjogIkJCMUM0NDlCMzVGMEVBNzlBNjVDMjA5RjMyOUE2OTNEND
 #c1RTBDRTIzODdCRUQ5RkU0Qjc4RjYwQjJBMjdDMjE5ODEzRkIyQ0ZFMTc1RUY0MEQy
 #MjIyRDkyNjFFNjZEQTdENzhGN0M1NUEzMDNCMUI4NjExRENERkFCODgwQzQ3IiwgIn
 #NpZF9vdXRwdXRfb2MiOiAiMTBENTk0MUQ0OTMzNDk3RkUzMUI5MTg4RDY5MEI4NDQ2
 #NUUyQTJEMTU4MzMyQTcyNjcyODRBMDcxQThEMDg3NkZDNUM4QzMyOURDNzM1RDU5QT
 #lGOEVGNjYyM0VFMjM5MjQ3MDRBMkY5MjlERDYzMUNBOTgxMjI3RUU4MkZGRjIifQ==
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    X: (length: 32 bytes)
      2c3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    G.scalar_mult(s,decode(X)): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
    G.scalar_mult_vfy(s,X): (length: 32 bytes)
      7c13645fe790a468f62c39beb7388e541d8405d1ade69d1778c5fe3e
      7f6b600e
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      7cd0e075fa7955ba52c02759a6c90dbbfc10e6d40aea8d283e407d88
      cf538a05
    Y_i1: (length: 32 bytes)
      2b3c6b8c4f3800e7aef6864025b4ed79bd599117e427c41bd47d93d6
      54b4a51c
    Y_i2 == G.I: (length: 32 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-13">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI3Q0QwRTA3NUZBNzk1NUJBNTJDMDI3NTlBNkM5MERCQk
 #ZDMTBFNkQ0MEFFQThEMjgzRTQwN0Q4OENGNTM4QTA1IiwgIlgiOiAiMkMzQzZCOEM0
 #RjM4MDBFN0FFRjY4NjQwMjVCNEVENzlCRDU5OTExN0U0MjdDNDFCRDQ3RDkzRDY1NE
 #I0QTUxQyIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICI3QzEzNjQ1RkU3
 #OTBBNDY4RjYyQzM5QkVCNzM4OEU1NDFEODQwNUQxQURFNjlEMTc3OEM1RkUzRTdGNk
 #I2MDBFIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiN0MxMzY0NUZFNzkwQTQ2
 #OEY2MkMzOUJFQjczODhFNTQxRDg0MDVEMUFERTY5RDE3NzhDNUZFM0U3RjZCNjAwRS
 #J9LCAiSW52YWxpZCBZMSI6ICIyQjNDNkI4QzRGMzgwMEU3QUVGNjg2NDAyNUI0RUQ3
 #OUJENTk5MTE3RTQyN0M0MUJENDdEOTNENjU0QjRBNTFDIiwgIkludmFsaWQgWTIiOi
 #AiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-decaf448-and-hash-shake-256">
        <name>Test vector for CPace using group decaf448 and hash SHAKE-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-decaf448">
          <name>Test vectors for calculate_generator with group decaf448</name>
          <artwork><![CDATA[
  Inputs
    H   = SHAKE-256 with input block size 136 bytes.
    PRS = b'Password' ; ZPAD length: 112 ;
    DSI = b'CPaceDecaf448'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 5223e0cdc45d6575668d64c552004124
  Outputs
    generator_string(G.DSI,PRS,CI,sid,H.s_in_bytes):
    (length: 178 bytes)
      0d435061636544656361663434380850617373776f72647000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000180b415f
      696e69746961746f720b425f726573706f6e646572105223e0cdc45d
      6575668d64c552004124
    hash result: (length: 112 bytes)
      8ad1e4999548af985785a92cf36c5ba8b75115c7b38359ddb45a7347
      ab381673a3aeaac0edf6aaa666f9f4362d0115d8b9ead3e3b0235de1
      4032c6952ac33ea84af04081bda042548c7bde48a2950cd5a370b786
      e2e5ef832b113f0ba86f46954ea5f1f99b50ce7e65d35ca3a8f93bf6
    encoded generator g: (length: 56 bytes)
      b47b2c3e328ea9f318ca695af65dc838ba5a58bdb8087ae6c6ab486a
      8bfcb13d35b301dddca91d1540a4106d38ba1bf152e5bba104193c7e
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-14">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQUtFLTI1NiIsICJILnNfaW5fYnl0ZXMiOiAxMzYsICJQUlMiOiAiNT
 #A2MTczNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDExMiwgIkRTSSI6ICI0MzUw
 #NjE2MzY1NDQ2NTYzNjE2NjM0MzQzOCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3NDY5Nj
 #E3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjUyMjNFMENE
 #QzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0
 #ksUFJTLENJLHNpZCxILnNfaW5fYnl0ZXMpIjogIjBENDM1MDYxNjM2NTQ0NjU2MzYx
 #NjYzNDM0MzgwODUwNjE3MzczNzc2RjcyNjQ3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMTgwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2
 #NDY1NzIxMDUyMjNFMENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImhhc2ggcm
 #VzdWx0IjogIjhBRDFFNDk5OTU0OEFGOTg1Nzg1QTkyQ0YzNkM1QkE4Qjc1MTE1QzdC
 #MzgzNTlEREI0NUE3MzQ3QUIzODE2NzNBM0FFQUFDMEVERjZBQUE2NjZGOUY0MzYyRD
 #AxMTVEOEI5RUFEM0UzQjAyMzVERTE0MDMyQzY5NTJBQzMzRUE4NEFGMDQwODFCREEw
 #NDI1NDhDN0JERTQ4QTI5NTBDRDVBMzcwQjc4NkUyRTVFRjgzMkIxMTNGMEJBODZGND
 #Y5NTRFQTVGMUY5OUI1MENFN0U2NUQzNUNBM0E4RjkzQkY2IiwgImVuY29kZWQgZ2Vu
 #ZXJhdG9yIGciOiAiQjQ3QjJDM0UzMjhFQTlGMzE4Q0E2OTVBRjY1REM4MzhCQTVBNT
 #hCREI4MDg3QUU2QzZBQjQ4NkE4QkZDQjEzRDM1QjMwMURERENBOTFEMTU0MEE0MTA2
 #RDM4QkExQkYxNTJFNUJCQTEwNDE5M0M3RSJ9
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-3">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (little endian): (length: 56 bytes)
      33d561f13cfc0dca279c30e8cde895175dc25483892819eba132d58c
      13c0462a8eb0d73fda941950594bef5191d8394691f86edffcad6c1e
  Outputs
    Ya: (length: 56 bytes)
      d2926adf737d8dfe46ae47cdd0a56bbcdad96958512d39f9865ad1b6
      4b5304d4d1696983cd6d38d57e3cdb1080262198b5d4c497c64926a5
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-3">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (little endian): (length: 56 bytes)
      2523c969f68fa2b2aea294c2539ef36eb1e0558abd14712a7828f16a
      85ed2c7e77e2bdd418994405fb1b57b6bbaadd66849892aac9d81402
  Outputs
    Yb: (length: 56 bytes)
      2e620e5d0bc4637f1ff97ddccb015141b2c3241b4abcb5931a7e22a9
      9fe256ae543733ce4e4c41826dda142fbfeb2639727a5233f8f0a42a
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-3">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 56 bytes)
      ee0c0ead075ed5637e167cd3e16415c114aee6e21adaddc0de9151b2
      930833e2862f4e4ec30c91de5c5249a724d9114860f2bcbbb6ca83fd
    scalar_mult_vfy(yb,Ya): (length: 56 bytes)
      ee0c0ead075ed5637e167cd3e16415c114aee6e21adaddc0de9151b2
      930833e2862f4e4ec30c91de5c5249a724d9114860f2bcbbb6ca83fd
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-3">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 122 bytes)
      38d2926adf737d8dfe46ae47cdd0a56bbcdad96958512d39f9865ad1
      b64b5304d4d1696983cd6d38d57e3cdb1080262198b5d4c497c64926
      a503414461382e620e5d0bc4637f1ff97ddccb015141b2c3241b4abc
      b5931a7e22a99fe256ae543733ce4e4c41826dda142fbfeb2639727a
      5233f8f0a42a03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 214 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438ee0c0ead075ed5637e167cd3e16415c114aee6e2
      1adaddc0de9151b2930833e2862f4e4ec30c91de5c5249a724d91148
      60f2bcbbb6ca83fd38d2926adf737d8dfe46ae47cdd0a56bbcdad969
      58512d39f9865ad1b64b5304d4d1696983cd6d38d57e3cdb10802621
      98b5d4c497c64926a503414461382e620e5d0bc4637f1ff97ddccb01
      5141b2c3241b4abcb5931a7e22a99fe256ae543733ce4e4c41826dda
      142fbfeb2639727a5233f8f0a42a03414462
    ISK result: (length: 64 bytes)
      6f3a66ce20e1bad279d32d65844cd66b7352eb61a9eb37631168fe80
      3c83c6601c6a3e0867f4b2dbe2b0cb1b530912892d2b5eb9af2e3ab3
      d8682a33e178d1d2
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-3">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 124 bytes)
      6f6338d2926adf737d8dfe46ae47cdd0a56bbcdad96958512d39f986
      5ad1b64b5304d4d1696983cd6d38d57e3cdb1080262198b5d4c497c6
      4926a503414461382e620e5d0bc4637f1ff97ddccb015141b2c3241b
      4abcb5931a7e22a99fe256ae543733ce4e4c41826dda142fbfeb2639
      727a5233f8f0a42a03414462
    DSI = G.DSI_ISK, b'CPaceDecaf448_ISK': (length: 17 bytes)
      435061636544656361663434385f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 216 bytes)
      11435061636544656361663434385f49534b105223e0cdc45d657566
      8d64c55200412438ee0c0ead075ed5637e167cd3e16415c114aee6e2
      1adaddc0de9151b2930833e2862f4e4ec30c91de5c5249a724d91148
      60f2bcbbb6ca83fd6f6338d2926adf737d8dfe46ae47cdd0a56bbcda
      d96958512d39f9865ad1b64b5304d4d1696983cd6d38d57e3cdb1080
      262198b5d4c497c64926a503414461382e620e5d0bc4637f1ff97ddc
      cb015141b2c3241b4abcb5931a7e22a99fe256ae543733ce4e4c4182
      6dda142fbfeb2639727a5233f8f0a42a03414462
    ISK result: (length: 64 bytes)
      59012b30b7a4050d1e83f7157da6cdd5baf77bf432f545e7baa1a2a1
      0bc29ef1345f9cfe2fb448bfe8a48a470d90d94cd73e4c99fc1c8b65
      1d43fb3ebed3a88f
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-3">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      9b3fb936e2b9d00da70841392bf012f3d0c1bcf0a8861020f7882b0d
      7f1e54eaf6e4d850ea4ed3169e630f2968d69e19338ae23d74febf00
      3b41600b0de91ad6
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      dfdf19db27b99dbf0a8943ee6a5395b48664e3930bdb0cf5a4e79646
      52e2ceafaee3645ee668a047f3fb259affac4eaec76014c2a01d2064
      9e96a19abde0cd22
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-3">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x52,0x23,0xe0,0xcd,0xc4,0x5d,0x65,0x75,0x66,0x8d,0x64,0xc5,
 0x52,0x00,0x41,0x24,
};
const unsigned char tc_g[] = {
 0xb4,0x7b,0x2c,0x3e,0x32,0x8e,0xa9,0xf3,0x18,0xca,0x69,0x5a,
 0xf6,0x5d,0xc8,0x38,0xba,0x5a,0x58,0xbd,0xb8,0x08,0x7a,0xe6,
 0xc6,0xab,0x48,0x6a,0x8b,0xfc,0xb1,0x3d,0x35,0xb3,0x01,0xdd,
 0xdc,0xa9,0x1d,0x15,0x40,0xa4,0x10,0x6d,0x38,0xba,0x1b,0xf1,
 0x52,0xe5,0xbb,0xa1,0x04,0x19,0x3c,0x7e,
};
const unsigned char tc_ya[] = {
 0x33,0xd5,0x61,0xf1,0x3c,0xfc,0x0d,0xca,0x27,0x9c,0x30,0xe8,
 0xcd,0xe8,0x95,0x17,0x5d,0xc2,0x54,0x83,0x89,0x28,0x19,0xeb,
 0xa1,0x32,0xd5,0x8c,0x13,0xc0,0x46,0x2a,0x8e,0xb0,0xd7,0x3f,
 0xda,0x94,0x19,0x50,0x59,0x4b,0xef,0x51,0x91,0xd8,0x39,0x46,
 0x91,0xf8,0x6e,0xdf,0xfc,0xad,0x6c,0x1e,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0xd2,0x92,0x6a,0xdf,0x73,0x7d,0x8d,0xfe,0x46,0xae,0x47,0xcd,
 0xd0,0xa5,0x6b,0xbc,0xda,0xd9,0x69,0x58,0x51,0x2d,0x39,0xf9,
 0x86,0x5a,0xd1,0xb6,0x4b,0x53,0x04,0xd4,0xd1,0x69,0x69,0x83,
 0xcd,0x6d,0x38,0xd5,0x7e,0x3c,0xdb,0x10,0x80,0x26,0x21,0x98,
 0xb5,0xd4,0xc4,0x97,0xc6,0x49,0x26,0xa5,
};
const unsigned char tc_yb[] = {
 0x25,0x23,0xc9,0x69,0xf6,0x8f,0xa2,0xb2,0xae,0xa2,0x94,0xc2,
 0x53,0x9e,0xf3,0x6e,0xb1,0xe0,0x55,0x8a,0xbd,0x14,0x71,0x2a,
 0x78,0x28,0xf1,0x6a,0x85,0xed,0x2c,0x7e,0x77,0xe2,0xbd,0xd4,
 0x18,0x99,0x44,0x05,0xfb,0x1b,0x57,0xb6,0xbb,0xaa,0xdd,0x66,
 0x84,0x98,0x92,0xaa,0xc9,0xd8,0x14,0x02,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x2e,0x62,0x0e,0x5d,0x0b,0xc4,0x63,0x7f,0x1f,0xf9,0x7d,0xdc,
 0xcb,0x01,0x51,0x41,0xb2,0xc3,0x24,0x1b,0x4a,0xbc,0xb5,0x93,
 0x1a,0x7e,0x22,0xa9,0x9f,0xe2,0x56,0xae,0x54,0x37,0x33,0xce,
 0x4e,0x4c,0x41,0x82,0x6d,0xda,0x14,0x2f,0xbf,0xeb,0x26,0x39,
 0x72,0x7a,0x52,0x33,0xf8,0xf0,0xa4,0x2a,
};
const unsigned char tc_K[] = {
 0xee,0x0c,0x0e,0xad,0x07,0x5e,0xd5,0x63,0x7e,0x16,0x7c,0xd3,
 0xe1,0x64,0x15,0xc1,0x14,0xae,0xe6,0xe2,0x1a,0xda,0xdd,0xc0,
 0xde,0x91,0x51,0xb2,0x93,0x08,0x33,0xe2,0x86,0x2f,0x4e,0x4e,
 0xc3,0x0c,0x91,0xde,0x5c,0x52,0x49,0xa7,0x24,0xd9,0x11,0x48,
 0x60,0xf2,0xbc,0xbb,0xb6,0xca,0x83,0xfd,
};
const unsigned char tc_ISK_IR[] = {
 0x6f,0x3a,0x66,0xce,0x20,0xe1,0xba,0xd2,0x79,0xd3,0x2d,0x65,
 0x84,0x4c,0xd6,0x6b,0x73,0x52,0xeb,0x61,0xa9,0xeb,0x37,0x63,
 0x11,0x68,0xfe,0x80,0x3c,0x83,0xc6,0x60,0x1c,0x6a,0x3e,0x08,
 0x67,0xf4,0xb2,0xdb,0xe2,0xb0,0xcb,0x1b,0x53,0x09,0x12,0x89,
 0x2d,0x2b,0x5e,0xb9,0xaf,0x2e,0x3a,0xb3,0xd8,0x68,0x2a,0x33,
 0xe1,0x78,0xd1,0xd2,
};
const unsigned char tc_ISK_SY[] = {
 0x59,0x01,0x2b,0x30,0xb7,0xa4,0x05,0x0d,0x1e,0x83,0xf7,0x15,
 0x7d,0xa6,0xcd,0xd5,0xba,0xf7,0x7b,0xf4,0x32,0xf5,0x45,0xe7,
 0xba,0xa1,0xa2,0xa1,0x0b,0xc2,0x9e,0xf1,0x34,0x5f,0x9c,0xfe,
 0x2f,0xb4,0x48,0xbf,0xe8,0xa4,0x8a,0x47,0x0d,0x90,0xd9,0x4c,
 0xd7,0x3e,0x4c,0x99,0xfc,0x1c,0x8b,0x65,0x1d,0x43,0xfb,0x3e,
 0xbe,0xd3,0xa8,0x8f,
};
const unsigned char tc_sid_out_ir[] = {
 0x9b,0x3f,0xb9,0x36,0xe2,0xb9,0xd0,0x0d,0xa7,0x08,0x41,0x39,
 0x2b,0xf0,0x12,0xf3,0xd0,0xc1,0xbc,0xf0,0xa8,0x86,0x10,0x20,
 0xf7,0x88,0x2b,0x0d,0x7f,0x1e,0x54,0xea,0xf6,0xe4,0xd8,0x50,
 0xea,0x4e,0xd3,0x16,0x9e,0x63,0x0f,0x29,0x68,0xd6,0x9e,0x19,
 0x33,0x8a,0xe2,0x3d,0x74,0xfe,0xbf,0x00,0x3b,0x41,0x60,0x0b,
 0x0d,0xe9,0x1a,0xd6,
};
const unsigned char tc_sid_out_oc[] = {
 0xdf,0xdf,0x19,0xdb,0x27,0xb9,0x9d,0xbf,0x0a,0x89,0x43,0xee,
 0x6a,0x53,0x95,0xb4,0x86,0x64,0xe3,0x93,0x0b,0xdb,0x0c,0xf5,
 0xa4,0xe7,0x96,0x46,0x52,0xe2,0xce,0xaf,0xae,0xe3,0x64,0x5e,
 0xe6,0x68,0xa0,0x47,0xf3,0xfb,0x25,0x9a,0xff,0xac,0x4e,0xae,
 0xc7,0x60,0x14,0xc2,0xa0,0x1d,0x20,0x64,0x9e,0x96,0xa1,0x9a,
 0xbd,0xe0,0xcd,0x22,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-15">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjUyMjNF
 #MENEQzQ1RDY1NzU2NjhENjRDNTUyMDA0MTI0IiwgImciOiAiQjQ3QjJDM0UzMjhFQT
 #lGMzE4Q0E2OTVBRjY1REM4MzhCQTVBNThCREI4MDg3QUU2QzZBQjQ4NkE4QkZDQjEz
 #RDM1QjMwMURERENBOTFEMTU0MEE0MTA2RDM4QkExQkYxNTJFNUJCQTEwNDE5M0M3RS
 #IsICJ5YSI6ICIzM0Q1NjFGMTNDRkMwRENBMjc5QzMwRThDREU4OTUxNzVEQzI1NDgz
 #ODkyODE5RUJBMTMyRDU4QzEzQzA0NjJBOEVCMEQ3M0ZEQTk0MTk1MDU5NEJFRjUxOT
 #FEODM5NDY5MUY4NkVERkZDQUQ2QzFFIiwgIkFEYSI6ICI0MTQ0NjEiLCAiWWEiOiAi
 #RDI5MjZBREY3MzdEOERGRTQ2QUU0N0NERDBBNTZCQkNEQUQ5Njk1ODUxMkQzOUY5OD
 #Y1QUQxQjY0QjUzMDRENEQxNjk2OTgzQ0Q2RDM4RDU3RTNDREIxMDgwMjYyMTk4QjVE
 #NEM0OTdDNjQ5MjZBNSIsICJ5YiI6ICIyNTIzQzk2OUY2OEZBMkIyQUVBMjk0QzI1Mz
 #lFRjM2RUIxRTA1NThBQkQxNDcxMkE3ODI4RjE2QTg1RUQyQzdFNzdFMkJERDQxODk5
 #NDQwNUZCMUI1N0I2QkJBQURENjY4NDk4OTJBQUM5RDgxNDAyIiwgIkFEYiI6ICI0MT
 #Q0NjIiLCAiWWIiOiAiMkU2MjBFNUQwQkM0NjM3RjFGRjk3RERDQ0IwMTUxNDFCMkMz
 #MjQxQjRBQkNCNTkzMUE3RTIyQTk5RkUyNTZBRTU0MzczM0NFNEU0QzQxODI2RERBMT
 #QyRkJGRUIyNjM5NzI3QTUyMzNGOEYwQTQyQSIsICJLIjogIkVFMEMwRUFEMDc1RUQ1
 #NjM3RTE2N0NEM0UxNjQxNUMxMTRBRUU2RTIxQURBRERDMERFOTE1MUIyOTMwODMzRT
 #I4NjJGNEU0RUMzMEM5MURFNUM1MjQ5QTcyNEQ5MTE0ODYwRjJCQ0JCQjZDQTgzRkQi
 #LCAiSVNLX0lSIjogIjZGM0E2NkNFMjBFMUJBRDI3OUQzMkQ2NTg0NENENjZCNzM1Mk
 #VCNjFBOUVCMzc2MzExNjhGRTgwM0M4M0M2NjAxQzZBM0UwODY3RjRCMkRCRTJCMENC
 #MUI1MzA5MTI4OTJEMkI1RUI5QUYyRTNBQjNEODY4MkEzM0UxNzhEMUQyIiwgIklTS1
 #9TWSI6ICI1OTAxMkIzMEI3QTQwNTBEMUU4M0Y3MTU3REE2Q0RENUJBRjc3QkY0MzJG
 #NTQ1RTdCQUExQTJBMTBCQzI5RUYxMzQ1RjlDRkUyRkI0NDhCRkU4QTQ4QTQ3MEQ5ME
 #Q5NENENzNFNEM5OUZDMUM4QjY1MUQ0M0ZCM0VCRUQzQTg4RiIsICJzaWRfb3V0cHV0
 #X2lyIjogIjlCM0ZCOTM2RTJCOUQwMERBNzA4NDEzOTJCRjAxMkYzRDBDMUJDRjBBOD
 #g2MTAyMEY3ODgyQjBEN0YxRTU0RUFGNkU0RDg1MEVBNEVEMzE2OUU2MzBGMjk2OEQ2
 #OUUxOTMzOEFFMjNENzRGRUJGMDAzQjQxNjAwQjBERTkxQUQ2IiwgInNpZF9vdXRwdX
 #Rfb2MiOiAiREZERjE5REIyN0I5OURCRjBBODk0M0VFNkE1Mzk1QjQ4NjY0RTM5MzBC
 #REIwQ0Y1QTRFNzk2NDY1MkUyQ0VBRkFFRTM2NDVFRTY2OEEwNDdGM0ZCMjU5QUZGQU
 #M0RUFFQzc2MDE0QzJBMDFEMjA2NDlFOTZBMTlBQkRFMENEMjIifQ==
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmult-with-valid-inputs-1">
          <name>Test case for scalar_mult with valid inputs</name>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    X: (length: 56 bytes)
      601431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    G.scalar_mult(s,decode(X)): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
    G.scalar_mult_vfy(s,X): (length: 56 bytes)
      388b35c60eb41b66085a2118316218681d78979d667702de105fdc1f
      21ffe884a577d795f45691781390a229a3bd7b527e831380f2f585a4
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-1">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When points Y_i1 or Y_i2 are included in message of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 56 bytes)
      dd1bc7015daabb7672129cc35a3ba815486b139deff9bdeca7a4fc61
      34323d34658761e90ff079972a7ca8aa5606498f4f4f0ebc0933a819
    Y_i1: (length: 56 bytes)
      5f1431d5e51f43d422a92d3fb2373bde28217aab42524c341aa404ea
      ba5aa5541f7042dbb3253ce4c90f772b038a413dcb3a0f6bf3ae9e21
    Y_i2 == G.I: (length: 56 bytes)
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-16">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJERDFCQzcwMTVEQUFCQjc2NzIxMjlDQzM1QTNCQTgxNT
 #Q4NkIxMzlERUZGOUJERUNBN0E0RkM2MTM0MzIzRDM0NjU4NzYxRTkwRkYwNzk5NzJB
 #N0NBOEFBNTYwNjQ5OEY0RjRGMEVCQzA5MzNBODE5IiwgIlgiOiAiNjAxNDMxRDVFNT
 #FGNDNENDIyQTkyRDNGQjIzNzNCREUyODIxN0FBQjQyNTI0QzM0MUFBNDA0RUFCQTVB
 #QTU1NDFGNzA0MkRCQjMyNTNDRTRDOTBGNzcyQjAzOEE0MTNEQ0IzQTBGNkJGM0FFOU
 #UyMSIsICJHLnNjYWxhcl9tdWx0KHMsZGVjb2RlKFgpKSI6ICIzODhCMzVDNjBFQjQx
 #QjY2MDg1QTIxMTgzMTYyMTg2ODFENzg5NzlENjY3NzAyREUxMDVGREMxRjIxRkZFOD
 #g0QTU3N0Q3OTVGNDU2OTE3ODEzOTBBMjI5QTNCRDdCNTI3RTgzMTM4MEYyRjU4NUE0
 #IiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkiOiAiMzg4QjM1QzYwRUI0MUI2NjA4NU
 #EyMTE4MzE2MjE4NjgxRDc4OTc5RDY2NzcwMkRFMTA1RkRDMUYyMUZGRTg4NEE1NzdE
 #Nzk1RjQ1NjkxNzgxMzkwQTIyOUEzQkQ3QjUyN0U4MzEzODBGMkY1ODVBNCJ9LCAiSW
 #52YWxpZCBZMSI6ICI1RjE0MzFENUU1MUY0M0Q0MjJBOTJEM0ZCMjM3M0JERTI4MjE3
 #QUFCNDI1MjRDMzQxQUE0MDRFQUJBNUFBNTU0MUY3MDQyREJCMzI1M0NFNEM5MEY3Nz
 #JCMDM4QTQxM0RDQjNBMEY2QkYzQUU5RTIxIiwgIkludmFsaWQgWTIiOiAiMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-256-and-hash-sha-256">
        <name>Test vector for CPace using group NIST P-256 and hash SHA-256</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-256">
          <name>Test vectors for calculate_generator with group NIST P-256</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-256 with input block size 64 bytes.
    PRS = b'Password' ; ZPAD length: 23 ;
    DSI = b'CPaceP256_XMD:SHA-256_SSWU_NU_'
    DST = b'CPaceP256_XMD:SHA-256_SSWU_NU__DST'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 34b36454cab2e7842c389f7d88ecb7df
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 106 bytes)
      1e4350616365503235365f584d443a5348412d3235365f535357555f
      4e555f0850617373776f726417000000000000000000000000000000
      0000000000000000180b415f696e69746961746f720b425f72657370
      6f6e6465721034b36454cab2e7842c389f7d88ecb7df
    generator g: (length: 65 bytes)
      0439bff2b051701594d3e9c7e93be9213af15db42214dfc4f7ee929a
      6697f774d7ba5fb289b982399e4acd281a988bf058ea7ff6d7ff34fd
      b72157bb464ff4af87
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-17">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0yNTYiLCAiSC5zX2luX2J5dGVzIjogNjQsICJQUlMiOiAiNTA2MT
 #czNzM3NzZGNzI2NCIsICJaUEFEIGxlbmd0aCI6IDIzLCAiRFNJIjogIjQzNTA2MTYz
 #NjU1MDMyMzUzNjVGNTg0RDQ0M0E1MzQ4NDEyRDMyMzUzNjVGNTM1MzU3NTU1RjRFNT
 #U1RiIsICJDSSI6ICIwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3
 #MDZGNkU2NDY1NzIiLCAic2lkIjogIjM0QjM2NDU0Q0FCMkU3ODQyQzM4OUY3RDg4RU
 #NCN0RGIiwgImdlbmVyYXRvcl9zdHJpbmcoRy5EU0ksUFJTLENJLHNpZCxILnNfaW5f
 #Ynl0ZXMpIjogIjFFNDM1MDYxNjM2NTUwMzIzNTM2NUY1ODRENDQzQTUzNDg0MTJEMz
 #IzNTM2NUY1MzUzNTc1NTVGNEU1NTVGMDg1MDYxNzM3Mzc3NkY3MjY0MTcwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTgwQjQxNUY2OT
 #ZFNjk3NDY5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIxMDM0QjM2NDU0
 #Q0FCMkU3ODQyQzM4OUY3RDg4RUNCN0RGIiwgImdlbmVyYXRvciBnIjogIjA0MzlCRk
 #YyQjA1MTcwMTU5NEQzRTlDN0U5M0JFOTIxM0FGMTVEQjQyMjE0REZDNEY3RUU5MjlB
 #NjY5N0Y3NzREN0JBNUZCMjg5Qjk4MjM5OUU0QUNEMjgxQTk4OEJGMDU4RUE3RkY2RD
 #dGRjM0RkRCNzIxNTdCQjQ2NEZGNEFGODcifQ==
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-4">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 32 bytes)
      37574cfbf1b95ff6a8e2d7be462d4d01e6dde2618f34f4de9df869b2
      4f532c5d
  Outputs
    Ya: (length: 65 bytes)
      04cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901ef962
      c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16fc19c3
      2a7b31aab097919736
    Alternative correct value for Ya: (-ya)*g:
    (length: 65 bytes)
      04cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901ef962
      c2e2d486b208c7d9c2925a5570d01e7a51d325a782072d85ea03e63c
      d584ce554f686e68c9
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-4">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 32 bytes)
      e5672fc9eb4e721f41d80181ec4c9fd9886668acc48024d33c82bb10
      2aecba52
  Outputs
    Yb: (length: 65 bytes)
      046f538f9b8eb4e628bcace0fbba7d36fea44e98334d233c22101a2f
      28eb3afc1a61b2bd14c0f11b222b5ea34df7756d104e2b5da09c9e8f
      fa330c150f47e84cef
    Alternative correct value for Yb: (-yb)*g:
    (length: 65 bytes)
      046f538f9b8eb4e628bcace0fbba7d36fea44e98334d233c22101a2f
      28eb3afc1a9e4d42ea3f0ee4ded4a15cb2088a92efb1d4a260636170
      05ccf3eaf0b817b310
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-4">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 32 bytes)
      9dd152b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb
      3a0db812
    scalar_mult_vfy(yb,Ya): (length: 32 bytes)
      9dd152b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb
      3a0db812
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-4">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 140 bytes)
      4104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901ef9
      62c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16fc19
      c32a7b31aab0979197360341446141046f538f9b8eb4e628bcace0fb
      ba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0f11b22
      2b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef03414462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 225 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df209dd152
      b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb3a0db8
      124104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b901e
      f962c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16fc
      19c32a7b31aab0979197360341446141046f538f9b8eb4e628bcace0
      fbba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0f11b
      222b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef034144
      62
    ISK result: (length: 32 bytes)
      d67704f1c69b85736f273e73198a79fe5e4f60cb405e32f708e0aff5
      fdb5f9db
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-4">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 142 bytes)
      6f634104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b90
      1ef962c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a16
      fc19c32a7b31aab0979197360341446141046f538f9b8eb4e628bcac
      e0fbba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0f1
      1b222b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef0341
      4462
    DSI = G.DSI_ISK, b'CPaceP256_XMD:SHA-256_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503235365f584d443a5348412d3235365f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 227 bytes)
      224350616365503235365f584d443a5348412d3235365f535357555f
      4e555f5f49534b1034b36454cab2e7842c389f7d88ecb7df209dd152
      b687ded1e071cc0625bd1ffff4c4ccd7d77cb4987c7d1e4ecb3a0db8
      126f634104cf55f0a53a1b4c43002e1be8171f42737cf20b7cd6177b
      901ef962c2e2d486b2f738263c6da5aa902fe185ae2cda587df8d27a
      16fc19c32a7b31aab0979197360341446141046f538f9b8eb4e628bc
      ace0fbba7d36fea44e98334d233c22101a2f28eb3afc1a61b2bd14c0
      f11b222b5ea34df7756d104e2b5da09c9e8ffa330c150f47e84cef03
      414462
    ISK result: (length: 32 bytes)
      724ffa2de3685f12a10bb2eb013cb6c0378acef40b78f5b21dbd69f7
      2478e32b
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-4">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      28e98006db715c2de9817e847f937336ba510ed288cd55a6e7b020d0
      c85e74fe
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 32 bytes)
      dc11fd7db69958c3bd30d72171377444261975c599fa6e85f73bac00
      a85ad5c3
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-4">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x34,0xb3,0x64,0x54,0xca,0xb2,0xe7,0x84,0x2c,0x38,0x9f,0x7d,
 0x88,0xec,0xb7,0xdf,
};
const unsigned char tc_g[] = {
 0x04,0x39,0xbf,0xf2,0xb0,0x51,0x70,0x15,0x94,0xd3,0xe9,0xc7,
 0xe9,0x3b,0xe9,0x21,0x3a,0xf1,0x5d,0xb4,0x22,0x14,0xdf,0xc4,
 0xf7,0xee,0x92,0x9a,0x66,0x97,0xf7,0x74,0xd7,0xba,0x5f,0xb2,
 0x89,0xb9,0x82,0x39,0x9e,0x4a,0xcd,0x28,0x1a,0x98,0x8b,0xf0,
 0x58,0xea,0x7f,0xf6,0xd7,0xff,0x34,0xfd,0xb7,0x21,0x57,0xbb,
 0x46,0x4f,0xf4,0xaf,0x87,
};
const unsigned char tc_ya[] = {
 0x37,0x57,0x4c,0xfb,0xf1,0xb9,0x5f,0xf6,0xa8,0xe2,0xd7,0xbe,
 0x46,0x2d,0x4d,0x01,0xe6,0xdd,0xe2,0x61,0x8f,0x34,0xf4,0xde,
 0x9d,0xf8,0x69,0xb2,0x4f,0x53,0x2c,0x5d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0xcf,0x55,0xf0,0xa5,0x3a,0x1b,0x4c,0x43,0x00,0x2e,0x1b,
 0xe8,0x17,0x1f,0x42,0x73,0x7c,0xf2,0x0b,0x7c,0xd6,0x17,0x7b,
 0x90,0x1e,0xf9,0x62,0xc2,0xe2,0xd4,0x86,0xb2,0xf7,0x38,0x26,
 0x3c,0x6d,0xa5,0xaa,0x90,0x2f,0xe1,0x85,0xae,0x2c,0xda,0x58,
 0x7d,0xf8,0xd2,0x7a,0x16,0xfc,0x19,0xc3,0x2a,0x7b,0x31,0xaa,
 0xb0,0x97,0x91,0x97,0x36,
};
const unsigned char tc_yb[] = {
 0xe5,0x67,0x2f,0xc9,0xeb,0x4e,0x72,0x1f,0x41,0xd8,0x01,0x81,
 0xec,0x4c,0x9f,0xd9,0x88,0x66,0x68,0xac,0xc4,0x80,0x24,0xd3,
 0x3c,0x82,0xbb,0x10,0x2a,0xec,0xba,0x52,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x6f,0x53,0x8f,0x9b,0x8e,0xb4,0xe6,0x28,0xbc,0xac,0xe0,
 0xfb,0xba,0x7d,0x36,0xfe,0xa4,0x4e,0x98,0x33,0x4d,0x23,0x3c,
 0x22,0x10,0x1a,0x2f,0x28,0xeb,0x3a,0xfc,0x1a,0x61,0xb2,0xbd,
 0x14,0xc0,0xf1,0x1b,0x22,0x2b,0x5e,0xa3,0x4d,0xf7,0x75,0x6d,
 0x10,0x4e,0x2b,0x5d,0xa0,0x9c,0x9e,0x8f,0xfa,0x33,0x0c,0x15,
 0x0f,0x47,0xe8,0x4c,0xef,
};
const unsigned char tc_K[] = {
 0x9d,0xd1,0x52,0xb6,0x87,0xde,0xd1,0xe0,0x71,0xcc,0x06,0x25,
 0xbd,0x1f,0xff,0xf4,0xc4,0xcc,0xd7,0xd7,0x7c,0xb4,0x98,0x7c,
 0x7d,0x1e,0x4e,0xcb,0x3a,0x0d,0xb8,0x12,
};
const unsigned char tc_ISK_IR[] = {
 0xd6,0x77,0x04,0xf1,0xc6,0x9b,0x85,0x73,0x6f,0x27,0x3e,0x73,
 0x19,0x8a,0x79,0xfe,0x5e,0x4f,0x60,0xcb,0x40,0x5e,0x32,0xf7,
 0x08,0xe0,0xaf,0xf5,0xfd,0xb5,0xf9,0xdb,
};
const unsigned char tc_ISK_SY[] = {
 0x72,0x4f,0xfa,0x2d,0xe3,0x68,0x5f,0x12,0xa1,0x0b,0xb2,0xeb,
 0x01,0x3c,0xb6,0xc0,0x37,0x8a,0xce,0xf4,0x0b,0x78,0xf5,0xb2,
 0x1d,0xbd,0x69,0xf7,0x24,0x78,0xe3,0x2b,
};
const unsigned char tc_sid_out_ir[] = {
 0x28,0xe9,0x80,0x06,0xdb,0x71,0x5c,0x2d,0xe9,0x81,0x7e,0x84,
 0x7f,0x93,0x73,0x36,0xba,0x51,0x0e,0xd2,0x88,0xcd,0x55,0xa6,
 0xe7,0xb0,0x20,0xd0,0xc8,0x5e,0x74,0xfe,
};
const unsigned char tc_sid_out_oc[] = {
 0xdc,0x11,0xfd,0x7d,0xb6,0x99,0x58,0xc3,0xbd,0x30,0xd7,0x21,
 0x71,0x37,0x74,0x44,0x26,0x19,0x75,0xc5,0x99,0xfa,0x6e,0x85,
 0xf7,0x3b,0xac,0x00,0xa8,0x5a,0xd5,0xc3,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-18">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjM0QjM2
 #NDU0Q0FCMkU3ODQyQzM4OUY3RDg4RUNCN0RGIiwgImciOiAiMDQzOUJGRjJCMDUxNz
 #AxNTk0RDNFOUM3RTkzQkU5MjEzQUYxNURCNDIyMTRERkM0RjdFRTkyOUE2Njk3Rjc3
 #NEQ3QkE1RkIyODlCOTgyMzk5RTRBQ0QyODFBOTg4QkYwNThFQTdGRjZEN0ZGMzRGRE
 #I3MjE1N0JCNDY0RkY0QUY4NyIsICJ5YSI6ICIzNzU3NENGQkYxQjk1RkY2QThFMkQ3
 #QkU0NjJENEQwMUU2RERFMjYxOEYzNEY0REU5REY4NjlCMjRGNTMyQzVEIiwgIkFEYS
 #I6ICI0MTQ0NjEiLCAiWWEiOiAiMDRDRjU1RjBBNTNBMUI0QzQzMDAyRTFCRTgxNzFG
 #NDI3MzdDRjIwQjdDRDYxNzdCOTAxRUY5NjJDMkUyRDQ4NkIyRjczODI2M0M2REE1QU
 #E5MDJGRTE4NUFFMkNEQTU4N0RGOEQyN0ExNkZDMTlDMzJBN0IzMUFBQjA5NzkxOTcz
 #NiIsICJ5YiI6ICJFNTY3MkZDOUVCNEU3MjFGNDFEODAxODFFQzRDOUZEOTg4NjY2OE
 #FDQzQ4MDI0RDMzQzgyQkIxMDJBRUNCQTUyIiwgIkFEYiI6ICI0MTQ0NjIiLCAiWWIi
 #OiAiMDQ2RjUzOEY5QjhFQjRFNjI4QkNBQ0UwRkJCQTdEMzZGRUE0NEU5ODMzNEQyMz
 #NDMjIxMDFBMkYyOEVCM0FGQzFBNjFCMkJEMTRDMEYxMUIyMjJCNUVBMzRERjc3NTZE
 #MTA0RTJCNURBMDlDOUU4RkZBMzMwQzE1MEY0N0U4NENFRiIsICJLIjogIjlERDE1Mk
 #I2ODdERUQxRTA3MUNDMDYyNUJEMUZGRkY0QzRDQ0Q3RDc3Q0I0OTg3QzdEMUU0RUNC
 #M0EwREI4MTIiLCAiSVNLX0lSIjogIkQ2NzcwNEYxQzY5Qjg1NzM2RjI3M0U3MzE5OE
 #E3OUZFNUU0RjYwQ0I0MDVFMzJGNzA4RTBBRkY1RkRCNUY5REIiLCAiSVNLX1NZIjog
 #IjcyNEZGQTJERTM2ODVGMTJBMTBCQjJFQjAxM0NCNkMwMzc4QUNFRjQwQjc4RjVCMj
 #FEQkQ2OUY3MjQ3OEUzMkIiLCAic2lkX291dHB1dF9pciI6ICIyOEU5ODAwNkRCNzE1
 #QzJERTk4MTdFODQ3RjkzNzMzNkJBNTEwRUQyODhDRDU1QTZFN0IwMjBEMEM4NUU3NE
 #ZFIiwgInNpZF9vdXRwdXRfb2MiOiAiREMxMUZEN0RCNjk5NThDM0JEMzBENzIxNzEz
 #Nzc0NDQyNjE5NzVDNTk5RkE2RTg1RjczQkFDMDBBODVBRDVDMyJ9
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    X: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5831
    G.scalar_mult(s,X) (full coordinates): (length: 65 bytes)
      04f5a191f078c87c36633b78c701751159d56c59f3fe9105b5720673
      470f303ab925b6a7fd1cdd8f649a21cf36b68d9e9c4a11919a951892
      519786104b27033757
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 32 bytes)
      f5a191f078c87c36633b78c701751159d56c59f3fe9105b572067347
      0f303ab9
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-2">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 32 bytes)
      f012501c091ff9b99a123fffe571d8bc01e8077ee581362e1bd21399
      0835643b
    Y_i1: (length: 65 bytes)
      0424648eb986c2be0af636455cef0550671d6bcd8aa26e0d72ffa1b1
      fd12ba4e0f78da2b6d2184f31af39e566aef127014b6936c9a37346d
      10a4ab2514faef5857
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-19">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICJGMDEyNTAxQzA5MUZGOUI5OUExMjNGRkZFNTcxRDhCQz
 #AxRTgwNzdFRTU4MTM2MkUxQkQyMTM5OTA4MzU2NDNCIiwgIlgiOiAiMDQyNDY0OEVC
 #OTg2QzJCRTBBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRD
 #EyQkE0RTBGNzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3
 #MzQ2RDEwQTRBQjI1MTRGQUVGNTgzMSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bG
 #wgY29vcmRpbmF0ZXMpIjogIjA0RjVBMTkxRjA3OEM4N0MzNjYzM0I3OEM3MDE3NTEx
 #NTlENTZDNTlGM0ZFOTEwNUI1NzIwNjczNDcwRjMwM0FCOTI1QjZBN0ZEMUNERDhGNj
 #Q5QTIxQ0YzNkI2OEQ5RTlDNEExMTkxOUE5NTE4OTI1MTk3ODYxMDRCMjcwMzM3NTci
 #LCAiRy5zY2FsYXJfbXVsdF92ZnkocyxYKSAob25seSBYLWNvb3JkaW5hdGUpIjogIk
 #Y1QTE5MUYwNzhDODdDMzY2MzNCNzhDNzAxNzUxMTU5RDU2QzU5RjNGRTkxMDVCNTcy
 #MDY3MzQ3MEYzMDNBQjkifSwgIkludmFsaWQgWTEiOiAiMDQyNDY0OEVCOTg2QzJCRT
 #BBRjYzNjQ1NUNFRjA1NTA2NzFENkJDRDhBQTI2RTBENzJGRkExQjFGRDEyQkE0RTBG
 #NzhEQTJCNkQyMTg0RjMxQUYzOUU1NjZBRUYxMjcwMTRCNjkzNkM5QTM3MzQ2RDEwQT
 #RBQjI1MTRGQUVGNTg1NyIsICJJbnZhbGlkIFkyIjogIjAwIn0=
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-384-and-hash-sha-384">
        <name>Test vector for CPace using group NIST P-384 and hash SHA-384</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-384">
          <name>Test vectors for calculate_generator with group NIST P-384</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-384 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP384_XMD:SHA-384_SSWU_NU_'
    DST = b'CPaceP384_XMD:SHA-384_SSWU_NU__DST'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 5b3773aa90e8f23c61563a4b645b276c
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      1e4350616365503338345f584d443a5348412d3338345f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572105b3773aa90e8f23c61563a4b645b
      276c
    generator g: (length: 97 bytes)
      04d938e00eaa8d44fcac33dd5d10404f0c57e0fb1dfdcca3fae47a6a
      14bbe52a6ac82a856d9de14e0223a1e1a5bd3fb38be951af748723f8
      f64835217ad5bc05a4fc0e1d7c17cf14c3bda93d05cef96b86483fc5
      f51570fc27f0a3c19cd2ece2a2
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-20">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS0zODQiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzMzM4MzQ1RjU4NEQ0NDNBNTM0ODQxMkQzMzM4MzQ1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMEI0MjVGNzI2NTcz
 #NzA2RjZFNjQ2NTcyIiwgInNpZCI6ICI1QjM3NzNBQTkwRThGMjNDNjE1NjNBNEI2ND
 #VCMjc2QyIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2lu
 #X2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDMzMzgzNDVGNTg0RDQ0M0E1MzQ4NDEyRD
 #MzMzgzNDVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDU3MDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMTgwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQy
 #NUY3MjY1NzM3MDZGNkU2NDY1NzIxMDVCMzc3M0FBOTBFOEYyM0M2MTU2M0E0QjY0NU
 #IyNzZDIiwgImdlbmVyYXRvciBnIjogIjA0RDkzOEUwMEVBQThENDRGQ0FDMzNERDVE
 #MTA0MDRGMEM1N0UwRkIxREZEQ0NBM0ZBRTQ3QTZBMTRCQkU1MkE2QUM4MkE4NTZEOU
 #RFMTRFMDIyM0ExRTFBNUJEM0ZCMzhCRTk1MUFGNzQ4NzIzRjhGNjQ4MzUyMTdBRDVC
 #QzA1QTRGQzBFMUQ3QzE3Q0YxNEMzQkRBOTNEMDVDRUY5NkI4NjQ4M0ZDNUY1MTU3ME
 #ZDMjdGMEEzQzE5Q0QyRUNFMkEyIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-5">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 48 bytes)
      ef433dd5ad142c860e7cb6400dd315d388d5ec5420c550e9d6f0907f
      375d988bc4d704837e43561c497e7dd93edcdb9d
  Outputs
    Ya: (length: 97 bytes)
      043973faff49d85b1a14f114d0550a8ec0e5defcc7399c2e19003251
      b1ddb9e786489b66be3cf8601880bd426a8a52f96968229d35032ac9
      cc3ef6c1fd67ce1f7979bb1be9f4ff63e34fc6df42ebb481989596f6
      3c6bd987fffd2527bdfd6b05d6
    Alternative correct value for Ya: (-ya)*g:
    (length: 97 bytes)
      043973faff49d85b1a14f114d0550a8ec0e5defcc7399c2e19003251
      b1ddb9e786489b66be3cf8601880bd426a8a52f96997dd62cafcd536
      33c1093e029831e0868644e4160b009c1cb03920bd144b7e666a6909
      c29426780002dad8430294fa29
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-5">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 48 bytes)
      50b0e36b95a2edfaa8342b843dddc90b175330f2399c1b36586dedda
      3c255975f30be6a750f9404fccc62a6323b5e471
  Outputs
    Yb: (length: 97 bytes)
      04a94b80cc266671a00ef719ee249bda79cbf66788784611e9c18835
      2ac7dbf23f730a4c3ea320e7a27a657ac336e7ee9c9bf49a5dcb715b
      b9b2ac2e5433bba61b2b186b7d6a539015096f351b36df579469d50a
      2f7ca1c615bd7e28633e5faefb
    Alternative correct value for Yb: (-yb)*g:
    (length: 97 bytes)
      04a94b80cc266671a00ef719ee249bda79cbf66788784611e9c18835
      2ac7dbf23f730a4c3ea320e7a27a657ac336e7ee9c640b65a2348ea4
      464d53d1abcc4459e4d4e7948295ac6feaf690cae4c920a86a962af5
      cf835e39ea4281d79dc1a05104
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-5">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 48 bytes)
      03ad91b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502
      397903b464768f57d2ef19fda00542dc7636031f
    scalar_mult_vfy(yb,Ya): (length: 48 bytes)
      03ad91b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502
      397903b464768f57d2ef19fda00542dc7636031f
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-5">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 204 bytes)
      61043973faff49d85b1a14f114d0550a8ec0e5defcc7399c2e190032
      51b1ddb9e786489b66be3cf8601880bd426a8a52f96968229d35032a
      c9cc3ef6c1fd67ce1f7979bb1be9f4ff63e34fc6df42ebb481989596
      f63c6bd987fffd2527bdfd6b05d6034144616104a94b80cc266671a0
      0ef719ee249bda79cbf66788784611e9c188352ac7dbf23f730a4c3e
      a320e7a27a657ac336e7ee9c9bf49a5dcb715bb9b2ac2e5433bba61b
      2b186b7d6a539015096f351b36df579469d50a2f7ca1c615bd7e2863
      3e5faefb03414462
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 305 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c3003ad91
      b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502397903
      b464768f57d2ef19fda00542dc7636031f61043973faff49d85b1a14
      f114d0550a8ec0e5defcc7399c2e19003251b1ddb9e786489b66be3c
      f8601880bd426a8a52f96968229d35032ac9cc3ef6c1fd67ce1f7979
      bb1be9f4ff63e34fc6df42ebb481989596f63c6bd987fffd2527bdfd
      6b05d6034144616104a94b80cc266671a00ef719ee249bda79cbf667
      88784611e9c188352ac7dbf23f730a4c3ea320e7a27a657ac336e7ee
      9c9bf49a5dcb715bb9b2ac2e5433bba61b2b186b7d6a539015096f35
      1b36df579469d50a2f7ca1c615bd7e28633e5faefb03414462
    ISK result: (length: 48 bytes)
      407d3e94916138a8a0cd3b6b64cdbd9a665fd83e706508649bc43b04
      7b73cf27017d2cc74533f18a5075a6748de5a026
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-5">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 206 bytes)
      6f636104a94b80cc266671a00ef719ee249bda79cbf66788784611e9
      c188352ac7dbf23f730a4c3ea320e7a27a657ac336e7ee9c9bf49a5d
      cb715bb9b2ac2e5433bba61b2b186b7d6a539015096f351b36df5794
      69d50a2f7ca1c615bd7e28633e5faefb0341446261043973faff49d8
      5b1a14f114d0550a8ec0e5defcc7399c2e19003251b1ddb9e786489b
      66be3cf8601880bd426a8a52f96968229d35032ac9cc3ef6c1fd67ce
      1f7979bb1be9f4ff63e34fc6df42ebb481989596f63c6bd987fffd25
      27bdfd6b05d603414461
    DSI = G.DSI_ISK, b'CPaceP384_XMD:SHA-384_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503338345f584d443a5348412d3338345f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 307 bytes)
      224350616365503338345f584d443a5348412d3338345f535357555f
      4e555f5f49534b105b3773aa90e8f23c61563a4b645b276c3003ad91
      b03f8312fdd6aa1986dafc684adb2d93a1248e99a22843c502397903
      b464768f57d2ef19fda00542dc7636031f6f636104a94b80cc266671
      a00ef719ee249bda79cbf66788784611e9c188352ac7dbf23f730a4c
      3ea320e7a27a657ac336e7ee9c9bf49a5dcb715bb9b2ac2e5433bba6
      1b2b186b7d6a539015096f351b36df579469d50a2f7ca1c615bd7e28
      633e5faefb0341446261043973faff49d85b1a14f114d0550a8ec0e5
      defcc7399c2e19003251b1ddb9e786489b66be3cf8601880bd426a8a
      52f96968229d35032ac9cc3ef6c1fd67ce1f7979bb1be9f4ff63e34f
      c6df42ebb481989596f63c6bd987fffd2527bdfd6b05d603414461
    ISK result: (length: 48 bytes)
      b2c28ddad4a77680469bd090bad8098d1c22e7050553acdacd13614d
      eed72bb7821c50ddc4b30b4b54151e07077d1985
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-5">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      ad0247e90c1124ce6da6f62d55daf30fada0b08160164bb93ccd5a2d
      f9750b91a4517184872e2bcfb4fff83bbad02371
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 48 bytes)
      4c7b6523ae4c7a5df9d709b59dd1b033152040715391c7ed7c60a12c
      c3f40e251fbda5b78c63bc465dac5ca6046f3fc0
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-5">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x5b,0x37,0x73,0xaa,0x90,0xe8,0xf2,0x3c,0x61,0x56,0x3a,0x4b,
 0x64,0x5b,0x27,0x6c,
};
const unsigned char tc_g[] = {
 0x04,0xd9,0x38,0xe0,0x0e,0xaa,0x8d,0x44,0xfc,0xac,0x33,0xdd,
 0x5d,0x10,0x40,0x4f,0x0c,0x57,0xe0,0xfb,0x1d,0xfd,0xcc,0xa3,
 0xfa,0xe4,0x7a,0x6a,0x14,0xbb,0xe5,0x2a,0x6a,0xc8,0x2a,0x85,
 0x6d,0x9d,0xe1,0x4e,0x02,0x23,0xa1,0xe1,0xa5,0xbd,0x3f,0xb3,
 0x8b,0xe9,0x51,0xaf,0x74,0x87,0x23,0xf8,0xf6,0x48,0x35,0x21,
 0x7a,0xd5,0xbc,0x05,0xa4,0xfc,0x0e,0x1d,0x7c,0x17,0xcf,0x14,
 0xc3,0xbd,0xa9,0x3d,0x05,0xce,0xf9,0x6b,0x86,0x48,0x3f,0xc5,
 0xf5,0x15,0x70,0xfc,0x27,0xf0,0xa3,0xc1,0x9c,0xd2,0xec,0xe2,
 0xa2,
};
const unsigned char tc_ya[] = {
 0xef,0x43,0x3d,0xd5,0xad,0x14,0x2c,0x86,0x0e,0x7c,0xb6,0x40,
 0x0d,0xd3,0x15,0xd3,0x88,0xd5,0xec,0x54,0x20,0xc5,0x50,0xe9,
 0xd6,0xf0,0x90,0x7f,0x37,0x5d,0x98,0x8b,0xc4,0xd7,0x04,0x83,
 0x7e,0x43,0x56,0x1c,0x49,0x7e,0x7d,0xd9,0x3e,0xdc,0xdb,0x9d,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x39,0x73,0xfa,0xff,0x49,0xd8,0x5b,0x1a,0x14,0xf1,0x14,
 0xd0,0x55,0x0a,0x8e,0xc0,0xe5,0xde,0xfc,0xc7,0x39,0x9c,0x2e,
 0x19,0x00,0x32,0x51,0xb1,0xdd,0xb9,0xe7,0x86,0x48,0x9b,0x66,
 0xbe,0x3c,0xf8,0x60,0x18,0x80,0xbd,0x42,0x6a,0x8a,0x52,0xf9,
 0x69,0x68,0x22,0x9d,0x35,0x03,0x2a,0xc9,0xcc,0x3e,0xf6,0xc1,
 0xfd,0x67,0xce,0x1f,0x79,0x79,0xbb,0x1b,0xe9,0xf4,0xff,0x63,
 0xe3,0x4f,0xc6,0xdf,0x42,0xeb,0xb4,0x81,0x98,0x95,0x96,0xf6,
 0x3c,0x6b,0xd9,0x87,0xff,0xfd,0x25,0x27,0xbd,0xfd,0x6b,0x05,
 0xd6,
};
const unsigned char tc_yb[] = {
 0x50,0xb0,0xe3,0x6b,0x95,0xa2,0xed,0xfa,0xa8,0x34,0x2b,0x84,
 0x3d,0xdd,0xc9,0x0b,0x17,0x53,0x30,0xf2,0x39,0x9c,0x1b,0x36,
 0x58,0x6d,0xed,0xda,0x3c,0x25,0x59,0x75,0xf3,0x0b,0xe6,0xa7,
 0x50,0xf9,0x40,0x4f,0xcc,0xc6,0x2a,0x63,0x23,0xb5,0xe4,0x71,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0xa9,0x4b,0x80,0xcc,0x26,0x66,0x71,0xa0,0x0e,0xf7,0x19,
 0xee,0x24,0x9b,0xda,0x79,0xcb,0xf6,0x67,0x88,0x78,0x46,0x11,
 0xe9,0xc1,0x88,0x35,0x2a,0xc7,0xdb,0xf2,0x3f,0x73,0x0a,0x4c,
 0x3e,0xa3,0x20,0xe7,0xa2,0x7a,0x65,0x7a,0xc3,0x36,0xe7,0xee,
 0x9c,0x9b,0xf4,0x9a,0x5d,0xcb,0x71,0x5b,0xb9,0xb2,0xac,0x2e,
 0x54,0x33,0xbb,0xa6,0x1b,0x2b,0x18,0x6b,0x7d,0x6a,0x53,0x90,
 0x15,0x09,0x6f,0x35,0x1b,0x36,0xdf,0x57,0x94,0x69,0xd5,0x0a,
 0x2f,0x7c,0xa1,0xc6,0x15,0xbd,0x7e,0x28,0x63,0x3e,0x5f,0xae,
 0xfb,
};
const unsigned char tc_K[] = {
 0x03,0xad,0x91,0xb0,0x3f,0x83,0x12,0xfd,0xd6,0xaa,0x19,0x86,
 0xda,0xfc,0x68,0x4a,0xdb,0x2d,0x93,0xa1,0x24,0x8e,0x99,0xa2,
 0x28,0x43,0xc5,0x02,0x39,0x79,0x03,0xb4,0x64,0x76,0x8f,0x57,
 0xd2,0xef,0x19,0xfd,0xa0,0x05,0x42,0xdc,0x76,0x36,0x03,0x1f,
};
const unsigned char tc_ISK_IR[] = {
 0x40,0x7d,0x3e,0x94,0x91,0x61,0x38,0xa8,0xa0,0xcd,0x3b,0x6b,
 0x64,0xcd,0xbd,0x9a,0x66,0x5f,0xd8,0x3e,0x70,0x65,0x08,0x64,
 0x9b,0xc4,0x3b,0x04,0x7b,0x73,0xcf,0x27,0x01,0x7d,0x2c,0xc7,
 0x45,0x33,0xf1,0x8a,0x50,0x75,0xa6,0x74,0x8d,0xe5,0xa0,0x26,
};
const unsigned char tc_ISK_SY[] = {
 0xb2,0xc2,0x8d,0xda,0xd4,0xa7,0x76,0x80,0x46,0x9b,0xd0,0x90,
 0xba,0xd8,0x09,0x8d,0x1c,0x22,0xe7,0x05,0x05,0x53,0xac,0xda,
 0xcd,0x13,0x61,0x4d,0xee,0xd7,0x2b,0xb7,0x82,0x1c,0x50,0xdd,
 0xc4,0xb3,0x0b,0x4b,0x54,0x15,0x1e,0x07,0x07,0x7d,0x19,0x85,
};
const unsigned char tc_sid_out_ir[] = {
 0xad,0x02,0x47,0xe9,0x0c,0x11,0x24,0xce,0x6d,0xa6,0xf6,0x2d,
 0x55,0xda,0xf3,0x0f,0xad,0xa0,0xb0,0x81,0x60,0x16,0x4b,0xb9,
 0x3c,0xcd,0x5a,0x2d,0xf9,0x75,0x0b,0x91,0xa4,0x51,0x71,0x84,
 0x87,0x2e,0x2b,0xcf,0xb4,0xff,0xf8,0x3b,0xba,0xd0,0x23,0x71,
};
const unsigned char tc_sid_out_oc[] = {
 0x4c,0x7b,0x65,0x23,0xae,0x4c,0x7a,0x5d,0xf9,0xd7,0x09,0xb5,
 0x9d,0xd1,0xb0,0x33,0x15,0x20,0x40,0x71,0x53,0x91,0xc7,0xed,
 0x7c,0x60,0xa1,0x2c,0xc3,0xf4,0x0e,0x25,0x1f,0xbd,0xa5,0xb7,
 0x8c,0x63,0xbc,0x46,0x5d,0xac,0x5c,0xa6,0x04,0x6f,0x3f,0xc0,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-21">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjVCMzc3
 #M0FBOTBFOEYyM0M2MTU2M0E0QjY0NUIyNzZDIiwgImciOiAiMDREOTM4RTAwRUFBOE
 #Q0NEZDQUMzM0RENUQxMDQwNEYwQzU3RTBGQjFERkRDQ0EzRkFFNDdBNkExNEJCRTUy
 #QTZBQzgyQTg1NkQ5REUxNEUwMjIzQTFFMUE1QkQzRkIzOEJFOTUxQUY3NDg3MjNGOE
 #Y2NDgzNTIxN0FENUJDMDVBNEZDMEUxRDdDMTdDRjE0QzNCREE5M0QwNUNFRjk2Qjg2
 #NDgzRkM1RjUxNTcwRkMyN0YwQTNDMTlDRDJFQ0UyQTIiLCAieWEiOiAiRUY0MzNERD
 #VBRDE0MkM4NjBFN0NCNjQwMEREMzE1RDM4OEQ1RUM1NDIwQzU1MEU5RDZGMDkwN0Yz
 #NzVEOTg4QkM0RDcwNDgzN0U0MzU2MUM0OTdFN0REOTNFRENEQjlEIiwgIkFEYSI6IC
 #I0MTQ0NjEiLCAiWWEiOiAiMDQzOTczRkFGRjQ5RDg1QjFBMTRGMTE0RDA1NTBBOEVD
 #MEU1REVGQ0M3Mzk5QzJFMTkwMDMyNTFCMUREQjlFNzg2NDg5QjY2QkUzQ0Y4NjAxOD
 #gwQkQ0MjZBOEE1MkY5Njk2ODIyOUQzNTAzMkFDOUNDM0VGNkMxRkQ2N0NFMUY3OTc5
 #QkIxQkU5RjRGRjYzRTM0RkM2REY0MkVCQjQ4MTk4OTU5NkY2M0M2QkQ5ODdGRkZEMj
 #UyN0JERkQ2QjA1RDYiLCAieWIiOiAiNTBCMEUzNkI5NUEyRURGQUE4MzQyQjg0M0RE
 #REM5MEIxNzUzMzBGMjM5OUMxQjM2NTg2REVEREEzQzI1NTk3NUYzMEJFNkE3NTBGOT
 #QwNEZDQ0M2MkE2MzIzQjVFNDcxIiwgIkFEYiI6ICI0MTQ0NjIiLCAiWWIiOiAiMDRB
 #OTRCODBDQzI2NjY3MUEwMEVGNzE5RUUyNDlCREE3OUNCRjY2Nzg4Nzg0NjExRTlDMT
 #g4MzUyQUM3REJGMjNGNzMwQTRDM0VBMzIwRTdBMjdBNjU3QUMzMzZFN0VFOUM5QkY0
 #OUE1RENCNzE1QkI5QjJBQzJFNTQzM0JCQTYxQjJCMTg2QjdENkE1MzkwMTUwOTZGMz
 #UxQjM2REY1Nzk0NjlENTBBMkY3Q0ExQzYxNUJEN0UyODYzM0U1RkFFRkIiLCAiSyI6
 #ICIwM0FEOTFCMDNGODMxMkZERDZBQTE5ODZEQUZDNjg0QURCMkQ5M0ExMjQ4RTk5QT
 #IyODQzQzUwMjM5NzkwM0I0NjQ3NjhGNTdEMkVGMTlGREEwMDU0MkRDNzYzNjAzMUYi
 #LCAiSVNLX0lSIjogIjQwN0QzRTk0OTE2MTM4QThBMENEM0I2QjY0Q0RCRDlBNjY1Rk
 #Q4M0U3MDY1MDg2NDlCQzQzQjA0N0I3M0NGMjcwMTdEMkNDNzQ1MzNGMThBNTA3NUE2
 #NzQ4REU1QTAyNiIsICJJU0tfU1kiOiAiQjJDMjhEREFENEE3NzY4MDQ2OUJEMDkwQk
 #FEODA5OEQxQzIyRTcwNTA1NTNBQ0RBQ0QxMzYxNERFRUQ3MkJCNzgyMUM1MEREQzRC
 #MzBCNEI1NDE1MUUwNzA3N0QxOTg1IiwgInNpZF9vdXRwdXRfaXIiOiAiQUQwMjQ3RT
 #kwQzExMjRDRTZEQTZGNjJENTVEQUYzMEZBREEwQjA4MTYwMTY0QkI5M0NDRDVBMkRG
 #OTc1MEI5MUE0NTE3MTg0ODcyRTJCQ0ZCNEZGRjgzQkJBRDAyMzcxIiwgInNpZF9vdX
 #RwdXRfb2MiOiAiNEM3QjY1MjNBRTRDN0E1REY5RDcwOUI1OUREMUIwMzMxNTIwNDA3
 #MTUzOTFDN0VEN0M2MEExMkNDM0Y0MEUyNTFGQkRBNUI3OEM2M0JDNDY1REFDNUNBNj
 #A0NkYzRkMwIn0=
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-1">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    X: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f4036e
    G.scalar_mult(s,X) (full coordinates): (length: 97 bytes)
      0465c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f6105873
      3173a033cda76c3e3ea5352b804e67fdbe2e334be8245dad5c8c993e
      63bacf0456478f29b71b6c859f13676f84ff150d2741f028f560584a
      0bdba19a63df62c08949c2fd6d
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 48 bytes)
      65c28db05fd9f9a93651c5cc31eae49c4e5246b46489b8f610587331
      73a033cda76c3e3ea5352b804e67fdbe2e334be8
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-3">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 48 bytes)
      6e8a99a5cdd408eae98e1b8aed286e7b12adbbdac7f2c628d9060ce9
      2ae0d90bd57a564fd3500fbcce3425dc94ba0ade
    Y_i1: (length: 97 bytes)
      045b4cd53c4506cc04ba4c44f2762d5d32c3e55df25b8baa5571b165
      7ad9576efea8259f0684de065a470585b4be876748c7797054f3defe
      f21b77f83d53bac57c89d52aa4d6dd5872bd281989b138359698009f
      8ac1f301538badcce9d9f40302
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-22">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICI2RThBOTlBNUNERDQwOEVBRTk4RTFCOEFFRDI4NkU3Qj
 #EyQURCQkRBQzdGMkM2MjhEOTA2MENFOTJBRTBEOTBCRDU3QTU2NEZEMzUwMEZCQ0NF
 #MzQyNURDOTRCQTBBREUiLCAiWCI6ICIwNDVCNENENTNDNDUwNkNDMDRCQTRDNDRGMj
 #c2MkQ1RDMyQzNFNTVERjI1QjhCQUE1NTcxQjE2NTdBRDk1NzZFRkVBODI1OUYwNjg0
 #REUwNjVBNDcwNTg1QjRCRTg3Njc0OEM3Nzk3MDU0RjNERUZFRjIxQjc3RjgzRDUzQk
 #FDNTdDODlENTJBQTRENkRENTg3MkJEMjgxOTg5QjEzODM1OTY5ODAwOUY4QUMxRjMw
 #MTUzOEJBRENDRTlEOUY0MDM2RSIsICJHLnNjYWxhcl9tdWx0KHMsWCkgKGZ1bGwgY2
 #9vcmRpbmF0ZXMpIjogIjA0NjVDMjhEQjA1RkQ5RjlBOTM2NTFDNUNDMzFFQUU0OUM0
 #RTUyNDZCNDY0ODlCOEY2MTA1ODczMzE3M0EwMzNDREE3NkMzRTNFQTUzNTJCODA0RT
 #Y3RkRCRTJFMzM0QkU4MjQ1REFENUM4Qzk5M0U2M0JBQ0YwNDU2NDc4RjI5QjcxQjZD
 #ODU5RjEzNjc2Rjg0RkYxNTBEMjc0MUYwMjhGNTYwNTg0QTBCREJBMTlBNjNERjYyQz
 #A4OTQ5QzJGRDZEIiwgIkcuc2NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29y
 #ZGluYXRlKSI6ICI2NUMyOERCMDVGRDlGOUE5MzY1MUM1Q0MzMUVBRTQ5QzRFNTI0Nk
 #I0NjQ4OUI4RjYxMDU4NzMzMTczQTAzM0NEQTc2QzNFM0VBNTM1MkI4MDRFNjdGREJF
 #MkUzMzRCRTgifSwgIkludmFsaWQgWTEiOiAiMDQ1QjRDRDUzQzQ1MDZDQzA0QkE0Qz
 #Q0RjI3NjJENUQzMkMzRTU1REYyNUI4QkFBNTU3MUIxNjU3QUQ5NTc2RUZFQTgyNTlG
 #MDY4NERFMDY1QTQ3MDU4NUI0QkU4NzY3NDhDNzc5NzA1NEYzREVGRUYyMUI3N0Y4M0
 #Q1M0JBQzU3Qzg5RDUyQUE0RDZERDU4NzJCRDI4MTk4OUIxMzgzNTk2OTgwMDlGOEFD
 #MUYzMDE1MzhCQURDQ0U5RDlGNDAzMDIiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="test-vector-for-cpace-using-group-nist-p-521-and-hash-sha-512">
        <name>Test vector for CPace using group NIST P-521 and hash SHA-512</name>
        <section anchor="test-vectors-for-calculategenerator-with-group-nist-p-521">
          <name>Test vectors for calculate_generator with group NIST P-521</name>
          <artwork><![CDATA[
  Inputs
    H   = SHA-512 with input block size 128 bytes.
    PRS = b'Password' ; ZPAD length: 87 ;
    DSI = b'CPaceP521_XMD:SHA-512_SSWU_NU_'
    DST = b'CPaceP521_XMD:SHA-512_SSWU_NU__DST'
    CI = b'\x0bA_initiator\x0bB_responder'
    CI = 0b415f696e69746961746f720b425f726573706f6e646572
    sid = 7e4b4791d6a8ef019b936c79fb7f2c57
  Outputs
    generator_string(PRS,G.DSI,CI,sid,H.s_in_bytes):
    (length: 170 bytes)
      1e4350616365503532315f584d443a5348412d3531325f535357555f
      4e555f0850617373776f726457000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000180b415f696e69746961746f
      720b425f726573706f6e646572107e4b4791d6a8ef019b936c79fb7f
      2c57
    generator g: (length: 133 bytes)
      0400aefb79f4ba40369bbe78a5c873b2ce75be111516deed28c5899a
      8bbf8a96dbd28882afbc1501d8a4e9b25c172dfadcd96d10466f9c36
      d23ea05c982df0bb1e353201c98da6ce14e3c424b6cf55e627c4f3c0
      a4469e2aedaa692f5fe16d57baa8a9432aac320139e854d06bfb4daa
      efc504ff2fe1d2c4f06443878a242a7b876b224040
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-23">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJIIjogIlNIQS01MTIiLCAiSC5zX2luX2J5dGVzIjogMTI4LCAiUFJTIjogIjUwNj
 #E3MzczNzc2RjcyNjQiLCAiWlBBRCBsZW5ndGgiOiA4NywgIkRTSSI6ICI0MzUwNjE2
 #MzY1NTAzNTMyMzE1RjU4NEQ0NDNBNTM0ODQxMkQzNTMxMzI1RjUzNTM1NzU1NUY0RT
 #U1NUYiLCAiQ0kiOiAiMEI0MTVGNjk2RTY5NzQ2OTYxNzQ2RjcyMEI0MjVGNzI2NTcz
 #NzA2RjZFNjQ2NTcyIiwgInNpZCI6ICI3RTRCNDc5MUQ2QThFRjAxOUI5MzZDNzlGQj
 #dGMkM1NyIsICJnZW5lcmF0b3Jfc3RyaW5nKEcuRFNJLFBSUyxDSSxzaWQsSC5zX2lu
 #X2J5dGVzKSI6ICIxRTQzNTA2MTYzNjU1MDM1MzIzMTVGNTg0RDQ0M0E1MzQ4NDEyRD
 #M1MzEzMjVGNTM1MzU3NTU1RjRFNTU1RjA4NTA2MTczNzM3NzZGNzI2NDU3MDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
 #MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
 #AwMDAwMDAwMDAwMDAwMDAwMDAwMTgwQjQxNUY2OTZFNjk3NDY5NjE3NDZGNzIwQjQy
 #NUY3MjY1NzM3MDZGNkU2NDY1NzIxMDdFNEI0NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0
 #YyQzU3IiwgImdlbmVyYXRvciBnIjogIjA0MDBBRUZCNzlGNEJBNDAzNjlCQkU3OEE1
 #Qzg3M0IyQ0U3NUJFMTExNTE2REVFRDI4QzU4OTlBOEJCRjhBOTZEQkQyODg4MkFGQk
 #MxNTAxRDhBNEU5QjI1QzE3MkRGQURDRDk2RDEwNDY2RjlDMzZEMjNFQTA1Qzk4MkRG
 #MEJCMUUzNTMyMDFDOThEQTZDRTE0RTNDNDI0QjZDRjU1RTYyN0M0RjNDMEE0NDY5RT
 #JBRURBQTY5MkY1RkUxNkQ1N0JBQThBOTQzMkFBQzMyMDEzOUU4NTREMDZCRkI0REFB
 #RUZDNTA0RkYyRkUxRDJDNEYwNjQ0Mzg3OEEyNDJBN0I4NzZCMjI0MDQwIn0=
]]></sourcecode>
          </section>
        </section>
        <section anchor="test-vector-for-message-from-a-6">
          <name>Test vector for message from A</name>
          <artwork><![CDATA[
  Inputs
    ADa = b'ADa'
    ya (big endian): (length: 66 bytes)
      006367e9c2aeff9f1db19af600cca73343d47cbe446cebbd1ccd783f
      82755a872da86fd0707eb3767c6114f1803deb62d63bdd1e613f67e6
      3e8c141ee5310e3ee819
  Outputs
    Ya: (length: 133 bytes)
      0400493381a239f5c33edc50f92a4ac7dbade7854c2ef090515567a5
      387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf4651e5d4
      cfebf1ebb89ca459a6311801d78c1142bf4eb46df664108bd05e8d97
      9f3bc13ea3e373ce07fd67e457f44927e0123d7566b527eb10ead212
      71d922f373fec78b4a3f4798f8fd52fb97859588de
    Alternative correct value for Ya: (-ya)*g:
    (length: 133 bytes)
      0400493381a239f5c33edc50f92a4ac7dbade7854c2ef090515567a5
      387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf4651e5d4
      cfebf1ebb89ca459a63118002873eebd40b14b92099bef742fa17268
      60c43ec15c1c8c31f802981ba80bb6d81fedc28a994ad814ef152ded
      8e26dd0c8c013874b5c0b8670702ad04687a6a7721
]]></artwork>
        </section>
        <section anchor="test-vector-for-message-from-b-6">
          <name>Test vector for message from B</name>
          <artwork><![CDATA[
  Inputs
    ADb = b'ADb'
    yb (big endian): (length: 66 bytes)
      009227bf8dc741dacc9422f8bf3c0e96fce9587bc562eaafe0dc5f6f
      82f28594e4a6f98553560c62b75fa4abb198cecbbb86ebd41b0ea025
      4cde78ac68d39a240ae7
  Outputs
    Yb: (length: 133 bytes)
      04012938f18169cf9f37048b973ec9ac06bb15eeb26d370957736775
      e6c5638153f00152fe632215eb22f407dc3a1a2c473f45751b6451bf
      626b781d8db61c537cb4310060575918b0c77f5208b31b89f6fc2cf8
      6bf494a1533a6f282ae0fc550133d51626c35989c01462aabab6dab9
      522cfb6a2ab214570f29560a7cc9619aa3e3341929
    Alternative correct value for Yb: (-yb)*g:
    (length: 133 bytes)
      04012938f18169cf9f37048b973ec9ac06bb15eeb26d370957736775
      e6c5638153f00152fe632215eb22f407dc3a1a2c473f45751b6451bf
      626b781d8db61c537cb431019fa8a6e74f3880adf74ce4760903d307
      940b6b5eacc590d7d51f03aafecc2ae9d93ca6763feb9d5545492546
      add30495d54deba8f0d6a9f583369e655c1ccbe6d6
]]></artwork>
        </section>
        <section anchor="test-vector-for-secret-points-k-6">
          <name>Test vector for secret points K</name>
          <artwork><![CDATA[
    scalar_mult_vfy(ya,Yb): (length: 66 bytes)
      0057f1164b053e75197f7457d56391442efe0e5078fa9df658c6a6d0
      0af69ae3998d55f092ef9da4040bc42945691590496a5d84479439b1
      14d28b02a51ba41b273d
    scalar_mult_vfy(yb,Ya): (length: 66 bytes)
      0057f1164b053e75197f7457d56391442efe0e5078fa9df658c6a6d0
      0af69ae3998d55f092ef9da4040bc42945691590496a5d84479439b1
      14d28b02a51ba41b273d
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-initiatorresponder-6">
          <name>Test vector for ISK calculation initiator/responder</name>
          <artwork><![CDATA[
    transcript_ir(Ya,ADa,Yb,ADb): (length: 278 bytes)
      85010400493381a239f5c33edc50f92a4ac7dbade7854c2ef0905155
      67a5387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf4651
      e5d4cfebf1ebb89ca459a6311801d78c1142bf4eb46df664108bd05e
      8d979f3bc13ea3e373ce07fd67e457f44927e0123d7566b527eb10ea
      d21271d922f373fec78b4a3f4798f8fd52fb97859588de0341446185
      0104012938f18169cf9f37048b973ec9ac06bb15eeb26d3709577367
      75e6c5638153f00152fe632215eb22f407dc3a1a2c473f45751b6451
      bf626b781d8db61c537cb4310060575918b0c77f5208b31b89f6fc2c
      f86bf494a1533a6f282ae0fc550133d51626c35989c01462aabab6da
      b9522cfb6a2ab214570f29560a7cc9619aa3e334192903414462
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_ir(Ya,ADa,Yb,ADb):
    (length: 397 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c57420057f1
      164b053e75197f7457d56391442efe0e5078fa9df658c6a6d00af69a
      e3998d55f092ef9da4040bc42945691590496a5d84479439b114d28b
      02a51ba41b273d85010400493381a239f5c33edc50f92a4ac7dbade7
      854c2ef090515567a5387c331fc9c7fdff4e151801a51ed20514412d
      d9832a0ebf4651e5d4cfebf1ebb89ca459a6311801d78c1142bf4eb4
      6df664108bd05e8d979f3bc13ea3e373ce07fd67e457f44927e0123d
      7566b527eb10ead21271d922f373fec78b4a3f4798f8fd52fb978595
      88de03414461850104012938f18169cf9f37048b973ec9ac06bb15ee
      b26d370957736775e6c5638153f00152fe632215eb22f407dc3a1a2c
      473f45751b6451bf626b781d8db61c537cb4310060575918b0c77f52
      08b31b89f6fc2cf86bf494a1533a6f282ae0fc550133d51626c35989
      c01462aabab6dab9522cfb6a2ab214570f29560a7cc9619aa3e33419
      2903414462
    ISK result: (length: 64 bytes)
      6f8daaedf8843dd9ae3b8376c6dd668f49a127e7d33b8adb37d4ae13
      5e1f09a68db1a03d436aae0cb8efb80a11813dec6924a52a6589b186
      e62e676a8dd777ad
]]></artwork>
        </section>
        <section anchor="test-vector-for-isk-calculation-parallel-execution-6">
          <name>Test vector for ISK calculation parallel execution</name>
          <artwork><![CDATA[
    transcript_oc(Ya,ADa,Yb,ADb): (length: 280 bytes)
      6f63850104012938f18169cf9f37048b973ec9ac06bb15eeb26d3709
      57736775e6c5638153f00152fe632215eb22f407dc3a1a2c473f4575
      1b6451bf626b781d8db61c537cb4310060575918b0c77f5208b31b89
      f6fc2cf86bf494a1533a6f282ae0fc550133d51626c35989c01462aa
      bab6dab9522cfb6a2ab214570f29560a7cc9619aa3e3341929034144
      6285010400493381a239f5c33edc50f92a4ac7dbade7854c2ef09051
      5567a5387c331fc9c7fdff4e151801a51ed20514412dd9832a0ebf46
      51e5d4cfebf1ebb89ca459a6311801d78c1142bf4eb46df664108bd0
      5e8d979f3bc13ea3e373ce07fd67e457f44927e0123d7566b527eb10
      ead21271d922f373fec78b4a3f4798f8fd52fb97859588de03414461
    DSI = G.DSI_ISK, b'CPaceP521_XMD:SHA-512_SSWU_NU__ISK':
    (length: 34 bytes)
      4350616365503532315f584d443a5348412d3531325f535357555f4e
      555f5f49534b
    lv_cat(DSI,sid,K)||transcript_oc(Ya,ADa,Yb,ADb):
    (length: 399 bytes)
      224350616365503532315f584d443a5348412d3531325f535357555f
      4e555f5f49534b107e4b4791d6a8ef019b936c79fb7f2c57420057f1
      164b053e75197f7457d56391442efe0e5078fa9df658c6a6d00af69a
      e3998d55f092ef9da4040bc42945691590496a5d84479439b114d28b
      02a51ba41b273d6f63850104012938f18169cf9f37048b973ec9ac06
      bb15eeb26d370957736775e6c5638153f00152fe632215eb22f407dc
      3a1a2c473f45751b6451bf626b781d8db61c537cb4310060575918b0
      c77f5208b31b89f6fc2cf86bf494a1533a6f282ae0fc550133d51626
      c35989c01462aabab6dab9522cfb6a2ab214570f29560a7cc9619aa3
      e33419290341446285010400493381a239f5c33edc50f92a4ac7dbad
      e7854c2ef090515567a5387c331fc9c7fdff4e151801a51ed2051441
      2dd9832a0ebf4651e5d4cfebf1ebb89ca459a6311801d78c1142bf4e
      b46df664108bd05e8d979f3bc13ea3e373ce07fd67e457f44927e012
      3d7566b527eb10ead21271d922f373fec78b4a3f4798f8fd52fb9785
      9588de03414461
    ISK result: (length: 64 bytes)
      28c311ecace3f42a9cc2ec3cc7b8bcbfd5308d999bb795ae0af7a312
      9b83f36ef011d7186422ed03bf79725cdb1b17d2a995f6db753db6eb
      9438db72bdf23d77
]]></artwork>
        </section>
        <section anchor="test-vector-for-optional-output-of-session-id-6">
          <name>Test vector for optional output of session id</name>
          <artwork><![CDATA[
    H.hash(b"CPaceSidOutput" + transcript_ir(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      eebbefc008cede41adf4cfb06c5f3d6236aa532a958dd352d4154efa
      bda569ae3afab954380b842cde2c13b4a9750d821634ce763be4c72d
      710fcc8d9f9c79f0
    H.hash(b"CPaceSidOutput" + transcript_oc(Ya,ADa, Yb,ADb)):
    (length: 64 bytes)
      3fc7eed0ea9381c98f60bc762c0bc6c73f90bb8fdc85c9826697838b
      76d116f0ee50a5489237b8bc7f30ab32157af2e8d8e6f712f07a3020
      eb112d609061f4f9
]]></artwork>
        </section>
        <section anchor="corresponding-c-programming-language-initializers-6">
          <name>Corresponding C programming language initializers</name>
          <sourcecode type="c"><![CDATA[
const unsigned char tc_PRS[] = {
 0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
};
const unsigned char tc_CI[] = {
 0x0b,0x41,0x5f,0x69,0x6e,0x69,0x74,0x69,0x61,0x74,0x6f,0x72,
 0x0b,0x42,0x5f,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x65,0x72,
};
const unsigned char tc_sid[] = {
 0x7e,0x4b,0x47,0x91,0xd6,0xa8,0xef,0x01,0x9b,0x93,0x6c,0x79,
 0xfb,0x7f,0x2c,0x57,
};
const unsigned char tc_g[] = {
 0x04,0x00,0xae,0xfb,0x79,0xf4,0xba,0x40,0x36,0x9b,0xbe,0x78,
 0xa5,0xc8,0x73,0xb2,0xce,0x75,0xbe,0x11,0x15,0x16,0xde,0xed,
 0x28,0xc5,0x89,0x9a,0x8b,0xbf,0x8a,0x96,0xdb,0xd2,0x88,0x82,
 0xaf,0xbc,0x15,0x01,0xd8,0xa4,0xe9,0xb2,0x5c,0x17,0x2d,0xfa,
 0xdc,0xd9,0x6d,0x10,0x46,0x6f,0x9c,0x36,0xd2,0x3e,0xa0,0x5c,
 0x98,0x2d,0xf0,0xbb,0x1e,0x35,0x32,0x01,0xc9,0x8d,0xa6,0xce,
 0x14,0xe3,0xc4,0x24,0xb6,0xcf,0x55,0xe6,0x27,0xc4,0xf3,0xc0,
 0xa4,0x46,0x9e,0x2a,0xed,0xaa,0x69,0x2f,0x5f,0xe1,0x6d,0x57,
 0xba,0xa8,0xa9,0x43,0x2a,0xac,0x32,0x01,0x39,0xe8,0x54,0xd0,
 0x6b,0xfb,0x4d,0xaa,0xef,0xc5,0x04,0xff,0x2f,0xe1,0xd2,0xc4,
 0xf0,0x64,0x43,0x87,0x8a,0x24,0x2a,0x7b,0x87,0x6b,0x22,0x40,
 0x40,
};
const unsigned char tc_ya[] = {
 0x00,0x63,0x67,0xe9,0xc2,0xae,0xff,0x9f,0x1d,0xb1,0x9a,0xf6,
 0x00,0xcc,0xa7,0x33,0x43,0xd4,0x7c,0xbe,0x44,0x6c,0xeb,0xbd,
 0x1c,0xcd,0x78,0x3f,0x82,0x75,0x5a,0x87,0x2d,0xa8,0x6f,0xd0,
 0x70,0x7e,0xb3,0x76,0x7c,0x61,0x14,0xf1,0x80,0x3d,0xeb,0x62,
 0xd6,0x3b,0xdd,0x1e,0x61,0x3f,0x67,0xe6,0x3e,0x8c,0x14,0x1e,
 0xe5,0x31,0x0e,0x3e,0xe8,0x19,
};
const unsigned char tc_ADa[] = {
 0x41,0x44,0x61,
};
const unsigned char tc_Ya[] = {
 0x04,0x00,0x49,0x33,0x81,0xa2,0x39,0xf5,0xc3,0x3e,0xdc,0x50,
 0xf9,0x2a,0x4a,0xc7,0xdb,0xad,0xe7,0x85,0x4c,0x2e,0xf0,0x90,
 0x51,0x55,0x67,0xa5,0x38,0x7c,0x33,0x1f,0xc9,0xc7,0xfd,0xff,
 0x4e,0x15,0x18,0x01,0xa5,0x1e,0xd2,0x05,0x14,0x41,0x2d,0xd9,
 0x83,0x2a,0x0e,0xbf,0x46,0x51,0xe5,0xd4,0xcf,0xeb,0xf1,0xeb,
 0xb8,0x9c,0xa4,0x59,0xa6,0x31,0x18,0x01,0xd7,0x8c,0x11,0x42,
 0xbf,0x4e,0xb4,0x6d,0xf6,0x64,0x10,0x8b,0xd0,0x5e,0x8d,0x97,
 0x9f,0x3b,0xc1,0x3e,0xa3,0xe3,0x73,0xce,0x07,0xfd,0x67,0xe4,
 0x57,0xf4,0x49,0x27,0xe0,0x12,0x3d,0x75,0x66,0xb5,0x27,0xeb,
 0x10,0xea,0xd2,0x12,0x71,0xd9,0x22,0xf3,0x73,0xfe,0xc7,0x8b,
 0x4a,0x3f,0x47,0x98,0xf8,0xfd,0x52,0xfb,0x97,0x85,0x95,0x88,
 0xde,
};
const unsigned char tc_yb[] = {
 0x00,0x92,0x27,0xbf,0x8d,0xc7,0x41,0xda,0xcc,0x94,0x22,0xf8,
 0xbf,0x3c,0x0e,0x96,0xfc,0xe9,0x58,0x7b,0xc5,0x62,0xea,0xaf,
 0xe0,0xdc,0x5f,0x6f,0x82,0xf2,0x85,0x94,0xe4,0xa6,0xf9,0x85,
 0x53,0x56,0x0c,0x62,0xb7,0x5f,0xa4,0xab,0xb1,0x98,0xce,0xcb,
 0xbb,0x86,0xeb,0xd4,0x1b,0x0e,0xa0,0x25,0x4c,0xde,0x78,0xac,
 0x68,0xd3,0x9a,0x24,0x0a,0xe7,
};
const unsigned char tc_ADb[] = {
 0x41,0x44,0x62,
};
const unsigned char tc_Yb[] = {
 0x04,0x01,0x29,0x38,0xf1,0x81,0x69,0xcf,0x9f,0x37,0x04,0x8b,
 0x97,0x3e,0xc9,0xac,0x06,0xbb,0x15,0xee,0xb2,0x6d,0x37,0x09,
 0x57,0x73,0x67,0x75,0xe6,0xc5,0x63,0x81,0x53,0xf0,0x01,0x52,
 0xfe,0x63,0x22,0x15,0xeb,0x22,0xf4,0x07,0xdc,0x3a,0x1a,0x2c,
 0x47,0x3f,0x45,0x75,0x1b,0x64,0x51,0xbf,0x62,0x6b,0x78,0x1d,
 0x8d,0xb6,0x1c,0x53,0x7c,0xb4,0x31,0x00,0x60,0x57,0x59,0x18,
 0xb0,0xc7,0x7f,0x52,0x08,0xb3,0x1b,0x89,0xf6,0xfc,0x2c,0xf8,
 0x6b,0xf4,0x94,0xa1,0x53,0x3a,0x6f,0x28,0x2a,0xe0,0xfc,0x55,
 0x01,0x33,0xd5,0x16,0x26,0xc3,0x59,0x89,0xc0,0x14,0x62,0xaa,
 0xba,0xb6,0xda,0xb9,0x52,0x2c,0xfb,0x6a,0x2a,0xb2,0x14,0x57,
 0x0f,0x29,0x56,0x0a,0x7c,0xc9,0x61,0x9a,0xa3,0xe3,0x34,0x19,
 0x29,
};
const unsigned char tc_K[] = {
 0x00,0x57,0xf1,0x16,0x4b,0x05,0x3e,0x75,0x19,0x7f,0x74,0x57,
 0xd5,0x63,0x91,0x44,0x2e,0xfe,0x0e,0x50,0x78,0xfa,0x9d,0xf6,
 0x58,0xc6,0xa6,0xd0,0x0a,0xf6,0x9a,0xe3,0x99,0x8d,0x55,0xf0,
 0x92,0xef,0x9d,0xa4,0x04,0x0b,0xc4,0x29,0x45,0x69,0x15,0x90,
 0x49,0x6a,0x5d,0x84,0x47,0x94,0x39,0xb1,0x14,0xd2,0x8b,0x02,
 0xa5,0x1b,0xa4,0x1b,0x27,0x3d,
};
const unsigned char tc_ISK_IR[] = {
 0x6f,0x8d,0xaa,0xed,0xf8,0x84,0x3d,0xd9,0xae,0x3b,0x83,0x76,
 0xc6,0xdd,0x66,0x8f,0x49,0xa1,0x27,0xe7,0xd3,0x3b,0x8a,0xdb,
 0x37,0xd4,0xae,0x13,0x5e,0x1f,0x09,0xa6,0x8d,0xb1,0xa0,0x3d,
 0x43,0x6a,0xae,0x0c,0xb8,0xef,0xb8,0x0a,0x11,0x81,0x3d,0xec,
 0x69,0x24,0xa5,0x2a,0x65,0x89,0xb1,0x86,0xe6,0x2e,0x67,0x6a,
 0x8d,0xd7,0x77,0xad,
};
const unsigned char tc_ISK_SY[] = {
 0x28,0xc3,0x11,0xec,0xac,0xe3,0xf4,0x2a,0x9c,0xc2,0xec,0x3c,
 0xc7,0xb8,0xbc,0xbf,0xd5,0x30,0x8d,0x99,0x9b,0xb7,0x95,0xae,
 0x0a,0xf7,0xa3,0x12,0x9b,0x83,0xf3,0x6e,0xf0,0x11,0xd7,0x18,
 0x64,0x22,0xed,0x03,0xbf,0x79,0x72,0x5c,0xdb,0x1b,0x17,0xd2,
 0xa9,0x95,0xf6,0xdb,0x75,0x3d,0xb6,0xeb,0x94,0x38,0xdb,0x72,
 0xbd,0xf2,0x3d,0x77,
};
const unsigned char tc_sid_out_ir[] = {
 0xee,0xbb,0xef,0xc0,0x08,0xce,0xde,0x41,0xad,0xf4,0xcf,0xb0,
 0x6c,0x5f,0x3d,0x62,0x36,0xaa,0x53,0x2a,0x95,0x8d,0xd3,0x52,
 0xd4,0x15,0x4e,0xfa,0xbd,0xa5,0x69,0xae,0x3a,0xfa,0xb9,0x54,
 0x38,0x0b,0x84,0x2c,0xde,0x2c,0x13,0xb4,0xa9,0x75,0x0d,0x82,
 0x16,0x34,0xce,0x76,0x3b,0xe4,0xc7,0x2d,0x71,0x0f,0xcc,0x8d,
 0x9f,0x9c,0x79,0xf0,
};
const unsigned char tc_sid_out_oc[] = {
 0x3f,0xc7,0xee,0xd0,0xea,0x93,0x81,0xc9,0x8f,0x60,0xbc,0x76,
 0x2c,0x0b,0xc6,0xc7,0x3f,0x90,0xbb,0x8f,0xdc,0x85,0xc9,0x82,
 0x66,0x97,0x83,0x8b,0x76,0xd1,0x16,0xf0,0xee,0x50,0xa5,0x48,
 0x92,0x37,0xb8,0xbc,0x7f,0x30,0xab,0x32,0x15,0x7a,0xf2,0xe8,
 0xd8,0xe6,0xf7,0x12,0xf0,0x7a,0x30,0x20,0xeb,0x11,0x2d,0x60,
 0x90,0x61,0xf4,0xf9,
};
]]></sourcecode>
        </section>
        <section anchor="testvectors-as-json-file-encoded-as-base64-24">
          <name>Testvectors as JSON file encoded as BASE64</name>
          <sourcecode type="test-vectors"><![CDATA[
 #eyJQUlMiOiAiNTA2MTczNzM3NzZGNzI2NCIsICJDSSI6ICIwQjQxNUY2OTZFNjk3ND
 #Y5NjE3NDZGNzIwQjQyNUY3MjY1NzM3MDZGNkU2NDY1NzIiLCAic2lkIjogIjdFNEI0
 #NzkxRDZBOEVGMDE5QjkzNkM3OUZCN0YyQzU3IiwgImciOiAiMDQwMEFFRkI3OUY0Qk
 #E0MDM2OUJCRTc4QTVDODczQjJDRTc1QkUxMTE1MTZERUVEMjhDNTg5OUE4QkJGOEE5
 #NkRCRDI4ODgyQUZCQzE1MDFEOEE0RTlCMjVDMTcyREZBRENEOTZEMTA0NjZGOUMzNk
 #QyM0VBMDVDOTgyREYwQkIxRTM1MzIwMUM5OERBNkNFMTRFM0M0MjRCNkNGNTVFNjI3
 #QzRGM0MwQTQ0NjlFMkFFREFBNjkyRjVGRTE2RDU3QkFBOEE5NDMyQUFDMzIwMTM5RT
 #g1NEQwNkJGQjREQUFFRkM1MDRGRjJGRTFEMkM0RjA2NDQzODc4QTI0MkE3Qjg3NkIy
 #MjQwNDAiLCAieWEiOiAiMDA2MzY3RTlDMkFFRkY5RjFEQjE5QUY2MDBDQ0E3MzM0M0
 #Q0N0NCRTQ0NkNFQkJEMUNDRDc4M0Y4Mjc1NUE4NzJEQTg2RkQwNzA3RUIzNzY3QzYx
 #MTRGMTgwM0RFQjYyRDYzQkREMUU2MTNGNjdFNjNFOEMxNDFFRTUzMTBFM0VFODE5Ii
 #wgIkFEYSI6ICI0MTQ0NjEiLCAiWWEiOiAiMDQwMDQ5MzM4MUEyMzlGNUMzM0VEQzUw
 #RjkyQTRBQzdEQkFERTc4NTRDMkVGMDkwNTE1NTY3QTUzODdDMzMxRkM5QzdGREZGNE
 #UxNTE4MDFBNTFFRDIwNTE0NDEyREQ5ODMyQTBFQkY0NjUxRTVENENGRUJGMUVCQjg5
 #Q0E0NTlBNjMxMTgwMUQ3OEMxMTQyQkY0RUI0NkRGNjY0MTA4QkQwNUU4RDk3OUYzQk
 #MxM0VBM0UzNzNDRTA3RkQ2N0U0NTdGNDQ5MjdFMDEyM0Q3NTY2QjUyN0VCMTBFQUQy
 #MTI3MUQ5MjJGMzczRkVDNzhCNEEzRjQ3OThGOEZENTJGQjk3ODU5NTg4REUiLCAieW
 #IiOiAiMDA5MjI3QkY4REM3NDFEQUNDOTQyMkY4QkYzQzBFOTZGQ0U5NTg3QkM1NjJF
 #QUFGRTBEQzVGNkY4MkYyODU5NEU0QTZGOTg1NTM1NjBDNjJCNzVGQTRBQkIxOThDRU
 #NCQkI4NkVCRDQxQjBFQTAyNTRDREU3OEFDNjhEMzlBMjQwQUU3IiwgIkFEYiI6ICI0
 #MTQ0NjIiLCAiWWIiOiAiMDQwMTI5MzhGMTgxNjlDRjlGMzcwNDhCOTczRUM5QUMwNk
 #JCMTVFRUIyNkQzNzA5NTc3MzY3NzVFNkM1NjM4MTUzRjAwMTUyRkU2MzIyMTVFQjIy
 #RjQwN0RDM0ExQTJDNDczRjQ1NzUxQjY0NTFCRjYyNkI3ODFEOERCNjFDNTM3Q0I0Mz
 #EwMDYwNTc1OTE4QjBDNzdGNTIwOEIzMUI4OUY2RkMyQ0Y4NkJGNDk0QTE1MzNBNkYy
 #ODJBRTBGQzU1MDEzM0Q1MTYyNkMzNTk4OUMwMTQ2MkFBQkFCNkRBQjk1MjJDRkI2QT
 #JBQjIxNDU3MEYyOTU2MEE3Q0M5NjE5QUEzRTMzNDE5MjkiLCAiSyI6ICIwMDU3RjEx
 #NjRCMDUzRTc1MTk3Rjc0NTdENTYzOTE0NDJFRkUwRTUwNzhGQTlERjY1OEM2QTZEMD
 #BBRjY5QUUzOTk4RDU1RjA5MkVGOURBNDA0MEJDNDI5NDU2OTE1OTA0OTZBNUQ4NDQ3
 #OTQzOUIxMTREMjhCMDJBNTFCQTQxQjI3M0QiLCAiSVNLX0lSIjogIjZGOERBQUVERj
 #g4NDNERDlBRTNCODM3NkM2REQ2NjhGNDlBMTI3RTdEMzNCOEFEQjM3RDRBRTEzNUUx
 #RjA5QTY4REIxQTAzRDQzNkFBRTBDQjhFRkI4MEExMTgxM0RFQzY5MjRBNTJBNjU4OU
 #IxODZFNjJFNjc2QThERDc3N0FEIiwgIklTS19TWSI6ICIyOEMzMTFFQ0FDRTNGNDJB
 #OUNDMkVDM0NDN0I4QkNCRkQ1MzA4RDk5OUJCNzk1QUUwQUY3QTMxMjlCODNGMzZFRj
 #AxMUQ3MTg2NDIyRUQwM0JGNzk3MjVDREIxQjE3RDJBOTk1RjZEQjc1M0RCNkVCOTQz
 #OERCNzJCREYyM0Q3NyIsICJzaWRfb3V0cHV0X2lyIjogIkVFQkJFRkMwMDhDRURFND
 #FBREY0Q0ZCMDZDNUYzRDYyMzZBQTUzMkE5NThERDM1MkQ0MTU0RUZBQkRBNTY5QUUz
 #QUZBQjk1NDM4MEI4NDJDREUyQzEzQjRBOTc1MEQ4MjE2MzRDRTc2M0JFNEM3MkQ3MT
 #BGQ0M4RDlGOUM3OUYwIiwgInNpZF9vdXRwdXRfb2MiOiAiM0ZDN0VFRDBFQTkzODFD
 #OThGNjBCQzc2MkMwQkM2QzczRjkwQkI4RkRDODVDOTgyNjY5NzgzOEI3NkQxMTZGME
 #VFNTBBNTQ4OTIzN0I4QkM3RjMwQUIzMjE1N0FGMkU4RDhFNkY3MTJGMDdBMzAyMEVC
 #MTEyRDYwOTA2MUY0RjkifQ==
]]></sourcecode>
        </section>
        <section anchor="test-case-for-scalarmultvfy-with-correct-inputs-2">
          <name>Test case for scalar_mult_vfy with correct inputs</name>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    X: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfab9
    G.scalar_mult(s,X) (full coordinates): (length: 133 bytes)
      040122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7
      c73cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517c
      df6d99a8a2d6db19ef27bd0055af9e8ddcf337ce0a7c22a9c8099bc4
      a44faeded1eb72effd26e4f322217b67d60b944b267b3df5046078fd
      577f1785728f49b241fd5e8c83223a994a2d219281
    G.scalar_mult_vfy(s,X) (only X-coordinate):
    (length: 66 bytes)
      0122f88ce73ec5aa2d1c8c5d04148760c3d97ba87daa10d8cb8bb7c7
      3cf6e951fc922721bf1437995cfb13e132a78beb86389e60d3517cdf
      6d99a8a2d6db19ef27bd
]]></artwork>
        </section>
        <section anchor="invalid-inputs-for-scalarmultvfy-4">
          <name>Invalid inputs for scalar_mult_vfy</name>
          <t>For these test cases scalar_mult_vfy(y,.) MUST return the representation of the neutral element G.I. When including Y_i1 or Y_i2 in messages of A or B the protocol MUST abort.</t>
          <artwork><![CDATA[
    s: (length: 66 bytes)
      0182dd7925f1753419e4bf83429763acd37d64000cd5a175edf53a15
      87dd986bc95acc1506991702b6ba1a9ee2458fee8efc00198cf0088c
      480965ef65ff2048b856
    Y_i1: (length: 133 bytes)
      0400dc5078b24c4af1620cc10fbecc6cd8cf1cab0b011efb73c782f2
      26dc21c7ca7eb406be74a69ecba5b4a87c07cfc6e687b4beca9a6eda
      c95940a3b4120573b26a80005e697833b0ba285fce7b3f1f25243008
      860b8f1de710a0dcc05b0d20341efe90eb2bcca26797c2d85ae6ca74
      c00696cb1b13e40bda15b27964d7670576647bfaf9
    Y_i2: (length: 1 bytes)
      00
    G.scalar_mult_vfy(s,Y_i1) = G.scalar_mult_vfy(s,Y_i2) = G.I
]]></artwork>
          <section anchor="testvectors-as-json-file-encoded-as-base64-25">
            <name>Testvectors as JSON file encoded as BASE64</name>
            <sourcecode type="test-vectors"><![CDATA[
 #eyJWYWxpZCI6IHsicyI6ICIwMTgyREQ3OTI1RjE3NTM0MTlFNEJGODM0Mjk3NjNBQ0
 #QzN0Q2NDAwMENENUExNzVFREY1M0ExNTg3REQ5ODZCQzk1QUNDMTUwNjk5MTcwMkI2
 #QkExQTlFRTI0NThGRUU4RUZDMDAxOThDRjAwODhDNDgwOTY1RUY2NUZGMjA0OEI4NT
 #YiLCAiWCI6ICIwNDAwREM1MDc4QjI0QzRBRjE2MjBDQzEwRkJFQ0M2Q0Q4Q0YxQ0FC
 #MEIwMTFFRkI3M0M3ODJGMjI2REMyMUM3Q0E3RUI0MDZCRTc0QTY5RUNCQTVCNEE4N0
 #MwN0NGQzZFNjg3QjRCRUNBOUE2RURBQzk1OTQwQTNCNDEyMDU3M0IyNkE4MDAwNUU2
 #OTc4MzNCMEJBMjg1RkNFN0IzRjFGMjUyNDMwMDg4NjBCOEYxREU3MTBBMERDQzA1Qj
 #BEMjAzNDFFRkU5MEVCMkJDQ0EyNjc5N0MyRDg1QUU2Q0E3NEMwMDY5NkNCMUIxM0U0
 #MEJEQTE1QjI3OTY0RDc2NzA1NzY2NDdCRkFCOSIsICJHLnNjYWxhcl9tdWx0KHMsWC
 #kgKGZ1bGwgY29vcmRpbmF0ZXMpIjogIjA0MDEyMkY4OENFNzNFQzVBQTJEMUM4QzVE
 #MDQxNDg3NjBDM0Q5N0JBODdEQUExMEQ4Q0I4QkI3QzczQ0Y2RTk1MUZDOTIyNzIxQk
 #YxNDM3OTk1Q0ZCMTNFMTMyQTc4QkVCODYzODlFNjBEMzUxN0NERjZEOTlBOEEyRDZE
 #QjE5RUYyN0JEMDA1NUFGOUU4RERDRjMzN0NFMEE3QzIyQTlDODA5OUJDNEE0NEZBRU
 #RFRDFFQjcyRUZGRDI2RTRGMzIyMjE3QjY3RDYwQjk0NEIyNjdCM0RGNTA0NjA3OEZE
 #NTc3RjE3ODU3MjhGNDlCMjQxRkQ1RThDODMyMjNBOTk0QTJEMjE5MjgxIiwgIkcuc2
 #NhbGFyX211bHRfdmZ5KHMsWCkgKG9ubHkgWC1jb29yZGluYXRlKSI6ICIwMTIyRjg4
 #Q0U3M0VDNUFBMkQxQzhDNUQwNDE0ODc2MEMzRDk3QkE4N0RBQTEwRDhDQjhCQjdDNz
 #NDRjZFOTUxRkM5MjI3MjFCRjE0Mzc5OTVDRkIxM0UxMzJBNzhCRUI4NjM4OUU2MEQz
 #NTE3Q0RGNkQ5OUE4QTJENkRCMTlFRjI3QkQifSwgIkludmFsaWQgWTEiOiAiMDQwME
 #RDNTA3OEIyNEM0QUYxNjIwQ0MxMEZCRUNDNkNEOENGMUNBQjBCMDExRUZCNzNDNzgy
 #RjIyNkRDMjFDN0NBN0VCNDA2QkU3NEE2OUVDQkE1QjRBODdDMDdDRkM2RTY4N0I0Qk
 #VDQTlBNkVEQUM5NTk0MEEzQjQxMjA1NzNCMjZBODAwMDVFNjk3ODMzQjBCQTI4NUZD
 #RTdCM0YxRjI1MjQzMDA4ODYwQjhGMURFNzEwQTBEQ0MwNUIwRDIwMzQxRUZFOTBFQj
 #JCQ0NBMjY3OTdDMkQ4NUFFNkNBNzRDMDA2OTZDQjFCMTNFNDBCREExNUIyNzk2NEQ3
 #NjcwNTc2NjQ3QkZBRjkiLCAiSW52YWxpZCBZMiI6ICIwMCJ9
]]></sourcecode>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y96XbbSLog+B9PgZFPd4pVFA2Au6tctyWRkmmblElRTsvl
Kg1WChIXJUFKorKynmWeZZ5sviUiEABBWbnc27fPGedJWyKBWL59iy8ODg6M
Vbyahm/M40+uH5ZN1/TcqTv3w8D0F7O7ReJ609D8dPiha7ietwzvxZNGsPDn
7gxeDJZutDqIl6vowI+WkwP/Dr4+sNtG4K7CN4YPf08Wy80bM55HC+Nhsbyd
LBfrOxjnZHRqJKtl6M7emL3R+MQw4rvlG3O1XCcrx7LalmPchht4I4Dv56tw
OQ9XBx2czoD33Hlw5U4Xc1jCJkyMu/iN+ffVwi+byWIJg0YJ/LSZ4Q//MAx3
vbpeLN8Y5oEJ60jemP2KeegF7nTqGib84a30Y/86nGa+WCwnb8xB+LhO4NVz
d26eLAE6ceIv6Otw5sbTN+aMXqy4/OL/muCnFYBfOt9RxXznukmozXZ0s4At
aR/TXN15sAyTxPwzfLFOwqX5Mf5pHQfm4dydbpIYl3EaLqfxfBLO9SV4NFpl
VrnG8f7XQ+hVgjCd/z3MD8Pq879fT2NX+5Sm7x31zVGYhO7Svza76+XiLoQx
vq6XsEN9uht8+RrfdbTtGvPFcuau4ntAvGmed4/tN/SSoLE9+MS0YY/TaXy3
in3zeL28D83j5eZutZgs3bvrzR4/7y4n4eqNeb1a3b15/frh4aGShP6kAkt8
DT/YB/dO5S6I6FkiM7PvbsomEg19ptBNfw7Ev2KL50g67jJIzGixNLtRFPtx
OF9llmGeIo2a+7Dg05IB7/e63a5dbVQz+5Ejmed3oR/DOLD1xZzH/bT2prDD
D+EmM3CZRjJxKG31sHALqB8YRANf99zJgm98HZo//LR256v1zHTn88UGqOAH
8w6RtFxtzEVk3rlJggxzgBCATeGSgJWBjczw0b92gWrweeCTxTSpbME6AWCH
d8t4vqrErr8keDuWY79utBvPApZorFsxu+5qMS/+tlMBeIVeDIwFXxweffj4
Jbe/w+kk9JYuQO0wuA+XibuMwwReNmEr5sU8ps+m5rGQS/E0hk0DP85ClCq/
Yje2Y7e+v52ciCj6/shderCU4u+B5T64q6edX35cJMnOL7+sCUrv3uVgdB76
wIuwb1fKA8A6S+SXb9+u/f7dZwRa0Q5YsMDH787t2hYdn3/qfuianwQpgsi5
j5MYSPWFu7Brr+utupIBz+7kBFe6KP7uHIjy2r1GNk6uVzEu9+j03Xsnu+A9
wDMrwTcpHU43ihJBQyKfdyWHRcvFDMRrsjI/CX5MsnINxPdtJcFdTcIlSs7X
8OYdaLjXtlWxLav5ut1sHVQPrKp90GhVm+2D2tULGPB7FPmhArpjOgVh8R2s
7YLVe4CDf0tgetc/79itLJiEjppPgDoD2PvKv8ZfGNfAx73zs9e97vG2jEck
u8vH+J7Q63rJa7tlORWr1ga5+Ny2n8UwfzmqmP0QQLu9q5QEXJ0Gih87rpid
xXyCWz/u9D9Z9ezW++HydhoedNzZxEWNoAj6jflu8WCuFkAsczB21v4KbKx3
MJN5sp77qC8YHKDqQdqhCnijZt7rzffeoDBEg4wkIauS6WKyAa18PLr8ND5D
5VFPX7lzJ2ECb9Wq1kGt1lJfdM56b0xJXbZdr9ZBCF45jUJcBIuYMLHreaW1
6t8nyvcHAOHjxVLpBWV/hO784Dz03GQF+jf3CGlqwWsx67aP68dw5i3Wy0nx
RJeIoSBOctNchvdgKsWb3JfCsHswL0F3aDMVjw3Y77vAte46yA1/DJof+H/r
29+wgU8VsBpgpW5uik9LIBfQ+vlvd24BnjjpfToHYZ8zv94dHlSV1QIDh8vZ
ekVGy8ERyPKACROZt/u4CuEpEG0HZ+vV3XqlyDUpZt/5/fRu7SWVeZysKpPF
/Wv8AT95jUt5Peidjyv4UwVWlbPdDtcTtN3s54mJd0uLBSOgB8wUr9arEAGb
WnS49HHoX8+ZR/ZxWrLfwJDLAwNsUQfEQwjidwZ7hd3n7NLOAgzbOcgxNDFA
ghTsvMA4dbaN0/funDb4vCz77cbpqHvS638SI8r9kVFggv8Dog/EhxnP7qYh
bJTxbe4nIChKe+KdHDIn8ep67bFiAp/udaGP9xq8rPD1DNgX9NbdwueheMfn
4R3u2KkZxsHBgQkSfbV0ffDbxtdgsoDvuMaVmEGY+MvYA9nGq324BjfDhCdc
ZaWC8eeCyJxOFw+JuXpYGHfucoV2IX0OfAGa2TXh2wMYECzhDUhSfxmuzH1p
C5dQ+gYgXu/xSVgIiHF+kQ3jB9jsYr0yQDr40wWpLzQ4xTDw7iKKgLlDM4iJ
AdwlWF+rlevfggWNtgyvXS34wYXFgUe0wAkQiz5JfiAl+D0AvYCyHLAMrvHc
9EJzjYwHGCG3mOw5MAxm4QER8xxYk34F8oA9VBieszgIpmBcvUK/eLkI1rSw
XwFd5eRLA+XgUHcYDsCcOeiCjw0+THJNg+2j+VMy1C5xY4AOU6Lj4RrozPQW
q2v1kYK5nxIvMBfA3IBNXseTa1PijCwmV2JFgB4e0vBaMVI4h/4qISRJHMOe
JgDgZPUMskxvA+wAzjSaXYaruRiAYyBOWCvYdDEGGuA3IgudDnFXG8IJjEP0
iMMgGIAOZwucGqZF8pmm6zIna3TmwT8TM6jxYW0VQyMfQFY8mWeJBwknRigK
kowWYlqTBNPCuwlp0OQNkIUSFv4GnK3wbrrYEOKkf4CIj0I3idFcBXJbhgmo
Ij88KCBPJDPzM8JnRV6WCPqYyfrubrEE2AdxRHIFOPPubiocXzPxQwB4vEjM
+9g178X7uGdUIOzcJmUJQzEYmYvpIIkAPDwjGNP0p6G7hEHiVQzu5ZK+g9Xf
LUBoL83lYioW3MtKuHC5hIfhwRiDRb6McZluPEsQZ+79Ig5wdlQA8HxOQN7F
qwjQDI9Ol6EbbHDJjKQyLB0YCTClhohh/DmhghgDKBH9tBCcbviX9OsKeTi5
C5HXQcfM4ifebsU8gReS2QI5B4kD2ITmh58XGpyzPDSNwVEG0gbllWxAAM8A
rKsM8wPd3gPtILPfI5WzCeLHd8CnsH4wTRlon4ByDzJBBR1WAJpQYGQGtANb
Im5JgAxhqoe5qbOR796RLwTzeACyW0m2KFiBn0Pg5gk8ubqe4ergyRnSYSiV
ro9KFxf16pUJNgdxMQyV2Rau+OefD1NyARMGgEpc8MsvmsTDecNH/AYALiIk
uEYYEKSuTrRrkvgy/AmkhctdgxdEBjfJMn89BQJk8am9ejANQWQAHdyRPEJN
tAzhMzTVkApozB8SMxE+e4VXf0w4OCcUwJonRDWwqAVA8j4Gc442jWMpywRU
awZz6fBiVQ8ofAVdCa2Tks5qc8c7z9AQjLlNRWKJnTAidlvMYYGxUDECqvPF
SgIOZlpdg9aaEJtmECUGktLzIAl9MVzCsTIxWlZ30lsoEwHKsPH4MSVjfxGE
hB7Y/gpkiw+SgNE5nQqIwY4iaaQCKUQk0RSkYOzDJMck8DMqVyBKkPwPgCMw
epmBpSwA8qJZdYphKQDflAHu5sNiPQ0AlLchcgbZW7Qz+H+x3ByAZJjSQlCI
4FcLti7IrMOYIZAYqgegagz2AIAYoz6SA8MoCFEjsF7cDv4wh0lcC1E/R5GH
4pJg4abgoGiaDgKU1DhEXjK8AssYdSVBITEHAuussshsIrW71784H++V+V9z
cEY/j7rDi96o28Gfwef4+FH9YIgnzt+dXXzspD+lbx6f9fvdQYdfhk/NzEfG
Xv/wco/5dO/s07h3Njj8uLe9K+RFgLQn9O0dih9AYmJICUGQODr+9P/+P3YN
YP9/jU6OHdtuA/j5l5bdrBEuwjnPtpgjidCvAK6NgRRKWokIEERfvHKnqNyA
369RMqI9VDH++h8kxw4a//E3w0CovgOzRwoOjabuUjlm/vxqh4AzhAkEWhak
Z5Jacc+FfXUrrmL2KmGF5TkPxUYUy0Z4crniT5Qty0ZQzi4DobpCQxoEZ5l8
VACNbo0dgBikBfAzYDuOzksVA/42hc1baLHHqyScRmWpQUlpo/WI6v9gFT6u
UrMKrJwFemyu78OvpGgWgLn/QMw5jfovv5RNMhQ2cglsiwbS0BQqnyfOzQh6
HkQbiRaCIL3KWJLiBWXJlskCfE6sgtSSgChH9mWrmN0J/MREew7FTgLiiywf
2MAaCXaeYtFUiQAyAxAuRB9gxyBtz8LZAq3aZUZFIABw2VfuekKCK7gy0GRP
w/3Kajn7dDi86ApwtVtW85dfYEM9jrPDcpZJKAVLVjyXzUPYxxzYHk1dsAzQ
h8SJj2j9R8VfHlZM80dyc1guhsuZuaesuQNlye1ltBrC7RB468HdJAZwgAsG
fBQvkxWzYzpSsgEIAJL9PZh+ReYkvw3Yx5UgxdH7/HpFMBHo5QUHNmLSviQn
ZmEAi0JkJQkCH9G/3zv/UCqb3npF9MRuwAy4GH73wH5FDPmuIBgc596dxiju
/ZAoTkCigrshID3EIDDuWKUyaQAHmTALGGrTNVBHRN4hCRz4mVyqhHRgEAfS
DA6zfLpO3VYcTH1OljdmQmWCaipYlR5DhpTApA94AeTaXUuz/U6FP8zjHlBA
x8W/PIPIPA7YD6c9eaFS7iRehc4HQju747BNj5ZD5EauaqLnzZS78133omLS
26ha12Ti6rwI5j0xFqJrMd/MFuskm//KqXMRSZiHxEPGEoUZTAbMmq4MUAsL
A7kqbUgkLIAS4QZZcD1XghzoA22DitEHHw6VeJnUhj4Asi5aT6xKwJnb4GD4
DxhXciUIztvwboVgifhld1pBzw4tI9jhghlW2wrQ9FJT2mU550aXKLBDsMID
SS/Fq6fFXLv3UovOMCqFIkt4yOikSGviO4SiKEwSpZEbm32kMJBS9LvOnrmf
hKAlfwb6OpA0w6g8iAOgrpJwrEEzEZwiYi4QfHs6k+9luByjEVNkaja5IowA
EF3EJCA0I0QEpHQCgp356ObjNLr2QGOKPCIRdMpqE0NqE/ND5wT2JKSzZqmx
hK63GmCXlABUgMNQY3UcDu0PWny4FFaFZkuDIyXtQeQ7MCxyjGgY6HyiDgJ1
CAgmTVnMeyxagaZ4xAU+lOSiEmIaMmDLsJHdlKp4uWyCQQdiPiFSIK9tdreS
apviGp9I4ipS5m+ACA7LRyVM+oLiEt5b6PrXQkALO4O8KwTRXdEgvFIYgsU5
2SUcASGrBqthqASDfyFiNC9GH3HSLBQeFrAFLFCh5D05YrIOQLPIJN70tYCs
XKocd1b3KiG+XGNe5AVEf2Aeg4ibAxGkg5v7xz0C03HP1AOOyHsxSsIMG0gh
GWRsxAU+JUQ1iKcVptspcCJmE4FFZC5Y2jyNzumxszhM5DLIY8rYXEKU64O7
ARXCsLzNxBXhxUJ00jdoZyECMbRkztczD0CggRqXcKQPxmYUCU0CCgsmpRCF
P37cq+DKSc2hjAYo3lGBxxStV4yyMQYf4iUrGJRxRNVyZ7oUN0xdIG8tiWYh
9a+Md91kTbEVR6xApE2QlbOMwqKtIKUcJsnC55eA8V0wjsJpgFzVcWkDILmJ
bECQAkmKb3UCKiBuNzcmlmdNyOItcvVpbFObL7UiyDefC11Alj8IRgTPFm8I
64rwWjAUxq/MrFNEEjMXsgcOQ+fQzNJZigd3sgwpaKrQoIOfSObaDfKwnusr
ogXusjpMaXWQNpVULfZaqKEzClpp5EKFjzsWC3kNOEPb7UXShCSrmxrVL9TO
xVaHWIRhMnK9jTAc5EA6ZYkv03EpiXK9SHMzoEnAcVySHYxG7D4+G8oQfpr4
YUsWTUWxpDyZsCjKMGrGK5cEQplV2kW6o/2wMqmQcMQoMIVDAQk4AucbWCKf
C37VJTKAmzVXTrARPkEboy0h40RIToD9n9ZS4mTcb7LAvZB+kgKaGDNHNVJq
CBuCPH2ljqR3h2Jp29pZCM8NzXWYjF0El3wmENGxyMeqEH+WPV0RcVNhvDSE
hVUNK2RdmJaj/cixsTAWRfYS+JIAESc7NrSTjpmGMZQsTB6pssnpS8DfjTTd
p2EHpkIJ79678ZSMNzcRu3NX6cY4ViKC5Bi8FbMg+QnXzs3hrWAuWO+3K16R
4SqHlCSDMkmuw+ldtJ4q2Or0SagWAc9k7SWgxyjguygQuLDk8E6HF0x+wDNi
uOTnn7nwScFtROyXxFRnJ9ye/PxTdxMu2dhOrcCVm9yyXsWosHgr8bGSNB/O
J8RPw0gtuWBwZKHV+s68uwYn+43QGlvPIdqWcsXT1IfFsp7k2sXgLEEVfkpS
3b8l1gVCtVioCEln8qqLkGmEWW4j7B+KSZEZknEOkHvkaqQbtSGpJahKUDwb
z2QhlZEwyhntgbKC3kl2RMTYOs3IhnzMa/stZHmSYrmY10FBzKvMyqhgahHC
Pep+PyynB/gVAlEJcloJVM2Ugj8rhL9KW5JWUL7mVuDIFNBVkSCls8gAEamB
yRoYD4OxRMm7VV/FFJEwNRwpLRoQYLB05xhBvlslnJFPo5wwGFoYc97UDMv/
dFtpEs5pIngyrW1IRxOeTJY9ML0gokX3ZEbpuY9IBiB2gUWFdvJwofD+Nqmj
g5hJTqmgYJJyoMonl5+LfijDZpvFssx1nJmf8EFJfH4e1IEKwICbi8VJyml+
x4GcfAIRaPA+Bm+b4HdaYQ9XRAKym31IY5Iw7z0KZRh27/jT4XH34PTg3V4F
w5ZKF+Z83cxY5Kfyi1+cet1uH5y/O6zbjghU0UM4GbtFVOiRXee3K34v6/0T
nPuL+WoCZuxy88svtGWs4oKxUS9lIMIWNWpKbWl6BpcwOQMdhVQkDectz4VC
83T4Q5SGger0Fwln9HiPn5x6A1bc77zBtdAv5+c/XlwNLr5d4c7hk4qh7TxN
R+2GACVO9Oih2P6PIbptwCgJJkvT4AeLmm9Xq8W3K0a8ooznlmeQMOQcT7va
smBMpEkaAIvFaG8cYs6Smxiqktd2uq2UpS/JtBydSS2fmbucAEQ0eH6p1VoI
tw9dnOFX0Ay890KK+dDF1RfQTIrUaquWQo1+ySAVPtmN1D8Ufc8sRKLvP3ai
D55nan9nvjXFAPou646dDg5slNslMu1/zS6fWcj3dwkvZ3dJ65b5QTRIyafh
KhSwST2t/g9Wnq4wS7IMoxFMMQJxJOBBJMTfdLrHhyc6sWrUZwhYHGNQLEQ9
WmyWi4IHVMcU+oGdXXOFtFqhNNXR+FiSKVBQJGKmRQqJKJUThQk/v9LqF8iW
Pd3mHubjIkGUFihsKxd+fp+AC2b8AoF5Kov8QIVg+VVYYodGi4ZQiRWQUUJZ
k7RIgcK9IrnvhSBRKoU2AKop9rXutfoLaVTymrDCxVUsfVrx3SmWrayA+oTl
sVjuvyuDDVkGAxM9ULEBNCgVVZKRLFwk+HwZ3oE5oUqiSAur0dDrjsKliJth
eF19tcc253yBUZCS9AFooYaqQsyYp2wL6+ZrgvZumaxhmWqSRWFs2YNfVGgX
CACA5wzk9O0qAUi4y/0Sm87qsSWYNMs5GYlF2+SE4CQs2CUPmNuiHpFA59i4
IwM6NDtxBLR08A4ICax/ihtlECdXS4N+u5qtp6v9TXmSX65ALwfTwW+lx42N
0NiCjAX3gD3fW4kNJltewfZmNf0iRrgEqbL59qeJWFxPIxXh075gyHm4Bok4
VYPqM1VoVGnaU7lSiFWd8uwIFthgRT3YWeFyhcWOXM0HjMQhh6QAbt+u7qPN
94BnSOCZvwF4xkuAR4AzD1VsZLopm1vL1KQM5YvRMEg3RxCBjdAKcTwuQRF8
SaATSWcKQKKvjf4oWPkCLJ1zHWcBFbIfJCGm6Fa5GEQGk8ycVKpDzgshe6qS
FRupNgrkJkcN3mV5ETSSsPqvF1T3jBt7RwuWZiyruYZTxXob+DY1Vn7+WZxi
QGWyj5UrZeHTa3MYEioZ2VGWGiGLm6RSIn9AL6wlLwZLJOmwA492MA3nE/gY
Z+JibTOKH8Og8Ouy7kloDoLyKQAyPxY9kZHkLGWEy0yWuozn5aoX8+KOfI93
Ffx0f1ae5mmfJToxABv7JNrywtaciVAukz2tE6slzCk/pqI/NDn8PKvwtN63
q3j+7crbrKjgmykOH7wCjyuerWdXMqqVxE9oTpn8KKtMUK4JC2NZpCuFo6HM
Zc5q8gmFzCqUDWt2MYSRW8tbs1GjwZS7lDWE4Tfxhnqh6uALhrD0tRdsp1XR
S1gU4iTYS/C2QkFuJSUR5Fpp8JO62lARP6zyi1yQDqagrTiCabCEdRr7sfpU
5dgRy5TblHiYuY+7UeE+FqJCoFYUYqeR9xx4e2mBC3MBvm8I3pBpawE1UYYc
J2n0Gr7MQgQLIrAsfEVlOhRv5WGm8SzmIHJmBZlJGH9i18nOLTOJe9OFf0vb
vVKphXfCwRK5Qf0tASf5FeYdNyt51ERkKESuPwwMSiSJen+eSETXMbalJCU6
0ksR+U0V0hILuuTZK5GnwqAJDu0uNyDuzsOQbXiWj45toXyUpoO/WIo4D4kw
tU0KQoV3K0w+nGgJ1nKGFdKaDe3NDCwBPkD0HL7fsQeEhyx8AAkLUgvfYAQb
jOAoI84LZ3VnWP5G0T+72hDwFnCkTIIGJhlKhm1PKIexCtPYoSdiimHAimig
C1ch5BTfYaRLMrEqTUaSovlt89u/vv2Lf3YUgWTDe1gDpCscIkhg0v3zUoak
UlISzBbPtyyy84IYMzn+P63lJmbu8hZMzz3WVmk4cWpO3flkjZV2nI4iuRqn
AMtWayPPkz8l52HphBkYYLINmDWPDC8ObBPMMiY55UJMjw+XUcRqjzKFQjji
cRmgYSJKUHLhkuQGyD6UWN4eFeqC2Zwag/kdxhT4u3bxhAzFTDChwUFgZXqx
jZhLg4kHKYpKhsJDgbjWwnwUPN2swmITVgTMmLkP6LnD8+NeT1taGu0nP4Bo
dbO65qThBKQ0RRwldnBduH+dNPRCFzrrxCLeImr42D1CdlI2HDr0kwUfnmBx
hHtZrhLdVaFCDWnKEH/J4HSFg+5qCA5MJGbT9ER1qYSGSAwqN2sausmK7HEq
h8PcbcxkTP++snDWVw1KrCYmxduRlvLPL7FvyLyMv5ivmlqmfyXEMX0CKEAV
qElWBr4ENqGNMpAJ+8socyjuqQfG2ZKR5x7p4AC+J0CqxqKTgyrLF6saJTp4
QEgAksDfvl0hYxO9gTtJ8MwyuSBFSaxcNwYmk7fiU1VEIWIw9CJMAVnCt+CE
DDlLE5B/47poRqG0DhKVa+FYDm+uEBQKAPp2XrD76f23K5B4+65Vdu2yWalU
SlKv7/EyDggVexp6pHJgP0I3J7fEZ6oOpHARB7/S4RYRgyqmY1yyPF6aQrwb
kPdk/5Wz6y3JyWGEDBpdq8TiPfupXWL4pmctMqWpyJ48fBF1ocX9LChlLGIJ
Ly9mQsnuz3eHYCTkpI0mattgGSp8Io83cJkdSC4sRaJ5VMYP3DcsV8ATTQBi
by2MjdVDCARg0U5AhtMKn8Ll4jesi3HGNQEsuBaMBFakZdahheMhRcoM2nd0
K3rkd1NXnkCaho+xL48xUcp9it6BcGUxW8d8wx4MVdYzrvl1rNYTToiU3Bnm
8/YW/p5kQZZIFXO0LU/I0FXb+S4NpLm+/Uu3TNWxl14Zy6yKoMOWeqGu2yqy
SEcWScTscUqysrO51F9xsrJsxnRkRB1kIJwJlaWSSNRYAd3tEAtk/NSVSM8L
g7TW06ffrhb+FiDeSvKRvMwPlMrqd49qikslLUaRoMlnyqxtUSI0zd5eb52D
11cULwtWlFsKC4/8evLL2bJAc0HaRIUEvhPXZfCXTefbn76YWfNBhJu2tI23
Edk7RNKXP38pawuQL30hVOcWZf6Z4urj7dKRn19tHeSTuQaKNmA5PIxFnCZe
kWJGOyNelkcgKuYhKvn7BdOo+pyUEqXN0NWQRagYBj4VDrvxSa/Nk2XDW69w
hBvxZe7j5g/ZCVcfe/zxUUken8TRpAMuOJ/MM0PJhD32yFcSwZ+2ingVCWQK
5LHzSy+tvUtLz7SCGUR2Wp1AaaWd1QmGIc/gEHuJ0iJqg3Dp5vMOVIWJk+IZ
nYrxMb4NH+IEvMGjnWN4O8bw+CiPQZWqEl/Sws4fdklESHcZ33OEXRwg23XI
poyl88w1n3SBYRj//ve/00Y8uT+88DfmaRkDjWB/viFaQf5lTKsnj+Q3nviG
xjx42R9DsBMBGP78i8dkecA/w0fqGS+/3n9tjfi3f209I8YkqSM+MvgMykaW
1f/rr1sDwWuZZwzZcwFPIqTD5mZKn/l1YBDRIzF28Z/0GcZdegZBO5PEfZBY
DB5KyCWZ3NIEJO9LklhlFc136Y2trE8q51RyQzypheTN/Y1bnpTwjBaWCrNS
mKHf8l2eMo5etIHvr9978fq9rfXvbzxavmTr73IxrJo2qpb+YWtMkU3xypcu
jUwHfMWJt8j88Pa00qsYZxhNQJECD6i9JgaSiIqISl3JWQkOrex9u4Jn9kSh
24cSfrptIAklTNNLy5OO8tAx8OUMq4MoGSwFm7m+o2gyhsA0N0MeRiR776gM
kuIFG8fpiSIKN67t/PB37Zw/fm7vh8/vfXydPa+ID/ELbAtIWa2qoH0s143S
Q82xCKutOXy2fZpL5GFVGnaGjd0wlaAdTVRnMtVGqAh++/AGvUx2Rq5dBzyo
H2ctKE9jYcL5pIwbkZo7issSBozWP2NH/4TMwXgkIBiMI0oy9kx6MZu5AcBc
L9K8JWIDXCzhjHDdmlTs4KCBEgzW7nQ7ry1z2hT+fy5Hh+RDwZ1UvmgHpNSH
MjqxD8+XM9OUM+Hd7/t3afTBkEScjqn7iuA8f7t6unNRkom5SjIWyl8AO/QP
v+xb2SWYHC3NOOF4SrxU9AXxD31llxivuAQgqSDIxs7SSam+gNo0BJw9oO2p
mhzxGsKVWhWOzgG+Ey47VaGvzCR0AoYobQoYn26MKKbmMCsRIUtTZnqMez9d
WxYBWiKrgn0pXBn7SiP8nDcViZfkGuUPrTMTVRYJigVnTGQiQYsKqLJtf4U0
mA06qRJePqFv7h8XdtlQZnmQMorybQVGYq0RFecpEXwHEnwIVPFmnobZjMdy
DpAO4AtNxGEi0bWJT1LC1AfyuJnsObMhpBrUDOOJIvRLajxAbCv9D3VM63aO
XRlUdFQ/yaG6HCCM9cYECG8RQDXAnQtTKpJ50BTtjHA6lrziIDNJgxmeCMnh
Q4jrA5XiVce0RZ4LBQNKqJ4QDzypSpZRnqzoMK9MYGWxrO8itceE80c9pBKt
AhVnlLWFlAvgOKy/oIpuNNw/Ak5RLwDk0lJDUZmFJcS5GkRRRRwn6kD4Q6gy
8Ezrel0xn5ZOK9S0ZdGacgU1KkmoF801m7UWVhPoRTM41vZyqdNfOgP9irPo
48jOY9nIQSLWuA2faQofWb+2PTF7i9KBCrRaNmATdASNtGZ3u7t0HigcuKFj
Z9KbpGw6H3/d4VGSN3mSqSIrLkrOKj99rZTqJCWknq6QpARVFD+F37Tc+nMP
oaX9FmOR2Ye2jOG3OyKppwWTlnJjbRVY7bD7+Ct+i37LjtODL3UF+IKpUcu8
1ZJme6pOM2OTMDmlUCe7k7Nq2ZIPPmAkmhyw9qEEe64E4G9U0cA/Y0iVPDOK
pWaPeBniiFc6czzPFN8TIaZFpkgxRHQvJQt4tpgo6o3djzBJYAdb7ZE/hiBo
pF9JDvBOhhhwjF9FCvhChhDgg+8SAkL5DyCDeuNXkgHOu4MIVP3FiTx+Il+Q
iiOVGTsdeLIj0Sw97pXSDYGlzVlBvVTZTQSNoa8DFuAJKdsJGnqg0wCc29Yv
mYuak13OVYrIaO1RN/Xc9JrorSIF1V4My9jAw96qoTdF+l4m9Gl4crBhDiqU
CdKEgjhrzjoaB5Wb+XZF4yr3UX5eNgspixre61YJ2h4z9OGS1E7B+ok4EU0f
OTYjjIN3FSCUTMkUURosWGZTliasFWxGXjnOxkawBhOhNrgEesYt/5hOM+lA
2QhDA5VM9SYyEMGaiTHuKnNbKVVCD66BvDQAUhBiJubiWD2yn4XjNtRiLHdI
Hcf0IIgwF2QrPZwF3Q93lTd285Xecj8yT2TeLWKsIU23ldIXbGt/Ur5HaTJz
77QzAd+usMh8giTs7K9LGiGqGkcEff5IQMXMWqT3OrTEGVSVhtk9Y2YScfZV
0WjqJsvGiGBsYsZ1rAOFYZVsGTLbpxi2wXecZtNCreDL9Rb3382rvgJb9rPe
pgedloQl07ZVpplg02cM2HK28w8NmT/PqD8Bu+LOdv51CPKC8+xoeNLR06lw
NGnlFEJKi3xFXyDVmyQRYXR8Za0jUxQ8EKY56y/6p1EqzmCag7WGMdmaZFHT
aQUBVmDiAE0+31w9xHSQq5ee3WbudldlvY/VqZDinDFjGLBQI19NxJwV6cVb
kZydqvROayVpqAadzD1s2mLHYx9bN1GgqggQpIqokAQWicm9smBd1XRDQEnB
iPkyIXrTC+de7uU+5ziNML0erlYLXI7Qgp3QdyPpQnE/Z14Jvy0bYotaNP3g
zK91l1JxsbUOtYiiSfkIXK3dQDdgTF0+Mg9wYEzVYwgREHL6W50Jzuc1xXJk
QzU8PCgDLoY6r0m0UnTG2BSHtO+oR7VWnsXBLz0MXjF+lP5Rwe6Ut+xS8UMs
hpdBAX152cov7EydLRlXx0wfc/tR9YhY5JpdGyajGd3UwxcXAC4ZBWhEVhTh
baTRyVz5GZWviRAYzr3GNHbiY1GkqI0UrKAbLYX7SQMvcWIIghLGW4ZcXmjL
6+9kzVn9m72ip593CzOPEjC3nMPnHmVgw1P/hOfMP5sOqHSnajfhT7XpVOv4
XwsEWrXZbFutVrVRa9Xa1e+Y3xkA/QFmeKO2ZYYbW2a4mZrhmfm/75MFkttf
iEspHbJ4lJ/u5Z963oNTjxXhrlar73hM4m1KuKvVGuI+BLvasltWo9Gy2q12
na8fsaxmtdUAU61u12sOPdZotaxqtdFoOzX4vOXYzVYD36jVa826VW216t9B
sZKQfwB6bXvb234Wv2ryF7taeRn3XTQXTp+esyzKN2b8LZO6b8gc5W5vO4t1
4Z7Q62Myg7mRExqii6JqUuFxgPSfm/nB4pVcSU+28tUqs2SJ+jTG1hEHqKyz
FYR6fazoXaMOuugVXggt8zBt4oantuJoxzlCNJIzTqpuHwpb715rzyrKXMBk
SYtEto7jymo9mpCKToSysGnJKZSZaTAZkvcBZqgaOEfxaGyNJ6v1ReU+HU53
JeyzEXaKvQO3LCNXnMkJZ14YoGUkOoUj0YIzTP39tahh0bk8sPzA/ZdetziL
pJ9j3HEUD15Ku34Ua7eMF6pxh76kzIE+8pSIDPCMI1s2+xvz25/MfVxjSZS7
xdoRQPF8qmpFwYwkMnVI8q0sj809sGPRqk2Wsmh2nmj8Usoe4frekgQ4BXTx
FxEbKIiqYGcZ9twIFl90Fxl8r6SsAwNz32aa+ta+EaA0CZbpWCXV8eVXBoOY
WASfumLEQDjY4mgWx3B2R4vMPypehE01fkWkaGeYyMwFimSY4NkQ0QviQw4C
vThIlA8RceXRf1qc6CEWTY13hIp4+my8iD/Lql09YsRonKvexd8TBiq/SAIk
yQVh8MO3kue+XaVeSC5+VOJlac0chFgq8ltUJbEmg2DpKehlMifJhkjIf9AL
kXJnliW/Z8kft6Af11Q+mnhAnr/Kj66Jk+J5cuOYX8x9kiToU++arPSdSEyB
d/bfIMJipOd3dh1XX8qyxu1j4IRS1QZMOMXi9A02/855qrtiBxQO43Qg6Llz
TD8faK1E8vQt4gR6s5FdXSxUdGLr4gcZVMC50Q5lY3NrahEMMygowqVASzpP
JAKKfJ5b2Fe5Jhnifh/tkbQT8u6OKBVj+ztqojVz77Zq4AnWKvClIl6CFI8Z
prkSuDRTbHSz7USKoU/Gk7sM9dg0ZVLlXcAYONF/k7eUycZcZTm8vNLLLLrR
C++HDKlNuFbY74cB3bWTua4igz+620BA1WACkHJZTSevDBvnk8i53iFFlJNp
c5OZGS9Jw54ArGhpmO7xh8Pzg847W1VGcehXhxTfPJGeyqOwCT/OqNL65+mF
5Mnao9aFdPgwnOG9Vml8bvzx3JBtsp1ag67voG5zNfolPX3gzuLpRrhSsruM
UCdAFuJ8KxHJdKpHjXPH/H7+GS+1hpH3H7k3gxaeLMlGeOoUANeqTTd86ELr
IMPBxlwnIbyiUDRsEjtqVNsY5z/EG3woGqoLhHuuC6KKkV0MjCJPdbWqGJ+I
YTLS102766VIjHOEdwhOwaN5WLEbFduqcPs8HbUi/CCqvXMFGpm7QxJtli0a
yV0NJBsS4srOP3c+wUuCXtRh/PSLIhc6Y2SjFEkLwcBwFdFyqdb2qMHInoyZ
P+pEIDREbmOZlI+b5C5JoQOSE1M4pFxrZO7T+XlVnsN2FojKk65zdv5JHctZ
Lddz0VIZHGfSiphnTqSqPd8tTQVDGcbhdJqWuxU9kie/NE1DQl9J7PQCJbqp
bJeqeK51bEhCT/qjVIKVFqZh1ysDsHPHLiqWNiFtbyeP6GwwPm3KpzP5IVU4
x7Y36wNz/0fNDc8sg6LMsRanndD1fNkaH4NMWTxwJq4bx+sg77hKTyeRA2Jz
4W+hqRWn7S3VqVvsPkL4S9tT5TrIZPpQRc9AO00SoHKmo3DFXUgyp4rY8sy0
cGFxL2bDfrhTzsikmnwXAVF8iWLwucDEQyjKS2ka/kxsM2cocNZGqi2XtVZF
jRuDE0b2FDqS6aiuVDL8es6AVWZC6M7yVqWQ3WSRZIwHYaPqHVCWfBML6WN6
NBadejKPRWAah3ymHh1ieTGJvnCx2MLAT2Z935GyfHVTvBJlEsIz5gXAQr+o
M91aGnDLptW3iwQhTVi2dcQGM9GzAkClGNqijX10Rzvn4xy+BL/mc+96Mpt2
ly9HRh41sgf9V8sC4483lLpqXExtasXUKxcU0/m4khUp6Y0zbK9J2eBuy4o7
MgI8V1zWmqDJBpBNUzjIn6twgtccFIddNVn4jCg0t0WhSOFk4PW72jxVxKt6
tye0G7UThCRJ86dyRYpgTxWta9Y13pGhwh96A1LV4atYGymEb7dW1MmDWvzk
KkNRpStFT/PvaB35jbsqLrY7RaYBYByUo2oKHqfZzMizg2MbjIu0Pz2FfzVH
nxPpbHimVQ6ZOosCmYx6WPpvmcgW436cOQ+6jX2ked6SoD4ykuY36pC+hN0z
WCngVJ5aFWtlz50qisH8SkXW13t7V/DO3q7OfLlYH6/5JdHvMfsRHN5OA4Jz
LeXKtgHuQjId5y4MVnV6VviZmXbncVzV3JGveF2GN2JYtbC07YaqfxHX3qo1
YZZD82xT+fBCSDzb8/G5AOuz1Xb/OfHTNBDKiXBpB3PTZ6Sq1aJAs+jVcKRh
KJzD55zK+gVo0oRh8bNNwAUJigRDYt/rmybNO1URIA5KcaSMiZE/+iK4I+Pq
prH5ZKs8qxh10nQgaVIxitac5Zxs4kuzA3iNCZ4hX+if7B8kJfyw0E6q5E5o
JdK/VVZmzlcWTo5qLpB2jaJrMYHOwJh15+ktCmljL/DjTbtSxTYxi3vCHbUk
U6e7xDjbS0IXeAsqeKWUICoBBLl1teFEnEqjuiD+mphLfJ+9BSjjDGK/pLRP
jXrmea/3Q8XYJ9NQhIjyRwl+t1tRnDkiaMzCJZ7Izl9oJyO8Odxr7rgyRdXh
vmvd5VZhqsJoz+p7CZo3Qgz0oqy9/NY8IZuWEiM7N5UhfOm7b5sQ27uhzTQr
TsWWcihNZ71sNi35LOydF8EEr95g0UKzl3IGPWcbMkEJta/9tNunK9hYZBpz
Bn5JXYXAQQhBhaxG9p72ss3C9bUpF4bLik16WqkIGfCnayJEHS5X4nrxpCjp
viuEkomZJLtFD3kYYRrvKvRmMOcqVyRGL8oHSSiKuQmQ29hxs9dMFJBCThw/
m/TYGSX5b5D6AA4w8rgSQSwUaWSzblTVW4EviA5jzh/cOs2b2efPrzKbMozD
+cYsOlPFsQCPS05RWkxc7BZgyktVFxhdcG/VcumEIAib4kF4UtG4meBDx8O1
Nrvc1aYI16mRrnXd5Z6KuDZZ45iduDAEJu+VooVTS0beC+8hjS9rJyTTuxki
gT/VIGUeqJOWfCkTt6HUbzIj91OxbgoEmerNkQpfgo5ENd0wWZGJ9p1CWXWw
bJUvj+fgRHqQO3+xuPjzyjyXHV6PM6fSgFoKjqpx2xPxAiwXS6yitKtRRM1n
SKqJa9RFKIYfFZepP7s0iajtO9Ir4ox9/vJ1mk7emkT1obKlinpEyBl5tTu5
SPfcPmklK3npEOt8gfWeB3RdSrDjWioV66zo83Kj/2u0KrCPvurQnY6hXzMl
25gKIxN5jHr2KV9Q3dJKuNy6sC5YEPvzTWWF6+RLjdRSuanLVrOcIiRThxuC
tXZ/WEJ5MJr7uftmdt/Bx5EM/SX9Dp/s7Utal4MK3RCmCEy7ByJtn7V1/yT1
GkImPzLFvd1i3FhckayuJMY+AcuQ7Enq2iB638n7pZVOMzIXNasL2ERnP3dO
La5jCtVu1GnTydqFLa5C1Ij68eAX3SxYAU7L9Gqhg6QgV+biIK3UKZ/EHWUh
SgIvM5okKKQQFDQFA3JNQTrqJ6FRT+XR1XTp+ftSVYMlrNeme9zm2xeC/aDd
NbcMqdhlIe/34vsEQaPmR+cuVapML71XkThji4j5JuBlaHAvPhoyNSEK7pgU
Mh6ojJtBvab7kXWrlW+BoNLNaPsCrKLmZjOwzMrbpCjXJnvjZu7AVKfKs10g
sfu1+SybbV+Bl+Y8tbZX2m2ddN1o9qrDLBBxCdsds8ppYAqRxD1YZLRRcOxz
V0QreaY1jszDSMZpdZUAk1OnwewU3/7v9ApJPu4vLi2UM9DUmaeY8GnvuQuM
s7dipjpH3i9beO/31kXIqnpLNv/PDaWmI0NuBx140gwr7l0mSbScZk6xzVb6
UEIyroA/Vaezo5c97KUXn6BOLEuzInfJHy9zxtf5UWIvvothJMNk5ivkU63F
Lr80W6x2yj5Dr5fTQJ0+riDDPOxlLgUuQhyQvt73TeJLCWl52Tvr7TI7vjm0
6AKggP9zyorHQ4EjIxTqBjh8OtVfzzd+zOOArxV6cDeJbPMo1jzHquJFlGtv
x6agMBESpDXZSkWoKZ0RZCCIg7PUrkoohJG4hCzN8HJ0XfY4wFQoOFB3C3m5
XjH6E1ECK0JQOFYkryePItVtRCV4sJMINcBObxg+pzXKB/luYSqNfqSANr4S
4qWmon+xvDeXfAyZL1KtEBN3UzYPy8KmPy5rfYZI5avWLKD7QSXPta4nrHZp
gVrDPWr5ijXZc7TV6d7yQ/QCwfeJZwn7dquQavCkeqaHjsoioUZwOyYNHbog
uXp0A8FOcLpLQZapZ3Kc3wTaLWSvCKo+TK81ZQtH6WNDXXXNgXHR/gabWSnz
6FjcG4BG4Uz4y3JP/AQv9qjCl7tK10mG3WLRPFUE0jjBtV5y9k6QqaD6FNby
SCH1qSdLg2vjt+iDGMCcLsCTAsGKj2BOV6s5ORQ9eDCih2BKdNOPezyDXf/u
3K5RAKSXGjmpH7il5oWwlzx/Jy8rkl21kco00487cG12iCqppLWHU82R1Qys
ofmmBwpS3i1E9XAcvaStLFseiejQJFVpPiyhL0Qqf/awcJCCKh/V5iYHvR1w
I8zS9c0ynIbMH8kQGlmPB+ApcNM07YbdNB5TMD3ff4DnUSWxL2bxCgGH7r8W
DI3n1LLIx9bNUiaDaoix1qZ4AzH5qaKnKDl+qyUVE4WymFjzkeWtMQQmYQeh
qbol635ag9Raz2RTPHTPqF2M+PwA3QykdW4/uuUTFlw/roE5e/W4yIz4gH5M
H2xU/8pcQJwD/wQc1C6GJAgdenIyQoZWy67rLKoghdmAlRG6brQSKRF1wTTe
zkOhMlZOrIBIoykNLQWH8KyFB5ZTeCs93iYdmyIVyjdd0YAoLUhUKJRslGNi
qP2o7qrCdOFwLk9PHgSWccx/WFEUAO/iEFp/Kq9SFX3TFz5d5alkXmrJSx0N
4qd/3rFbLIBI/ut71g07nDdTf4W0HZmYg8Z8MNdqEE1oWj7rjsr1pUsCesgs
dsttJMIwMsFFVuuk16izISKBo1M64PUW0AI6WdgLsWiABL1n+kKDhQQUlZo9
I8zoI77ambeGVrlYgxDbkmwz1TnpmItlbkiOvogxUIsqc8BjGcGCOufrkM7d
F9neksBZQpeCZc+JicIDWRO07ZQhMLi0hQ2Lh8yV5IDidcyH5Ex1hp+uBklR
vZhvET9YG/cg2wzV5Yx/1ycum2igYSCI4bzIdWrjS078aSwq9HEIAbISkv96
GvAChS+kOaJ512Aly4HTO3JQdSkRqEKuVOVMV3QJptbCrQR67Rg34YMXSQgS
pto6LRgSaxcHtHj5KXXrrID1KunQCJekJKUMG38a5QJM8Wwfy1QZ3EvXiXp+
zRlUqqRx5TpUPGZB1hmbBjMXL53iKBXYEvGSMEyqQwZ0Cl4/EuYZ1tYSUUij
BF6Yi7v9xBC0a3xFv/wDyPuWrQcFoS340DRZI9Og9nac71LRvLweEmFLGYsv
IFQtTkBYTK+zE0cnt27slkeLM5cLpJ33UM2pa+XEjVv6bRfiIL/slcMezyd1
SUh2NON7o8kOGux6LA6wjiKkiw+i+PEgwku4M8ZV2qZV3ZgnYo7UzXQxXUw2
aaZB3nXb6X+y6npsHU2MjX7uIYiTVMiLW0IoMs5x4hm8EMnOquIem5lmyPmZ
ivl+uLyF7XbcGY6YOyFGZTeyj7R+Q5h2dxvfL6iWTSj9ACa3doTr51fZ++4p
01CYmxLHV9Mm2CiKKTA1OBsjyS+S0PxQRs/Q5cogMIMxHvjBQL4K56wmowi7
+wGgaOXoYzAbG4IQpaQvCxlBDXPT6jQE8oe0cFOd403jOsJi1BQ1Wm30OIX7
l+DdbRihW139fynOYcmTw9jWmzKu+WM9gAnMItxmYatw9aFzYu5LFGVy0HTO
odVo//JLiQNrZUMwRprWxVGJrvkm7QO+EVCuPcUqOTOSrTnBgLjVP+buKjMM
lmdyG7xrcPvihPaDcioQbT/EDXy3+Rn4woO8RZm58EI73IP6Dkldn9Zg9UAE
L1Qyn8zE+XIY5cNM6XJyXysvlPwqgWMXSDSegjoFVITuak2RVt59ISil6hLV
OKVy0b7SkyEU2FCUyAZQaOThhMQn1iN9nJ0wLYvJwvnNYpNwyhSI4QG5X3k2
1AyFxf9x5x3riXP8AcMCdyKHqNKA3CbGpaPrat5n5hQCantacre0uZniX7QE
zfriFOXRh49fKCGIeSE6OoK9adlwpGwaKOAnKtxQ9cG0SEN0N3p+pd8FsyJL
duE5R6oQKV+bimSlIXyQ4rSpkc+WCgOZqDnRQAVvpOARB3vc6ST0lm7s6xGX
RRBO+azJihvFuQli6UE/yMHOmrGbOcGO2AmfOK28lc6fEvUoc54hz7goYUDC
fp65Alqw40GOS+mc6H7/8LikjOB38Fv2jkdwcI7TD2u1dlXdKc8Bo5nrf7tS
ojYUp+34Bo2zuXZ0Z3GXljKidZUwEcdS0SzRSJimkUpBN7Jdvrrph8NLpAS2
K5G5QFTVL6arc5P0Z3VmXdRS911/jzvfY0qTfoD1q2YBc7ovla68YpM9EY2Q
NHgifbgT/XD34j5UByhZVsmdyDNf1+R1kOsb3rOBy2VYhkkzyohhuhtMWeSQ
iLOOXapadKm5+fG+3Gc5f1tQevmrCE1mh8YsUsHglBMce7sHl3cD0E2BoR4l
SCPgaUJEhA0KZspcJwqskjZIEfcd6HVn8eqHJA1ZsdpVUSoVy8W2IMW6Rav1
BOUiGa9gAHISCgfJjQEskp713MmaaLRsHc/b1yN0qvgtVxmROo9u0T3u4SP2
S5moAma60Yy8+4yELGUUwHo+jUX6Kruioln05DHdkaPdeyQtv9maGrvvshuk
5ytHkqlcrmXiQTJCL/v+DpFHxtFOk4gqSjjCk7nQaMsa+6Ws5CAZHgFeJCXE
094JXqpwHQZ72jVj8wLMV2QNALeoybhrdI3qjC+TdfkyKjWYvDB1vVRyooCs
Iq7Xnd8vptQ3wMVO9dPFAaBsqdIvwlTnRpih9I4P6En5TElAMllPJlTdlgb4
mPA5xUnGYHouicpu9VVnjtOkQUxx62luCk7Z6hhVnUWnqXRMb1mVu2QK40yI
vMY+XcIqDQbxda+hWiYvSD5pkFkwDzWzicNciTxOKc8FKszp8aLUwid305fR
HRrS22Rkh9pUgaeeZeQopiZ+3zHr990kdUblhLJKPRdVKqBU4Pl8L6lsyCGb
fqY5E+3y3BS5TH+cek3yiZjcQo573HalzF2xZGBFz/kbHHhM14KUqzLY0gl5
rgQEuP82DO+eje6mG9FZdwZ6aIn2+yqe7ojEa1eNS2Bvy3iNvBda8uHSZd1B
Cq2AAWmrl176EEeXsg9VzEMSrvmIqCGDnwlFQNmfKJosDVtlB050ZKUREcJX
Is8XFWgvRdiZg625RJlRvN9Euy8erJGKqe5J2qksi7JwRdtJm1VoM3iCU8kS
RuPtWnRnC5buA6dEVb8hblglzl+IW7YAOQxmmcgA9QiM4VJiIFizZEgLrGTo
LL3AEJMDRE4/JAUhLgrYyCWBwwHjkpkbgREqtOcmPdqovme3jOTlyj3IVu8w
vHLY1Ep5JWL0aCbDUT1K+pyKKkRJQa5UK8vi6p68Y2FHsltQUIhJWhi1SBpd
U5wmoiPw7QHbLr9oBSTokMpiNVar2j3VdGWRyvm4osCxnL3jSTSYoxplV90v
uL1E0U1HL0/NOwrncXBG3+x976Is/SpHVU1DZCpKIuTq0tpZhuS5PKenzhKJ
In7ZvQWRJtB18u3qJ1HR8RMfGONOK9QTRR5MfhAH3h8WOa9VnQgU03Crc+0M
4PZt4FsdzKn3RbAw2Y9TzQuQU/xQtp3hDoCags2FMhWRZ/r8GXqiGAfVewIm
v7ILYFr0HIDYn/PpaFF1qB+tVjAJ4oB00DycCKWJq8bSDuW4K3dFNkAuvrxF
SiFZhH0tgh0qwkFEFDHgqCHl99oAcQBV3tGUw2rBiU9sHEnkIYzfrb5N2NVF
tw/MzAXv6uaqvCWt3RrFRyOJPPa3u9rrZ9xT08GgtjToYC/DMtG1WjGSbtoo
U2vQmd6uzBb0ddpcPOCydA4GiIQphm/WeFqNCJIdTdaSsukAtySimz5D7SgG
96NShzhJIFNFLAulXPsi3mX+pqFfjGylvjwbo07KZa3n3UcB5BMvvy8oRbO+
HszTbWSGKW3KodVmKDZ5I/skMnRRTTGE9++wuZ9fEhVOWicpHwX/jMopFsC/
q8VSWC8KSaAGc83fuSDCI/aR4/9AE/wgZ/hBn+IHqsUSo6slig9gBbKSnBYt
O3modoCULldUpequVPm5HOaHzDjbq+Z9ldP6vSmXNRlmQe95oh+9px7p3vwJ
H3g1PeNDQAEdvl5q6l4JaVm1lSGe/N3JqoxZ22jCN9j7wtWUri4IAMB+evp3
66p5Mpmoqdw5H/1MV6qSJnxnBYeA6E5ebrjIOP3JTK8NFQ3wFXJ2qKoiWaOI
s2weyiM+Xb3/Z45V5QFppeayhzG32dWkiiuVJ6ZoSqDIrPg4X9EpQLk3VQSR
tmBLqZPOTmFSWlyCwJO89O4CPFaMs1A3OmS5rdsFMp3oOCKAz/2w80FmSNg7
3yh6mIoprTHgQpSLCNmLpkxGcJEtIg71qIIujvjEc5+pcJe4FPUl+smw+1CX
TteLqbrMHAMEXPlkGOfieKngkA2b7xsvTYdi/XHI6uYzl0vxXXKBPDCQeQiv
6xA192i7LBKX4wOGKsFKTFUgqjFOPFvzfX8HvHXOZOhCN1ugnNqg2fyMaIFb
HHPM1rglaZm1zBSqlWmHr+JAN3T1Sx1Tl1qspmwU5FzTG30SygizhybuYuEL
ApXnVSmM+tOl7xzLlIZ7nGz3dAlB782oMkWUXktnCZ6En8BlYnjrBr6wm9G3
yHaMFn3HKDRwsIgOiKiWK9VyjKpoKLmFS8o2zggfQW2LRHu2jd45ihGXiwbz
gFKyczpl+zB8aWtHI9OSABcSYJZIprHkeUBcaOagsMx/SjMovfoC1adB15dk
NqYd1E8DHHySuwCCWsWt1ncyrW/TC8O0YFl5R+IeS4MYfAZMEM61+JO4Mpc9
fOLntPNE8c3V2r3VfCaSjWe9PnYV3uG86r4SVTMmgtBYRqCFFvSrMzXjVvIc
VetwEzb9EkucOnO7qFao8iD7Kad7g6VQXU86hBSYqngNHQH3lqNjKze5le3Q
ipqig/Dkcjit2XrFPF/F1HEPDWKRa0eNGsp28ck6AjKlyiauJWOXkxqIoBZW
3oo61UwAFs2gUt+AIrqihwxHMrbuUyXdnmu1xqeNuYSFOU22AyJKNZFS6QxO
xndQMiVL0bLJ4NbpMTqFmJ0ZaL7LSmaxnogin23S0gwpRTEa+cOOyFkUem1G
d7+iV7KSaiWPpqSgHhENnAOsb1JtOdRcXL0TlA0V+NaKvTUWh1FSgcnaULu1
ldShkfb9UXZnvndHWqmIWoZJkJR0xuNmMfsR94mfoQgIl3TPtEmH9EWT7YTd
XZV/z94/m/bU1Nqeyua/i63evbI9qQgQZI9cJ5kT1jJVoeoISLCl1QMVrf2z
HhvgohQ+i5+4EWMU46NpqmH7rLUM66jEvamXbhL+5nyMAb2PGFBDGQ2plriw
kcJrqSglUcGX/sr302MtDPzhdmX8q8LKeFkMyOUUSPC0Bz31ARgMpCGiVZDw
0OKQEyhVJBV3Hi7WSS4bODf3sciEU8qFL28/fwzPG3pViryDWVzbt5+vxxK4
LakrobR35ck1XWqihUhcP+USD4IpBQwOkPTDgrMF+x/Ph8el7NFTUPIoP8t8
mDiTdsanzZCa2KTJSCwJUYVauETxMF5RB5wdHkwXE5cFpgYiQUbLkLoD+qC8
MP8vop7Uz1DxNh7G1y1O7TS9MILRoKJDcCqeLC+lxuDc9J5s9WcRhJQCe5hh
pUpa4D1ZI438/HP3nI3TXlRQn83e5naR83EPFzPPrYiCNEufMfY71mbw2qg9
c/5Y2J0bL0V/jLRq5/mmsGyoUs0+HZInEzXKXvnnFpbxV9S1xeTtPTdZmh/a
cYLqsHwkj9RU9LvX5ngMNY1IPYgeLWnyCYzi8xXQK7iRi5mrvLrjk9EpHoMg
FYBHHMqpx7CXlxvYEg+bpxwODnNtMLBmgD8XN5pkq5ZemaOQKsO361Rz17cr
JwAPy7NbveNFrhNytSiZ6umc6f+ROfYBr/z886h70ut/EhfJpUFidMoatQPZ
PSgzCHFi2jn//fnZANQZeqvX7r0EuvbGD0mmhWWiehK5fJDJbpj7dHXLdfjo
wrhgJExL6qQ3QfnQxzvgp2Ew4bMYhvEj4hU1Mddk0E2I8/QUMeixO1dz2Am1
dGpF9CXTLogL7unYFna2EV9on5siKRZys0wMPhwc0CFBo/iPvC9AxXW1XpIG
aSath3AO4cLVZlsQbHxKtGvN7+lUrSha/3YFejK9AtQw/v3vf5t3GzDW5gZM
KR/Dp/axQr30hlo/7cm76T52j2ynlckYcuJij54TSYy3pnpf+/hKYhA7bPLz
fIBgvFyHPA9dVaJyIX81Ya70i4KR/vyWb+Da/zt/8Y+SehrsqfCF7+6L+f6n
aT02o5L5Z/i3ZWljqW2B3JAP/+1vZrNUsOi3b00rO68H4ur2L/SR6POVXwkd
BkBUFCFLxzThC0bS0QSwLL0xxbLemLYp7qHG+Sxr62HbqdYyL9QzL9SqdtWp
Vqu1/IsEqiUG7PZtp1kqZeYEktAGaUaWZdmWY1WtmlW3GlbTallty7U8y7cC
K7Qi27Jt27Grds2u2w27abfstu3aHt8F59uBHdqRYzm24zhVp+bUnYbTdFpO
23Edz/GdwAmdqGrJtVbr4Ko3qy16vdquulWv6leDaliNalbNrjm1aq1Wq9ca
eGtcrV1za17NrwW1sBbVrbpdd+rVeq1ep9frjXqz3qq3627dq/v1oB7Wo4bV
sBtOo9qoNeqNRqPZaDXaDbfhNfxG0AgbUdNq2k2+oa5Zbdaa9Waj2Wy2mu2m
2/SafjNohs+Cs5UDZ9XSwdlCYP4mgDI4vd8KUAZn67cClMFZ/60AZXA6uwDa
jJhhXiHDmGNgEtWuKkm1i641jg7Pu42akHnIVQeSq8xX4eb9gz/7/PD1x/rt
F+dx6sXX8fuNf9e7WUx6N4cPvfhh0pv15v1x72lw7Mdn8WHcf+o+9W/6T/2n
YfzxGAY5jP1376f+6ef115N28vXH2uIy9h/hEev95pZf6Qyf+uP+Bl8aHPeS
3nF2WhgEZw6/jKb+5npz+WN9/vV8AkP4dx/OeYiBdfnQ7xw+9ju9h/7TodXv
XDwMbg6r/c7k4Wx8dNTvwiC9h+HTUbffvXgY3XQf+uMuDAGLHQ8fB+Ou0x/7
j2edbr1/0X0c3px0+hfDx9H45LR/c7iBDW5gxRsYZNDp2f2by83gqVfr39xu
huP3x/3b/mbUeX/Sv7186nf6j/2nHmylb/WfLp4GN/1q/2nydDYeHPWt3tPw
CQfp9q2Lp9HN8AEMNKt/M3wadIbWYDx0Bh3fOusM64Nu1xrejDqD7tAajUen
g/Gh3R9fbAbjvj3oXNg4yPjSHjxd1AbjW3s4/nw8uOjbo87nk8HFpdPvXD4O
bnpO/+nSGtxcOIOby+rgZuKcjb8eDW57zvDpa3dwC4NcOKMb/2Hw1K0COJ8G
T8PqYOw7gye/etbx6wOrWx3eBJ2BNayOzrcxg2hBOtnCzERh5qxzCKCG/zsA
8ptDgA9senwIK/Qf4Lt6v9t9GN7AIEedfnf4MBofncLjj4AdgHr/EeAD+4bN
PHVr/fHt43B8cty/6D+OOicn/YvLDSAcpgPsPPVAqr/q3wCIbnqwmcnmbPz+
qH/b2wyf3nf7txeb0U3/QaPOJwAlwMd/Ouv0632r+zS8GXT6OMjwaTQenA46
QEbj4QY/BOwA1AGUT8PaoHNrDcejY8ThqDM6GXQvbSA3oCEgjKcLwCJj5+YC
QDmxz8afjwYXPXv49Lk7uLiwRzeXQJlAbjeXQBuA8PElYMd3zjqX9cFt1xne
fO0MbofOaAyDfD0dPAERj30gt34VaAMQDoh88muDp9vqcBwcD6x+ddQJToAB
4mj49q3Ql6QwRaH0DsPGRGsKnqFa6j+Br5qUpIYWPSJTi8TksNaSbiLER3Vd
Lp4Gy0GX5fBUSQ1H+p2f0xR6Kp74GLio6y5JfS7WJrRz2dur41/4f6PZyqp3
p1hdW3a1DkqiKhThHysa4/dPQKNPwzmLw5TtpVgcnEuReAGi8DAGuQecNRHP
I7Uy/bHIS4Jp++byy1ATj48wxcX842lvzj9fVs+OlfS1kJaJ5Imcgcn6QIfA
aE9y2PdtBezcZRtb3av1+/ny1q96WHa6zvW5Tq7iuWhxzWTxCp04X+SP+YCm
VhImqSS9AUYLUFbEAIdBQLFtM41ta5FyCo5zuJwLKGWHdeoSI2zTqyd4F2h4
5j7uW9oisVU4/I80qtMrvFoqZSxU9Wf7YZivJJ6WxivTKoKGGo3T6sXFsHIx
pXLx+PwHe4lgTqEIZ8mWO0uZVKzY0DNZRv5iFXaCsAhqQbejUMBPHmgxuL6r
cKRd79D9B3QjuaiWTmRjtjd56cLiJTPMdHPFVTRs6dll+sdRcmdvJC4UGYt7
R/ixv/FjIgyxY2UVKalmgGj0EN7iTyQixGylsql+cRSuqRUOkhebneLtki7g
1EL+PvuH+Tf+2YGf3+TQKUgBF/8X7atwmhngr98dgDo//yUrPLVtwBK0fSih
toX2HSSiLozPX8/AbusOtBcSSaz37MsciCpSNQuW5oWYj38tqWig8fYW/h64
i/yg/MExJPSzHm/RS456O4XmWA8l7AAlqymZTFvM7txlnIikM+32jRBGO3a2
983aK5v4D/xQQieZUP+9l+zcS0hw351ITfUb3rF/xeIsubxf8dLh0XGHXsJ/
tbfgNUE04hHxhKb527rib0SNqvDChDemjSAGwIG6WePBen6MWv0PNxysk+Oh
JQ0HcD86PdDmQ2U4DG8H3febXqN33JPOgTAggqPhLfkPI2FbZPwHttDvvziD
6+D4Wk2DBgQPKZyl20sHDYcnZdzmVtCOLp0T64N67VEMNTrRh+ij9bE9BHgn
W5ZoXjSl9cvfruKlZqDmTI/0OXgsV+r8RqhfYaoKBSxOHAJDyw/4aV1X64bo
Fqs/tzQYJLsiMk2Jcqkr5SH9KIxV+uRoj9apaM3JGqpVNlStRh1cf/Dqa812
zYZP2XjVP3UK5q7W6g010yH+BFPXd89dyxnJIqSRm70mgx25+f8zjOdNNmag
4glk/RL9a7EEov/h5Zf3VngBg3QF+6CjT94reGe3Vp95IH5vH13781F9GAs+
QZeT/Khh9Qy8OpwKQwI42xM4d7FcSR9YCQzpp0tpsqOJb+dW8yRYzfJnMMjJ
Guz6jfvlyPriTDfINhgQIbaRqzj3EzEUcePF6ckmeDc9luyE3NjpyyAIbCi3
qTH4zTKm0EF3Ex3iHjqEdWA7WmnwDgZ5f+3NwZmcTR+Ck/adj+EaeAVcTH3W
I3YmerDRi63VwCAqJKMiGIdODnyP9L3yo/Pfk1zoza0Xy4CF/yIZsPCflwEs
6rOSoJyVAy8XBN9bY5YhYWm/XhjU8oqnmPWLxUTB/L9WIDS25v//hcJ/hlBo
3/xGocBq9lnmR39fRB622bSHgwD45iOMzT1dVt/f+e9Gkef0McqAAsDZsSJb
/xz5OZaBh6+ngxsQUR0tiLa1qi5+v1Fwo+9hkKzUyhoJIB/kzVDg6nZlKi2t
+c5cECJKv4tcTs6mfoxXq2nYpTtZ9r0yXS2WOg+C/5P1bP/v3t9jcMr+arb+
FBPPx6kzuI9v/blZet0q/aNkZCe4OFbXuuyv8+Ovryg/+tb8Ozyz75W4EhsH
Xv9DPvPK7E3mWDyHdSPrOWWb6WiTfAC9RqzU/h9mNt3Hg//9wP6H+T/fmvv2
X/9K6/wfrVLpwM7tsAAY/LpYsdoUM+mzmxJD/vBD5WYRz/f/7l8v9/fXmPID
0JUoTxhFO0Io5vOgTakA7ySfUC2cszNFT+l1/UGsRle9Vlw6WJX8tMbqED4O
IIvkv4rTcerWvrRthpFxX7NURQAC5RVcPV2F06mzf6K5oa/Mk5jvyZRTwpLU
4hztucPlhErT3pgnZTqBTScV6JbDMh38L5snQDKnJ/vOP516HeNU7RScPl07
d1KZgOufflqUKpbQ/gp6j68D2T/Zh9dLMP7+Af5QygcecHlf1aGYDATh9ZPK
1uMxXld1xY/s80QFg9K6F9hORjib+h9BTvxy5lvc6p/fmsIZR2SnvUbp7EO6
uq9cfhdwHl4/esA30aUVoxTtMDIN4lQH0a8AWYeveM4ebPr69sBmhAZ0oo4W
k55gorINukHZzVHaUhwlk7ov+y1RoUEHJ/kWnHXukih368wVh05FFWt62LiY
VkNFfvvLsvkTddimFdAJyqssW6MgosqjN/k9lLOnacraGwpV+QUR2Pg10Z+P
pIh69eQnJvGfSn+Bh4Ggf9o/hB+P+Ee79BdDmwUrWzVkP21dbSYrpR1eR7B0
o1VKrE88aIZzf9KCvFRyfLJYfgyBqYJleL6ZeYspvBRNARv7+z8d2KXXTild
0T18dwDLfg1SFzzMJ/NP5vKfjlZdcZfE0wWGHvfv/1mFJw7hift/YnjpCH8q
/bN4SjXAI7wqB4HnYbJ9jFWLj0rw2eHrVKQIDtoW3T0+gbX/WNrGu5K1GWuX
ZK/+SXrhuQi7cq3kl5Q3KAiPd8DWbUeY+NsGdOGFjkTK+njSnmY6pP29g//f
yuFFc3DKJHDYn2hLFVgwyrGw/a3p/fBJ1On9YP7F/PrpsGOmgZ42fCRus/2B
NgfT/0AvH/OH3x4t7/AqvfECfj26Uk1ptUctr2bXo0a7ETbazRr8a8PfUdOB
z506/NuoN6tNC2zqELP5ogwCS/vems2w5oH1bAcNtxVGlt322tWG32xHXjNy
/DoWGPBhb4bEVvpl66LRd5WtFEwa3Gpmolvg97fIircb1UYdjPo6/NIik74K
/zVxC7DgwNr6I1//jX/+j3jdbhWjVby+G7u29RxSxesCtyZzTv68ghaQrDo5
lFXb7ZbVanqBZ7sOLMnzgHDDqO42fbvlB7WoVYvallN1Wk3Lbratdr3VrNel
yg1rbhjYQVWohyKFBCoHLQ4UEP/Z66hXs1RtPrfzwKp5USOo2VHDdVrtRtVx
nbDttCPXaXuhF9SBpR0QEG6zBR8GQdgMqnbNa0iIRxasrfpH18T0yBGaDnrD
c8sGr46cwvPj+tMXZ7r+4ryvB6efn/AZ+K6G312cvB+nfim6qVXM0A6efKy+
2Axu2JP9cXp0NDo+Sr7+WJ8HpxN0Ah/7nVv0KbsXlgi8sj/1SBUGfXD40M26
kK5n5/ycXNKHIUaVLy6x3uNkcHMLPtdlHT3iQQdLCuj7zQAd5ktwkrGMpF/t
41e3Fw48Cr/zpnxnessLD04G3R4604+jztejs+7n036nWx/e3FI5y22/enbx
9XhgXW6GTxdVdtmDqTf7vLn8Mrr3p+2n4N37O2/mL0abOm4mQZh87A7ef3w3
uPuKdUKPvY/zQeT+WI8u51Pr65e+THTX5J4zGx7D5+ztPlFtxNPXU1zJUw82
8LVLifDf9D9WLP3GV9P/KZ73e4f5L1zJ41nn6BhLbUY3WIVyAXTjW0A3CF6L
6oSQTvCRns0Ue4EU/IDxidGYSozge/D6rQsLSKt6Nj7pDm67tdHF5UN/PD0+
G/cdKqzx66PbXnV0874zGPtEYu7pyZN7fDQHop/6sxPLq/YmfnW0AUIQsZzD
p7Pxba3fmVQp9zE67l90N0jMw9v3J/2bzyejm89HA6v/eNYdwH+XNfi/3u9g
XGYCVN2F1RzWB+NJdTCGZ8ejIxwEi7s6fVrB19PPN54zmn49Ppq5P35O4N+p
d/p5BSuyeqftWQ82PTg/it0vo6d0RTCIXNRvXxFVcfGicEVA3Lwi5/P665f3
18Fpe9M75SDUqHNoDRHcHVj5zdcjGAo4ur8Z4kren5yNewDa7ubs4v3J8HYI
Yumw3r+5eOzfwmwd/G7UHY2Dbv8J68ouN6ObQ3sIvDOKtSqRAhNQNTrCc1mH
BYYaNlhGywn+ZfNo44I8p4CDyVfilp4R8I7t1aKaF7RBkYZBtV73q6HXaKK0
D70wcEH4tyJQNIEP5kq7XfeqNqiVpgxz1KtWrWa1rJzJdOk+M6Ud2FW/1Xaa
oLHcIGg5DZwkaEatVhPUVq1qRa1qywoC3242bNsPgkbgt1tt8bofWn47qqah
z+/A7KgQZp6AmSdg5v0KmLVqLc9qgmkRoa1iuVEtdO1aELUD1PK+03b9mh20
0PwAbQ1a06+FnmurDdRteMBy8zDznkNTreX7PsCp7iMmwCSy3KDerkaANz+E
BTTaQa1dqwPkmk7YALPSdkI/dMXrVcdu1eHTZ2Amzt6K1gAfJNBMcXSQmhBw
DwIM/j8HnrpnNZphFAHNWJ7jWqEdtK2m59ih5zl1PwoDrw1GWt0BC8Vt1Zp+
FWy3aiitlKZddRy/4RVP7pUv3f+KyZ/hSOx/Kd0qbr8lnJXXyk9JofdsAjXd
RrOWw7f127hEUmhbcolVrdm1WsN2rJeQkHi9iJIkCYkB2Z9iV478oSsAS1nz
6vD3H3ZWCMIcOSeoHtXa9WqN0a4Vc6F/9aH0r399PxOtFao3c3azv2u2F/sN
jvXrKUvSFBGYpKyXY1aa4Dkx+FLMite/LyMKMYtEzrE6DYeNHJU2QgAXeBhR
0603AIJe1Xergee1YTbH9ev1IKzCxputlg2unQO+BGzb8WpyZ/WwXgXguW7L
8auW5YVu02vUAwcUkB24TRseDoKoUWvC4myv2fZ8pwlbE69HbssDCQzOTj1y
nMZzwi3PsqrntOr2UMix2+lOjWMbOVhE4By9iMmyOJBKsRAV3ycWKeB36Mw8
sfxv5NoduWONa9v/fbn25dj9FSK0CLuStl9kERVi90WcG4ZRs1YPnagRNt3Q
8WzXBl4M3GrNCpvNpt1oulYzCu26Vas2GrDtuh15dluZMLYdVX3P9SK/0aq6
wNKt0HajOjB6u2YBbNqtoNqs++162PBqbthu11pure5J9QS7CkKrUW9UW44X
1p7hXHU4VzRmzHTPSZl2Z7fGPxdrYFNWI+SIMA8n3/Ob1ajh1Fttz/OBUryG
C5vynWqjCpIJyKhd9fyqZwF6W1XPbXjtOsguFe+qg5CKQKIFVisCqAL2HQBv
5NZaNd9yXKAbUAhAd2HoBB4YiSFAuuopa6TeDPzIt8LQC0KvHv2Krabc9tKt
Vl1Adtj2m5EdwQqbVbvWatih49daTSDTCMRsoxFhhUJk+W6zYQXAGbW29ATA
pnWBQlueHWE4yIUdN5zQa+PW4WlQUzae0XJc2HILmApoIgAKkdxqB44VtPwo
AGKsWVGokcQxdnonw4q6s+OR8MnSndHVm1N3Plmjqc9GGF5XIY4jmr5B3ULM
9Vx0McTeFebKv/o0Ov/7P0AA/myY1mPdKluPDRv+albVX038LMKfHPypVjZ+
+cuu0Y576WCWB4/XcLA6vt1o41+h/KlZU5/Z6lcxS/q2I9/muetqUZZ8nEes
qW+d55YHgjhdXxPfrNE0uMU2LiNowF9uC/4KcXALP2vjI22cteHjDG1aX4Sf
NvEhBz+tN5+bd5LOGlhy1gjnCnDlNm3ExbFw6jZ+UcUNu/hXiEByxKwu/2w9
erh6L8CpcZEWPYQQsOlF3FELf2rj2EFAb4f4aYA7sXFaD+dxaJ91+U41em4f
GzfdiIPTejhOVJNLaStkhPhrFYetI3iqoZyv2aCl0M5aodxI4CqAIAQiIgkE
UkBv4xd13GG7Tm97tIe23HeTiAw/s3DuGoK4ZT23ERAF6U6IRms1JsVnXrrU
3rFxfzZO6RPKcDtN/MnHL9xA7sRpZDYWNBmN+HOrKQmZsFHFn+iLKv5lBXL3
dlMyie3T2wF+1cC/fNx9C//yEYqWLxFefZYNNl66kRbO3UJQW02mbqybKOuc
a7kSyaErVxtEtJQ2rdKWZOUTxeFDPtE1fttKOYf21eIl49v0aY2IwJUI9YmG
1RAw97No9ArR+OzuL7V3HNo9LsP3FaLqEo1+VZJzQ8GBvgVpQGjEBYcNCX4G
Ef5KYKnht7W6wiqC1wnF8kzBHcStoS9hS1xv4+N1Ys7qcxv5oAluQiDxVygR
SBzpI1V5JBLwp5BQ1ZbY9nglNqEAhyAJ4uPbxMAeyWdcWAu/IJYnCiERWWNi
JiixMMWfwlByJG2GpGPDe24fYKNd9UbpZkikEzF4OE2TQIjLdeuSE0hOkxTw
CWwBb4BIUqHCcSU91fH7kFbXlBzVwrFtS8LbsehtkszEUQ6unuQboTzEv6qe
giYBxZFEYvHbJMtIjpKso2kdfKfRlOxA39pqAuLliGUiqSGHhiPZSlrJk2xF
koIECykBYlnaps3ESKqD+JUGbjxLOgjy88sU5IQ0gjERbOhIZiB4uaHcBzEm
kQuJWxDbRMnEqYT3pkQ+7ZhojpQkER6ZF0QkDRy71mL6IT4giiV1S1LAlp9V
kX5IPHj4q48vkkhxmXYJQ6RIaG1RXaGW2A9nZB1CopK0Eq6szqK0TbttSEzT
RmkBNRzCxc+ItVJZHZCgZYQRj5K0JuCEz5pGYHtgP3Uwu1Ow+4RdoXdJMMCg
LYl2j8Q5WSREQ7g/XjAvnkilQXhQbxNuyFiht4lgLSVeCHAeI63hyeEIX2SX
kB3A5BUp+sW/SGoTfdja1onQGOWRBBfpE5I6xH5sEZBoIfpllJPMJyILCHCe
hD2JYiItYiVi/SbJsYiHVcRK0o1erD9rskiwL/wU7FVXESOBy5c7IIrjvRBS
bEkJJHRCpjjSS0QQpPgIc44S2aQpqorQI/yJZJQwfEivE+BoHLI6Wd3hX5Yy
HIgXyA4iODYZaYSlFsGegNDOIMhVloKjzAqyiGxeuauQQYTgKOuS9FVTyX4S
VDQELcVnXR8oKUBcFYUE9lxo+HfmsocX075eC62SqZRJPf5eVhkzgwWJ5V+X
Vaa87XZiuTirvCsbBoPIhNhvz4ZhZjCmPdcvec+b/kXPGt2MjkedKex5dDLq
9O3BRf9pdAHwecKZr2GKz93hBa7m+rSP+bjgeARjD24u6mfjz8cwS73fua32
xxfY/sDCphS0mduTrpgGOw1YAEeuA/ixq85hXAwf+1a/BhuqYjJxeDHqwgYc
2HP3rDusjm4mtcGT/wCvP/W7l7X+0+QBttYBTDq0kpPOqDt0YDX1s860Mxof
dc4uLp/6cpMxzV4bdK6P+x0fwX3KaeCjI9j0yXDcReyMupd1GAYwNOj0b6ZH
wyf8ecIY6hzWzjq3zvAJHr/tPp5d9O3+xQk8eXSkNonb0ffZE/vscX39zbCG
58ZwU4ML2ORTH5P4p/3uSXcwvn0a3QDobwcnuBJY1OBm2sUmDEBmsF9/Mxpf
YkkAIPdzZ3SBhwa6tQF+tqFNfmRSAzR0LqujC+qqMLwFEHV7QCtHJwBiwE5w
3L85gQ30gHoHp6OL0TG2yjjrXGwAlPXheGINLMCodWH1rc8nRLE40/vO4FbU
f3wefPxiTc9FkfwJpb07PoAyOILVIHUf9y3sATI6HsKGRjd0SmZ4geQ0Oulb
F9jnAUCJnUkmm34HVtC53fRvgfywqcd4AK+9P4KVADP0H/pdoOxxcEx1IJ+7
8BhQ40l3iE1Mxr0N0MDp4GYIbAiPXgDtXLwHzPkPQD+nw/H18Qg4uf8EiMcW
GriSSz5ncTsdn9vt8Y9Ele9PRsDJA5i9T3n+4GiEzU4uuo8joORRt/sESD7B
XiH98SXmsofjw+roFlthYHeCS0DidWcwPjkd3nTrQBePfSC9oQWbuP3aGdxM
nrB3CjwDKDg5HYwnNaLYW6uPBPx0W4O/q8Bq9cHFhTO8GcHst3V4/AhWhKCt
wnMneLYAuL7Wv31/IsQVcrH74yjyqp8t/91nOpRFWLkFED75QE6XG5itPrx9
30EkD0F+AJueDPFI1M2gi9/3kU4u6n0LwGaBVLM+Ay3A6+OvQBeAqYvhQ7/z
GUF5OrgYbkAc1UY3/iO2Wunf9ECABvDdsMatXh5A7NRH8Gof2OqsAzJk/L4L
MuN4eHFRA8n2NLzFXiFBd2h9BbKEldwCL918PiWUzHGQu68n7fvgy+gB/sfj
G8w3VtcGOjkB0IIgABBaX49A5j4OOhOnf3EBdDKsDSwUIJfYuQaI2RlQhxrg
1ZujzhBlRHcIJNa3zsbdx+EFUGcX5Eu3BzK1C8wBCIeNDW6A1G5uYZNYkVKj
18Y9FDnYvQYoGLEzQWYAuQus+QRseHPShc3CUMBLXVjJzfABCEM/8lF43ur0
2xVXhG43n3+DDeRNvYG8YWy9z+X9z4yyn3y7iufl9WOJq91FCa3WUd9QNXFL
0RVv+xlVN8dHNMxXWDy3iLJFdUaucT+2FMS+oeLmSGwaOw1dauK6P1ZXHWhl
vLnrTMSRF3nDcMKvYxRSLQFBkKvhzqxB3i+ibhcU5byq+UeJ68mNtfXmN9da
qprLtQ2D2L93EOeNGfrR7/jTjIx1FQaxQq/pNv2qV7O9lhtiNDysRm5ktyO/
1nAD12q3gtBr+1XHs6Og1Wg4Vh2eimptr4Urqb0x61Hbb9c938WqWd+peXZg
eXa93vZb1TCqexaeFvf9Wr1l+62w1QhajlMLgyCw2pFt15vGug4rCX7vdhpv
zMD9PYNEMEjzDaZhfudKWrAS7/eupA2DtH/vIO4b0w9+D4pbgGLvjVnzfw+K
g6YBzGNWKhVzLe6B8EIQUUs+ssD3B9MdVSvtwll5KuUnfvMn741hHKo+0HjL
y9oqr+3y2imvq+V1rbyuUwn+uslTrJbxZCL6K/OVtdg42Hjgq2VFf9x4nivm
Qgl3BAyfgJfmRjUAVcOLrLrT9NtB1bMbdr3mtZxaow67azh2reZbrm9Hft21
sWLchX3XPLdWawMpGj8NMKeblbtp3UwCO/hSMn76I8TKT/YfMYjzRwxS/SMG
qf0Rg9T/iEFQrLRCx282G57n+lhdjVQdYILYa4aBHzh1RH/YdoPIc6teI7Rq
VtgCamnanmO3rIbxU/OPWAmIFb9V9xv1euiFLS9EQmv7VhQFYaMdOVFoW3Yb
+LAV2NVmZLU9kEFNp+6HdWDjqh941ZbxE4oVr1EDSekCe0cBPNto27WwYdca
drtaj8K247rV/4+9d2uO3Ti2Bt/1K/Q2xxM6jroCqJn4HtgEmiZtoD9ADUpk
TISjLgCpblr2WJJJ9q+fzCygmpt3cl+8rTmytcXNbgBVWZlZWYVaa+XCO6Yz
CZ9wIbnzavBcKJ4rDd2xOHNkAvquZZ4FXQiTu0FkvPC5MsWotbOWIfUik7xQ
Q2EhzQgG+UMU8I8bc/sNxPO3xkgPGYhzr7wwwRqrszGH9owBulWEXIpBGeie
0MxlXgww5TA5QlgKY3mu91XTp1n3n7ifzy/dESzEl9vrmc/x85xNjsujH7Q4
++HmH+eHi/N62k7As8nrz3JKelrL/Bb+tvzF/tBe/LCOK80O13bb8wf/4sry
kV+/7l9YVdJyGs/h3jVrPCy87a87WIBBMY0rCQaLMQUVM60UkGWw7c9gyQzL
ofJ8ASsqtMlqfVnBJRqWeVA4L49gpS1gyXyNJJWwXmMruMVjZoXlD5qV08ry
qsSdh5ZVdFIeljasxZocSvtm3cOtL3awtuPt5oC4DVuGLBEXN+3ucrkqz3GL
gbguq1NYD7TXK2hkvZ52YD4waz+ZtXvCNrTa/jiznpwg/+ferCKaFZaDb7rd
K1ty9tCst/Na+CP95PGWbMLRQ7NeRLNWJ0/e5mNaMpnV4coymVVHs7b6rbd7
VUsemhUinzqJrELE/xnwxPwOtxjbzSWs9cHZ1+fLGta0sBiFVoGHbnGD40Cv
Krzkqqx3uBuB3noGq+4DTvnkDPy/1bAgVfXh3M/UyZsp9bB291SA4E7Vq2Pk
gwDpW7nnPHklnBJFE++CKf9c/beAaefdcEo1cSI8AaaMt38KTimzt8EpeX4f
TgmP/+JwSi2EHJgPUJIHJFXOsiJkymstGB74UZ8YTlk8A6dU8L/iIZwy14/U
ONPl7y2R/hMvn+GV85HVV482Z3cHeb788bF+GV6p7x2dhbIPlnx4TNMphrWW
9cKNsMyTUOUWeNaOhRzqXWPw9DBTnpsBFpLzWUkLy8I8NzYbPTiwEt4ok9vg
vWE+C7DOhILUM1dkBRuLPIy48Cz8dPL2STgmJoZ7cMyvqd2Pwzfvt9B47ww8
OSsGq21hCyi7gwmGa1h4j6KAyMg0LC9gDTkYaRzW4Hnm/XQ5tAEqaMYGDdWw
HLSD9bySnudjcJZBZ20BFzEzQFmey6HgfBy1NZ+a53cP9+x/Xf5lfcybOIHe
xytGvObuDD+781oNC9Sn3qzZvlpWx0c3V+5vgVms38rqprnFcqBbfz+/Gtr1
17TNXyGdNyfWnbJWsWpoTmLx/hx8b8bu4dT2NHwvdmoHBcjU8OPbmvXXMD9D
cXpaRT5rIg5cVa1oqpo3uAtctjf1hF+9C1v7UTbM/+3qt/Pbyz/9hTpzgzb5
pWXbXzze5Gr7l+riN/DJf7grM3G7z3TwF9Tn+x2G3080Q8io7mXkR8I3jayB
r3/1IMuvvyUTDBQByi+40gsw0DUtHx5zn6d853EYKNaWeyTotoevY92G7/HO
D/ENI7SKtz2sk7ZnWKTtuur8cFUhRPjsuivDUbutNC2p6E3aNTwZVlv99Wp9
Idp1s4ROyFVfiW7bHEEnWb2tdVNuZdt3cLPtNdLk4xKMRgfvvziEYlPhm9aG
dUex+LwsZ4Lvl5CkGIBly1aHd8Ckb+4UlsrUr4/pFL6so369olOPgFFXPVxH
y8xDGEQYVOS4r1QL5fFq3VQrfKW6xldhi6N6c4HhCStX+N0GOt/3ut5d4Utx
1q0pFbSsgTr+TK0q8Imq59364hp8BypvfLfXQvhXstt2h+16UdbbkwUS9kNV
rru+5avS74gq/wIKcMitPdjl8ItCWu9Pep8I0qp55gIrpBu9H7KMC24lI3IO
Y5SHqpN5j/CFInitYPJ7DgJ7v4mhcALm9tE6I0xhc6t9JrgZnfFiyPPgghMi
g1JMFXYYoURjTNqQwCUyaKcLb2GyljZzOZPSSmyrD7nKHfQYijmJQig5zGrK
j4UYoOvsy0Fm73f4E0FmlTTejnrI+OCxFmIoupJxww3UpwYK0MEi3YQTVg9W
EITuSYjtgyYaa8d8lKMEgxZ+8COChQSNUiEKnlsPrYNnGM5ZpriyQluVzwgs
XuTWeasFVx4qLTkyGIcRajfjXdCSZwOHWklALW1Hm7PgHfpc+DyQ3Pt9gz7o
AlxCCK0syfRIEfJMBW4cOIrT3heGhVEhtEWpkAWwZ57lc6U6Qij4ggmoRTOo
CMHfR26hYDTMasd0gA7CiJkASwUDdSX03cOXh9dBeL+Wxn5hyC8X97B1snhf
Wphr/fC+tDAvZtiMIpPFW0JhHrQ7EfGWUJgH7U5EvAphDMuzN2AVaV/gEyKM
BXsOq/jB0z5cOt9fM89NhaWzLN7u+POURf7/dsefl3nk/293v7nx0+T0Vveb
oY7T5PRW99ub7l5Cfp37zcXCg4T8dhj0CE1VoxWj4QNzNowaJrEhCJdDcWHy
AeY+J7MgFRQiqvBhtHzIx3ye3KSxgYXMQLNhYW2LQucOVv5Wesk5TGgOyo2B
waQXjAucc+cUVC92Hj1vuLMjVw53IuzoviwMmov7mPAxk+/JZHMgvcuVxmIe
zne5kpqz2PtcScy++Kwr/Xsy2Uuoa8H57y6Tvd0F5znwTqn9FhecTXen1H6L
C86B/Gh5+bILzgXoo+Xl27MZs06bAnqqfYDSKHibwYAVmWSDRmI5pJuzYL7R
wywYvAli0Ay8InFCuGLQA+6F5pDSgoK/ZQzR30LgcR68h+CBsREWVR7iz+cC
VlgJtR9gWWB0UAOs3vQQvl5oeDYg3l3YzBorhcwLM8BgWZF7cHrNJa5GpM+1
gW5wD4ufPIBJhE5mhgLQee5hrFlmB/R3Zhke+oA1q2AyCDswo3LuuS1gDAtw
Hyvm0ZY5p/MQZmQSmTE+KzQc5jM1jsLnXgY/GPAOp0yeeTfAwA1s8BKcFf6F
tVmm7ICcHKOWRqWcbsipICYdLPbYGILPAqSFsRgD1B0qKFOYokDIeeaEEXzA
kyHzPnmuLJgJHAimRDwq9j/Q8M8ADdeEXCS8IOF3wgzXIURUvBthEQmNFubH
+IhOpqsZm7sonjXLHWg44ZAIEkbwL0LuZIRFJ7wSwbLoD4LJEe7LxD8IxEkN
okcnRBIhCnWCIhJKmRCyJsHETERNRqjTEHFKExo2QpAIr+vmHhEMciAgr4x/
JRBeNj+HQE+E3iMYFcG7CAVIGEaXQGixh7HlBDUl2BsNIN2d07PHud+m+P3A
0ifEPuGwIp4rAjgjvpGwetns+9QbS7cgcCiZmBDGBFLELxcqDiCbr94DEskz
CV6pJsN+Tkh8hK2JuRnkhQRcJLczCaBGKF7CcVLvTESXEZSNnIQgpwT6o8Gj
O1LHCZxMo0phQAwNJmKQybbkkYSQJTwbgYIJvUm+Rfi66OH0PQJ9xqvpQpmA
xISlI9xpyOcgcslnYibCK1QcdRoPai8BxGlQKGoIokcQxeFZMoL/LDj+5EyU
rCwF6BCvJogkeSSZOzkt4VsJsE13pD9igjWxXxS2hJy2s2mJXYOAj5o+oLQW
PisVAIG+qQWEcx3l/AfhsMlOhPInhCSBnSNMMmJx995OoHBK0bmdHZ1MECcD
MgExdmT73is7uzdhaGnGI1Q63YKQvDYB8MnBCIBvJxoClhyUpj0aVxo8SjEE
XKeMQ41O2VdE548pJmFeCYHq3Xd3c1h4LQ1BtAJBsFOUEMpUE7qa0OApCxI9
AEVYFlNYSGwrMbwodGlOJEg0+24COis9exrRN6hIbkKEGNGv6J753K0sJWx6
LE2MWfqjiPMfNZCgvOTscWo0s8dHegV8LOH1dYohFSMnTPXF1MqR4PNsHjo2
TSpvoECgkKfmqHH2f2KbIHw3FUCRCoAeXMweGSZMPDEH4EeUVSM3A2VnvJCm
LcoPKs2BaqIuSRwz9ByawikFEXqenkj+QcUZQaDJZ8bwXYJ2E1EEzZGUQSM9
g59dkKcwd2kCoxJrTiJhdgFyBgoUl4rFfF9NkC3cPMRc7ecQGnjKjOOLrBN3
KRBooCmKaKqKM3OiAiGTxzrQfjcVE/TlIttPv5EjQsy2GVL5QlaiWmgkt8Uv
m4nAhfxHzFezxONC0UoEGEPin7B+dm9qYx4HTKUvZdRoO8cIhV6RAoXcltxf
TIj/FLOx4qBZgZKWn/2Z2kspj2DmcbKhDB7uIPmz+YnDszn6MQoE6uaetYFy
fmQ6SHwoRNhA6XlIiXFif8ipc3p+PCW3mGeH2e+oUDfqu2kq4RSRMfXR+iUk
m9J9yA2IlYVKKCplfTbflpK2jb66Tyl0DQ0aJQKeikwaaKopqF/k6Sb6KiVW
ujulcjJsjNF8vmPsA5Eu6PmnLJqdSH5Ymp3Ms57+GAWCJptSmZw4rMiY1Fqf
eDCohKRy2uTRRRLPSWTMGWan9RMpx+Rn9JNP9TPNcEPsOo0S8U7RN2lsqC+U
PGkSpaqaClmKmljNRH8dEzESJQsqMciHacohkgK6UCUOHnKdIqanPLFfRVIK
M0cDkUpQpUqVIU3BFG7kMDa2nGYjKsezqRb9vVEg9Lf1hqDtNcL7dy3v6Gvw
9c1l1Wy6slnDV8oDVq+P2V0KhHgG4+4BDDy3864zGHcPYFBL3nMG4+4BDDzo
8pEsCgRtf4lFASER7ba9Rmx2t23Kbn2G2OSbdl1fRykAGp3VuitXqFhZoWzd
xW0Lpm13COXv1UtEDJMSX4cMCfCEukLA+PZ2tb5cNKzi7e7stl5fHdF5dIRx
M+hkBR1GkDmCNarlspv95ABMusSR2XXl6WGzvizbdbdsds2i2R5LVABtYeSg
Y7uWtXBJgO+clnTqCuUISwLZd+Vi0VTN0apETMLJcjrm/iouh0jkgEdu3szl
0OCAs+URgvHr/rQkQDmeEjqQ7S6Ap8LorLe83hyj/t9t1y8X0LEj5Cxo+tMF
osH3dBCzqePhn3t0EKsSWgXx022ao5qhXS5LBO6AW0JLT6YhuLhdlZVs+1lY
AOMDWlBdNxihVQXWr8Dp25tViaLJYGLwC7DbYlVVCH9H0x41m4triKNDOlUF
boWAgzU6Njx1s1x02wpJBkp0dGRX+JBRYnHUrnuE/e+g07yJ4J1md6BgIG+7
0guIZzAh3GrXHTYQrWDaaxgBBvYoMQy78rzCo3LN7kyi4yMrxYr85BYPZEHj
VLtBLz0Dh96iCsJ1i4FQnkKbehwxiOQWc4quKyQxWRy2O7i26tFjH5BSbM/B
nGcMeVHAI2+6NXy9746atVd1RRQSEuNstQ5L9CE631VDNNas3TX4q7IDy9d9
DyPjMX8swBVh4LcKAgGTAySFC96wYxSBXqB2bL1eYmZr++UhhmC3PoC8cg4B
cFLVSDiwRR8IlFNW6+UhYqGaCvxnE5Ztf364Z6SAm8ykFJBf+2OOGCk8Dwpx
co0a1S2rwNzw+/Jsh+mLuC0YDDC6IYbktqYTieUVBP4V9BW+UvV4FG4JyWAJ
Tk0n7poddgYSJNyi2SDXQYseTfAQVB6h0TkGLzxAOgOBMdPCwDa7kyPo81G9
RddrNeRZ1vWY8U+X3eF8rnbPSAE3SaQUm3PIDz2EHcTJttIt6Zt4BSkabHMJ
cRPAV3p4OrJtwMit8XG9pnxyuqx7THReQqKExh9Dp6qbenMCfgBRixwfCCvr
0a0OrtHM4DeoewGdOoAcdEJSGKhFUfobuAQGEGIGxr7ZLRZgI5gJKzClBye4
wrOC8PurOCo/32WkwJskUgp0p6YCV0Pb7HBkMH1Dvt2AXXbnJWR5SN4QZxUE
AYMwXYOvQHgSucsZa6nfED+bHhy+va7xwCINeK26CvyG1dfI3oOHGCHLXXeb
S2SY2K3AOckmW7VaIycO0mAg48YW5p7T5WoN5t14uH19A74CIQhP3RFW6FWk
FKj+97GUFI/e4/WEFH/8Zn350y8znvuX+VzWr5f2129RHQ+F8ryFP3+CZ9zO
9c933/70x+GP317afyHcPFFLREHFb6AtF8M/v4F7xEdGGMI//vnT34Y/fvPN
D4Pdzo/BrhBa6Ze/4Tt7xJo/vObb/0oN+MP8BgypJJ44a/Ve+Mn0tvfdlyIx
xVNNejdfxUc2STzZpPG9JA3xXd07+RQoHh51gOgzSB4w/L+/2SvkNHjgBh/4
4t4V5NOdfO8/H9VJaJL65N45jh/TpG8Orq5mnVOSLJ3tP7NKqLdRPuDn//jn
33/9u//71XzK9pcPCSBoqKubf0DSGkLiokjjjW84//h0ApsHN37w7dOAJTsW
livBCzcKK1gmjMiCGAibP6ihcFnBc6mMy4YgxsHxQYdMhdzG97hayJHr0Q+D
z9noOOdDgQcNkAPA8CHL8ECvHExQhQhMKSm8DXg04uhuw+9SUvzGnj4G+t7B
/9g88HRj+X9SY8V/UmPlf1Jj1dfW2Fg4PSh77jQ9wo1hMtgN//z7dFrml68+
bVDavVsy/fbXKDJ8V2T66VY75rMi5LkYPMoQhEFor0zO2KCykEmh4dEhs1aa
gKIzgyuUzQqv4/kclGnJXci5U3yUAwuCs1GpgcPFAyp2ZI7juRQnR6OYZa6A
ZrtnHSe2/mnvkY4hTwrCHLIx+LzwZmDZiNo6ynMlvQ5ajDLTGcuZlm5E/YxR
w9BE71EGhkaPhjPLGXeyGILn1gfpglBsDFoH73IrM6bhatRkEPnwzeOG/vX6
J3CnydD0lyeb7U3BfeADH3MRjJfa5yH3Y+YGJbJc5x7GuhDIVjT60epM2WLI
kb0lOr30bMj4aCwMEvdo6WDykA3GQSfYiNRHTEqT20IitJQrNPn4vKGpwU8b
OjArnMsH47UXHqyQGxkKqcQopMu1GYc8mEFKFObQ3qoxZFzmmZTxlKhGFhyD
TSlguHLtwfdH65UEr3cD+JjNBi4y743wbnSj1NJk/HPSx9x8XvqYT4B1fEg+
EXegrmkH6t+NunzKJg9pQeIKu9ueflJakP7Tkbb8tGfcQNKW6B9s3n36WKqU
D/592gZvtskjnC/TVtOn9NjqU9PHkH9cTWF4ePkv99NiE348EeffI456kR//
HP2l7c8Ubv4iL267Pbtt18cRT36s6815VW9PF0gp1G171q0vD5vNBUKskWZI
dMhtuj09rPse30uwrgyLBjlx2dkNvW84L7v+tGx2C+R4vYGvKfgZ99ZVV1a6
xj2wbYV7YrsOqUHLC6RKZU1Z37ZsWeHeGG6oHZ7wH0XD/c/nV9FXlod1VSNW
WDa7k2WL/26uqm59zNsdbiMdXHfrVnS42bc5XZKk8nnVbJeLegdPYcei6ZEi
tls0G2Sg7cWqb1nDTqpmtzxsyuURQpO78vimxu3Yqse9oopkYYlqWbT4Oqda
lu2mOcJdqHaNGNmTsu2n1zd/O9190OJNc4jb0iu0yUncL9+eQ6+9andXS3wD
FHmAkZkZX6acVs365Ah3oJrNgaxL5IA9uyZSqE1P4s7l8XVTbkW92XLcraWN
vRLssrtcdlWNZK1VDR2qiVm1RQ5haG3ATa1r6PCOdm8vF83u7LZh/U/j9w98
BYqKq104fN5XiNQXWvJRvoLvYMBdPs5XSPmX0gv/UXbS/thMeQWZrZdlVy6X
Nb5027ZInMXpnQRrjhrkBS7xJVMvW2QGxicivfL5ot5Ci7YVjEC3WFW9bLDP
uwMYnQW41PJo1eNrjOMb3P0mXtw13HLba8JOI0vz4gjcrIJG7urdVrbrix3q
/q7AfC073s15hXzlgxajP6GfHMKAIXkvNBZ8hmiDtzt6F1OCb2xwu7XXYGqJ
b83qXX0LTqBw57KpzvGFC0lv7yAGcJcW0gt8jZ6+qpBA3cNtcWTO8RXPDkcE
t14b+E5DmPNzBIODabElRzDWu2Zd43vMn8Yf30Zi9E8od/45/Prr35GC9i6Z
0X9rLt5NZXT3rs9RGuFDniI0EsXbCI0Y+/b/vgOWmRAy3Z2WfHF2o+eUBlFi
8JtPy27E7mkl8z0aRwtovMwVNVdhB6Iq4kO+oyydvP+Y9ejXfvnMZnR/WGfY
wDNsRq+Uj6QfKZheRM0EmwUZYKlTMFjoWMN0kWsNKwWJ2n0Mlgqw1shRFdIw
boUuYLmLDJUzcCnLMmlhSefGTGlvJCypvOYQWpLl3BhfsKFQhhWGZ8EU0kll
x3xyVNIZhM80t9C9YZjwaPNi4nGqoAcK00I4WNTCChIe5HimhbMBdS+ttIOE
JaRUfMglAyvnI6x3OddOsSQzm5nC54POPvU6Z8/98z3j9Xqi+j/UMPtf/faj
ONHh6JR4POAzhZ/1y5P1dLDjmuqSChlSdg2+RCPGlEh38sPVYtEdLn45/0H/
HI4uInVQeYDTW9WzyIPT4Hu68oyqgU0t8BwInjiB2zE624CELDuogjb4xrDf
Qc36zEkVfDMmm/LjxDqIEvKYvV6sI1y5v53env3Y/ctfmV3408k/HJKg+L93
txr7+Qua6y9Vc/KXPzVQeN/cp1T6R3wyVAWTLWZDkE2escX6QD16mgdmwa+K
cefrackn4/5hPaMKqZWr9RIKpkp1/dk1yWGsawElMZQ0x7JD6Yy1v8v9c3v+
Y8Pdn9qJ+xJbAiV+A5UXFOXlARSXDZQ3B3jcCMpdLHcaUkqoy0soSqFKBGeA
Yp3Dd26gaIXvkQBDjTow+E57cyZqhpw354f4phmVJWoo/ms85LLGighfpZNQ
haorKE7L7fWq3N40uOJqNR4xqnfdAtl1kGwSinL4uIcnQayw02W9iZ2BiJ45
gD4gM8Ilyu10GGpzcthsj29Wa1jEri8YVJPgwSd4GuMQzdmum0WHB4E2SHy1
XIIHX+MwNFRJQ9Re3NTrU6QKglXEmV5VtexgjbMnn/wivDf3M3iwkKZhomPW
QCI2BiYZxFar4FnGwhisHpzL+MiIHQVVaING4PqMYmcmzwJ7lsfmwSMzZ70q
GFRCssi8NGoYfe5VDlMHNgAZqzPJXKZGoZjXbCwCG4YZKwpzoDPIyv/FeGke
dEBInjmlVc6RWk9mIhQyZCaQ3vMoC50XQ9CmgMIBS7FBIElfNs+7wTCYCp/n
mbn/SAm2HxjOtEgP6JljI9QnCh7oDNR4RRZGWwgpHFJvZ1IKNYhghsR3ICUy
bRefhTfmfluhwsqMxb1ipXPUPlZRlNoqqFOc1laMBXLSGy+hWYbnFioRb+aq
psh9gWq+jz/8Pg/M53r4F+Z1ye9VhoK9L0pmTLqfo2SGlAv2GhearfCIJ80u
9Cp6gruLr8hTcJ9A4CmugqfWK5+Qh4Wre9xBXL/++XeXAdPljy/xBHvJFefL
n/DI2RWfcoWZAODFvPm4K8ye8o6kgq6Q1kv3POJVbAFgl2EcwQrcaR50phj3
bMSXVNziK6AiDPj2ZxwsrG4GKbhBdq8wzwB2yJ3U0FsnC6MZvo0bgw7KwqjA
Yo0jV3+hxjxYqzLmdFF4PhSJbECO+EaygKUQJGKlnptIPgP3SX7P+TKaNN4e
7XOoPjPEz43t/PRnhvg/I9pf4irhqvhPivan3GEO11dVSg/d4dOWEW+PeK0U
NybkfMzAAMFYPg6DBrvlg1DjoKzShVLaSC8cZAHp1Qhhnc1sR9ArHaAQRfGa
LNfQcIXvdz2UpkWQSjjGR8ggpgBTolCIsQLJNGaOlcGMYBq4K7c4zNnXyw/i
HPdKGUhvkPgs8jxrZEwBt4QfjQwq1wPzg5BF7oZgwHIuL8YsUdkIohKBfMmR
0NCPA4cLRsWCgH+CERkengg2D3BV7qEckkw6PvNaFRnnAammUFcJ3OwNXX07
PwhnUCIrHpSREsrjcZAcnLYooJCG8lihghH0JnBdgB9aiNBcFMgLNF9ukW4m
z0avPVThwgSfSw23tGaEEM0yIQewkxEqZwpptuAbIZMzaZO3YCMB7gczzTiO
4n/4QT4DP0hE1NJjCH6XJMkJy0e4T5bAzGaPuI9oTwK35wl2p/NX8oOIhEok
7FoE0hN6s5ibw4mSIlFtEHgui9wABKokkgMSQifIqUp4SSJdIBBrlkC0EcEc
cXOExNVJ/JdwjhEFTB0jRfDstRwdIVEtiDQiLKlF68RvQYDMO1wPao+7JCAm
YZEj+JjApySaTUQDNAIifWCjMyZ0c8TEJ3g1ddTkCVL4mXkysnl4opJ0QowT
gpLEnX3CRVLHiT7AT7jRNK57E5FFwqT6Pvk/+TXdlgZsoqaJQEnqJAF3CcOe
+ELIj593x7tcFfREmbhMCIFL8cATAUREyhPQv5jHPJswz+PcXkLJEtVCkeDs
kROGHCwFKME2ZewIiYebPS6VHkF4/clpPztfBOHmCdhNsN6oXZ9A2MRrQDLo
jnqX0o+aopGwuxTBBBQuZueL6utkWQrj5NgEspaR8YHg3EPqMwUvxbJMCU8/
68R3OBvI/yhqTGIYyhOgOxJQUGpTc7ciJVAMJ/qtSzQL1JnIVkBDQF5OlvGx
9VMTDd87cxSdJ6376cYT4wPBjtmz6u73eRNiPwhSPqaG8dmOBMyONEWkj55o
arLoVDRyxP9AAGeaQihYKMGKNHFQPrGJB0TGaYdPMGNoQDYHJSmuRzaERCVA
oUYQZTMBzsmdiMqJIMwU0mr2LgrKTM0dIcoEkQJjjMNAGZXGIktkIJGGhc/N
J3y6TGwSlECL+GwiPCHwdSQqejYD3OdNIOYMCiBKSOQhlH+z5AbkpJYYnSjr
EFXJxD6Sz55MmZgA/tQP4uyhkIxYcD9bLg5SjANKoBQxZD6akEJiYiAsOLFH
iER8RROb9nfqBDlfTfB3+joRg0SGDIpBNneJAnqM+Yvg5j5VISpFkNgzEZDv
EIUPm20xt5yQ/xRhxPjy7Nz5GG8CNZQ8OBJ6JR+jR8UZj8yefTfh1iPrREw/
MjEDkc0oL0eysMQ/QYNCbkr+Swl5uppGiYgHyAjR5cTsWZGTgRyimC0R+Xyi
2ckHeHoYMRnRTB7rm5TViPOJCEOIZi1EXyWiJZoiyGuJn4g4Nqh4kWQVouGh
q6kwo9kxtjwy9KRweN7TH+NN4Kn6MYlSiUgGKLfRT1TZUY3F06Q6sQ/Q1G/S
DKXS1DYk6xHvCTk/3ZF4I6a6lnw38rpR3qRIo5ydWKsocVMupSGn4mxKT5Fv
JJ/dJPbBfjdxSRDnGTE1UNjS5BY9wOxnHCrUIlcRJXFyIqJjoLmJGC1sGveJ
ioccBm9Hkxql5VH87ngTwhJfRdMJqNe+jY68CfXm+LbdnB8iWr3b9qqZJN82
/W2LAnMbfGq1a/t+15WovtPedNC5mt6dh6O6Olb1uuIkaV7iO9LLsmE9QpQn
XaCJ9OCkIjD/BjuyWKx6RBRvdb3pVdufHq3WiGEFu1XdUVdVvOtPDuktPb6g
jJB5EpHvWx5B22fXqzUCcQ9eZCxAZD6+QS3PD9u+ZqtygWDc3ao8L+vdlnWo
Noladgw7iy06rVoGpt/UMATwqA3cEm1Sc5QE6crFsqPbnByuoN/N7V26ATyA
WN80W4RHt7Jek2zIrtmcVKuSDNvguc0NntOEVuwuYCAvl2A2vSpb0eBBwx2+
Ot0y7Bye3QNbHUKL73AF4Ojc6eeHXAE1AzuhzMym0s2aNF9KGKHrjt5Od0fN
poFW0+jUmwuBAPZVebyrt8docfDEGlrWLfHJMMjQmgZdka8O7wL9L9Aums7s
0YlK6GtYgJ8smqqV3eYC8e+sxRe3m56365Mj6MCi3VV4EHEHo6dr+H5dnh61
u60i3oRQriq08nTy+AOU/rFY9Xi4+QQavzxs8B36Gk8tLKFjZwI7WeMp0+Vh
t25vUQpxhUdFt+fLtl8iRwJ0qALzXuhm25XgxbLd1IiTB6fHw61gq3WtwRA0
Oj18sPbQQHyBD53YHcOlYDbWLdp1C96Jr9FhUPte1RUYdFvdQiAopGdYrQ+u
KYpbuQfqJ5Q+b8r2ZoXnOHdL6AjYpGrBhMujDgNh7fFU6m1TQTKoKori9QVr
wC9qhqKneF6gAQc6X4DH4uHd6259WmGMQPQyJMJoevTWNp68ZFPsXEITsZ8H
N922Bh/Yqm5LZxqhc1cLCL0b6ELVra+O0LPxEXUPHr1r5RS6eKLyLlA/ofS3
qDQJMVMiaQrkGeRb2V0tmg0yORxoPHeCkjtIvEI28bxDtP36GMIuHHY9ymr2
rN14BcFwjaQYEdiPI1WBWSElISZ+Ddf1MNhVS2wFkKm6cguRuQRPPYd8EsCc
lzA6SJ5S7RCRj3qy0MGbrmqqbruE2AFv3U1DggKfd4H6e5R+vcazA1tWgwOs
1uD25VZCC3dwO3CGC4h68NoKyURaQX4CyXGNrA3gByhLiwO48bd4xLpG7oBI
xyDBDUsYGYXStau+KyGNc4x2ip2rI0zRzebstqbzEjVy0UByhFts4WmYKPBA
d4+nPC5uoPOyQ7cjkdTjR1H6CHm9gzb7f+7Azf5lr34K8UjoL9/ceQX9zAvf
3Ac2sFyPNjco66yFZyLXxmbesODc6DkbsqCYHWwRRCEHxfKQztD5UcvCsrg9
/+NzR9289JkrvBplwdiQ22HMikwxoZ0aQm5c0MZwng9K5F5xF1QejEyvDbRy
ymoe30Ed3UUg/dcv30U9wf/68Q/PvdnOPZeZ0uOQG2ZVVowZNMm4weWyKAaN
SjiK6cAtqm0HnueFhy/L+ZVwPmYuY9Mb4qNHIFA/fomH713h+Oe7g/3AHyaU
8vLvBJYGh/l1dp1fHn7vv26/++MfIsL6DhPDP4d//BOu/PnX+O5ugmdP/AxJ
tfHoj8d//PYHBGBPRx/O/p+//sQRZI0/CCJpuAvNns+WwO0iFPtDsDY1gqDd
f/zy/nsGLX/Ohd2nc+EztM3/wreBx8888RMd5n3SZ7HDf6B3ko9+JuJnx5/6
fOkPEXEEU+affvnJx/NhEkltuvUBzHFQYuy2kOuhIFyflHV5LJs1nt+H1Fl1
hy1hgUrI5ctm28KssVxSIt5c7KA2uG5Yq1YVFDRrSMjrAx7xQlFaGgvCdkey
coyYV1BeEW7DkK0KqYfaa6gLD1HfGDlfqGJbVzd4uA8nrqaE8qOE4qdEwAKU
51RDQynR37SxPvzTX36GTP/DzaW/Mr+GH27Yn/9U/zLr4/15efGPP38/dXZX
Qb3YYikuSakPqabOcJqEyr3W7RZasYPCBRl5yiWUldCxvr1p+26JtSVMmRI6
gZdDp8MRndY7FtiZWJX437xoLt3R8vZHwbn7UzeGv51rbM0Ph9M5W1ajbCcD
cy8bpJtZt1Hl8kxQ3dwj+sjDRH65hCIXybIYUjDV/RJKiTPdlbCE2cEioEe1
aiRHgnXH5uC6+x6RFeYB9HBiRGs3UOBskVqow8IYhe8kLgwaKFOb8gBWQsdQ
qrdkk/4EJ2tkt5JY9GH1XuPvylBRxbHB0qIDH1mWD0GDWCjj+dKfPtf50iS3
9zq4CExRdvzEutfzPb+g9rV4DCpSTu34/5sIdtgfhMDXrfBfnmVPymG/FWnx
ytz+n3H5lxTBfnCYgt+X9ils4IMyxmhV2NHgeVNtjfCjzDyUEIXLNefa504W
UpsQnNI2lyqJ3cHveZZLBGlY69kQxsxam2XZaEaFx1kZXB4KZwYb5CAdE1KH
YX51rpgUPjNaWC8lFCXKjkyxAuoFy8AIqoAHhwFaJoxGaRILBnF5UrAexKCH
sZDCcY7CNLbIRjCkVoPVIx+NcXDVkA+ZDhLVO2wxGunG7BXwlPuigE7lDurU
QYpisGaUvPAWnmRHuLcvZAHVltWFCw78HaqhzGfWqSJLxyCh+HJcQjOcZDyE
4K3hgWvUlOQsC3gD7kauoUcOfoRxNNLnw+eDs3wZKev6p2elrBvaBDrb4d+b
DTIGtrvVixuHuA9HwJqPIVxFtlUijnwN4epjMJYZw4LAmlfCWBbVhzAW3M7q
0RAR4nOGKtcMa4FVSerX95FD8qsHkXzFLVlfPOFKL/sRwbHJlW7qcu8+r/Od
y0svLi48wp5Od1gIR1+4XCBiuSm3UFf3yBJ7tFrj7ugFb9eIyj3DPWzebiuF
SF7acN4RJS74xw4WAVWHQKwefaSFuhH3mSCGdsi7ucSdwBIpPaEUXbQ9xtb5
0Qr3lXZnt0R1eoAAkmpVHesOqlioWnft5uC23sEluCeLkOsd2GZ9ssAdtq6v
VFPhxjQy7ULlP1GdlrjLh7vfJ3BZC2uMY7gEOSZPF4gMwt0uMN9ttz6FRcUF
brrCY5HHFemDkZw2vgJYIzft6VHdn+lVjxSWDaxDiKx4RzSNrILVwBYB8iKa
9PS3M2G251DdojY1roHuyVMj+KjdwIKJ4W7oJdz+CmpsMCXDLbrTBSwuOKKK
6t3lITx6QZntEnl7UWQezNkLWBwt4DYK8Uvt9rxsN9UOiTPbTX1d9x2YH7ep
lrgjBgsvsNn6QBA5L6y1tkhtCkG+PlnC0g2eUF03iHBntey+/7dqU0sZdMZH
Lv2IxDhW5MZLNhQ+DIXRPIfJDKddWRhRcIMSyFIEXcznneE6pjJhi8GxkMsx
WAMTlWbaKDeMmhvUUDYwBfOxyKAWGL0NmefDc5ieB9rUSPBkwwjFTyjCOKjM
Dir3ASYVnTnngw0GZt5CcxGkgZIl01DDuLkmUA4FtIMKHCoqg3J5OLsGnQ/w
o+OsYAJl+Aqng0JCJp8pfJ7+92lTCy2kh7aOWTFa4QRUUsIoGAdpBijDkNGK
aV1YF7jKubB5IYqR70sLPQQBpUKeD8KFoHhhjFJMj447nTswmbUhQI2IImcC
ijQTCq6YeA4z9KCJQybw3CxzXmUyh9pqNDkUMd4xrrniWBoJ+I+yzqPQGrfQ
GGHnM7dmHGDlZQetYBUg/aAGMD0vRBYCUnuNbhycyKTJRW7BGHIsRqiLhP0i
2tQDVNQMqlOWgyFh5ZIPUNB6KFZ5BmW651zZYcgGwS14XoCoGQz02c0QLCNZ
AbWrKDIxQr8GCCcPYTBor4UyNhcqGLhHkbFRgHGcyzxySYXXYZK+lsZ+BdrU
70oLCSXyvrQwr3L0Xk7zLaEwP/1ORLwlFObN0jsR8SoQxbwJ8UDWNX8KPHF/
zf4ppar5/cPa/OXnPib1mlAqd5e6snhtRKSz3h8GxmsjYl5u3wuM1/rlPJQP
Zq3X+eUcvg9mrdf55fz0ZzL1c345m+6ZTP12GEc2SptlfoBGc2cDFCIBSo0M
sRtgg8zlEtbCLuMWqhBkv+McpsehSPATWHT7LGMcFtrgKEWWj8qJ4GAOZB5n
PskMFzDhBUKgGDuKQVon5yKjyAphYeB5XgQexJcFbj0lWv3mFDcP7Btc6a4P
zXngDa5014fmy9/gSnd9aH5r9ZwrfRUp7mUN6/so0N9Tinutb86R9Whx/rJv
zpXmo8X5y745v8N8oSB9yjfnvr9QkL4DrWYYF04yl1uoyVngA9g05zoPNgPr
aYc0Om5UqFis9JBDsc6tsHPKhm4KWAVwqfRoPDR+dKjEDInQKvh/zoKB/0PG
zCX0BLrnuS9cNkMEeVBydHJwQ5C2KMavF61mHDTUwGpHOBMYCzZnheLSCDeC
AUcZmOfOwygURcaZYGNeFJDq521wcIQBt33HbFCh0BAtCroMzjZkEvzZ4A65
GbgBT7aDkCFXMMJj2sOXTvGMMUcxY6fX1J8LrRbGMHITnMidgf9gn4ySEMEW
Vnwad40zNUiIWhdgLhs1SsCbTKVkLwbhoacQ83iOAq7LCssUKrw7oWGiQzLY
wQ4+h9kRlpGWwfzGEiWXGUxmubHICuWD+B+02u9HzZrQG/l07ns6USyTvLKl
U/F0SDqJ85KR9ARJSKLVBAWhc+guyWDT+eioDpxEbAlLMkQ1RhLso7PeBG4i
6FuR5BcJqiOTSB+pNhNcL4Q9wIwaSMe7SXyPACMETKAT4ATV2TeKDnqPfG8v
wh/QEX2CPRCsgiccQ/6sFuhdpBydAY9gO/7dJEBNt6COsKRHGTUhyc50/D8e
N/cJu0JIk3jmnq5JmqwkB0wCeXSwnNo4RElUankUaSU4CYnhTUJ8E96BTqdH
uewEepLjHpFiUr8p4AjJQTjFKI1JGAEyPI2xibelw+pJepzcnnAx1GXSICUw
JX/WiB+P0qPD7WL2npD0bAmAQFFCQAY1KUJO+IlJQ5VAKATvIFgUycCSRULC
qZAPkwlIWZN6P0NLstnRCQ1AoKaohpvExAkfRJ9m6Y6TjjiN+t5BozZtksMk
6CBPIrxir8MdfcYl9JFP6Lqof5kwGdCvVyIECQpDmcenVlJkFwmHFHEjSeSZ
PMbHzBjVIQmYIGdPoNiNirEJHOqSMimJaooJKFLMTk1RE3PApFE6C14SOish
kOg+YdKopKgxs99EjFoCl5B6Jg1LjHEaKjJ7dF+CZhEKIipK2tkCIWl9smfz
90ejE0k7lKAcBFHTew1bug85Minnjt9NysL5pKtJLkR6x3x2UGqASxBVwoKQ
HVSSp47CudEBCZNCtiUwD2VSApmQlXUKmKi5TDmDXGTYK8oSyo0eS6gR8uaQ
1M5FwvYRMpKccsKp0PRJUwHlYbox5ZExJXD0j1chI4eEhSIb2iQ3SrilmJXl
3FVCXhP0KUQrDAm3RxMIAb6o9TZJ5pI9yFohedCkckrYNZNGgIxPQHKWoEF0
NaUKske0W7RhFF/38y3oZgQIIqNQJBO2UCQ5X0JKqWIPgyTosEuQOHJ2mmpo
xhifxdbeR2VS/ULQcyoxSF2W0Ghko4hUp3Ez3024OzFVJimYyCEIZpQlgfA4
0xJgj89+Rn+NSrlyD1wnQB+l66g87ud+UGbLEhg0YuSHaOYEuSKEGo0AJc8h
YQL9PiGQwcmQNCoTaCrBPcljCO5LsNGo7EvBQxN8UiOnCVXecSDKYpTnw7Ox
/wCVSVhoPj+fqgJC7NmUzqh6IHxdHNJJaDiB7Ag5SJMJuToNE32JijoyClUH
Y5JfHiLai75J1QOl9FgBUe4hL6aETrUF1aCEJJukhMloFNx7OeREcEAtj+LW
Sag+isJPUuIUN/k8guQxlMHHJONLNWCWoMAqQRPlsNc1JgckIofiWezxY6jM
CMMc58GWKcpdgqZSuyn6KJQpyc0gOzIsm72IZj26hpIHBWNMY9Q4AjjSHM72
KN4igfnpOTHHp2Q7JD1mgnCS3+l4NX2kUv95AlJHSgHyWjO7aUif8thySkiR
qYHSLj1bfTcFHY0hS/hM6jIFHYuVJks42ZgMXwWGvYvKjLjp8bup2KQwpZKY
zE4QxdgGSmBmHvph2DNjxGJDz75H1qXsTUhOk3gV6N6UWke9R8ATAp9g3yox
cJAlKNdRzMe0L+fbToL3UXid3JvNnj3uEbMJpEm4SdKjpjGaJMgJzhnT11Q3
Tfch946AdTUPFTWPgtHEConqnf2SUPz+UJnvVrN+eGSDEEPPn9p4+chGPJLx
7KmNl49sfHNPzXpXs5ajQgAiyAhpBretNx7xftfdGnVye0Ta3TS7UzACnpK5
2BHub4uixbrrTxakcVr2Co+/t7sD1mxOEMF6WFetrBlivbaM9JTLXjfVCWrE
3qzQJngEvtZ4dAkVu5vtadVhX/sW+r9cvlrNmvQcFl2F0tKhWiEKdQ236HvW
sKYijen1+SFJ6/YtOMSWI9ltvW13KzynQ37CWzyIj6KtG5TkRggauNNmC6NF
CtZkWuikRNFaGKkblOxGYWzomGo3p4RArGq2WgcUq6UWTSzWs5r1bbM+Bvsg
BhC8FPGACJUjPektohV5jYa9AvPUArUaUGIY/GLRohJv6aHBlVyVx6rbVKJd
X3AUqWh3YdnAv/X2BLWdb2BYNB1nQmTBOSLqUMRYtNuTRQs+0yAeokRZWfx7
rbvy4gYP6L9SzbrekgY7uBUqFdfwObgU+A6Kgnf4fIYyRKhAsjxEuAHh/tCs
HapWHzbr7a7u8dw/9Hu9RRgh2ARGDj1458EVm2VT9awlpetjAbdcxJbcIoQU
bILAXg2RKlsMvV1ztKrOEONw235/B+S6PV3WFXgvHgcrEYXY8sg7Dk+uBPoE
ROYNaWv39U297hYocNyh1noPP0NHaoSirisO9rtdretrcNNdhy1BgOLJETay
6+sdPAU8twN7oAoxYkL9LWom1yhcUZ5dd6hezFAbA7waJTW27aNq1htUs4aW
bZslmreGmAKvliiuDl4qCE9aITbiHPEjvEZcyOkhRO1i1aOYvBeQW6BDl0dR
6h7yCqshTR3cYB5BfRhojUTN+nrbHXbrEwjNhg7g4Rm13YFGxvcVYiIJS3ys
2/4M1ZkhBTUVyneD6+3IZrvLqga3e1zNmtiq4RZgFxwhcMH1oiK4LTtDqXvw
EfBcBm6IHdx4CWkKBv7kiDCzkF9RP7uH7LXGnIIC4Him7+wGBeO7zVWJ/tIh
PLuEZLntUdEa/5U1mpxOwGoyEyp8w8is+vOyRgAn5FrEhkIqOqzZKSJYdy3i
Qn96Qc366hAvQaZvNBkid8EvFqiKDvl0B/Y67DbY4bMd5Bh41EmJ+vSUTy5g
ujq4rSElrcqL2xaPy7KzG3R08EqccxiEHifoLcqV72BWQC363eKoxpxTRdRO
j3my3q2qJfgFdgwyW39yBHPOjma7zcE13rpbb28wab6gZo04acgdGrLXLSQF
sA/4AjUY0jM7XcJcA86w5TTvIHh+Dd69W6CfwCXXLYMkue4QVkQTJiSD25bB
VLZdLuGrUSB8jZkN55twRObe9OBL50ctorxr7PuyRW8tEZ4Ng1xChG4O4NIr
CDfw1PXVgljQKyQb+Bw42Qcn9AJ3PmdcB2udy7NccGG8l9pKZwuuVZE5Lk0Y
xtE4RObkVo0+m99pSSWFDFJlusgzPhg2jiw3Jhc297awVmcsU6YYFfyPDc4z
IyXc1jzA1d5vF77vkDzoQfNRyaDwhZ8I+FpE5hIaIgrBc2iyElooLxW3VjE1
zG8u8Qi/1VrxMWdKBOek0PiK0EML81w4JguruAzeScvGzI3SDmaYDme8Cof7
4DRmUSD7bAa9VNxlGSu0FZwXkmeCF1nBQ16Y3IQsy3MmwsCZHoPnSSKEj+NQ
FMrqPA+50aPSmeF5AbZnVggDwxFyp0U+wB0lUoCOGp6gXofb/Voa+z84368p
/u7hgu83TY//vhB8HEd8v4VfGO31weVfN+4Yi+El1A/+GrEBbQ8/b7wg0APU
EaSptm5gZQTVL9WXCiUsUG8PBSQRotqhMhmrGKyIYCZHJMsxHplHkItqdjiT
b6+RxwYmQ6hHTxZYwTBYj1XLBbKa4AoASlMGJRfya0BLoMbaweewYroLXcYS
rSnrmw7mTmoJ1AYl0m5QgQyLquao3RzDsreB1WEPC67jm4YtF7SOhUUniqLV
PTwSFqEddhJWkqRyR/hiWPLC2hQKPlgxwtdh2bLuyhUqve08EotAXYGrRihY
GaxL8PdQZCPkgpT/oL7+/k3oZwQVI6EILH8WSyxPSDnlDCZ7xIEgXOJiV69x
wXQhVjDxN7sLMN0VrklgTX9wCx28QWIZVATsNrD82Z4vYy2FWGzZMBRhOQX7
IE8RroSwBFvA4gnKVRjMrgywwDiGEh8fg7InUMLiaPXEyfJaAHW9u1BEMrOD
8r2HlVB/jIW0IoXIChpfKazWUFMQBQO70kPh7GEhdQbuBe6G1Qus27oteAsU
0TVqu0Ct2VTIzRKqyPEE1SwuurdQT1+A2yFM+xg5V3aw1JOwAEVCGXzMLvId
ncF6FQrFwxmADTd5gMGGWyIBEZi176HahbqaQcWLC3Es66kUq2VN6JZjBa1H
LDbGBQJf6g00doc4dMTLdMsWMfroVrguw+2SEhZgFSwacI3KYnGNpW2zI+W/
Gjcd1u0N1HcoMrlAah/U4IMFuMZF1eMw7j2G++uEab0RCd4cw8z3vwmV/YFs
4Mcgwff3fFY08Gkk+Hxc55VAcCEfw4H/b7j/X3+sy/9retZfv//+h/6vTf/X
/2P67voV3/0rfO2LA8mlcnisSHnrxJAXCmnjzYg0IYN3eRhfApIjhDyCyV8D
JGf3T04Odxj1GTHoZxoKQRWUklZLVSg8WTj/Hgn2c60TmFoN+JeHiHOev2J2
fji5P6Xwd9+Q+1O8Car9CjN++wT0ONP3KhYljRtHqH40x6rPkF69zwcj3WAE
l3aEUhAaJLgKo1djPsCvzVxTZdByKJ4UVNdWQyFWGGcKIY0ZlPVBFNwaqOxH
povB5uOYBfhDqnE+WeegNzp3TmVqHJUdi73IxadX2IMZ9+xJhT2oD+7BkXF/
G7m2XglHPt7hrWExfhK3KtpdvMUZ6ahuYAooJ/W4DUyZ6wtMzTAl4AK/xd0L
KC3ufl7D72GKhboBKpZYicCPP70Gvfz07jpl0+c22GGKQuxw2cNUhRuGPUzq
uKVZqxXcpisvVIezbnPYsO7oZfTy09Bl3OD9AL2MaNUPRPiuscBrcBejx9m2
gxIMN4nAPsiQglMoGnb/lSjM53mDFQnSuSDoE3d08Jb4ZmHnZVSZg5l47T8a
CPwB4hdRom8C/e4Rv3uT0wbvU1Z/wuQ/LX6O9oO6Epl0cB/yDEtJTn1c4/Y+
KR4ji6SGamO5wsIPheqwDIfWQeXBuuocatwzZERDprRFBIzrhmFFAZZnWH1g
wXKB/JcKydVWPfgIqkRDyQWFsVpVuAvWQ0sr2aFoH87/4agDl4LK6xD72uBm
4qYVTQU2QEhy6e/vJ30ixKr76eIV8mgy17nyoxu5Mxpyky0GAXlsUJkIKjA+
ZAHWlBkvMGOpMJgwFplJcDcFM4Tw+oE8mn022/oR5xCYbCx3yivJmBi4Gwqe
w5pWQL73I+T/3AeYDHJnoBWjSYpsXkALcQEuxlwWIpM+C7ioNUyMAy+0HYSH
XxQwBRRB5JZnIym4zLskNncSFsWOmdxwk8t46vfg6tfhnz/bX3/61/Ctx1O6
/lfcuPstbupRf/771v7h/7y4f/T4c3WOFT4PxgsjNKzXc4ZjkVvNYWrWCFBl
uQiFHiyTA5hg3reAedzDDK2QK2zICm8+Oej2dW416CwXozeDUwNMbyNyzsFk
zwevvBkDzIcZHqr2qJsjYLaVvhDO8YRRsDCHW/0sgvah5TOkVxuNK/CpmSic
h9qPjc7ZPEgUqFJqMIWUKgh4IEzmqNObds/gKpjnPbcZdwKRwJ6NsBhD1Vww
M1wEU7zOAmdqgN8Eywx0r0jailZK5rlmo8oHHITxNW7lyK3ca9zqE3UOapKg
BPRnZAP8OARlufboboU1Yhgdh9+IjCGgJpVdTHs/ysGSKjCGD/si2oQmBK6F
yyCUh8AHlnPvWSY0DM4I/0BweR/ykOfeKVPkEC8cwTczakpaFqC94vGHv6RN
+Kke/qVxveqevrji70tJc20r3pdv53wmH+bbGWqELXvKq9Nu5XPO/XTIzm7/
bOQ+DNlXAeOeXkw+oqYm1VNoubesvdRMzYl/+ZTIYXEvzQjxCRaHe/zdS0s0
wWKUzaP95mCLUTavbMX7fH3O4OZ9vj4/3bzP1+env5DIn/L1NHDv8/UU5U/j
7R4qAuc5UyP3UAYWsDjPRrDqkEtuCpubcdADVB8MBorpQYIdWTEwO44zYG4M
To8muC+MB1biIR74Pe6SdlHe5y6zEfz73GWurl6c9x93l7nxLxY1j7vLHOW/
owz5IvBY5L+rDPk+t59LIvY+t5+fnr3P7afLX1PuPub2c8i9opZ/zO1TGfU8
KvkBU7RQcDsRBpkVeuTCcuZgiB3KZbrMM5nD6gfFHlESUjvBgwsZjPzsZiov
IHs+lyW/MJz4AT91AfZnLAsuhwUEdNSA84DR8tEg8DuD5RtnQxBF4YPWNhty
xwSsYufCENauCBF+QxtfxgE/mKo85yNEhcuM0YWXLkgWYDmac5nnSimRgftp
r40ZoYEwTrl01qfNaguuHLSX/wPg/QwAXgJKuP3RcTrrTegRMZ89J5BMBNoS
7IxaErGIBAkgpT8CgIRnQQ13ALyEMyRYoptEeybYCyGSqF88CSERaICO8PtJ
8sfMx/3pJ4IYEuKFoB+ER6OD9gQRo9PrdH5/UjkkLAPhr8xeqYpAB3RAPp/H
geAeERc8RntQj6nRBIkUcx/oCDzh1eJhdwLiJbGiYkJekGuRvQjDRv3O5ufQ
GXwaC9KcJGuKSTKRYFIEXyMQAF1IYC8SV3peUvEu3jefb0fwldHNBnNJ7HPc
64yKZIFh/2wCHZHyGMF/CGBAyDL6Orlwse8IGXHYC0RFzK2ZfYs6QtCIKFX6
gqTiR2JuyeM8PTIpmRGIViaQdQQGEhqDoC9D/IA8joY0yc9RRMYQ9LP7Uqjm
CUrGJzQT9Z78mbBJFOoE3kgwjpAwIWQWckAKNBEBn4Qoy5ISKQE+6Y6EZiIk
F2FPCQQiEhpYF3u4VVTKS/BFnpS8CNLi92JgBDHi8SkE40jqpQT2o5/k81qs
d4CihFSPymJJ0I5AdIQzoWQWzZlw2uRWRQS7RwFRQloRBCdJIGZ7XAt+ulc6
FVO2SFajEHUJlUx9jNlqQnF+TpgsS8mcnJwCgzBcEdSu5gCidEEALOrOwPZC
vtRMGkFCexHgiTBBZECT4Joq6d3KCFWLmS9JTpL56TkRw2jT+NvvZhHLCaVM
uEaKFUJq8jk49gLBhDe06bExYeroo0nGjhoYv06eS35EYznMthjt3HyCPPE7
KrIEVYrKw2SSZ6eVO6jaKBjHv5t1igkOThPTMH9AmCTCcvuk9Sv0HrMUQcsp
x5Jz0TcpGdIfUcwxwbBzvw80Psx998nQLHFJ8BdhlneRrZRGqO4gT6KhIExp
dKJUBZCLiYRNzOUdxdAk1UiuQyOnkqyiT5LLOhFoTJqfBB8kU9EkQzDMODHR
TxMQ7g2Y0TxlfBp2mkgiYI1wguN3Ey5xD+h0EwKXmpO4KSJWmOB++dxBv5d6
pBxczC2epmwCrLlJHnhy2Kg5WMytEM925jE0ZowmMjKb/Yjwe+RbURQzQQ8L
qmrI8yelZUoGqbqUSbaZ6h+ChFO6jjqrJC1LKT7OCFSVuQmeOcM4i3kcZ2zk
W3GOFIR8HmhyZ5fksnWSXSZDykTJISa1XT4PCT2eUmUU2aQyl1Dqer4ZuQCV
rIXel2RU0FEKZAmIqpOiNjz794YgjG/bCY/13BmHu2/bJ13HErFpJ0cIIKpL
xN0Q0TWqnHVls1z1CGVCGml8g476jmfQ8A4P893W667qtjXrNmEJ3yEpN+wM
4m0Io9bKdltxlGlblVeHq/XFbb3b6m7dLVBYb1UuUbJMtXi4dY3YRXytfl41
7PwIRQg7UseB/le8Qam6kvQcWYv4vdsPkYUNHimpmiMEI7YbFKg8Ey3cst6S
Egw0HpGCCLS7rhF/VXVLMOvNqjrbNXh2tup1V6F+z9VhvenwlArY7XSvpvj9
PTXFD5GBddmV3QYPtCD8r1nUPZ6XBcOXB7fdGhUHL25Qzy+SfyNyEL6OAwz/
pUMc4RDhTF2PDnBSItqlK+mg8G1HCjrHAkFWqHdJ6JZK1yUM2LpSTb+EPkK3
1r3CgV1VKHNT3aCgXL2+KuvdyaJhxzs8udtuDjSKfq7ANe+qbkZBymWzBleD
yxDm1VQ9mB0PCCNs8uAGRmrZ7jr47LzCEWs2iL3BM8R4dEXV5TGjY527i9sW
TzeXJwt0NUTOPYT7fYj1m1Q3wQsFmHAHI6JbxLHi2aDNMfhGA77SX3dbRJeG
qoZ46vqKQQs1IuWg67d0XqYp6w0+eYmqeLcECWXLo3a3XKAcJGIWwVtRCvIG
gXY1ODtqhZKuIXhrsyZdx3p9wBB/BQ6+qMsr6G+vui2qKdbX7a5CYU+G52XB
1ZbTkaVJ6xJF+KqIljsWqzJUXY/6pwey7qFl5RlEMrQAT+iiB+/wiBTKQHnZ
smMGJpXtLiB+jaHdCMBUXRNId338iNZlSweAwXNvkG++3SADPvjHBnyLoYBn
pWl0KhRzXTZ4V1RPhCfV5ekSUXAILOvWiwW0htMpFnA9eNz+Ubw5x0dhd1BE
oTo/Qh1DxF6tytOjekbNbVDj6eCmZpBXtvV1vfOq7cE2m/Y6ijbCMJA6a9VC
o1eUzVq5QrXN7T6D/SgMD39a8LA0//ATgHVFA3xw3dAZm4qT6AS2YAs2CcsV
qmihYu0OfGCLOl9grx5zyiXEFMqJQscRIrpZVHVVQ6BggqDTTA+ha3dxazX4
B6YgeOpmqxtUZmV4JGtR0UmfHWGjwfqsKVH7tYKQOi0bQphWokOoLERsu12W
pF5bni668rSsbz+gr38aXEYgm3jCdj5Z8CYtRmT904x7ZpDh0RljuZDjOA46
56FwnvGhYHk+DLrgMsPt4SC4NPObXVZInSkZ94Z/fPZchlCZKgZniswLhy+D
Mtzz1ri9qjXL4HGZ86GwVmQD7s+No+VuftswBi6cVQPyEQYrXAatKNQouR2l
GXSW2WHkImdcuczIzBsrc6my+XAlZ1ZZJzRXI3xRF/JxMNmPf/j2v8bfrq7A
lH//Z/jpZ0tHaZ/r1KgtB8uxvPBF7mWWSengZ2gI6fmYoDOvzSjHwXCmnc4F
9DTtJudslExaZ4R2mc2hkz6EYsyUsYKjNJDLimAG45Xl8BhjjeaFmV8DaG5y
JGlUDjou8QjXk+AX7Njff766/fbH/9537aV90/f1LUkWzX37qoFlET6G+7b3
sGV7ONkvr8KTffFguwcQ+7rjbXJNxFndfR17HzH2pP9+ReAtlD6/hYL9hmBT
hMhCtHJ1U2+aI4QFNWt/05WXh20sixH0jiQIHSr6wmwItdoNTG1QCtcaajhV
I2dHCdX+XdFInCmgeMWihKQaLwRMZYc0/6J6EQJ0aNJEDoYDmNqXFUxpMI1d
Ltr1MUwqOPdAvYdkG8iAUBI8CCprqFUQYXUJ5R/ULNSKC5jq6xsokXdROf18
Qaj2DR6ZpSkN9XF0u45HpnfINVFdt1iQb445fOWItBQR1/QMIuuHw+3Fn4/O
ucOK9vriTJh/+b91/3B/W9459wyV1AYKrPX2BjqGWpNQoMJcjZrm7Bj/Dgsa
WOysK1JxQsXr9TlMpFcI5kZChOsGCSVgHdTAhNqU/rpDMhJY2KzWx5xUxNk5
VExIunF5RMpWSIpwfBM1gI4R2K7peHAFgwmtgEGF6bxSeDn8HdZGYJeyOyTb
4Ept7WfChO5W787E8pezH09G9+PpL1CXiPOft3/3tzdnf/7+4O8QCr8M3y/O
/vJD8y8nT7b2B30ZjvrY8W2k+FhXSDRyjQqXqFteww2h94ekeLmD5dWuv8FD
zFCrgDPAf9HdoJVQoB2izDcd3j4jlSIoOlGyGkZo+9P4/X18U/XAxfb+BTd5
r4vt/YvKnfe52N6/ENd/38X4tIg7cT+fX7ojWMgutxMbwsH18c/sf70DEyUL
9SEmCn7xsZgousUzmCh85hPqmKJ4EyiqyB8FRcED0skL/Pk5UNRT3/23gKK0
k3ku8QzBUIxC+ozrTFqYY5SGIifz33xSUFTOngVFSVkgHfiDUx3z718LitLv
A0W9CfH82S9/CqKVDjo8o6b5zKDOxwji2D6F1DL5/eImGFkMjA3WFjA4o0dd
yxA0nuWAopx5neMxER7G4L2VI3Lo22wvsOHcoAX8whfCFjoLJgwcih0hpOUD
t9ohlF4WboCC2465KnKo0+bzM1CfQyGG+PqgoWbTCPpnAw+557kfucITBtbI
wLDWMpkr8PujT0ffNAePGL3IR2YlnoUJYvCDsOIzAr52sPx9EvCFBDv4GSKU
Jnax60n58Z4wYtyEuYI54nDxy/kP+udwRBWLam4f6k+i2CTVDGc4hcCyGxnF
kCwHt0NaWA43sAivGbSM6K7ufI5IJiQzgykImV4I8AU/0tNbNmGhK9waQhnn
rUB16AamjtUa98Zaai19jvgx3EudNrB2B/ARbp8ibZG/Tev6w4hSbje4/Qrz
JuLn15dHNSpH417iBlpawW1KojaCiUtM4ts/gw2uPFQxMKmPXna3MLH//OfK
/4bgt78sF9/3tzfl99/f7GDq/WU2PdH4ROtP6HQoEvcYuQkgtyP9wfIpgBwZ
dv+V+xg5/C+MymP7ymUvPxbw9dVrUL6IUnsaooZ+8ixKjTitJNSVi9V6sVxV
Z7e41QqlmYARYsjSRnD841uwePkcSg013VdVf41ESygn35RQ6bAl7VF25em8
vQgl51FdQTzQpib4SnWO0bOAqncBfiNb4iZCkXrwm20l2r5GSiyFO5REloCg
f/gXt99ZBa62XNDWIsLud5dQ9G15jbRP6FpIJLHB4rjFdQmUbgF3ow5pK+0A
CZaO2h1SgLWoJi+hcL5pKvDJbbdAeXSwTUlb0ltkIoNbMKjPEY+4BpejrbSy
3gToDDLxVRp39DuoMaGxt/vq7fOD39Q9Ue1hVDR52MCV8EXGhtzD5MRYCJLr
IIsi6MFrJWBa0WwwIRuZYfk89clcI5LJeRVyBpk+xyoi4yirMuQBJqoh+ODM
s+C4hxOcNDlMW+OoTCi04xZW0pyrgEt3WwwepVmG0ftcGuPFwA1jEpbb8wFR
HuCJQ44zj3FZ5gbpR+gYL2AWD0pktrBawNxkskIIEySeYbU+wTW8HMbM8zFk
uR/4mJvcOMdhNhzVOGZykEhzE0YlBudUwU1htMnG+VgzzPAOLJKP4xiEFrmD
WThzTIePw9j922yEujeZ8Hb0QcvUSZi5GYwtE6aQHIWx4EZqQHkTx5jx3Dsm
DVRF4FTK5UOWZTYzLJlYGHhEXkBlJYINhZJwIzVa8aWgeveDQEOzB5k5o60Y
wgh1lVTCQbtQQ9swx3MtUeEFbckdFMhFBlVIUiOSXmhtcj1K5obM5pqNBisx
730GhZYU0mmowfj9IHDPBoE1yhXMewHWy7mFem/MuRkGoQyUWLnxboQPiiIv
VMb5AC0roDKba0rr8+CgxWMumYWqbLBSQGxbAaWgzrFizAaE8HvjwIWsDh4P
sSbQkXFwB4EKRtK5eJKYF5nLA+nHMK4Z+LzUaIww6hzVWAM43vz0MfeWY63r
Qo6aUFIOGjfD3GuC4ElE4L/NRpAPXQa+AYugwc6AEZUpCInArfNeKU2owgEs
UQhwI4/ns2G9wLxFYikBMZlZA96QQCAQb1IP0sANBdKameChAxpq+M8CLLzv
8kzaYDiEKTSDixGC3FrIZVmASM8KZYMTkL0tF9BlY6wQEA1es3n7HbKPYRL5
GvKsAAeAKn7kZgwwBDBXBJ9neKR94mV7EXj472rcFwYmCnZfkY+/L4+ndyDv
m+tmDzTvm+vSSvDpuW5GM2AH78foPMavCtWHMTofTH9VOnuYx+bYf1U6e5jH
Zg+b0tnr0JJP7jK9FQv06k2Zz4WWlOx5tOT7do3uqBW+sAUmWUwN8zT15gwR
U8N8+YsZ4vEA3cNpXqy3HgvQ+fJX1KSPBejc+FfUpI8F6Jx6XozTxwN0uvzl
OH08QGcY1Ytx+niAzntYL8bpowH6KGrp/tyjWI7MR8pwVIKEcWE+SJeBC8JC
JhibZXoMhRxylmkofME4XknHZqfIXQ4pGF8OglOBOyioHEcOo8tybbNcFWHQ
lonsy2I/xX0KLHSO1w/6frTnqeNNg74f7fnyNw36frTnxr9y0O9H75wTX71a
+jB656e/ekX5YfTOvvvqFeWH0Zs2ix/Osr+X2eclJKpkzyNRf3ezz6NBOhdA
r1zs3A/SVMG8r4JKGfh9FdQcQy/G6uNBOl3+2pn2fpDObvnKmfZ+kM7Z65Uz
7SNB+qoZyAkvihBsUDYHB2FgSheYYc6GgpkicC8ETD8a7CKtD/B/Dm6i5uQ6
DCEXzuWF4OBzIXiFysDKacU1oqZZngdot/56cLX3DWADEyofYPHMIYT8AHEF
JhZBawgwyUYLkeJYwWFwMwUeKr0PsDqfDTCaXDNnuFWa57zA91eDcH50MJAQ
sODFcH85BdKnwt0+KCN87jItJC7/c4im0YScGacRyw5OL7mG1SCDCJOG+xyG
zGcMEkaSmJajYgO49QihrfHkWSZRjBos4LW3GYLE5ejZ/+ByP4ewbhKbo1vu
UX8EiyLEYQQGUhdIpZBUtiJgJmJ5k1RV5t+CyyWknUwIoChQSOpWYYZ2jAmu
FlVkI/KLoF4R/kV/kCwWYTvz+WZR5zLMKBNCVtmIWCJUCGmHEUgxS5KMBOAj
LKFIH/ikaDdBSAggSfgvQkQSBoslcWKCFdEHhKGMGBZC9cZnFwlMTAAcAj3R
oBN6TOyVHgmBS7g7fQf8klAqBOMjBTybzET2oy4TcIyAoQRE5WovqEgtIpVB
0jejW/g9YpQQX/tnE5pygs6Q4pyevY6eSGMeEa4kREjQTcKwEaaKIHXRj+2z
DnkXPUyqugSOlUm2zyZxVIKdUgOpt3mCaim2V2GL4m96/qlICrLUIkKeE56J
gEIU7ENUgCMkHPWHIoDAUzIJDu9B1j7BttmkP0yjM8wtpzAhsT6SqYwSrSF5
PKGuko6t+QJ4ZEKPU3yPSYhNJS1Xil+ewmDke58JSaWWJZlkQsVRmBDakTyB
RNwiRp0cY9hjA6Nmnphd3k0i1RMcPAL/k8cR5HASoHVJ7zcCugllSmPAZkdW
Sdu4SHKpk/5wloT+CFFqklQ2Syhkwgn7JOxNMedjpFHSIEQxBQeBNQnfSH+4
pJlJoUyQQLLppNdJUD/KSoSjDAnKTajYqM3HZ48ivT7StRvv4rDd7C5Fgu1T
o6IccT5bIDaU9Pz07MOvRE2T5xO6LwIk3dwYUrwkhWHyFgLIEdKecLYTsjBG
Z5jNSBNVFOem2E3yq3unIIPJbM9PQKl0SLK41G/qnk5YvjFpFhKE2UbUKLWc
EtY+/9M4+iToTYqPlE8JSTpMysqfHYdtkzw4eSm1ivCJBCYn9KJNk12UK43+
SkQRhBalGAgJUUvoWfLNLIljEqCUmBI43zNVUP4t9pMG+TihiV0ajSQBTvE8
CY7KhLSOirb57ARxgtTzTz5hSIeJ24LA0H5uNAUC8VxEhfY9TJX8PjEy2Ds5
Igoo00ARLjObPYWcjeI9quWSo+9VLmO+pyxPmrVRn1ff8bMp8KgmMKnOClMy
SzKtNIfYBHrmad6O6s/F7ExkJD2pYE7I+dehxSnj0BxG5AYUcjQQpFkbZVIp
CsjF7XczqDrbi9BTkqVsRvQfURyU7piqDvIdStCEfbVx4qX206REsx1LIUm+
RS2jfESFXJ5kzXUMtDiPJ03SMUHsqW6glEYTGV1IJqc78mdx9Pfx5xTDkXxg
mIeKDEUlJ9WHNomLEkaZELzZnQrUJ+T1nmWFhormtwhXZ7MrE+Y8i1nMpOmc
7kkhnCdxZp8Q7wQMz5Po+sQPQ4LBUZ6bQo+8k3qjZ1eOxR0lOj33QTybou8j
2l1i8ShSqiQqD9LfjUNGWTBB9gPbB0gUpi7mKKFbUGUiEu1OFFKmvEvONDF7
UMlIX5fzWBAPAyWqCMmmqKakJObbUvenMt0nyp+4jCGWhiQmThQGJEVOf0Ra
A2qjfitGPqqaE/Kf8hK5doKZU2DQNJ4lSehxYpmhDKRns45JJtgmT6doLZLa
L1GaqCmdpdk6IucT4cCY5i/qODkz1emRdYh8JfpfLPsTh4VPutFxwi9mx4zD
SM4jv3tpJnsMdU/8FnmSjo6LlSQxnaecHSkX8tlfnN7T6oR98koFtkiLsJjn
5dxdmneGaGDKsGS9mKjIYhQ1xKVAvSePoN4nAhoXg6ygqylR+dnNI9cH+Zuf
h3RPgxKXLex3h+OP5xEJAfzckcS75xFnHH9Xrda16tYHKEe6IARwy5oKVW7r
XU1amO1NjXKtqGS6Q33ZxVG7WVaoINSyaofyik0ZFs22umkqRJD0t6TxdL4g
aDdiNratRvWkBk86blDLabms+4q32xYuP96tKiTi7xEeAga4kAijopacCVTz
bdakKoWqnGWNQkPQuhpu1yFEZo2weFRrRAUqFBFGYVkErWxFu7mI3AYobFrj
oeKbZu2v4efbhqEsa0Nw9648Wbash5ZGsw4TQL9DkSI6h4lHfhddWbF6WytU
j2oQurwhuU3UxuSovbuqWt71NW/KY7QTr5EeAEatLrfX8Lh4+Pi0itwFKEXk
r6lzDLVlYZR60uaFW+OIQAeQd2BzVX0oMoyHSp9gE2h3iNGH0TjqNi0K53IY
JTwVeoRqr12JIJ4Fyh7TueGq5111etQyBNxsdbs7Wdbr7TWqcjTr5SHqN8PT
l83uAodAo05Wu+13LUO+A8T2o+7VNQwgQyHhVYUwdvTgrViVKBVFZ5l39XZZ
rhDLzk7Be+ubDkHorFmiaBOqUhHLwvEN0kSgEhmijrp1TaJmXQXW356iRIJC
CeMVijdsz4jTAB6rV2VAqF1FSHEUpDqp8O6o9dCVZ9NAHk8huTiEDiPASzd9
ddv1CCdCnaz2FnyEoZeThiiqRiFcu99FoVPUdahvSJBifQEtOoXhxnOrx2BK
iNr+bFeD54LjS3jEEeleYJyc40ltgedwUbSj3ZwuUR35JU6DKRwXBPbrDlfl
AoYUtb0gCfQVnhCGxIB61tDZ8gqdXYJpD8FmAkZJwb/oFDeIXiOllgs6vtsi
EweKUUBINUhIgHwGDDkMjq+7dVjUG4jcTS8p2ncIfz9F9g6Nyrek8ArOXTUE
poeRAj84WaCvNGuUdkN2BaTOODlEzbR2E6pJohWlNq4hux0Ry0JPJoQBhcy1
hUYiam+BjAsS8geSEdzgYWQIhNtViUA/cE2UbJ2w/t/fHmfo9pA3IbtBbIB3
lpAfyvqmhvGHEFsgbm5Vnldtf142MKBtj0LCrcazzjX4T7cGDyd1ZHgCcmxg
GkKdZmgoO4YWtRK1iRukitgiUcHVEZgXgqFHebqy2eGJfPDm/uxxdWQYdKRn
WG8hgiuU41Pt+nJBIrGobY2i3aw77MorMDVSJ5CiH5EuoExtiSF2dYjtAu9l
DUNChuYoYuOwRQ20oOWoJl3Dbf+/9s5luW1kW9Pzfop+gBrkHcCgB5II6sgd
AANsUlXSDMgE5CA97BOS+PT9/wtEqiyrbFnn1N5de1dUOMqWQCBz5bomsb6E
XUH1pK2C72vDr+pud/F8JnN82qv/O+318XzOOxzm4TO0Fs4T+oKJODIzeIAg
3VJ3/B/zGecXHt4LK3HzvIWDbOVcbyI0BLny1HCF6u16u+9sc/wEZXh4bnii
NG6MaQt54nR51dY8fJ1nUu8f29MFD8R7grfTb6ET+t9mhe94ZjHELw0eR+Iy
nnjY23bHQ9kR8YhfkQMSaWo8Qr1GZLyAQ7iDbCBWqCRkBRcOjT5ur8V2IgaG
H5P3sastWw83q/hMQken7q9IpdgeHk48cRxO8RmB8+nrEdIVfMV3wDJaOaP5
0F7yiMJW0SjuPF34Zn+jN3CWzf6GDaEIMDdw6xcSi3d7uOQ1Lr+FcsMhsKf0
SGcIz1bzZPH1NV+bR1xmZys826cVwztWa9XyeEd6NugDj28+No+vXo//78NB
vP7OJoxlX1W9jyk5VY79WJWjHsqeCFfCW7Xp0zCkPhaTicGUqVJBxfxShOlH
hR8NyRe9D27id4tqGmIcrTM+xcoNverT/OX4b99999cPju9bR+dViFHhgy46
N5mC34Ila6IdvU+T8UM58CzTQg86LN+OFn2qfBHGaexL46tJhdKlUQXfu0L5
EvcexrLguyixKCr8yE02jVOGwBs9FMVUWgxg6KMvYlklb/repZCSLwsz8ECv
qqwGbUvrq0AIbrV8O1r2UU9WaW8xtITJV6manLJhvv/PUie+lU3w/Hp04MG/
1VT1lQ1eRx+j1VgxV0U3euMCv13HCEu+woUx5xf3dGF7ZW1MPb/QH+3Ye+vN
UCo3hmJKw2hGaykg43wi+raMVZXfOgyUyIT1Ca4oJ1MNEHyIJYSsbSjCVLpp
0l4lUzg9KVNOPuDpbvniGbox9Lrqg01TMFGVFcZrpnRGB3wYXvGNIn9IRHZ5
teC9Ivo3hlv8M13HK/jFv4X3OL/b/S/A0CA+4DNKVaREQmPoHlGZXBLURPbZ
pkb+t7pxqHgReWdyxZ7tbUhITum64aHHyGs2rLXrFrUjYvnuEv++RJaFj6Dq
RZyv2YGKtAFxv13P5ArU1DxiGLciR6Pez9n33PuJuE2IGf5DYdiukMQwWK94
LWI+O/A4kojEvmPB94wSZ83kZHtg2+jnK5QUmuCP7lCjXmDX3BEJ7z0S2dtL
FEVIE3ju8oOSUoOtsahkWQTuWKltyXtDFhoVIRfITC2zz+2h5YnPax433B2i
ZeKCCZ7mxG2Fp6w2K6bTyMp3yNOP+IPbCLjs8MDsCxk7T+lt9GZ3J2gsjMIh
2X8iGGNJUmqIj62Huy/1hkXvCtn6u0gexHjgJm+TPDBByT6lJOMOwOELFpy1
lOQ3q+a0Xnf7vUK5ITLZsbC5F2KfgP9qFHvIRJG8oTJBIqeQkZ8wSiayxwbp
druWAxCR2G14vjRTyDtLMBlyvTU3L1BXOmSXWvLfPbJyVLpIu5lpIbHFaqy4
oULiGCsbrtw969rNiuVojZyfTc8P5Acir7uESCOPG0bCylqB+EGe/AyVqwk2
Y3KP1TrcPc/UF1SsHevqa1Qo9TtOd4ZIq/8c/uP48OuVPgym4ibK/fWX/7z7
bfvl3CNsMInnTY3ihsdQr75cE0/C3mpm46g5UaHQhvhYNgCjshG0HAsch0QV
8yS9hAeE49JdPHUs0RVBgNFQm1kYSh/x8cbxnOX2gBobFS715MiiWLT0ezwR
avJKNJQVywqV8OlCEQoiMkFBcbixktTvUT/KInIfgqA7UvvkRGdUu6jBpSTt
POzJ0AC63cMzMS8z4cSxGmHt1O06KxMiO/EoJ5/bdkVYSkR1hyqmRu6Mwnkr
J13j0QoFkJwsqUUHTnjK6YE8lWeeLc2V2op8Pl3R/ci+w54Hr3MT6mhgTygK
IXZk6BwJqxIWPCcaP3fDuOPz5Rr5P35+rl5//d1J2HPl/9Gjm73RX2NKvDb/
VUwJ7vldTAke8ediSjCA/FouHvZdTMkfXftPwZQUoxtcUenEgzInpauBDKyi
mgbmNgK7+sdhSrw1Vr/xyq+32pq/MSXvxpR8b1GXHDWeQWZvY0q0ta/zUKX4
hi9uwgwUFWA1DGNRIklGsTGYOBZ+GLXWXoc0MlGOvqzyidLlMEzIqUNivliW
pkc6jNJKp7J3YzUYH3Vh0oQkMVVyjE0IUxVzi3IyqFuUj1WJi9Qw6JG6ojR+
kPoQSTxBgmwcyrfJ+zGYIiKRzUfl9A7SG5GWp74PlZn8NGKUvkC+jEE5i4Q2
8na2GkvvkgrDNDhcu7yDO0WvUAvyMKBkcGcVoJ4lJm8cz/5BAj0Y4yCiPxF7
ojMN9Z+GPSEZWL4m+APsCf6OGHPzz8Oe2C0hXKvom30nCOQt9/j3N0gu7hFM
v1xLEi6J9wLg+hOxJ5rb5jLBP8Se4J/1qXnzaPC/sSd/GvYkrVuoFnHQ3HVH
wUYQIs/AJryN2OCrVs0nbmNFvns49wp2xMuhWi2yZ2ZMxGh3xI/XZ24v6hh1
84ykyrZ7fjtVIwmv+S2MlIZ4hGP5uOFXjgeWkvfEBT9vVg+uOXJnlYJ9IqWR
wDqin4mSI7OEO8XM11CgCWkOE4RxkHvNr5NYVVzguqM77yg3eEKz389WvFqj
fCTY7h7lEll3LBWRfKJyEJj3Drksv1A6oL6pa0UxixWTbY3iFdbaCD15/9Si
jORR4p3UwUyH10hI+YiajDxo8LbGElxtjzcKBQy/F9ry+w3Spo93z7zFdvWJ
B5XD3TD5f6DoUEIJvBs5LE8oJ7y5e711/KeSVUJ4vRuBHKUYq4goMk3VpNOg
q34KSsXYF9Y6m1wRhxGRJo7DkDRPrytt3gkxyFv6EjGuL8OU2LcxDrYIRQya
jTGlsmkcgknBDinpMWg74XEZ0TGWUTs9jsiE1GjHsZQDaf8QwvJm+HaVtaXu
ja0mHy1ZLkRbmN5JT1GfEM29i2YkEsZr70PRL9tIltRcq6dYxWJK0+RGxPlS
6d5rhHpc7ZinpapEKFXjMCEP0aNPS4tfnPAzDbGUVeyd55ap5schoYjpG3xg
HFxIUwhOq3JIyo9lqpb21GqyyBbY4zQiyYujKtjXMyLNm5yrTDEqbWwqfAiD
x78GiKhPRi+N9YVOlTETPjqNsSgH19sJ2VE5lVPyZhoqzLvyZXnekPso1OWv
IXNlkK6N45CcGrQbKqOqahinwpmpRwoWck+Xis6OyNGijmXEMEriYfTQIysd
Qir1hLkYbpO6Hv9y46S9QVaz6PtoQkoKH0VWVRZu8FENZYDaK9MnpHclIXYF
ktV/ECTmW3uGThRISlMsnE59jJWDkpQD08axClMcoRPFEH0wY99Po8LSTeHF
nicDrXGj65Golh6FCSQWzFD4ibxgOIcyjnGA+AOFrQfopMp9ny5y5fsYymQr
ZJFIrV9XWl/xZN7SLW0qW8Jz6FBFOCRLYhN0GYtW9REp7KA91hnLgN9Uvijg
vorl+WPAvKCY3k4oNGAEY7DG4APIYyf2TEfbQ2ujg83AzLxm16QeltkHE4ai
RPKehqCjtzyjE45JBYVrK10OKhbF5A1M2WooIOQWTczUwcCeRB7Tbi2kZ0ru
l08EUmGaCfWDCdH6CnqrtAvIzYceGkf89vxxb3CvIfSmH4xmrTeZCtLvC6xh
gFOmm7BOV6Z6jz3/IZ/mryFzXU2oYQKPnrRlqfoEU46jKwIcik1WZR9K6A3P
Co3RVyoVkPOkLBU7MqRVqbKxD0WAjxyq5L3z8KzeLQGoT7iXq3xCeTTCCUwK
tWVF/DwKwRHFO9wEol9I32uF/zjv5lvrhe/X7BdU3qLy1FWBeXvMKtgKjhEO
dVSjV0U59RXCii9j6EM+q5ME8aofbYXykRsIFa6vUs8KbkAZWTkfKg0xuSr0
PpUO0cLZKhPFtUMRO8CRYXl6mLYpbHp7Hq/ROH+BefyjKTrFq+/eSriBj0TO
xUwQQD8SORcjRQD9SLayDB5Jy0eylbzNoc37s5WlF7lc5i6C+4CLWvIk/zEX
tTQ6Tx8LC8tXjeXHwsLy9Or9YeF9nJ8/3Kb9WdLCu3c1/zTOz+svlV+RFj62
7fpCWvjRHrIzs59b3M5Pu7vZzy0m+tPubvZzi5F85e7e722ye3qdrr/P2ywW
/k26/j5vs3i3b0qk93mbbOGvS6T3eZtl7l85nfd7m8VEX+VF7/U2i9a9yove
622WdX+Vi77X2yzl1Ktc9L3eZrG46sfsovCaJ4fipO/HNJXCrmSgH0pbhIjK
KoSSXA8s4Fgki5/3abBFcv2ol5ej/IgMD+oE+egeuaCzAXdTcYCNDsgUoWXa
pjGGyrieCHHPtzjKJeMbUfcgH+zLlIqi6NM/GHFUqm8RRz+jc4uyLcL4SZ1b
lG1xWT+pc4uyLbHtJ3VuUbbFcH5S5xZly5XDx3KqHIw+llMtH/8JL/d795a1
+GM51aLFP+Hlfu/e/lVSgx9CmKrq79Tg7dTg/R5nMdM3q/8fe5xlv+/N6v/H
HmcJUG/uuPzY4ywff3PH5cceJ0v+69T6vR5n+fgb26Dv8TiL0r6xDfoej7Ms
3Btbz+/xOMvCvbH1/B6Ps+zMfOt43pUeGG7L6jHCIeHepq8iBBhtjMVQDnHA
c6zCTKpqGIrK9zw2rehtHnWFXGKygUYJmSDuO2PGpOxAWJbxEVnDQOphX1V+
CmkovIUKjoutwHygknz/c6LnLf7/4U+9lhNMchinqFQZxzQ63acJyjEo2OUE
KzdMi+DmeqxDgmMzyWnvxikH39R72WTpJxoEpq2G0pmYRgP9wMKST5VKA4/p
4lgEO5ARlRP+QsPeYsk3t+n21E9M9ceYqtdTtVMsRizi2MNf8eWIKcD9FXw5
fYhwu3aqFAxiSrGUdylCgB7a7P+KkLQOkxrhZ3vvyspY0aVisqofLJxW0U8G
5lGOYSq0mRQUSpkca+FOTeLGY9CTm6q/aVZ/As1qZvAMSye4tCLPWAXBTAko
Ssgr0pctje3S/1wtRIcz9cecaVI/QbOaDxMXrMfwy5mvIA3O0rstPdI2t+gL
26YoZzaSMJjKRQxzv/+4dJDLldLHPnfNC9difGmuFsCDsB1KIa0IDEceIYQJ
wXnlM+Nfznovz1ymaemrnkkaIi+BLXDkYyZ2+EyUMmcuTD7KXSA14YXIFZZV
FC7IzOEQ6oRARtR8M2kqL/PtpNFeeB/C/BGsglnGEzO4QPq845ktJAMUSoOg
aUTS8nvhVwj0RZr8i+US6e6PMxZBpjcTE6T9vP/lTKIR/IaosMBBRE+F5yUz
PGMxhozFmXEvmSg0k8ryyAW0IRw1wR6k+dmCMxEdcfmJ47Ssosrd/yY/W+QX
Z2KAyEpsQx4rAAFZZZGAjELa/OUX8ighPZz5WE69l8Ml6ixt9yEzFYRCMau4
LLCAQQS9oRfVOzOMVIbfCKVCgAEyXiFXzNguMVUxcgGFic7OOq0zU6HIGDJB
TIhFCGehzLoo6yAKd5av+BFxBMKeEEJGkRF2L4groWYIxkieHcwLA0yYCwI3
EoWcQSRTlkVY1FnYBHJHPWulQD4sLxesgVwkCkDKz59N+RKhC9ZL5C3Qij4D
XwTgFjPJJp1pHaJT1aI67mtmkGAwZkSXAF/O3J4XSJoEGAkHfpGOuDOhthSZ
2ydkhxm3JTSrNKuQzFb8m7i2crGbPvNBRPOFTSJSFtGYM0lN4BDZ9ETe4vNm
QoSA+PyiceIUZJll6ceZHTMIf0u0VOgcws0Jywq+jEd4GGUGirhZU+aHyWNl
sdIvC6dJFEK4IRnH4kVdhFAz+xAxHtEzwTa9IJjGHKVjJqS84MjG2QsI1Eii
i6y3ydxDoQmJUoutCAlnyMiw87xlbGO/yFc+I/wO8eXiL6Y8imlclq2cPy06
ItYwx1jhFZbLKGcG2zBP9Kw3QhUr52iH2PVOPpmoc2WWsc/xLC2DEVUQaou4
GaEGzSMvX1bHZi7iDFgTRyP0RdFPkb6IySwC6WetFFnOJiJmnz2QULTmSblf
zlyxmSizoGv+5xmDIhBAodDI3YWTM+Oj5DPi7jIETpY6nrUyQxhFYUV/hWml
cgQ12RrTOZGQ2CPRRWiHwmHJUUFYX+N3s5n/HvqZWIvJWM/ZzUr0FNvPQcO+
sBPnOYuuiA2Il5A4qkR3JSuQaC6WJiljyreoXqyhyLGqyMF/XtzsDGVdxHXJ
QP1sx6LgMy/O5IflwDkzaopFHQR+KqxEM8tbbGC2Br88W1YrZOCPqKIowUwy
k3gwRzrR5yHjImWAc3QUJpUEEgnE4kNEhSgffdZxtViDJK1iekK3ksAno5Ck
cMrKb+KLhYQXZJtoZJaQzFFU3mT66Zihn37W8TnBkZCe81IB3UmIkVHKs4UW
qd0igb5/yaBk3mLCgoaT4c8DFPn1y7Nl0eUW5/xLEE2iZrOR9YvUYq49RPlf
/KngC8+kPfPdUPy/Xzmg2dPqZYrujFpcqGL+lzO1qsgo14WdlnWvyuY0x05x
60KTU4s6CGixOkeQDEgUIJ14F4khql/WUmYnE6tyciwReJpDcpW5bXJP8Tiz
gWbemYhPVFZsU7T+HNAlpISMhColzGSKniQTQ06l5pJCpGJeyhnRvT57LnHg
9rug09dUuJDdfZ+Tc4kyMhybaaqSjkocLc/ZnqDHRGgSNTPTTqY1E6gkFopN
2/zpM1dPmF7yK7fcXQBoPnNAVU4Typz79udcUsRnF/HJpyUEDLn8lL/JSurs
HeckNL5wS8Vr9y8k4lzeycPm2BAWfRKfF/oXfyLpipT4/Q9F/nvS3FxK2mVo
Y2YvjxnWJcORjClmxK+dBy5+SGYn9aQ4PbEBYYHOqY9UqJkaN8NG58R51m0Z
c4YiVnlVJRsJOfHUOSk7O8KQo7/oyYw1fGG25go2ZXCr1LLprLHVMpgpV8pi
2DZ7Z4kHs/qX+ZJzGiia+ZJ2fTfMvkWvmwPbsCiIOEyVkwIJ8BKQJRmfcjY7
nKvJnKTI48XJ2gyS9Dk/nnOwjEc+x76UcXySyIobeiGwhRcD6/Nvxe2eGbCi
y2co7Nl3y3jlbzrDJfsXHp44lPnZ4k9thvMVufCSpCrmAk8yU5UZr2V6yZ+r
uKzx9N3C9i0i3kyJO3NMzx5WUsAq5wvzzoNEb7Xo9dnByAxnbxqW+8gdq7yX
IR+UpEHyxflm89TFKc35sTxsWOafcqARRR9zlJD1cOWLd7dfm9vMqpYrBX+a
MxlB+4l6jucEXFyRPEIsyCwPkyvlFjMFVswkF1zhHFnybuJMPa7+5Sh7c/uL
dFN9rwPm9+0vC2WPqDhBWlk22EtvSi199ps9iXnRdbvbFTvdiWzCv3V33D81
u1o3u/t6u7+tm8PnVbt78Jt97brjp+tNXZOe1rLbfXXjNquH5w5P7074yGpd
49dqu/ty1bAHfxeftwJPamt2yfBA4fZwf73ZNydpEO+ehQi2wgh2D7j07pFQ
tq10Vt08NvvGb+rtZXts50OEFf47bK/w7+t2dwvR3ljp19le4xePnWDNvqwb
Irzq9SUk/7w93F5v2btDNsORlMHatyQo7HnSMR6xa+YumQfd1t1ji/l1h22N
X68J7uPpx9vDJ9xiXTdE5x0usELdCfKC3G5Uc6xtd3iw7fGGPUwNeVyri69Y
fs0K+nK6s0JHE7jYnd8e1nV3wOpBRxrS1hSb/ji9mYGoWqwM/o95dwQq7MmZ
iq5hD/kh6hYr0Z4+1R3RcMdOkFfb/c2JPehkmglcgfC9h0cMed0d7p63qzse
lIxb7aG9EB9V6tCuN3Xz1K4wqt3+1Owu2Ye/3kCvbogb+z3+7w/Zf4/44+X0
9H393LCrSuiNtzVZZ+wcwip0O6Fn1FiBmirXEgVH3BkBhTuyK+5IzoBYE48e
f4LoPWkb0J3rthaOGy5zUK/Ldid8Dn5MSVNeTSAfFhSDJzmuPeyhP7dkaVxv
95+umz1Bfg/C+1PkchGW0DyJbPYd6Vf4e/fMj0KEEPkWsrnDZC+g7AQ67t12
daTtnM59XaKxag9pk1sByQtZcI9bp+uWsoBoYZrQ7M5iYqY7kBF4e0Xxdnvp
dWt2NxZPx6UY4InoxNtVe/p81db1aXvAqHafYWb3pGtAHfH01d7DBN2CDRl/
JVxhUS/c5gbKfYdfwyXBBDvoywaTavAz/PzEU7OJxCMlgJCOjr2UB4ErQNGv
yS/pTsQkQr2Od8/ytHqviEEjRU36Qg+XK3zkqsV1spowU4xyteUR3+1VxzO3
j7dwCN1Td7hcCxYOi4wBWyIL2sPnGrpxSQPp9mcX9TsiocjkLSgh1GvHXtDP
1OYnWPdqe/hCmcHOPl8JdpLIwH3zKP6EOMDb9Za4UTa3ni6IcbA0Pwx83cq8
oalQNVgyUYFsZiMr8Zmf6w5ixVuh6hFWWD91O5LRIleFvbFPQjPdrck+xCPg
U8XjwSUdyERpbKfYhksfC7sgpyPqDTS3o/ig0GS0beqbU7OH44TxEwgqYEv4
nXZ1hMjZbtrC4909Cw5E6DLXAvVc1eSKwC3zyQ2pELhFg0l0Rhr4jms4RqzM
4agbuvLjjenm/j/M60k6UGssLrGsNU9PbxiPILqa4Evocg09OmbuodAi8Jnt
oaY/aQ9Ef0BsZNztjvhxpMJDQ+9OGzHFT/Bs+0f4Ebijz9CRLwSSaNLlOnp+
RsDLS/wITySc7gizkn5ZT0ew2W/ZiamamuK+8cSj4LaQ3YWC5l62e7bgdlYo
e3C/JGOwSfHwGaP6RKdwBe+P1SHAcG6Y/pqTCE1GIOn2ZOYIobJdkf3zBeJt
r+A/yHUx8CVGaIz4OU10SwbiqSUTCO66sdBnXF+f4BSeRE8ufLej2d08kWcC
5UdUW3PFVt3hM2OuE/IeNFf88OkOIsZEd58IvsTq0YqfNismCZ/WZL50u88Y
VbRkzs428mX3f3S1+3X2wc8QJ9z0et2pNXwP3DgmL6zMlv50RSAhOzC7IwLI
keDGC3ovz1CPzEFD9I8k3Xbs+j58wcTba6I3RSYXT3SIxGliBZ63xCMqaCV5
QAjlMknkL1s8EauHlbuHTKAMivH49orLwpHQFsgwEQowHODcsn3qf91Og71V
8T9u1W/my7OsyvGW4Y2BFqpGX7JdS6YEEdYEV95fkeNC2CnCF2ILcZsIU0eE
cJETcTHQ490erhu/I9BwN+uXeLZ7sQVIBqsA97T6RHeEDKlGqrO9nGmNHQIq
YakEP0bSedZELuK2Vkiml8TUupl3wyTr7vEtpORCa2zUPZGLiE/0gEeEM4G1
0JvDfyJDIsEJeQpUraPXP5CDeeOIM96cUyDEHt+eHk5wElDJDrpzf90wAsJ7
7S4xv85tdoj0ssjQyANuh8iPSWjozHVzZLj6DE+HzBLBo1mlSyjBc1PfCitz
xy72u0ehV7HLHwY/df/rz4E7ftM4o0uTUlEZP/E4d6er0Q0TD3qvisBz1GyR
glNK8SwxXDGmydte5zeZC74xFIbIw70JoghVpQtlhjD0updT+Hw5jWMpL46w
l29Sqizzq8ilqoIfp+CnyfBdsNLP71H99qMeXL7/VJSDcdH1kw5G4elqGsYY
Q0x4io79oAalNVEbNhbsM1ze9wkpGh2L2Bfj4FQYxsL1oRrj0PvB9WURVRGn
GMZQFsS6xb7qw5hezof2lVO9HZw2yhPZEfoSAvKjvARi8djelH6KYzHYSU/G
G2cx6UViQQ3lpNNYaNVjGlH5QSXD15bGaazUOJghxt6EoiqiSaXvx4CR5m5U
BRGHyHeK7OjUkLAWgymq4FIRCownBFcM09Lk97Ncybd79cyEJRv5mp7ve5PY
yOqTctqVRVDRpqoYILbU91pB9kM5DMtb/pHHvoax8nz9zJjC6GHSzhZV5ePE
KWhreqzjOJTBltUYVLJeF4t+pCmkqupLPDSwT3yceIYgZO37qRrLlOJkbRFH
vkhn+OZWyS7cuAird27qR5SSehwKM/IQwjC6yRpjdDEEaLYaKuewglgqKLZy
ge9FLq8c+aKAUZS+MHxHHLqmp+THMpa4gZWGXZOMrkypv5X1z3Aqv7XJj0g8
LjL/mMRT7o98Q+L/xkjLv4jDfEW//NtnfsBnTtUiyr88TZOMF1bhKFqJESKQ
vkFO9gWJ1Cei0lXDDbADmd6yV9MqJNlEw7BE39dPLMwIaGe1xeJ0Lui5n8R8
leckEGp09M0uPjaoaQTcz8Lsy3pLziCSqy2L9P39CrXwXJSittuQxbd6QKpz
p7eotNo9EqkDqgmmgsJrfAXgvHhEPYEqK6JYuyFTHcUKMsMDWfj14/bIkxqQ
t6nOoWB7QgIuCVXN+c/ba5gpykHy7m9QSTTklJMyz50ZJTSVXVSksGz3qJd3
5H3WTqA1qF1VixqPZQCKcwI59+3lZl8bAbdADkiueWbEFTc8WJSRTtMeuSFy
wR0KM8PHHWuVhkTIw4PeHts1skQkmcgKuQOxYpL9wDMkyLd8YmXekIVPAurp
QgtmiaDJi5PsBx33nkljc/zE3SnkpdG3qnmWwx3wRE4MmTKLXN+i2iA5sVF7
NUNrataxLMYgfR43YYSIeOKZGgmFyfpq813GJ4Hsv8N8vs34lC2W453b1Jjo
qUV1dYvygJtlpG3e1gI36p54qAc3L1CMeDJvNqtUo+Z9YurfSRZ9Y5mMY1HN
FnVNAz2CJj8TOyQbPne4BRYWv5KCZMetSG43QU9Y9qxQ/66g7IdLMl+fsJI1
S6OZD8Rs+17ONTnw+IQ7OSui4XkY+/U1STtbSB85/ElOpmBVfrrBrb+shIu/
J2Kn5okol7LNskVhgdLvEFGc3V9vVwTZbq9l8+LAbcg7y9weNQ8+ggkc0hWK
s+tW9lwvLPeTWMjvyHKtuaVkm7nWvWoOHc/H0FvYDvfSSJvHhJWI88B9gYen
F4wob/JukugrjCh3c563hwcn23FU5FvUd+tLFFxP3QkWu+cGak1svmlqlmVH
C2uHnZBgBDOEVQvw9pBWrdDFVmSL8QQX7hlyI6w5cHemVs0p+s3ulvsg1Myn
5oSq+/QZtgUHcGhQfXMjRIpWwvo7ioqHe3CXG/Pm9ja92Fb21rrvkUcfpUDb
ko8EKUPyNZRtD7053DzCZzyRAwyLXsFOamjrdQPr7mCG0OCnGUXFYxYe5q0n
GjYqW24nqfaS+4ZwTTwABeZWm83+dgV5aClguVmKP3Jkye4OMrqZt/dxCXc5
jzy8oEGpfFQNzw7BIsO6YYawVh6cIoiuW/l+Aot+4oi6HWSzFxLtdkf1gZ84
3Gjoxwla6zaiXp8xARTqcIodNw4V3Nf+5pF7srgJJ7TmMUDiT3juQQt3xCNX
MNhjh7uvUZxiYlha7oxvdvdY0LXYVbsi0BZRQE4LOpq2lg0fuB7uoxmeldEd
YQvLLtV3+ab/D0V+kPTtvQIA

-->

</rfc>
