<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.2.3) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC4648 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml">
<!ENTITY RFC7942 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml">
]>


<rfc ipr="trust200902" docName="draft-sander-open-tabs-passkey-00" category="info" submissionType="independent">
  <front>
    <title abbrev="Open Tabs Passkey">The Open Tabs Standard: Passkey-Rooted Delegated Signers for Non-Custodial Payment Channels on Solana</title>

    <author initials="N." surname="Sander" fullname="Nicholas Sander">
      <organization>Independent</organization>
      <address>
        <email>branch@dexter.cash</email>
      </address>
    </author>

    <date year="2026" month="June" day="20"/>

    
    
    

    <abstract>


<?line 39?>

<t>This document specifies the passkey-rooted delegated-signer authorization
model of the Open Tabs Standard (OTS), a non-custodial payment-channel
scheme on Solana. It uses Solana's native <spanx style="verb">secp256r1</spanx> signature
verification precompile (<xref target="SIMD-0075"/>) to authorize voucher signers via
WebAuthn passkeys (<xref target="WEBAUTHN"/>).</t>

<t>The model is interoperable with the Solana Session Intent
(<xref target="draft-solana-session-00"/>), with which it shares the channel and
voucher primitives. For a passkey-authorized signer it defines a distinct
<spanx style="verb">signatureType</spanx> value, an exact signed message format, an exact Solana
verification program, and a binding between the delegated signer and the
channel's PDA derivation.</t>

<t>A reference implementation is live on Solana mainnet. The
<spanx style="verb">dexter-vault</spanx> program (account
<spanx style="verb">Hg3wRaydFtJhYrdvYrKECacpJYDsC9Px7yKmpncj2fhc</spanx>) verifies secp256r1
signatures over a fixed canonical message via the SIMD-0075 precompile,
records the active session key on the vault account, and exposes a
read-only <spanx style="verb">prove_passkey</spanx> instruction for off-chain liveness attestation.
A live reference vault (account
<spanx style="verb">7FE9VUeabi3sF8wUABV7F3eyvEi1ekDbER9k5JBYrWAi</spanx>) demonstrates the full
lifecycle on Solana mainnet.</t>



    </abstract>



  </front>

  <middle>


<?line 64?>

<section anchor="introduction"><name>Introduction</name>

<section anchor="background"><name>Background</name>

<t>This document specifies the <spanx style="verb">secp256r1</spanx>-passkey delegated-signer
authorization model of the Open Tabs Standard (OTS). OTS is a
non-custodial payment-channel scheme whose on-chain channel primitive and
off-chain voucher format are shared with, and interoperable with, the
Solana Session Intent (<xref target="draft-solana-session-00"/>). For a passkey-rooted
signer, this document defines four things: a distinct <spanx style="verb">signatureType</spanx>
value, an exact signed message format, the exact Solana verification
program used on-chain, and the binding between the delegated signer and
the channel PDA derivation.</t>

</section>
<section anchor="why-passkey-rooted-delegation"><name>Why passkey-rooted delegation</name>

<t>A passkey (<xref target="WEBAUTHN"/>) holds a <spanx style="verb">secp256r1</spanx> keypair on a user's device,
authorized by a biometric or PIN gesture. Solana's SIMD-0075 precompile
verifies these signatures natively. Together they permit a delegation
model in which no service operator holds a key that can move user funds:
the user holds the credential, the credential authorizes a session key
within bounds the on-chain program enforces, and the session key (not
the credential) signs vouchers.</t>

<t>The authority boundary under this extension is the verifying program,
not the credential. A compromised passkey authorizes at most what the
program permits (a fixed cap, a specific counterparty, an expiry
window), and raising those bounds requires a fresh credential ceremony.
Implementations that treat the passkey as the sole security boundary do
not conform to this specification.</t>

</section>
<section anchor="terminology"><name>Terminology</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
<xref target="RFC2119"/> and <xref target="RFC8174"/>.</t>

<t><strong>Passkey.</strong> A WebAuthn credential as defined by <xref target="WEBAUTHN"/>, whose
public key is a <spanx style="verb">secp256r1</spanx> (NIST P-256) point.</t>

<t><strong>Compressed pubkey form.</strong> The 33-byte SEC1 compressed encoding
(<xref target="SEC1"/>) of an elliptic curve point: a 1-byte prefix (<spanx style="verb">0x02</spanx> or
<spanx style="verb">0x03</spanx>) followed by the 32-byte X coordinate.</t>

<t><strong>Vault account.</strong> A program-owned account that records the passkey's
33-byte compressed public key, the active session key (if any), and the
active scope parameters. The vault account is the on-chain anchor of the
authority relationship.</t>

<t><strong>Authority program.</strong> The Solana program that owns the vault account
and enforces the on-chain rules. This document uses <spanx style="verb">dexter-vault</spanx> as
the reference implementation but does not require any specific program
identity for conforming implementations.</t>

<t><strong>Session key.</strong> An Ed25519 keypair the client holds, authorized by the
passkey to sign vouchers within scope. The session key's public key
is the <spanx style="verb">authorizedSigner</spanx> recorded in the session intent's channel
state.</t>

<t><strong>Scope.</strong> The on-chain parameters that bound what the session key may
authorize: spending cap (<spanx style="verb">max_amount</spanx>), allowed counterparty
(<spanx style="verb">allowed_counterparty</spanx>), expiry timestamp (<spanx style="verb">expires_at</spanx>).</t>

</section>
</section>
<section anchor="extension-identification"><name>Extension Identification</name>

<t>Implementations of this extension MUST set the voucher's <spanx style="verb">signatureType</spanx>
field to:</t>

<figure><artwork><![CDATA[
passkey-p256-session-v1
]]></artwork></figure>

<t>This value is distinct from the base specification's <spanx style="verb">ed25519</spanx> value and
MUST NOT be used by implementations that have not implemented this
extension's verification flow.</t>

<t>The trailing <spanx style="verb">-v1</spanx> permits future revisions of this extension to use a
distinct <spanx style="verb">signatureType</spanx> value if the wire format changes
incompatibly.</t>

</section>
<section anchor="channel-open-with-passkey-authority"><name>Channel Open with Passkey Authority</name>

<section anchor="authorizedsigner-field"><name>authorizedSigner field</name>

<t>Per the base specification, the channel state's <spanx style="verb">authorizedSigner</spanx> field
records the public key that signs vouchers. Under this extension,
<spanx style="verb">authorizedSigner</spanx> is the Ed25519 public key of the session key, NOT the
passkey itself. The passkey authorizes the session key; the session key
signs vouchers. The verifier checks each voucher's signature against the
session key.</t>

<t>This indirection is intentional. The session key signs many vouchers
per second without user interaction; the passkey performs a single
biometric gesture per session.</t>

</section>
<section anchor="vault-account-binding"><name>Vault account binding</name>

<t>The channel's PDA derivation, as defined by the base specification,
binds the channel to <spanx style="verb">authorizedSigner</spanx>. Under this extension,
<spanx style="verb">authorizedSigner</spanx> is the session key. The session key, in turn, is
bound to the passkey via the vault account.</t>

<t>A conforming implementation MUST ensure that:</t>

<t><list style="numbers" type="1">
  <t>The vault account is initialized before any channel <spanx style="verb">open</spanx>
transaction that uses an <spanx style="verb">authorizedSigner</spanx> derived from a passkey
session.</t>
  <t>The session key recorded in the vault account's active session field
matches the <spanx style="verb">authorizedSigner</spanx> field in the channel state at open
time.</t>
  <t>The vault account's owner is the conforming authority program.</t>
</list></t>

<t>A verifier MUST NOT accept a voucher unless all three conditions hold
for the channel and vault at the time of verification.</t>

</section>
<section anchor="vault-address-derivation"><name>Vault address derivation</name>

<t>The vault account address is a Solana Program-Derived Address (PDA)
derived from operator-defined identity bytes, NOT directly from the
passkey public key. The reference implementation uses the following
seed schema, which conforming implementations SHOULD adopt:</t>

<figure><artwork><![CDATA[
seeds      = [b"vault", identity_claim[0..16]]
program_id = authority_program
]]></artwork></figure>

<t>Where <spanx style="verb">identity_claim</spanx> is a 32-byte opaque value supplied at vault
initialization. The authority program does not interpret these bytes;
they are operator-defined. The reference implementation writes a
Supabase UUID into the first 16 bytes and zeros the remaining 16. Other
operators MAY use any 16-byte identifier suitable to their identity
substrate.</t>

<t>The vault account stores the passkey's 33-byte compressed pubkey in its
state. The PDA address does not depend on the passkey. This separation
permits passkey rotation (replacing the stored pubkey with a fresh one)
without changing the vault address. The existing balance, custody
binding, and identity claim remain stable across credential rotation.</t>

<t>Conforming implementations that use a different seed schema MUST
document it in implementation notes so verifiers and clients can
independently recompute the address.</t>

</section>
</section>
<section anchor="register-session-key-message-format"><name>Register Session Key Message Format</name>

<section anchor="wire-format"><name>Wire format</name>

<t>To authorize a session key, the client constructs a fixed 180-byte
registration message, signs it with the passkey via WebAuthn, and
submits the signature and message to the authority program.</t>

<t>The registration message is laid out as follows. All multi-byte integers
are little-endian.</t>

