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


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

]>


<rfc ipr="trust200902" docName="draft-dohmeyer-chainsync-03" category="info" submissionType="IETF" xml:lang="en">
  <front>
    <title abbrev="ChainSync">ChainSync: A Synchronization Protocol for Strict Sequential Execution in Linear Distributed Pipelines</title>

    <author initials="" surname="Douglas Dohmeyer" fullname="Douglas Russell Dohmeyer">
      <organization>Independent Researcher</organization>
      <address>
        <postal>
          <country>US</country>
        </postal>
        <email>douglas.dohmeyer@protonmail.com</email>
      </address>
    </author>

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

    <area>General</area>
    <workgroup>Independent Submission</workgroup>
    <keyword>distributed</keyword> <keyword>synchronization</keyword> <keyword>pipeline</keyword> <keyword>execution</keyword> <keyword>ordered</keyword> <keyword>coordination</keyword> <keyword>protocol</keyword>

    <abstract>


<t>ChainSync is a lightweight application-layer protocol that runs over reliable TCP connections 
to synchronize a fixed linear chain of distributed processes 
such that they execute their local tasks in strict sequential order 
and only after every process in the chain has confirmed it is ready.
The protocol has four phases:
1) a forward "readiness" wave,
2) a backward "start" wave,
3) a forward "execution" wave,
and 4) a backward exit wave.</t>

<t>The design guarantees strict ordering even when 
nodes become ready at very different times 
and requires only point-to-point TCP connections along the chain, 
thus no central coordinator is needed.</t>



    </abstract>



  </front>

  <middle>


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

<t>Many distributed workflows (pipeline parallelism in machine-learning training, 
staged data processing, multi-organization business processes, 
ordered multi-phase computation, etc.) require that tasks execute in a fixed 
order across different machines, yet must not begin until every participant is ready.</t>

<t>Standard barriers do not enforce execution order.
Token-passing or leader-based schemes introduce complexity and single points of failure.</t>

<t>ChainSync solves this with a simple, fully decentralized four-wave algorithm on a line topology that guarantees:</t>

<t><list style="numbers">
  <t>No process starts until the entire chain is ready.</t>
  <t>Execution order is strictly A -&gt; B -&gt; ... -&gt; N.</t>
  <t>Clean backward-propagating exit after N finishes.</t>
</list></t>

<t>The protocol requires exactly 4(n-1) messages per synchronization round for an n-node chain (one READY and one START per directed link; and one COMPLETE in each direction).</t>

</section>
<section anchor="requirements-language"><name>Requirements Language</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

</section>
<section anchor="topology-and-configuration"><name>Topology and Configuration</name>

<t>The processes form a static logical chain:</t>

<figure><artwork><![CDATA[
(Head) A <-> B <-> C <-> ... <-> N (Tail)
]]></artwork></figure>

<t>Each process knows:</t>

<t><list style="symbols">
  <t>The IP address and port of its predecessor (Head has none)</t>
  <t>The IP address and port of its successor (Tail has none)</t>
  <t>Whether it is Head, Tail, or intermediate (inferable from the presence/absence of a predecessor/successor)</t>
</list></t>

<t>Each adjacent pair maintains a single persistent bidirectional TCP connection.</t>

</section>
<section anchor="states"><name>States</name>

<texttable>
      <ttcol align='left'>State</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c>SYNC</c>
      <c>Initial state; waiting for READY from the predecessor (Head starts here but moves to READY when locally ready)</c>
      <c>READY</c>
      <c>Chain segment to the left is ready; has sent READY to the successor (if not Tail)</c>
      <c>WATCH</c>
      <c>Has propagated START leftward; waiting for COMPLETE from the predecessor (if not Head)</c>
      <c>START</c>
      <c>Currently executing its local task</c>
      <c>COMPLETE</c>
      <c>Local task finished; has sent COMPLETE to its successor (if any)</c>
</texttable>

</section>
<section anchor="message-types"><name>Message Types</name>

<t>Messages are simple ASCII text lines terminated by LF. Recommended format:</t>

<t><spanx style="verb">&lt;COMMAND&gt;[:&lt;ROUND-ID&gt;]\n</spanx></t>

<t>Defined commands:</t>

<t><list style="symbols">
  <t><spanx style="verb">READY[:&lt;ROUND-ID&gt;]</spanx></t>
  <t><spanx style="verb">START[:&lt;ROUND-ID&gt;]</spanx></t>
  <t><spanx style="verb">COMPLETE[:&lt;ROUND-ID&gt;]</spanx></t>
</list></t>

<t><spanx style="verb">&lt;ROUND-ID&gt;</spanx> is optional but <bcp14>RECOMMENDED</bcp14> (e.g., UUID) to support multiple concurrent rounds on the same connection. Implementations running only one round at a time <bcp14>MAY</bcp14> omit it.</t>

</section>
<section anchor="protocol-operation"><name>Protocol Operation</name>

<section anchor="phase-1-readiness-collection-forward-wave"><name>Phase 1 -- Readiness Collection (Forward Wave)</name>

<t><list style="symbols">
  <t>Head (A), when locally ready, moves from SYNC to READY and sends <spanx style="verb">READY</spanx> to its successor.</t>
  <t>Every other node starts in SYNC. When it receives <spanx style="verb">READY</spanx> from predecessor <strong>and</strong> becomes locally ready, it moves from SYNC to READY and sends <spanx style="verb">READY</spanx> to successor.</t>
  <t>When Tail (N) enters READY, Phase 2 begins automatically.</t>
</list></t>

</section>
<section anchor="phase-2-start-trigger-propagation-backward-wave"><name>Phase 2 -- Start Trigger Propagation (Backward Wave)</name>

<t><list style="symbols">
  <t>Tail, upon entering READY, sends <spanx style="verb">START</spanx> to its predecessor and moves to WATCH.</t>
  <t>An intermediate node, upon receiving <spanx style="verb">START</spanx> from its successor:
  <list style="numbers">
      <t>Sends <spanx style="verb">START</spanx> to its predecessor</t>
      <t>Moves to WATCH and waits for <spanx style="verb">COMPLETE</spanx> from its predecessor</t>
    </list></t>
  <t>Head, upon receiving <spanx style="verb">START</spanx>, has no predecessor and therefore moves directly to START and begins execution.</t>
</list></t>

<t>This phase completes in O(n) messages and guarantees every node knows the entire chain is ready before any node starts.</t>

</section>
<section anchor="phase-3-execution-trigger-propagation-forward-wave"><name>Phase 3 -- Execution Trigger Propagation (Forward Wave)</name>

<t><list style="symbols">
  <t>A node in WATCH that receives <spanx style="verb">COMPLETE</spanx> from its predecessor moves to START and begins execution.</t>
  <t>When a node finishes its task, it moves from START to COMPLETE and sends <spanx style="verb">COMPLETE</spanx> to its successor (triggers successor to start)</t>
</list></t>

<t>Execution order is therefore strictly A -&gt; B -&gt; C -&gt; ... -&gt; N.</t>

</section>
<section anchor="phase-4-backward-propagating-exit-backward-wave"><name>Phase 4 -- Backward Propagating Exit (Backward Wave)</name>

<t><list style="symbols">
  <t>Tail, upon entering COMPLETE has no successor and therefore immediately sends <spanx style="verb">COMPLETE</spanx> to its predecessor and <bcp14>MAY</bcp14> terminate.</t>
  <t>An intermediate node in COMPLETE that receives <spanx style="verb">COMPLETE</spanx> from its successor sends <spanx style="verb">COMPLETE</spanx> to its predecessor and <bcp14>MAY</bcp14> terminate.</t>
  <t>Head, upon receiving <spanx style="verb">COMPLETE</spanx> from its successor <bcp14>MAY</bcp14> terminate.</t>