<texttable>
      <ttcol align='left'>Offset</ttcol>
      <ttcol align='left'>Length</ttcol>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Encoding</ttcol>
      <c>0</c>
      <c>32</c>
      <c><spanx style="verb">domain</spanx></c>
      <c>ASCII <spanx style="verb">"OTS_SESSION_REGISTER_V1"</spanx> (23 bytes) padded with 9 zero bytes</c>
      <c>32</c>
      <c>32</c>
      <c><spanx style="verb">program_id</spanx></c>
      <c>Authority program ID (raw Solana address bytes)</c>
      <c>64</c>
      <c>32</c>
      <c><spanx style="verb">vault_pda</spanx></c>
      <c>Vault PDA address (raw)</c>
      <c>96</c>
      <c>32</c>
      <c><spanx style="verb">session_pubkey</spanx></c>
      <c>Session key Ed25519 public key (raw)</c>
      <c>128</c>
      <c>8</c>
      <c><spanx style="verb">max_amount</spanx></c>
      <c>u64 LE; cumulative spending cap in token base units; MUST be &gt; 0</c>
      <c>136</c>
      <c>8</c>
      <c><spanx style="verb">expires_at</spanx></c>
      <c>i64 LE; Unix timestamp in seconds; MUST be strictly greater than current on-chain time</c>
      <c>144</c>
      <c>32</c>
      <c><spanx style="verb">allowed_counterparty</spanx></c>
      <c>Recipient public key (raw); zero MAY be permitted only if implementation supports an unbounded counterparty (the reference implementation does not)</c>
      <c>176</c>
      <c>4</c>
      <c><spanx style="verb">nonce</spanx></c>
      <c>u32 LE; per-session value chosen by the client</c>
</texttable>

<t>Total: 180 bytes.</t>

<t>The <spanx style="verb">domain</spanx> field's hex representation is:</t>

<figure><artwork><![CDATA[
4f54535f53455353494f4e5f52454749535445525f5631000000000000000000
]]></artwork></figure>

<t>(That is the ASCII bytes of <spanx style="verb">OTS_SESSION_REGISTER_V1</spanx> followed by 9 NUL
bytes.) The 23-byte label distinguishes this message from other
operations the same passkey might sign. Conforming implementations MUST
use this exact 32-byte sequence.</t>

<t>The combination of <spanx style="verb">program_id</spanx>, <spanx style="verb">vault_pda</spanx>, <spanx style="verb">session_pubkey</spanx>,
<spanx style="verb">expires_at</spanx>, and <spanx style="verb">nonce</spanx> makes the message uniquely identifying across
all program deployments, all vaults, all sessions, and all time.</t>

</section>
<section anchor="passkey-signing-ceremony"><name>Passkey signing ceremony</name>

<t>The client signs the registration message using the passkey via the
WebAuthn assertion ceremony:</t>

<t><list style="numbers" type="1">
  <t>The relying party (the authority program's client SDK) constructs the
180-byte registration message above.</t>
  <t>The client computes <spanx style="verb">challenge = sha256(registration_message)</spanx> and
passes it as the WebAuthn <spanx style="verb">challenge</spanx> parameter for
<spanx style="verb">navigator.credentials.get()</spanx>.</t>
  <t>The user authorizes the gesture (biometric, PIN, or hardware-key
touch).</t>
  <t>The browser returns the WebAuthn assertion, containing
<spanx style="verb">authenticatorData</spanx>, <spanx style="verb">clientDataJSON</spanx>, and the <spanx style="verb">signature</spanx>.</t>
  <t>The client submits all three plus the registration arguments to the
authority program's <spanx style="verb">register_session_key</spanx> instruction, preceded by a
SIMD-0075 <spanx style="verb">secp256r1_verify</spanx> instruction in the same transaction
covering the WebAuthn signed payload.</t>
</list></t>

</section>
<section anchor="simd-0075-signed-payload"><name>SIMD-0075 signed payload</name>

<t>Per the WebAuthn specification, the authenticator signs:</t>

<figure><artwork><![CDATA[
signed_payload = authenticator_data || sha256(client_data_json)
]]></artwork></figure>

<t>This is the payload the client submits to the SIMD-0075 precompile
along with the 33-byte compressed pubkey and the signature.</t>

<t>The authority program verifies the precompile result by:</t>

<t><list style="numbers" type="1">
  <t>Reading the previous instruction from the instructions sysvar.</t>
  <t>Asserting that the previous instruction's program ID is
<spanx style="verb">Secp256r1SigVerify1111111111111111111111111</spanx>.</t>
  <t>Parsing the precompile's instruction data (offset structure defined
by <xref target="SIMD-0075"/>) to extract the verified message bytes and pubkey
bytes.</t>
  <t>Asserting the pubkey bytes equal the 33-byte
<spanx style="verb">passkey_pubkey</spanx> stored on the vault.</t>
  <t>Asserting the message bytes equal
<spanx style="verb">authenticator_data || sha256(client_data_json)</spanx> computed from the
instruction arguments.</t>
</list></t>

<t>The authority program then parses <spanx style="verb">client_data_json</spanx> to extract the
<spanx style="verb">challenge</spanx> field. The value MUST be base64url-encoded per <xref target="RFC4648"/>
Section 5 without padding. The program base64url-decodes it and asserts:</t>

<figure><artwork><![CDATA[
decoded_challenge == sha256(registration_message)
]]></artwork></figure>

<t>If any check fails, the program MUST reject the transaction.</t>

<t>The <spanx style="verb">clientDataJSON</spanx> parser MAY be a minimal-footprint scanner that
locates the <spanx style="verb">"challenge":"&lt;value&gt;"</spanx> field; the WebAuthn specification
guarantees the challenge is base64url-encoded and therefore contains
only <spanx style="verb">[A-Za-z0-9_-]</spanx> characters, so the parser does not need to handle
JSON-escape sequences inside the value.</t>

</section>
<section anchor="application-layer-challenge-binding-informative"><name>Application-layer challenge binding (informative)</name>

<t>Implementations that wish to bind the registration to an application
layer challenge (for example, to satisfy a single-sign-on flow that
issues a server-side nonce, as discussed in <xref target="TIP-1053"/> for a different
substrate) MAY encode such a challenge into <spanx style="verb">identity_claim</spanx> or
<spanx style="verb">allowed_counterparty</spanx>. The protocol does not interpret these fields
beyond what is specified in Section 5; an off-chain verifier that
needs challenge-binding can recover and check it from the same wire
bytes the program signed.</t>

<t>This extension does not include a separate <spanx style="verb">witness</spanx> field in v1. A
future revision MAY add one if implementer demand emerges.</t>

</section>
</section>
<section anchor="on-chain-verification-program"><name>On-Chain Verification Program</name>

<section anchor="required-instructions"><name>Required instructions</name>

<t>A conforming authority program MUST implement at minimum the following
instructions. Instruction names are guidance; conforming implementations
MAY use different names provided the semantics are preserved.</t>

<texttable>
      <ttcol align='left'>Instruction</ttcol>
      <ttcol align='left'>Purpose</ttcol>
      <c><spanx style="verb">initialize_vault</spanx></c>
      <c>Initialize a vault PDA, recording the passkey's 33-byte compressed pubkey, the bound session authority key, the operator's identity claim, and any withdrawal cooling-off parameters.</c>
      <c><spanx style="verb">register_session_key</spanx></c>
      <c>Authorize a session key with scope, gated by a passkey signature over the 180-byte registration message defined in Section 4.</c>
      <c><spanx style="verb">revoke_session_key</spanx></c>
      <c>Revoke the active session key, gated by a passkey signature over a 128-byte revocation message (Section 5.2).</c>
      <c><spanx style="verb">prove_passkey</spanx></c>
      <c>Verify a passkey signature over an arbitrary 32-byte challenge for off-chain liveness attestation. Read-only; mutates no state.</c>
</texttable>

<t>The reference implementation provides additional instructions for
withdrawal flow, custody binding, and authority rotation. Those are out
of scope for this extension specification but documented in Section 8.</t>

</section>
<section anchor="revocation-message-format"><name>Revocation message format</name>

<t>To revoke the active session key, the client signs a 128-byte
revocation message:</t>

<texttable>
      <ttcol align='left'>Offset</ttcol>
      <ttcol align='left'>Length</ttcol>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Encoding</ttcol>
      <c>0</c>
      <c>32</c>
      <c><spanx style="verb">domain</spanx></c>
      <c>ASCII <spanx style="verb">"OTS_SESSION_REVOKE_V1"</spanx> (21 bytes) padded with 11 zero bytes</c>
      <c>32</c>
      <c>32</c>
      <c><spanx style="verb">program_id</spanx></c>
      <c>Authority program ID</c>
      <c>64</c>
      <c>32</c>
      <c><spanx style="verb">vault_pda</spanx></c>
      <c>Vault PDA</c>
      <c>96</c>
      <c>32</c>
      <c><spanx style="verb">session_pubkey</spanx></c>
      <c>The session pubkey currently recorded on the vault</c>
</texttable>

<t>Total: 128 bytes.</t>

<t>The <spanx style="verb">domain</spanx> field's hex representation is:</t>

<figure><artwork><![CDATA[
4f54535f53455353494f4e5f5245564f4b455f56310000000000000000000000
]]></artwork></figure>

<t>The revocation domain separator is distinct from the registration
domain separator so a registration signature cannot be reinterpreted as
a revocation or vice versa.</t>

<t>The signing ceremony and verification flow are identical to the
registration flow (Sections 4.2 and 4.3) except for the message bytes
themselves.</t>

</section>
<section anchor="provepasskey-for-off-chain-liveness"><name>prove_passkey for off-chain liveness</name>

<t>The <spanx style="verb">prove_passkey</spanx> instruction verifies that the holder of the passkey
can produce a fresh signature over an application challenge. It does not
mutate state. Verifiers MAY use <spanx style="verb">prove_passkey</spanx> via
<spanx style="verb">simulateTransaction</spanx> RPC calls to confirm liveness without consuming
compute units or paying fees.</t>

<t>The signed operation message is:</t>

<figure><artwork><![CDATA[
op_msg = b"siwx_login" || challenge
]]></artwork></figure>

<t>Where <spanx style="verb">challenge</spanx> is a 32-byte value supplied by the off-chain verifier
(for example, a server-issued login nonce). The literal <spanx style="verb">siwx_login</spanx> is
the domain prefix for this operation; conforming implementations MUST
use this exact ASCII string.</t>