</list></t>

<t>The completion of this phase guarantees the Head node knows all nodes have completed execution.</t>

</section>
</section>
<section anchor="waiting-in-watch-state"><name>Waiting in WATCH State</name>

<t>The <bcp14>RECOMMENDED</bcp14> approach is <strong>push-based</strong>: the node simply blocks on read() from the predecessor's TCP socket. When the predecessor finishes, it pushes <spanx style="verb">COMPLETE</spanx>. An alternative approach is to poll the predecessor's TCP socket.</t>

<t>Both approaches are compliant.</t>

</section>
<section anchor="example-message-flow-a-b-c-d"><name>Example Message Flow (A-B-C-D)</name>
<t>RD: READY<br />
ST: START<br />
CM: COMPLETE</t>

<t>A.....B.....C.....D<br />
|-RD-&gt;|.....|.....| Phase 1 <br />
|.....|-RD-&gt;|.....|<br />
|.....|.....|-RD-&gt;|<br />
|.....|.....|&lt;-ST-| Phase 2<br />
|.....|&lt;-ST-|.....|<br />
|&lt;-ST-|.....|.....| Phase 3<br />
|.....|.....|.....| A starts immediately<br />
|-CM-&gt;|.....|.....| A finishes and B starts<br />
|.....|-CM-&gt;|.....| B finishes and C starts<br />
|.....|.....|-CM-&gt;| C finishes and D starts<br />
|.....|.....|.....| Phase 4<br />
|.....|.....|&lt;-CM-| D finishes <br />
|.....|&lt;-CM-|.....X D exits<br />
|&lt;-CM-|.....X...... C exits<br />
|.....X............ B exits<br />
X.................. A exits</t>

</section>
<section anchor="error-handling"><name>Error Handling</name>

<t>This protocol intentionally does not prescribe error handling.
There are many potential applications of the protocol, and some applications have mutually exclusive error handling scenarios.
The potential applications may vary on both how faults are detected and how to handle a detected fault.</t>

<t>To make the potential scenarios salient, the following examples are provided:</t>

<t><list style="numbers">
  <t>Suppose we have a switch stack of four switches (1, 2, 3, 4) where the switches are configured such that the stack can tolerate the loss of any one switch but not any two switches. Further suppose that ChainSync is implemented so that the switches are restarted in a particular order after applying updates say: 1, 2, 3, then 4. Further suppose that during the upgrade, switch 2 experiences a hardware failure and never comes back online. The preference in this situation is likely that the upgrade halts so that no more switches are lost. In such a situation, the successor switch of 2 (i.e. switch 3) could be configured with a timeout waiting for switch 2 to come back online. Moreover, once the fault is detected, the successor switch could send an SNMP trap notifying a network engineer that its predecessor has not come back online.</t>
  <t>Suppose we have four nodes where ChainSync is implemented to orchestrate the processing of data. Further suppose the processing times of these data are highly variable and the nodes are not expected to restart during processing. In this case, it might be the preference to implement a heartbeat with a timeout shifting the responsibility of the health check to the implementation. If a node in the chain hangs during processing, its successor should not detect a heartbeat and thus know there is a fault in the chain. Moreover, because nodes are not expected to restart, a failed TCP connection would be sufficient to detect a fault in the chain. Even though a fault is detected, it could be handled in two ways. One, the whole chain could terminate and start all over after correcting the faulty node. Two, the progress in processing could be preserved and only the faulty node needs to be reset for the processing to continue.</t>
  <t>Suppose we have a multi-organizational business process between four companies C, D, E, and F. Further suppose that this multi-organizational business process by design has no error handling implemented but the preference is to engage people to handle faults. Each organization could be responsible for both detecting its faults and notifying the other organizations in the chain. Perhaps by phone.</t>
</list></t>