<t>This instruction is the canonical mechanism for application-level
authentication in flows that do not register a new session key.</t>

</section>
<section anchor="simd-0075-precompile"><name>SIMD-0075 precompile</name>

<t>All passkey signature verification under this extension MUST flow
through the <spanx style="verb">Secp256r1SigVerify1111111111111111111111111</spanx> precompile
(<xref target="SIMD-0075"/>). Implementations MUST NOT verify secp256r1 signatures
through alternative means (for example, in-program ECDSA verification).
The precompile's verification semantics are normative for this
extension.</t>

</section>
</section>
<section anchor="voucher-format-compatibility"><name>Voucher Format Compatibility</name>

<t>This extension does NOT modify the voucher format defined in the base
specification (<xref target="draft-solana-session-00"/>). The 48-byte fixed Borsh
layout (<spanx style="verb">channelId</spanx>, <spanx style="verb">cumulativeAmount</spanx>, <spanx style="verb">expiresAt</spanx>) remains
canonical, and <spanx style="verb">signature</spanx> remains a base58-encoded Ed25519 signature.</t>

<t>A voucher signed under this extension is signed with the session key
(Ed25519), not the passkey. The <spanx style="verb">signatureType</spanx> field distinguishes
channels that use this extension (<spanx style="verb">passkey-p256-session-v1</spanx>) from
channels using the default Ed25519 authority (<spanx style="verb">ed25519</spanx>).</t>

<t>A seller verifying a voucher under this extension MUST:</t>

<t><list style="numbers" type="1">
  <t>Parse the voucher and signature as defined in the base specification.</t>
  <t>Verify the Ed25519 signature against the session key recorded as the
channel's <spanx style="verb">authorizedSigner</spanx>.</t>
  <t>Independently verify, via on-chain account read, that:
  <list style="symbols">
      <t>The session key recorded on the vault's active session field
equals the voucher's signer pubkey.</t>
      <t>The active session's <spanx style="verb">expires_at</spanx> is strictly greater than the
current Unix time.</t>
      <t>The active session's <spanx style="verb">max_amount</spanx> is greater than or equal to the
voucher's <spanx style="verb">cumulativeAmount</spanx>.</t>
      <t>The active session's <spanx style="verb">allowed_counterparty</spanx> equals the seller's
receiving address for this channel.</t>
    </list></t>
</list></t>

<t>The third check is what enforces the security boundary. The session-key
signature is necessary but not sufficient; the on-chain scope is
authoritative.</t>

</section>
<section anchor="off-chain-verifier-flow"><name>Off-Chain Verifier Flow</name>

<section anchor="voucher-verification-sequence"><name>Voucher verification sequence</name>

<t>A seller (verifier) receives a voucher from a buyer (payer). The
verifier's sequence is:</t>

<t><list style="numbers" type="1">
  <t>Parse the HTTP request and extract the voucher object.</t>
  <t>Confirm <spanx style="verb">signatureType == "passkey-p256-session-v1"</spanx>. If not, this
extension does not apply; fall back to the base specification or
reject.</t>
  <t>Verify the Ed25519 signature on the voucher against the <spanx style="verb">signer</spanx>
field.</t>
  <t>Resolve the channel state from the on-chain channel PDA. Read
<spanx style="verb">authorizedSigner</spanx> and assert it equals the voucher's <spanx style="verb">signer</spanx>.</t>
  <t>Resolve the vault state by deserializing the vault account (the
account layout is defined by the authority program). Confirm that
the vault's active session matches the constraints listed in
Section 6.</t>
  <t>If all checks pass, accept the voucher.</t>
</list></t>

<t>Verifiers SHOULD cache the vault state for short intervals (on the
order of a few seconds) to amortize RPC reads across many vouchers from
the same channel, evicting the cache entry when the active session's
expiry approaches.</t>

</section>
<section anchor="liveness-for-application-authentication"><name>Liveness for application authentication</name>

<t>For flows that authenticate a user to an application without opening a
payment channel (for example, single sign-on or session bootstrapping),
the verifier issues a 32-byte random challenge, the client signs
<spanx style="verb">b"siwx_login" || challenge</spanx> with the passkey via WebAuthn, and the
verifier confirms by submitting a <spanx style="verb">prove_passkey</spanx> instruction to the
authority program via <spanx style="verb">simulateTransaction</spanx>. The transaction is never
broadcast; the simulation result attests liveness.</t>

<t>This permits "passkey once, web2 session thereafter" UX without coupling
authentication to payment-channel state.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="the-passkey-is-not-a-hardware-wallet"><name>The passkey is not a hardware wallet</name>

<t>Phone-resident passkeys, particularly those synced through device
manufacturer keychains, may store and operate key material in ways that
do not match the security guarantees of dedicated hardware wallets.
Implementations of this extension MUST NOT treat the passkey as the
sole security boundary for the funds the vault controls.</t>

<t>The security boundary is the authority program. The passkey authorizes
within bounds the program enforces. Compromise of the passkey limits an
attacker to actions permitted by the active session's scope. Raising the
scope requires a fresh credential ceremony, which an attacker can perform
only if they retain the passkey at the time of the new ceremony. The
user can close that window by re-enrolling on a fresh credential.</t>

<t>Hardware-grade authenticators (for example, FIDO2 security keys with
non-exportable keys) MAY be used as passkeys under this extension with
no protocol change. The signature scheme is the same; only the storage
of the credential differs.</t>

</section>
<section anchor="replay-protection"><name>Replay protection</name>

<t>Within a single vault, the program enforces at most one active session
at a time. A registration whose message specifies a session whose
expiry has not yet passed is rejected if any unexpired session already
exists. An expired session is silently overwritten.</t>

<t>The 180-byte registration message embeds <spanx style="verb">program_id</spanx>, <spanx style="verb">vault_pda</spanx>,
<spanx style="verb">session_pubkey</spanx>, <spanx style="verb">expires_at</spanx>, and <spanx style="verb">nonce</spanx>. A signature over this
message cannot be replayed against a different program, vault, session,
or moment in time. The <spanx style="verb">nonce</spanx> field is operator-controlled and not
enforced for monotonicity by the program; clients SHOULD generate it
fresh per session to prevent confusing collisions across their own
sessions.</t>

<t>Voucher replay is bounded by the base specification's monotonic
cumulative-amount semantics: a voucher with cumulative amount N is
useless once a voucher with cumulative amount M &gt; N has been accepted
for the same channel.</t>

</section>
<section anchor="session-key-compromise"><name>Session key compromise</name>

<t>A compromised session key authorizes spending up to the current
session's cap, against the specific counterparty, before the specific
expiry. Implementations SHOULD set conservative caps and short expiries
by default. Implementations MUST provide a <spanx style="verb">revoke_session_key</spanx> path
callable by the passkey holder without requiring the compromised
session key to participate.</t>

</section>
<section anchor="program-upgrade-authority"><name>Program upgrade authority</name>

<t>If the authority program is upgradeable, the program's upgrade authority
is itself a trust assumption beyond the passkey. A malicious or
compromised upgrade authority could deploy a modified program that
bypasses signature verification or relaxes scope enforcement.
Implementations SHOULD document the upgrade authority and its
governance. Reference implementations are encouraged to burn the upgrade
authority once the program is considered stable.</t>

</section>
<section anchor="clientdatajson-parsing"><name>clientDataJSON parsing</name>

<t>The reference implementation parses <spanx style="verb">clientDataJSON</spanx> with a
minimal-footprint scanner that does not handle JSON-escape sequences.
This is sound because the WebAuthn specification guarantees the
<spanx style="verb">challenge</spanx> field's value is base64url-encoded and therefore contains
only <spanx style="verb">[A-Za-z0-9_-]</spanx> characters. Conforming implementations that use
full JSON parsing MUST handle escape sequences safely; implementations
that scan MUST verify the assumption holds for the operating
environment. A non-conforming relying party that emits non-base64url
challenges would otherwise mis-parse.</t>

</section>
<section anchor="origin-pinning-relying-party-responsibility"><name>Origin pinning (relying-party responsibility)</name>

<t>The authority program verifies the WebAuthn challenge binding but does
NOT inspect the <spanx style="verb">origin</spanx> field of <spanx style="verb">clientDataJSON</spanx>. Origin pinning is
the relying party's responsibility and is enforced by the browser's
WebAuthn API based on the registered credential's relying party ID.
Verifiers operating outside a browser context (server-side
verification, native applications) MUST themselves verify that
<spanx style="verb">clientDataJSON.origin</spanx> matches an expected value.</t>

</section>
</section>
<section anchor="backward-compatibility"><name>Backward Compatibility</name>

<t>This extension is additive to the base specification. Channels opened
under the default Ed25519 authority continue to operate without
modification.</t>

<t>A channel opened under this extension is distinguished by its
<spanx style="verb">signatureType</spanx> value. Verifiers that do not implement this extension
will reject vouchers with
<spanx style="verb">signatureType == "passkey-p256-session-v1"</spanx>, which is the correct
fail-safe.</t>

<t>The 180-byte registration message format and 128-byte revocation message
format defined in this document are version <spanx style="verb">v1</spanx>. Future revisions of
this extension that change either layout MUST use a distinct
<spanx style="verb">signatureType</spanx> value (for example,
<spanx style="verb">passkey-p256-session-v2</spanx>) and a distinct domain separator (for example,
<spanx style="verb">OTS_SESSION_REGISTER_V2</spanx>).</t>

</section>
<section anchor="implementation-status"><name>Implementation Status</name>

<t>This section records the status of known implementations of the
protocol defined by this specification at the time of publication, per
the guidance of <xref target="RFC7942"/>. Inclusion in this section does not imply
endorsement by the IETF. The information is provided to assist readers
in evaluating maturity and interoperability.</t>

<section anchor="reference-implementation-on-solana-mainnet"><name>Reference implementation on Solana mainnet</name>