<t>Thus we have three examples where both detection is handled differently and the handling of faults is different.
It should also be clear that the three examples have both failure scenarios where the error detection from one application would not be appropriate for the other and error handling scenarios appropriate for one but not for the other.
The ChainSync protocol neither detects faults nor handles errors because the implementation <bcp14>SHOULD</bcp14> both detect faults specific to its problem domain and handle errors specific to its problem domain.</t>

</section>
<section anchor="IANA"><name>IANA Considerations</name>

<t>This memo includes no request to IANA.</t>

</section>
<section anchor="Security"><name>Security Considerations</name>

<t>Connections <bcp14>SHOULD</bcp14> use TLS 1.3. Production deployments <bcp14>SHOULD</bcp14> use mutual TLS with certificate pinning or pre-shared keys to prevent node impersonation.
This protocol implicitly trusts every node in the chain.
Mutual TLS does not defend against compromised nodes.
It only prevents untrusted nodes from joining the chain.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>



<reference anchor='RFC2119'>
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname='S. Bradner' initials='S.' surname='Bradner'/>
    <date month='March' year='1997'/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name='BCP' value='14'/>
  <seriesInfo name='RFC' value='2119'/>
  <seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>

<reference anchor='RFC8174'>
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname='B. Leiba' initials='B.' surname='Leiba'/>
    <date month='May' year='2017'/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name='BCP' value='14'/>
  <seriesInfo name='RFC' value='8174'/>
  <seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>




    </references>