<t>A reference implementation is live on Solana mainnet.</t>

<t><list style="symbols">
  <t><strong>Authority program</strong>:
<spanx style="verb">Hg3wRaydFtJhYrdvYrKECacpJYDsC9Px7yKmpncj2fhc</spanx></t>
  <t><strong>Reference vault account</strong>:
<spanx style="verb">7FE9VUeabi3sF8wUABV7F3eyvEi1ekDbER9k5JBYrWAi</spanx></t>
  <t><strong>Implementer</strong>: independent</t>
  <t><strong>License</strong>: open source (see source repository)</t>
  <t><strong>Coverage</strong>: All four required instructions defined in Section 5.1
(<spanx style="verb">initialize_vault</spanx>, <spanx style="verb">register_session_key</spanx>, <spanx style="verb">revoke_session_key</spanx>,
<spanx style="verb">prove_passkey</spanx>) plus the additional instructions enumerated in
Section 11.</t>
  <t><strong>Maturity</strong>: deployed on mainnet; byte-parity between the deployed
program and its source build is reproducible via the procedure in the
Reference Implementation section.</t>
  <t><strong>Interop</strong>: an end-to-end voucher settlement transaction on Solana
mainnet, exercising the full register-session, voucher-sign, and
on-chain-settle path through the reference implementation, is recorded
at the mainnet transaction signature listed in the Reference
Implementation section.</t>
</list></t>

</section>
<section anchor="canonical-client-implementation"><name>Canonical client implementation</name>

<t>An off-chain TypeScript implementation of the byte-precise message
encoders, instruction builders, account decoders, and secp256r1
precompile helpers required by this specification is published as the
<spanx style="verb">@dexterai/vault</spanx> npm package.</t>

<t><list style="symbols">
  <t><strong>Distribution</strong>: npm registry, package <spanx style="verb">@dexterai/vault</spanx></t>
  <t><strong>Version</strong>: <spanx style="verb">0.11.0</spanx></t>
  <t><strong>Source repository</strong>: <spanx style="verb">https://github.com/Dexter-DAO/dexter-vault-sdk</spanx></t>
  <t><strong>Coverage</strong>: the 180-byte registration message (Section 4.1), the
128-byte revocation message (Section 5.2), the <spanx style="verb">siwx_login</spanx> operation
message (Section 5.3), the on-chain instructions relevant to this
extension exposed by the reference authority program, the secp256r1
precompile instruction builder, and the WebAuthn
<spanx style="verb">authenticatorData || sha256(clientDataJSON)</spanx> precompile-message
assembly.</t>
  <t><strong>Maturity</strong>: in production use; tested against the live reference
implementation.</t>
</list></t>

</section>
<section anchor="conformance-tests"><name>Conformance tests</name>

<t>The byte-parity test suite at <spanx style="verb">tests/byte-parity.test.ts</spanx> in the
<spanx style="verb">@dexterai/vault</spanx> source repository is the canonical conformance test
for off-chain implementations of this specification. The suite locks
each domain separator, each instruction discriminator, and the
serialized bytes of the 180-byte registration message, the 128-byte
revocation message, and the 44-byte voucher payload against snapshot
fixtures.</t>

<t>A conforming off-chain implementation MUST produce the same bytes as
this suite for the same inputs.</t>

<t>The conformance test file in <spanx style="verb">@dexterai/vault</spanx> version <spanx style="verb">0.11.0</spanx> has
SHA-256:</t>

<figure><artwork><![CDATA[
f7fc48da373069eb209ac3366046cbc5540c17450ce76ca7870aa2ee9adeb8d0
]]></artwork></figure>

<t>This hash is a point-in-time snapshot of the suite at the named
<spanx style="verb">@dexterai/vault</spanx> version; it changes when the suite changes, so
implementers re-run <spanx style="verb">sha256sum tests/byte-parity.test.ts</spanx> against the
version they target.</t>

<t>Subsequent revisions of the suite that change snapshots without
incrementing this document's <spanx style="verb">signatureType</spanx> value would constitute a
specification break and SHOULD be rejected by implementers.</t>

</section>
</section>
<section anchor="reference-implementation"><name>Reference Implementation</name>

<t>The <spanx style="verb">dexter-vault</spanx> Solana program is the reference implementation of
this extension. Source:</t>

<t><list style="symbols">
  <t>Authority program: <spanx style="verb">https://github.com/Dexter-DAO/dexter-vault</spanx></t>
  <t>Client SDK: <spanx style="verb">https://github.com/Dexter-DAO/dexter-x402-sdk</spanx></t>
  <t>MCP server: <spanx style="verb">https://github.com/Dexter-DAO/dexter-mcp</spanx></t>
</list></t>

<t>Deployed instances on Solana mainnet:</t>

<t><list style="symbols">
  <t>Authority program ID:
<spanx style="verb">Hg3wRaydFtJhYrdvYrKECacpJYDsC9Px7yKmpncj2fhc</spanx></t>
  <t>Reference vault account:
<spanx style="verb">7FE9VUeabi3sF8wUABV7F3eyvEi1ekDbER9k5JBYrWAi</spanx></t>
</list></t>

<t>An end-to-end voucher settlement transaction on Solana mainnet,
exercising the full register-session, voucher-sign, and on-chain-settle
path through the reference implementation, is recorded at the following
mainnet transaction signature:</t>

<figure><artwork><![CDATA[
3hqDvf3b8ZwZNGmtZAQXsdh5ejGwuuUrNt7Rv2PfuSs1aqKJdC3cxviKgVcd8tawtGB1F79XYjwcx2Re2nSb8oqR
]]></artwork></figure>

<t>The reference implementation includes additional instructions beyond
the minimum required by this extension: <spanx style="verb">set_swig</spanx> (one-time binding of
a Solana smart wallet to the vault), <spanx style="verb">request_withdrawal</spanx> /
<spanx style="verb">finalize_withdrawal</spanx> (gated buyer withdrawal flow), <spanx style="verb">force_release</spanx>
(stuck-voucher recovery), <spanx style="verb">rotate_passkey</spanx> (credential rotation),
<spanx style="verb">rotate_dexter_authority</spanx> (operator key rotation), and <spanx style="verb">settle_voucher</spanx>
(operator-initiated session settlement). These instructions are part of
the Open Tabs Standard described in the reference repository but are
out of scope for the session-intent extension specified here.</t>

<section anchor="verification-that-the-reference-implementation-matches-the-deployed-program"><name>Verification that the reference implementation matches the deployed program</name>

<t>The deployed mainnet program at
<spanx style="verb">Hg3wRaydFtJhYrdvYrKECacpJYDsC9Px7yKmpncj2fhc</spanx> can be verified
bit-for-bit against the source-on-disk build. Because the reference
implementation evolves, this document specifies the reproducible
procedure by which an implementer confirms byte parity at any version,
rather than pinning a section hash that would rot at the next
deployment, per <xref target="RFC7942"/>.</t>

<t>The procedure compares the SHA-256 of each loaded ELF section (<spanx style="verb">.text</spanx>,
<spanx style="verb">.rodata</spanx>, <spanx style="verb">.data.rel.ro</spanx>) of the on-chain bytecode (obtained via
<spanx style="verb">solana program dump</spanx>) against the local Anchor build
(<spanx style="verb">target/deploy/dexter_vault.so</spanx>). When all three loaded sections match,
any file-level size difference between the deployed and local <spanx style="verb">.so</spanx> is in
non-loaded metadata (<spanx style="verb">.dynamic</spanx>, <spanx style="verb">.dynsym</spanx>, <spanx style="verb">.dynstr</spanx>, ELF padding) and
does not affect execution semantics. Section offsets shift on recompile
and are read per build via <spanx style="verb">readelf -S</spanx>.</t>

<t>Reproducibility of the verification:</t>

<figure><artwork><![CDATA[
solana program dump Hg3wRaydFtJhYrdvYrKECacpJYDsC9Px7yKmpncj2fhc \
  deployed.so --url https://api.mainnet-beta.solana.com
cd /path/to/dexter-vault
anchor build
python3 -c "
import hashlib
sections = [('.text', 0x120, 0x38608),
            ('.rodata', 0x38728, 0x4068),
            ('.data.rel.ro', 0x3c790, 0x1808)]
for label, path in [('deployed', 'deployed.so'),
                    ('local',    'target/deploy/dexter_vault.so')]:
    buf = open(path, 'rb').read()
    for name, off, sz in sections:
        h = hashlib.sha256(buf[off:off+sz]).hexdigest()
        print(f'{label:8s} {name:14s} {h}')
"
]]></artwork></figure>

<t>The section offsets in the script above (<spanx style="verb">0x120</spanx>, <spanx style="verb">0x38728</spanx>, <spanx style="verb">0x3c790</spanx>
and the corresponding sizes) are themselves a function of the build and
shift when the program is recompiled; re-read them from the section
header table of the current <spanx style="verb">.so</spanx> (for example with <spanx style="verb">readelf -S</spanx>) before
running the hash comparison. Implementers re-verify against the current
deployment; the reference implementation evolves, so these values are a
point-in-time snapshot per <xref target="RFC7942"/>.</t>

<t>Implementers building their own reference are encouraged to perform the
same comparison whenever they deploy a new program version, to make
the spec's normative claims auditable on-chain.</t>

</section>
</section>
<section anchor="test-vectors"><name>Test Vectors</name>

<t>The following test vector exercises the 180-byte registration message
serialization with placeholder values. The placeholder bytes are chosen
for visual distinguishability and do not correspond to a real on-chain
deployment.</t>

<t>Inputs:</t>