<section numbered="false" anchor="Acknowledgements"><name>Acknowledgements</name>
<t>The author thanks Grok, an AI system developed by xAI, for assistance in drafting portions of this document based on provided specifications, for editing, for suggestions on the ROUND-ID mechanism for concurrent rounds, and the backward propagation of COMPLETE messages to ensure clean termination.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA51a7XIbO3L9P0+ByD8iqUjuleyq7PI6rtCUvFaVviLJdXNr
sxWDMyCJ1XDAHcyIZmy/yz5LniynuzGYGVLyvYl+UCQGQDca5/QHMMPhMPGV
LrL/0rkrzFhVZW0Suy75m69Of/rpTz+dJqmuxsoWc5f4eray3ltXVNs1+l+c
P3xIdGn0WP3ZFKbUebJZoLnIzNrgo6jUfRySJJlLC73CuKzU82qYueXKbE05
TJfaFn5bpMOfXidJZascfQ6m1HqP1rGaKPq/LF1h/1tXmEvdlq5yqcvV3JXq
viptClHm7zVEWp2r8y8mrbmjLdSlLYwu1Zn16DerK5OpW7s2OZr9QaJns9I8
jVUUl+S6wCJMkTxuxolSQ5W1I/m37yvDbeswI/8wjXj+5crMlGFo6vDLFp1x
YSGJrqulK8fJECr7sTpz9SLXHv/FSOgstmse3NXemzzvdnDljvHvjMfK0yU/
TV1dVOV2rD7d45dZaZtjJ2S2UbMX/8b6FPRwlLpVUrhyBWWfDFni7sP09OTk
T2P1St2d315OpucJwSL2SIbDodIzGEunVZJEiyrrlVa5XSyrjaFPpdfr3KZs
hWGuITfaQVVLXamyLrxyT2gvYVU9y416mN5iCUVhUhrlVVK5zkYYCJjbL9ja
XHabMaXcvLt5JCQ1MBtG+zpdiqxqabZhxwz9sKXKXQoQVdo/egKQF3z5Fl+8
pSoBdZQr8q0CnPHbQOFtI4QGYragyBI7Bu3ntlxBD1uRScCbbDtKHtAprp76
zV0Ne+Cb8ePk5IhW5sqNLjN1QEMItv5AbfSTGSSn9Him00d5DjaXVfPsdW9o
xGTzmJR/0xtuvkAxejhKWKvMeLso1KLWpS4qA7MFS/DybbGgFRdqs8QHkILu
amaAGiNLUzAuWySz8zkYAEBWdkXGJ9ElrGlL/GIDrp0tqmHlhvxlb7PJPy1a
cw6w+8vaq8KpFNPC77TEgj+AbQtjMpONBJIrm2W5SZJXIEdVuqzmWZPkShfb
Hj42rnyc527j1WHDZ7XG4vMc3/2KtnSl0yWahzlAVpAJIN3SF+gE6y8wS6Yr
3aCAH6zqvLJDsFNH/zWrPe9jC0mMD44i9GcEYF2rdV3xoIEyVTo6aiwX0Msg
beALBRseyGxKp6WDmHYLwgIgb2vwC24eZqywcQsMhoeweYNjQMmmdo2t76A1
uaeAQWiZ6bK0psTcjmcw5ApS0zo/gQkA7h5NMVxrtgYaFWyHB8MZ1pcpD/dE
oLBha2TJOWERCAJQaBT4z8DwxOg5nFNdEkhbD+Nd/oRJqiU03dhqCTN4S9MM
1LzOAbDMBKTAV2RMsSEhHchauBIDVsAhOylseeXWLneLrVi4hT883MlIXbtI
caabD1YjdJJ7KBvOR6Op5HTUCUmyMbZhE5SbqOE79Z4+RqMR/bvGmNcjNYWl
isjPIcSu9QJYIOYRV8XtXGPHC+uXxmNU351EkpkvmiW9OSyGcCkwuAdWAT+M
3wlnqkSgyDiwQngxJGKHFR0iS4Drn5z9qsT1GXX/MLl74GkyCEor8cCPP8cO
05ur28vzh3PCpgH2Qj8IOhoRJe9ExZWh3b1E6K2hmCzjEY4ZlMy8Orj6dP9w
MJD/6vqGv9+d//uni7vzM/p+/3FyeRm/JKHH/cebT5dn7bd2JLS6Or8+k8Fo
Vb2m5OBq8iue0BoObm4fLm6uJ5cH4tEtAT6tSV+liYUO3CH0mnJdGlq/9glc
YQqnQq6+UO+nt//zj5M36uvXfwoR9Pv38OOPJ//yBj/Igw5UjCbyk+JSgkBJ
0Yx4jVif6rWtdA7uIkz4pdsgsBhmwvFfyDJ/Hau3s3R98uZdaKAF9xobm/Ua
2Wb7LXuDxYjPND0jJlqz175j6b6+k197vxu7dxoJLw8NOclcUwqpi7qUfKrB
fojxlJmQHyDvmSKmLyxFdUYymKzwd/gR/DwC/d4y/+hzyp9EQ/p/rQ4f4G2O
kuScoNvw/rFAjMAcx4okXtwqnWUlPSCd1q6syE3Ziry7IcfjPcjEwjjAF+DF
0W8PRorSDCUlekN/WRrgowyZBM08UNRpQP6VwYg8w2qEhEOkaMjMKYWal27F
bgpqeVOk5g9I1ug/SdRdZf8QZTdL19nfNHlQhAUkSMgPi4qSdvaz4p8RChBK
qcvMRo7D4P1YzpxHDKmM51gCDenvm7qCq8NMFLDlD23hW3L/6/VUhX4XheUU
jLbV/Ix0xbI/JHclnqm7yh3jB39NnEEERvRzHDRcGMmJDOd+ICG77qNEnoho
DjdIAxdMfgwjKbmZt/HxZ94kz7k3DwydOltp5xwtBVa/TB6mH8PsHzVnA+zh
4TjEsdLs5Pv7C40+9fm1BhEM7kTmCQuoS8oB8ibfpfkIaW2+m8Sp0f0yNjcR
JussMPbEGnfgCgWQWh3RVl9JpFEPKBix41dN4CHXKRFaTe6nFxeqMl8qDr/Y
EKCXUjlYYbZVlx9GCBJIClZU1XBgQsEB9n1+S45kcn327i/jt3c3n67Phhdn
7/76n8XnJDkz0BidaRh4JWT9zHvS6/yZmtlE+83NAneeQG78+Zl23q0D0glS
He+mDs1oMRqoT58uzo7ISr5eM785v6OVgxapbIkEXUqGBS8o9bqkURdkKYKd
loQYBRJnnxwvKMxK0Ea6ojnJVvCmyq3IPVRMuVgw34CowV2+QjMnmSdgGmwc
agt4VSS8LFgdfgj1wy9Ilo7IiEykw8nR4Bm6DAKjGJZM2sgtzuQMLVF24fMe
bEaY/JwzT8eujfOOwFjQjqYbkd8ryOnBvRhLoprZWGSXBcfHEHl8HCoSv6uo
rf6Puvb0ZDXYKR9eH1HWR3kw9x0Ek55KRg2g15WjApmljzpGPyWj39P61ENp
Fwss+bZJ8Mjy75uyLJpeHHy9xlMWSQAIQoO6jORo2q45aE3R3bHboXVMin6w
IJsHCWJhEtHMypbqbRkdCiAjvv8N4eiFBPiqJ50VIp/GcbolW0dMd4bjEOOe
V20QYuPeiglIBvObsHaJS0AB1BDHSL3CTsXChctfELutwHIkdozCm8Oikz3T
4E51LHUT45YzhJdLAohkragA7eC8C4/XBI+2aHgWInvknMhskCRGlsOUyJUf
G7nFx49ME8CvRVJTefBcFCn2mMVTYc4YLjrsavXZjyGVLLjbRiwkO1FOsl9N
tXv9TF017RVXHTO/ITNHqt12KqxzqrB+Jwvj4gIOW537KLSrwDQo95INdjFM
njxGxJdIS1veBuTf3PVWv/+3Fs/z8YeydubgdD2wi3dyLuWV0K7DK6IRh50O
tagckiOnJZXxDUmzHotfYdcka4qM4JRTRHdDNeqs0lGeC/nHx+vaL+V44vh4
zOKFpJSvgLsIJY8cqonLh0fPZmH/7Dnx9ehqqhC3dhO1hjzMGZLZ260RbbTO
YbCCz1d7OmKXUAblP5aaJO8dHYWEcSHrYlNZmJYNdP5FcxLW5GkfcrdBeB++
H06HZ0h/z8YhKCpkkuNAZ5VMr8Yt3lSSTEb0954/p/x5huZvw7uz4btv/Dt8
xoyDHktTt1Pb2n222/p2eP8w/BbjaHwq7e1M3d898a93ZwxPJzHh6BCV1jG9
2l3HpPV9xI/3zch2WZ0xeNzrPd3r3R2Dx73eZy/07i3pzb6RMNk3DI5zdQ1F
z/j7f6AHHSZ5MVjbzp8j6BKfdtvD0/fxaa89PJ3IU67bz8sSkP+I9eRU5oUI
22Sl5NAKSaPpsM4ZzyUMFap8kKIMD1+G4XxqTvGTIjsF0bWrwtF852rBi0tp
z8PkjMXTCXWvG7uQVV3VLN18SfPaE+P6QpVHAaxL63w4tH9e5kpv1ZOmNLZQ
M+LfEoyaa+T8wr8MborPyUgXegYuswi6w4gPeQD5SIcJH40sIwqMmqBSyC0a
+bgImVQO+srxINNaJGL5Txalk5xf3lMVAsBsjKwbFfzGVnArAFn6yAesdAEh
jZjh8GSgTgfq9YBuCzZsdi5RmufiU+Qchs5zuxcrYc5Uw/m5nAoPGZzTmbTj
KpGrl6ABFVC07dRcbVyUMVIf6pKLAh+UZwG9CybbVEikg+to0NUTcCImybmc
Dkfcda7LkEbIgSpt55asWK8zOqiAkbdjFc1QkS9/84JOWc0JAUmu14tSUz4d
VneKXUHxZenEhQ5OlkgrNqRVONBmQBSURCopWWa8HwUVxSMlZ1uGT/FTE88i
vQVq5aYTNY59JIcV1x40gCQCX2MV5CcrTpO6lsGOIExdFLJ/up13sHOAERaD
zTtFoT+CZqHl9RFdMeaUM3bxEE7jqSh1ddU7xoh2AQP42qi34CvoSFeAA7Sk
AhsmBS20ockLyokelNrQEfb99dUtXdOsCVt2zjuL9NVUdN2DHA4ZroHN2Ta7
qY/kc9Uz6vGh/i6XmDmSlghTXoQoluzoZpYuSwMp2isjvrfUlX4OY71+cp8m
Xg5P+eaJdnNpF8uc3ZBcnoYsNKhGPfjGBnBMgzKBGQ1+WxkMCoZaijAj6T3f
4c4abSImKXVslkj4NphwZmDVHQz4pZ1XDUsgGDmktzOb041P8NgYm2MMDAST
h0M02zsDgV7zpgrZuWotFn5/HYPdxHfJICE7CJp6GovBajnqlQRebrEDBDsC
u0idmVTX/nfYecBT2RyN/fNRtWk45Ov53KY2HDVGHZ9T4PyJs0tXL5Ztjy5L
bNVyU2INe0DysRu9hX+9KYxwabN0eWNJGRIzdgmejBLKvvl6Xhxm6ko+7w1b
ygpIYQu/tXGDBraLMlyMdyAc9eJD6fIpBEY+2NqZjG91fbhxod4Vu5FdTpAz
QZgsambp6+ci3v6NLB/f9e9kIaXaGFiWWU1pM3pjW6cDdTZQ55JMfHghDjBj
fqeYbXPTHqrHnbSj6zYoQu6wTqoBuDFK39fGUTbfphSSeAAiVDj0rqCj4SMD
qTsEc9Ii2GkOiJv0pcg6PpT0kKO67rx+B5u3plzqNa9yvXTiOZE+gVrNdlTL
0pg2YxHH2VVCgluD23iVnW+jX4u24uth1tV2Lr1HyUXVEF7nnvGT0g1+Gyp3
lGDFWIcmOLcpV5sDyUa1WnIhSPlMJyEMhJY7dqnF1iXX7Q12xYa0lJfyzb1h
JKNJlnrTSGbaRp2YYBfGshhRNu5o0cij4yuS7qMP23e5Ktz2dfammcfDw1m4
q/b4wAFOK2TydFUkqa4AMkj58YARlwwXk+sJXfF5JK9lANfXV9T6PdQPK7PC
8AL5esYVA194w8PSrNRP5rk3KaIBnMjeXM0TzDftvG4S1klWeLi8VycjOJHb
+OIIlr7O3VZurDtdpYDgERzwUoPsck4wAC9tOK+nN53M0CP3A5QfzVZK+ZJe
pKlCMFvRVZqTd8RGu3US1e6p5SNMekWvd+jYI15y1aoT66kMXoOSogXd3XFW
g5lXlt7D4JDFRJEXckQlfrmBBDU9BON/c7ZoXEAQJ6/aUIpEJp+kFDhB10W4
2f/6arfpe/J1rIp6NaN3Xv71YA5imoPvjF95F47IWTx69efSPZKzVZML5bdQ
BSiBcrlbywXRl8nFQF5X8HQDqUN6zC8Zcg7gyk412L2/lzdQXBErpAhLQYhM
azJOWeWHrxcLAEzmE3s3t0FAI2xR0ItC1HPvcmcQ3VV842rdOc2FdvFEJZ4w
s2f35H9SfhekCcYMjf8FRlGkxcApAAA=

-->

</rfc>