<t><list style="symbols">
  <t><spanx style="verb">program_id</spanx>: 32 bytes of <spanx style="verb">0xff</spanx></t>
  <t><spanx style="verb">vault_pda</spanx>: 32 bytes of <spanx style="verb">0xee</spanx></t>
  <t><spanx style="verb">session_pubkey</spanx>: 32 bytes of <spanx style="verb">0x11</spanx></t>
  <t><spanx style="verb">max_amount</spanx>: <spanx style="verb">1_000_000</spanx> (decimal) = <spanx style="verb">0x40420f0000000000</spanx> (LE u64)</t>
  <t><spanx style="verb">expires_at</spanx>: <spanx style="verb">1735000000</spanx> (decimal) = <spanx style="verb">0xc0ff696700000000</spanx> (LE i64)</t>
  <t><spanx style="verb">allowed_counterparty</spanx>: 32 bytes of <spanx style="verb">0x22</spanx></t>
  <t><spanx style="verb">nonce</spanx>: <spanx style="verb">1</spanx> = <spanx style="verb">0x01000000</spanx> (LE u32)</t>
</list></t>

<t>Serialized registration message (180 bytes, hex):</t>

<figure><artwork><![CDATA[
4f54535f53455353494f4e5f52454749535445525f5631000000000000000000
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
1111111111111111111111111111111111111111111111111111111111111111
40420f0000000000
c0ff696700000000
2222222222222222222222222222222222222222222222222222222222222222
01000000
]]></artwork></figure>

<t>SHA-256 of the serialized message:</t>

<figure><artwork><![CDATA[
acaf34c904b60f1e3dccd30a9543eab7325e06982582d5852c3405beb620e6ad
]]></artwork></figure>

<t>This SHA-256 value is what the client passes as the WebAuthn
<spanx style="verb">challenge</spanx> parameter. The WebAuthn assertion's
<spanx style="verb">clientDataJSON.challenge</spanx> field, base64url-decoded, MUST equal this
value.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document defines a new value (<spanx style="verb">passkey-p256-session-v1</spanx>) for the
<spanx style="verb">signatureType</spanx> field of the Solana Session Intent voucher payload
(<xref target="draft-solana-session-00"/>). The base specification's namespace
governs registration of this value; this document does not request
independent IANA action.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC8174;
&RFC4648;
<reference anchor="WEBAUTHN" target="https://www.w3.org/TR/webauthn-3/">
  <front>
    <title>Web Authentication, Level 3</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="SIMD-0075" target="https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0075-precompile-for-secp256r1-sigverify.md">
  <front>
    <title>SIMD-0075: Precompile for secp256r1 sigverify</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="draft-solana-session-00" target="https://github.com/tempoxyz/mpp-specs/pull/201">
  <front>
    <title>Solana Session Intent for HTTP Payment Authentication</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

    <references title='Informative References' anchor="sec-informative-references">

&RFC7942;
<reference anchor="SEC1" target="https://www.secg.org/sec1-v2.pdf">
  <front>
    <title>SEC 1: Elliptic Curve Cryptography</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="TIP-1053" target="https://tips.sh/1053">
  <front>
    <title>TIP-1053: Witnesses in Key Authorizations</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

</references>


<?line 790?>

<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>This extension depends on the SIMD-0075 secp256r1 verification
precompile and is compatible with the extension surface defined in
draft-solana-session-00. Normative references are listed at the front of
this document.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA8V9a3PbRrbg9/4VXZoPJnNJiqLe8s7UKpI8UeLYvpLsTCab
EkGgKSIGAQ4AUmJiz2/f8+pGAyAVJ3O3VlWJ+QAa3ef9Zr/fV2VcJuZMv7ib
Gf12YVJ9F0wKfVsGaRTk0Zl+FxTFR7Pu32RZaSJ9aRLzEOCr2/ghNXmhp1mu
32Rp/2JZlFkUBwncsp6btNQXsyBNTVLoLNW3WRKkwQsVTCa5WZ15j5IHqCgL
02AOW4nyYFr2C9iAyfsZXNcv4br+QjYyHKoQNvCQ5eszHafTTMWL/EyXOTx/
NByeDkeqWE7mcVHEWVquFwavigysE8GmVJilhUmLZXGmp0FSGKWCZTnL8jOl
dV/zDt7E4Qz2C2CgTcA3GtaAO94M/I/MPIiTMz3JgzSc/e/IPJUmH4RBMaNv
s/zhTF97T1Zpls+DMl4ZfNbNq4vR3t6pvDzZOz6QlwdHByf48oerr8/f333z
5oxWK4P8wZRnelaWi+Jsd/fx8XHwuD+Ah+ze3ew+mgmeIu3v7/LVjNQfzESf
w+fw9BhgBvDo6ddmZRK9D5fdXn9/CdA8Ptz8hIe4nC0ngzCb7xaEvP40WwJR
4DL2k3i+yLOVQWz3AX9LfFHsTpJssguwSXfh20VWAJh38Tn9RW5guUWcGFgr
7xcmXIwOj/K9fhE/rEweT9eDeeQfYKfao37nbiaSczdrd/MO3CrEw9srDBEB
LPC7RyzNfJE9rX/dnS8W/WJhwmJ3sUyS3dFwz98Qk7G+5YUBvSUSOu7nm7u7
d47y60BXCsm0jvvj04MRvry9utjbjmE45APhGF7s9VejwSKa1uFzdaH3zvRV
ksQLeJy+WOYroy/y9aLMHvJgMSOg3F2/6+8ND/c3P6iMF8WgmO3iFbXF3W36
h7hM4cimADbQ35k1HTDL41/pfMWOUv1+XwOXlnkQAqXfzeJCW4LQCM54GsPd
ABVt+ThngRJZgYJEAAJFB/7Sap7BBTqb0q1t+aQ7b+9uuz0d6BTwHDoRtGBE
9EMWQaoIZ0CllSAa6OtSL/FAIpgKYH1Ejx47whojZcGny9woIjBBp67IWHd+
+82R6OfPXV1mbv9Gr7IlPDbXhUjKVRwoYEmEXWrBUOASltVhhQECz2g+dozw
BqECQjAPJvC4RyBYgsRGOlSw1Bb6h5V7fPfjDISbjgErsyAXlAiUNMBU2U0v
8ngeI0SKgX4F9B04xLkDRnIyXC0y0xhIBC6L4qKMU6CCsQPfHUjhsV4FydIA
qlJtnoBK+OZIz2GTwQMxNXCI9z2fsQl6JOs5XhXBsyYg2eP0QU9M+WiANvAw
jqDs7vBS+ELJKQHV7y7P4bI8XtGiAPJznZupyU0aGg0yLSGJxk8EHCRIF450
NEq21JQDDYhSYxb7/VWwTMqx3Z/uBGEI0hKA8M3D/uNNsI5eld/Ofsyj1Y/5
d1cXQbj49sfL4uL03dPx+rv5Ig1/GU1n4bir+bQASEeGyoERFOkKz6On8RMc
LwyA5gEwiQMhEBhThyVJj1R7Cl/mEWMc4IuHEgLRgFY8IH5DB9GyfYazeQIh
jriFJYKon6XJWo9J8N8LTYxRPYIGDglkKA6z6RSZD8QFQg+Fhw7K0hSlgPyc
oVqBnZ9bwe341dXph/cmmMT7xauTx/fnX384frVv1qureM98vJxc3Zx+PPz2
6x/zH85jgFtk5hluARDPJ5yC9FZJPDXhOkw2oY9l1jyOogSMgL8gD+VZxEeA
93/RXwfhx4ccdd7zAs2TGNZIaUk1VZNq+ouk2kDD/5H+AvWscNMi3B5ngCWN
VxLc7beOkYm9K7xYRme+0yAMWCREJCcY823p0yNW2qwGnxU/TSnC4l8xeHBV
H8BWmoDFkeNX6QMYX5Vo0Q3Ror5QtCC0fdmifdmiLO+CWogcGHtWfHyxrFG+
RG1JGqCrH2brLUqQKO/cftnQDBpM0ggFrK+h4LJFEOdI3gFuPAfpFplVHAK/
e3J6siZhmc1NmYOVAIh4d/1GPwA7AggHlQ7cJDiUE0lwMCAwTxyxykzWIAoz
MCmQmuB/cDqTA8khwqpziUZLRQGlGQifHDeqib5K2JM9IJ69nAFNgoQDVgHK
xZMBR6dRcUbgpfd8OUEbqBbNrSDpNd5X2hgX9sSdQmKG3UyQv3kVxzmWEAxa
baEpKhrw5WUnzUpVf1qXgFNY1ipEmcseyjU/LcjXeolOBBM96o+0EFVDEpiM
WSQ1q+2A/8vGwQb6XCOC8gw8HcCwpRn/vCUArygB4AHd7Qic0QOWR6VJFmhC
iVgLNYlgky+CvFwLVy3iHGGWRtljl+GRB3GBmyxJ7Agcc/OvZZwTsKfwz8xH
RQiSHoT0eqCuayq2YGSXoFxK30LUAcMDpAlCPlzWQRhlBBbw55C90fIicNpD
eAx3h+dNsyR7WDNCcPFH0oU737+/vdvp8b/6zVt6fXP13++vb64u8fXtN+ev
X7sXfIWCN2/fv5bv8VV158Xb77+/enPJN8OnuvHR9+c/7hD81M7bd3fXb9+c
v95BrqjLPxTGcKCJYQkMzIhSIkDeLsI8nhgUzeq338SJ/PyZMELv0ZP8/BkO
/tVX4lkPvvoKiMUZnj5zFCJpSUL40qbH2kQtlpMECAIBFjdlT+fNNcDsXR/e
dvUig53SUy+QKtFZAKJcTvBOxA9uAkG/v9+frEtDfg8TMF8KNkCG4hVtWPwO
BR7oR6Q969uE5NvQg1AZ7PFCsAAQse6Mh0/D0RhEm8JX+2ASTLMkyR75bEhH
+yO+4x/wXEB+DNLL0I4/+CYPQ0tYpZ89InDkK6ZT34wSSn1RKHuusHZ6gV1v
m83VifGI666TMMpeFIJUhOVhD4B6kCQEvJptZsWFE1sYhSDLixdyQic3CfPZ
LF7Qec/dV3JMixzRilZO0HEBAkXbMFRkF4p8rG8jXyaG9usTNLlaDVs5KEh8
brW8J0swBDJUM1lpBQtCq5JTslEVE0GXRGlWIKBoqi9Y0OFvK/ATqlN9FY0O
D/dOnS4lQZvEuG1SMT1d16QkSkVEAZOiyHcSX4taIfwx0jx8g4atiEIJ/sbV
6hxSGwuJEZPX1E5Mdhas4tza0tLwLT1Q8FhpMkdAjEwSnk4h1EhxHqwri+EM
YczmDugGYK558HQfzBHzYyRWYSxfT6jOWD6+9z/Gy1l76DKeo/0/x/XoI1Pc
B7AeCml95bTgNSHTWWUtZUH0XdObJLsLw2cSTACQmkYi2DAJMFl2ptS///1v
i8I+ijNnqq726Du298mqRDZzducU1C0bgwFaQr6qwQcapiRxdUnKW72CspwM
SyCgeJP6mwXA9kjp7lsT0UGVOyg8ouYMTwHcYmKA4xMniK4xHGHsNPx0iccH
elrFxRbgAQXDvsDH2GZcWzCws/KITCguA1Ih2JAK7gKpB3uagCmIyJTAL3s2
FHUQVaSd6CHF3KR8TShS6h0bkhug3KvFK4j8EfBtFuKVarK6UmUE8Iappt9v
MMl6asPSwrdWbHjrikPnsVWPcO9LDECLSaYsGjYYbY37XzY/UM1t31mLMYbd
w2fhR9h/ABZ2xQgOnzp4CNBRpw15iw6E4NHDAZDZuAeLG3iD5mZDlAn45iiP
7WbUwlBcNkvZh8yWJVvqZMQEtO7LmoUHNyAtkW0O1AvORuWkiHeieVF6MJtz
NXVt3TJmg20hnl7D1NlCXAoXq4fEgD3aJPDHicUHdhOUPRLzyxx2CdzOIpqs
2QpONrBT08EUt9qq7VgqYqYDbUkgeBB7e1vMiDiN0R5kBWdgPdazFgZjTMKM
MTQMYiYtGJHMRKTXwUjbcHKCPixIMtP5/biKw+aoTVZN1VfbK+C1YUQxm8Oa
II+ABrdqVJb9smZNfKCbhOej44GGGqj9DVCCJ6MpmFt8emAPWtYU4sWxpFMA
sJJZoFNsAy/LNKGwWAJUNssNLRrFrBLQ8FBozTTCs3ZXrOtwvyh0fK1Q45Eo
QlvUYwRmkzoB2KvIwBcT8J3Yv5eCxHO5pgN81VU11Fr3vW/5y1ljaBAXLAFZ
riRrp0GdPKzEJ4N9qzlIpEaRPbLrkecLg5EXjH4FPYkrbLf+tLhqQZQtSrEB
cIFC099f9U+THQIM+Gf2CPdhEsTzn4aDwd7Rzz9bB/o+juByh/d7a4aS5fAD
oBZIsL7CmIFrPZBsEfxraUSxFsvFAqzNCJFKz1eOHRmhuh5DsNa5M42diygB
GgL7S0WRGHQkmwj6HTg/wlMo2Hu7XAQkJN+/v77Ep7BMmsY5aJC9I34OEeWv
Js8YNznmRFOE/t7RQL/FkJCyzy80OL9sbIBw2TtiWMRi7qGUX8YlBRr5SWCK
WyhiRpeDu4NNFFzA6qbhkenNHhmp4BS1sBjPBAzUFo5ZLFw5c2vj4rKwODaF
QdOaw4Zia1mCzjMBZCc3iyQIOUZieJNuD2QV2SBJlpqushqTrCp708rnY96r
eSJD7QEUGLBqaHqaI8NrJapQQreWC4kABTEo8hDAQQgIK/xQgN01wPdiOwtZ
mU+x2CkREEC/4kKSdsp5fXFJsK7TF4AW0xuZE5FMQ+xxFRjzU16+PmGVMF8s
S8NetMAC7cwb8wCwAMqxTh2mJr+XoO8rMlI54loZrUA+foouqCtiz/ULM8lo
FC7hsncyJJICsxKfm0ssn5/XE4sIzuyydL76tvEXDv5QhUIptkFlnqVVzFq4
bZN2YfZtb4FyVQEIJySjoBBBCWRzDipmDoQUC8uBwHhAew2lQxKXZWL66O0F
iP1P+u10is7UJ/3apA9wkk/6FWnPT/pKgjT6k/rUl7/WC/cBvITVhnDf/gj+
N44yJMExvDy/vbi+1uOdt3e397dXt7fXb9/c31z9/fr27urm/sPezlh3Rvss
X7oAxCiSpIQ+JVEjkgdXp5V5+Uo40yNa8hJkWCcPHq2Gs+wuT8HFjg7cYsR3
94sowLVYmfoyAhfie06P3D1CSffM4XijF2vY5C5Uq+yNTuBy/M/3tOHtEvb0
+uolsDjgjxPUNc8cLZrsI3hZJKiXoDiKl2xygL/5NwQ+rr5/ZFf3/G54G8vq
79P4yXPPUU6QFe+tVaBNjtz4gGFasn3B7AuXOYkAF3Agi4SeeVABc2NcAL64
Adt7QczWBMpLxjPqi4kRb7akrAzsADzRhkhBFZrlJVmiy5Qs6EZ0QneeDTVZ
mS/YOEZ44f7HaQZXEyLgKAgq2IsNFoj+DjFQmlqvQqTHJ5QzZZCcodBgGhPG
dWxAJinoqZl5go2hivJyzmKfHEwPDw73D6eH+weH8O/+wenB9MDA+9HB4cHx
wSl8dgDfjOCTo/29YeuPTZLOHYptsVyZ95iDwHQcb+HBcS18eqrfvH+t+Bhd
0kIj0a5JMAHLlGMHD8u4YBscnuVyb2QjeoaAKBIgqWBeich5/DBjn3ygn1FA
pF9QAYnrhbk8a1UVBowqQJcAGpTGBGO8CFA8qCcfej6D91qcC46cxyesTi0l
zIOPYmnYAwLTwXORLtmSocwNK1iFtr2z18AayChxW1AEjXW7vJYdSKqJXALy
RVB72dgJAof4XvIockwmOFY+5TbNsCysRdFwKauCFPjc5HSTfUDlMeZwPkpI
VbzUUkwYluS93F5+1/X1Jz4GLGyrPjfvMJhkK+NcQqeESfEXegziJUlAHxmw
vItZMDo86vjL3Msy3TGpV3gantOQOpY0kjtotda4CpCieYC3jdNgFT+guTqo
rKNi8GDKTnfsfEOKajSiNjZe0XEhjB5mWXuYbZ0FefQI2rYvHnCJLmB3oA54
uUkOahpWBBt+maeN7Tq89BCmJZvXtNWgqjLL8sugJFpmyOG7b2/fvhlXucsq
rAfnOKyB2VojlSu6SJYbqCnIH7jET6wT3MUmOhjnYpjdW85q1oj0KMFsIslN
40JV7rlKMt1zLrReXmKD4ig+vIAErhFigYyldAdBqQZYBOskCyJmqupp9W+r
4GN1ezsAWYM88571KGm1e1lN3ER36X0EeNGfPlkSZvjTp/e/FFna9aLPsXVo
eKWyjS4xETcm7YMkAzA4S3S7M+RS25Y6WklrK8D8OgC/Bg7WQ/toIvLixgSR
EzYYec6WRb08yAbRvQ/BIVgXqyAnAXDOFE9r2JTwhoUwm1LZdnFBPHFrSec2
fvhAxLO37Y/Z+V2QF9525VAv6lsmtHUyNoz5Y2R1cajxwZQ/bZYCmieqh6yy
+rFXlFK5z4wJXoUMhYM6DIzFFd8Cai5IfKzSwUWuO+tT3E2/qovYvr5wfTO0
clu0/C7Vjq2gjqr4DpdMOwg60bGVvPCBKI8pU9h8xLgBTuULcbKkbNAOTTJr
tKJRfHSwzJM+pZeR6IG5KU2OVdafP6tbiXYfuoA1uhsAHQnQy96qhSKDC7Fe
QU1N0LTMz1+CoVspq+e1FbP79VTCrSb8qKdBnBQ9IUd+Oh0nN78YISVP6Fmj
siH1GY65NaADMK/SeB4k/WmWlQuQkEDFIQYVyY4vVZKFrnBuvOO2v3O2878I
on/bESi/fEY0qoclaFMwuauqUoECiLI2KkTw5BxvFtVWKK4u/Om8/8+g/+uw
f3rf/3mMSyHmwWftYeSA5SKd0EVrUoxCAJGAW4IFfQiGvoFDLirDkHgarDTh
CDgX64JzDMDxGfpJsKY8it26rfrqeCXc3XZSkgTVI5i/VLYRi0ytKU8sDQY+
qJ6lms/qYMAXbFpcu0epZbiumK5ddoSKCfuS+WPMxUWxlNqmfIW+CZ6PbFXO
ecRFuCRxD1rzt99sRffnz5Qq96I4VYStS1TDWAJVE2KYykMlhgFb0U2sutjo
5Tk2KrMwS7bHLIm4CjUx68wmqKtaHt69Y9WXCEevjtFG2gkeKUV03X77Fn9Y
SobSfSUFwcxssZfSJXsC05vs59Q4kLW6TZNVyVPvPGGyjDieRJFB4KNHLpr3
kg8rUI/nqpGUJXCD0MEoYM23Reo2cyq0mJv8wXDM623av6Bzf/BTwRKvJ3K+
4VKJqKZfG7mitvglIeOeTcVjKDOW80bM3V90oK89EY+9MwVFnMERjDA0+fKZ
cLyyweAqkMgLYGFxHBlbcAcAADXE65KTDGQeUZzKf/Yn/W6ZY5WyH5pqhKPQ
tR9Xqa57KUPBhexnmJ2xwZ6e5KIajtNzkWUW25zBs0GCCtLuAhsQRyOjFqUV
7y/l8HCUB49YNpdlmNnvA8XXCoLoOJsNbRf+akY42SCk4pSe5sJVKg1deC4m
hyKJUXCzz3ttLudT8eeB29oq+2iaG7uhT7fUQ33JngIMltkdrbKwvp+OkxKD
UVc20qhU/8Sc89wj0FyZxHDWfO2iC5UI/ILydjKCqVD+pZ4vS9KtWPHKGYdP
NoS7JRolHFCgVIg5/163ldFX9SgEtYHLAuhaFsCrArMBfpDIyCeUGVqWKptK
sRlnG2virabepR6LQ/t1lJ8MRPC08OEF3fPnMe/7NxTLqBCt2og++/8ZqP7w
9rsrG6be2xSm3tv7z+LUXxaM/t3ws59bFw9CAraJl2iv9X14ccvRyf+buOXh
EbyewL9bYpZV3JKZxKGeN2AVbJZvrszyxZRq3QLGY1CXZBXvo0EMqnyCa9TL
blXg7wOWobp1EBVFINBpxuY4V98s1iKmY5GPbTsSRKlthy6zUqwAYTqipQ4G
+11gTKogsGUBNd8N073zwiQrNhP+omtSb4vMEsw+08rj+fziiWNlgrFVpq6q
A82rBbXPGJfV3CBVK+O3kqfUimcNKcXS0krKDy5FaK2F5maxp25cxJQdMXeV
YzTWN+8uAKVJQnEStEPifF5Ja5dtBSgv0T5RNslISRRE8iKgmOfUOB6QUJGL
Y3uJNyH8bHE/Lx70X/Vkp4gfn+6T7CFOd9B3duetlQl4XmytQqBRGiDJhbbR
q+o+g3MDyC2IND2e3YEum+JJjKVYCUYD7fbw0VSJK9wiFdVOH7jjPmfObYzM
s/jE1BE41K7GzIvkiaPoNbJh9jsu5uye+H4Zti0rLywhkUDkF6HOKJNKYUkK
B+ATPup6mVst8ueFyxSmSNvmQI2DN/ZskNmMmwAI5tnygcNtfygM5e+j0U8K
vLEBzFRRw5HRehu09OW4rQQJwEH6WucGeKPhYsZp32qdq4vL2/PaebsDddeM
idXgUbfNXXO7I5yqcJUclw9S9sR5eX0hJaNxQtWgmxwrPOYc9PiUqb/RsOaZ
nqWU86m6wfI7/Wh4ugMxJTnB/3WWFzN0y1EydMZSd3VNCaMqA3vO2dmey6ae
l+OuFFgUyhGz5I2qqLu9BFuxYLOHJy4UYnPDfgz2vN4+HG1tGZKvXajXLxbt
yMrdnrYtRF4di2mV+rKnWsvm2bZZr/ijsYfOeEspNfZggFquVqiyUIA8sjfs
ySs7teOqqLsEBdBpCZy7aoryC+i2MCQHojGya2qUgwjxqi2KTTTUbCAaDay/
gFe0MOWX1G4uZAxcAqyqTt1QUoqx6Ota3QsfuUeZuqrJQ0qesBO3J3WdGidX
3G17vm/fPVNAqTn6W/gAk9ph7AYn83FQPaq+DBW/e6UFSJYbCwYEEtpVDrjS
g2fX9osiYO3akijQOCKeVct7XQAtxn32SZtrFTzQMD2+KPg5mMSKV0SWUhri
1KZg2xboz+LcRZ0KjnDV+mdaDW612ti+Lf1mooMVUngyGB/goaJfhtxdLKdA
tuhBcZTW0Qz7dyCQLZcRNDiaBBaFH05C+YzKjGpIhWsaQp9jqR5rdqwx0hVw
UDzSSWsu/50sMdbZWWDIk2Wv7SslKpNV2ZCq8S7N1cDuH3CupRvdS6rIQ7IJ
BseJWS/E0quLNgzE72wRUztj4LwpgpDbkBGzG0J8aI2AOz/FJOkkADRK+q0t
NDSnkjliT4z9rASxDGqFlCdQxsx+VHvNWQ7MDd0YUGgrY4PsXi2z84JaXeDg
MHJUwqV36gXSVTIDg6IbRYHdDKWR/D2w68g7mGDvOyxD8bRGFaOIro7NHMt7
0bdxq0K/FaTsVuilYC9m0reLNr8knKsRACAljnMoOH5BWWcJYRwN1BGRAaJX
2iiQXnq2btuDBXBO5ZhIVXEYhLM2NGhQDZxBAt4rBGqH8a1QOpMfBf4S2alU
ccUjROZwCwbv0IdBSV/Yis1avwVrVxe7FlT3NPZ/uwwfbwyEAkiKx5n0rTfl
npIWLaDxPMMbxIl8bd2lhjmu64a4Utjb75ni3tdGGtPb+Q/ng2H5PYlQJZMN
HNXWzVVOgmibBMlcXwjIzKxE/C4WcEm3p7yEK4YJJEVinSvwEsHVqTyydvBJ
jbf7b+MvqO8kBFddOUyzWGsoufuSDZnnPG/RZhvS8DG24W7weFlh+C0apCZg
G2oCWI3CoBDNIHfjJZK85+Bl4fxj663Z4mYrOzVnlh7NZOSAT0k8MLNNvqPf
/8PzrJcLDFw3nTY4WGuAhbQx/gXZkbUg8DmmsqRejNu4PYjHIpNdZY1+RPSU
Sr2bZanpw7EozuLG7PSodikO4dx5guIFY6DFGk6DyGJ3iQcnKOCx5TSgDH+O
phQJUlhgHqw5q04YZq/YSO9kSRKPxhsEa2YCJf4oiaG6ivcSpcD/YKQRo0TN
wxTtTvktzY/UZLalf15t6Z+3YaSpG4DAkgszsXmWuJhH60bx2tuVyVt62jaM
WmhOWBiQO8izDBqhJSBJrk1KFRAp6F0RJRIgq2pDrdJomnTSinvjxhUARMgg
+pJZBbatBCWXfTrFurhxTdmC1HJGJncZxGkdBfVGHXyNQQk3CoEMIRKPuGqY
ZIWxuWQctYCHyrE4GxBC7Z0056O5W8DUN7bADMAaNeqTml7/q+vLt6MKrzSE
ClFEU2Zw1k/OTQL4RdeWEFDvauC6HIrNzpcsUyV8uUVUTFln8cjAGtsbB8rr
JZf20lvYcvBglIDLQwpnCgubbFiA4UBPMjKz5wemM5stZ3rubSQ4NxwDk651
klGov9gl0ef1WDFP2LFBv2oKUJVj46kJok1nAUuptWE5hEZHIWYhvuayj2XK
npOXMkxQ568VdXpg+b4M4PAuIb8/YT8Ro6vYtANIEJ59Pmdn5hPMkW8viFWt
gli9tSAWYdTKGoINbR/mB9URYUhFYuD6PSRurpfgTDbQAysJ8MTNJKkghQIX
Uo4rqfWianIS8ZVIhQnGlAXpEYk8YDugzRQcJepQ86njpWtCEaPuAXQhCfm4
VMx0XjMqKbIc1Cs3i0w5uBEio3KvtZhsJXUyZY+p7bhFAra+FQOFCmSkan1r
dyqIMrd3VTm1ffaLq2jcmed8kaXi9Q7ItW/QGQSOpv5DBOTv3/K9/hvchhQ9
weFHbBSbqkfRt0AlzuoFI6pJNVyHUM2t8UMWXkGta3JYLqyfJREDVUl2Hlvj
x182D7CRllb/CmHRdnxVMI95RZoUmq8YDPAsLtZjc55uB9ZX5O9QLGtLrFaS
uWjtbcqILwKQmJimIJFr6VG0h+RarEXFCssZ9hUU/V5utq/Q1IkXYlX9xZaH
ADQr/SBt+NfTzdocaVIux63VxOiLYsNKGNun3naUnjiMFf3J5XzBuWMu7KkF
IM/BNAJfgMo6wWP2qaK1OmIUI5NUQ4/1bBgWxsyIP6sEkCFV31si+FlOw1Ce
jFgFVh0gztq2lpCC62bDzbc3Rr12ZaEeUPalWPWCzvHmzD5HyjHqu0QVR/Vq
k2We+kt7Fj9xpq+9MKokdjGyDqlpRnC9/o+K41xT/PY6g1qxZVU8yL2J6vma
wSowwhV3emPF3cDVMhdUFTMxYbCUyM7mKkJdryJsF3q+8AZz/E9VFT7bc2Lj
3gpHCmofvszhcv5WsWERTA1GjJqFTzx9Au09un1VxYY8huHhZla6SgoOMGrS
VZxnKVEscBANBqy2Xu/ToAcZsp7xOgcs5UAKhh/xFfXnPKLxDfzXJ7pgunqb
x5hBBLeaPPSOPKDPDwCVuEB65CRO94sKx6s5VK0aSzvwR6E7A1hb2ILXcUbb
sOoeu3kaNDto7jS2w4U8gLwoGjtm5i20MxCs8uV+jBdF1R1z/u6aqM3F022a
ERvNnIlKT/BRcH058GJFDo1YeVOwVrC9H0iqYEjrjlfIWZt92rMTar0QCtrn
SENV8r8iJ5CHDSgNLBhtZIwnu7E16uphae7lI06hfD5FF9v6pJXZHgodeEPA
QaWDqrJ+w3M5IIRFnC5pXetnixJULPndrINzFyvi9bemyfykFk/hAaG9cdSN
X3bgJ5ar4sj66uDfglyQ+uzaICj1R4LQ1tV0EyZyHJmgsB68j6Lki2x7O8wT
6PqZMjm1KYXanD+H5S14z3i1B+z1qj1JSDUnCc3cTCBtYpQoNrRLNGrbxp+b
Dlz3VNWWxOJo3JX5v678p1Xo01hoc5fjSIZP1TU/jmEtl4UQfCEBYn+UUEEX
oBz6mIJh39IYMoKtKnv249rNGYXNGAH3wgrLA/GTHLMVtXgB9S/g/PDPnzFl
GCZLGQ4mi8uGq9pk2B04k2mUgVgn9IqYu766e8XulCtuZ16pSnAz1EkAZIpC
Y8s4PMUgqliMzRGBTpBWw2JJYlg/fYv1kTUn8v7JMcxK9fWGmXZffYWJ0T82
fplWummMJJY0haz3h8YS03rXVT03rFH7LQL8+nUcAv8Y/AolGNpJoIpQDRj7
GpzErIiBqkHF4i0XaGoCG+M9WLdCU3LzTVXfm+pzDwc40b7TroTubSkn7m30
XHoIjXr8ulu1DW6rXDUpCJg8cPkXu6m9vQEd7XshKDwaG/uscQXZL6nYDa0P
8t5rk3j5YljTmh1imVsoTpZxIgEYrlSL0eOyk5XgIzAAKLdqs9QVITTkg3AY
7/iaqR43jOo0jfplhtMUqvINgwMWWG94sXlHyErb0+GkPJOHLk5JM6ydoWHl
X8+uTN0gPel3tQm/Pj+O/ErtlyRt46weg4SLBWAhkUaypdqWK6/KpdDoWgco
uH0bqFAUXLg6L8m11HcC/O/3daBauA3zeNG8zgZSmRRg63EVlFPsB2CfkJ9M
IdzTpzbpyK1auTRcV8PWvb7GmUkWqMkdZ20W37EMdSS7QkLuY/k1kCDelS6D
dDEHnIQfYY8isS5Re8dg88IiSD14hej0dc9eq1sr0b0fWDfjbePhAJhnyJ/f
NgUGXbHh5y4ueRLn5fnbXX8oZ7+IPo5bMqb8XbOjUxX/73V7wj9fXKffs7nu
qiLR1Rwid7Tv2Zd7XJq7JmTABAcdhfyW2YR+ZaXwMHtn6lds0fJbejZpI6Sh
/abXDdRVtVpbr0FtatJuNVJa87zrVwL2LUFrSsvPabRiU0LGtuiW6xML81Jj
Gs+LsZZU8ukP2ocF6+wkvMlOJNkYlApka9MXt/gxzWiimWljumrXu2CAnwzK
YmxFaJsLWgqtXQIaNjai6qXLG02t1thnzjfQVpMs/FgomojYNBJ7PCix1ugb
43zlOc6NyCqEKlvQQHQjkzN+lyuYfp5pYqgI5uBAyn7tj29I07dFY5EGi2KW
ATDiJyrxbM7+2wYgF4OkymwXqJXe44JNeAZULZIbp4ul69VtogTccOKAtnCq
nAaRShgxVrffnOOQaCmRnh5Pw4OTKNg/3h8enZrJaHgahPv7R0fDg6NwEh4e
HgzDveODw2Fojo/C4PjkeBgEI2NOwQCdnERDr0UeFp9x3TRNhe6D+iMr2oLL
DeS0REv5NzhftIE2Zesvsf5FJptWBRO8gnyMPajKa9NDidPPl3Bq5usCm+a2
c4c/hNPCi/KH/MM8APTb5YTDSGVzdKvdie9r2dO6onYcyJrT3tiQ8Dy79lhc
cbw4DkRlMnGJZfBBo5h2Ah7ARyJYiYtSSkdSWf5QW8nQbTWfbDtJbRZ0Y/J0
XDxrs7SdT/wNAxQtZ6hbW77AH9KBqP8u3CCTL7316WA4strz+4t3Uof/pXfP
w8VYqUtr8CJ5BBRDbLk7mw+ory//lLezxdf5E54O2m5/wvh1pq/6k6Zv0/BV
f87wtcKh6nN91gAWUbY/+9flaro/Ofnn4z/f/H1e/vP8v/9RRLND88vfH5fL
9/mb8vhmNXo3Xd4We8G/vvs2utgPn1bxdw8fwuikDB7Lv3+99+r49B8//vIY
Po1uzCi9nZxk/7rx25+2+cPccLy9R5AzLhQ8sI28LUPWsc8Zto+V98Vj/DDG
AjXDctQGZoHd3GTQYh7kpRSo2LgfEU+X/ESq07yvmhPHeleNwQdlR9P/vCO9
nlQY2uhmxLUoJHuPtlxQmLHqFOUy/NhfucQp9XKv6anY2uiVUXU2zDXs9pS9
jnnu3tl7eGL7EyT+AMeureAnwrqXJ8NOXK6ZXejSS2NW9M5FrkVjygl1MSMA
SYJt/O0f/yceGgTs2U0YK4fFFNXP1Vs4q6JhHuDcbujEUiOTS4i/1kfu2ry2
Ep5fVek8dDsBlWjWfWpZyDnkf/TnsKgoZlLNTlGTuKRfDpzg+A0/8UvCvw9H
BgPuIxvkA/21l2yq7N/GecAqw7h58xeI6j/x5IcMVBUqmKyr8iC/bd8r+CsJ
3xQiK6ncQzR+TwEJzWwNu81aBC56R6YNVwKRZs4zN/U3BXyqappYrxpqIkFB
JY07dps0nd0OSBVjDImGrF+0M7EF5fUr9+zOeICpCCwEGcCxZbDUAF8MgB/h
s3HXmiPOA8Oj0siITjbBnBumFKg3r67Zo+V8geFb3z/J0O4/51+vINSpzpht
oV0+pqhJjlMNCnj8QP+Aplk1sEqOUdjGSSLTnkKIo7XK/WMgwH+tBg5gTGhD
BImYnvc0xmfxgGwqjpKHzE0Z8EQgAMoa7Mk4ZACt02I9dy/LHF4iXGWkDAWt
VVVPDrsIkTlNuKz3Uw1cWIwnDoGFPounWKukvQFPGACniHzAY204vkXVoRSs
Taa6fzsGYrhxxMtJL8Gcn1uyw6vauNJ/hGH1/8Ff4BQ4Aux0v7/ME/dDk8Ei
HohM6APkgwE/D20iFUZ6F1X3bpnVrDEV+HSxWIPMTvd1P9Q7yMhYioGcksQT
5VD/V/1T5wVR8IueHj7tjYb4z/7J0fCk2+O2DfmDy5i+X/AVx6MTfHEwPNpw
pUf+fHl4fEorgxN40v2Z/FSahtjj4BvwBOzDQgNueeFB5kVj/eo5RHlwNfy9
eJYJXnR/5t/znCyncGYMHnfwwfCgfPKiO0Ai6HTpCtwauj09JCjwXn6VEZ8E
rzO3kRksI9AcSIQC1v4J7jmD//6r+PXn7mBmnqIYR93J0vhHxQGd6Yvf6Phn
J8Vn/Rv9kO7eAb6cfX7RVTuVTVM0iNvOc+NYH80BpJ/zAcQhLwli5CUCfays
30xJMszokpmC3F10+ceTqoRogBWu9okcOCROoTG8xFfOy/PcD8do0Uvy7gyP
YJt782Kk7HBGmRHNNZO2aFG6m1iA+LkoLq7wObQr9UkKPMjUmr8k/lluxwW6
N9cNd1PSvL4ctQVSlWp4+bwqd6qPRyoV0nbMVkqgtvjUbW1T2xsBV47BdW9+
jK1V/iKFtBxloRoyd2jCi1nZH5VztT9YQOuVFrBjAEvhaE5li7zwB11dRyoN
V4FjLSMZMG61FjmqdxjS+ADYzHKJejkvgMMdK/rOBudFjz4b+nEBo6rRQeMs
cCMVXQxnKZj2Ppe4TG6nypJQWcXFMqjNWA288gVJTlecQEk7VAuJO6ZHEogu
iu2QI+nXgJ7hHIlqLuzwaTpFF9ErDG1dYQxd0agWbV22t0eXeU184G/s3Q+H
Q/wP+CMCW2uOP5/3V7z8YHgwGk6rYRBwwesrnISM2S+/EBVXOd4/dFfVlwmH
0+nR6dFxfZlYltnY59fa+WhEO+diU3zcmNce7tW2tj/qKnVbxQg3x8jdJOAe
zs7o/k+N+J3+h3/K/Id/amtr+xf+qSbGVRN3avQf/imLMVZDnhHMotyhrpov
gxcGYTDdPwhPhweTo+F0z+xHYRjtD4PTw4N9E0yO90eHZnh0ejI6PBlFhyeH
o3D/YHg4MZOj0dAcBZEXq7SPdLVr7le4JBkmpYuNabW1+jc3/oklR3tE7Iui
VfPTLJ/rtYYZwkf8WzEyVzIuVFUMdH3+5rzVjFP/bbfqp59RMksdx3M94eyl
tipAXHEXuSkbf2G2ER9//gevZbbupkJqmjS2ALkrZZtFnWVtUoHO8rLhGdZ+
kg4TFF5Gn8HlRjPiDwxjqygC8jzEWhGwJx5oDGZ74gGtUdjyMm8+rZvw0Pi1
WpeLkio29yNc3u+Ee67/Mp/Cgb2KALUFdAP9xmlOp7pZK0ne1wbL8iwtXSzW
Amig/i/vO21vV4IAAA==

-->

</rfc>

