<?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.20 (Ruby 3.3.5) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC9000 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
<!ENTITY I-D.ietf-moq-transport SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-moq-transport.xml">
<!ENTITY RFC9438 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9438.xml">
<!ENTITY I-D.ietf-ccwg-bbr SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-ccwg-bbr.xml">
<!ENTITY RFC6817 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6817.xml">
<!ENTITY RFC6582 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6582.xml">
<!ENTITY RFC3649 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3649.xml">
<!ENTITY I-D.irtf-iccrg-ledbat-plus-plus SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.irtf-iccrg-ledbat-plus-plus.xml">
<!ENTITY RFC9330 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9330.xml">
<!ENTITY RFC9331 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9331.xml">
<!ENTITY RFC9959 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9959.xml">
<!ENTITY I-D.briscoe-iccrg-prague-congestion-control SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.briscoe-iccrg-prague-congestion-control.xml">
]>


<rfc ipr="trust200902" docName="draft-huitema-ccwg-c4-design-04" category="info" consensus="true" submissionType="IETF">
  <front>
    <title abbrev="C4 Design">Design of Christian's Congestion Control Code (C4)</title>

    <author initials="C." surname="Huitema" fullname="Christian Huitema">
      <organization>Private Octopus Inc.</organization>
      <address>
        <email>huitema@huitema.net</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="C." surname="Jennings" fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@iii.ca</email>
      </address>
    </author>

    <date year="2026" month="July" day="05"/>

    <area>Web and Internet Transport</area>
    
    <keyword>C4</keyword> <keyword>Congestion Control</keyword> <keyword>Realtime Communication</keyword> <keyword>Media over QUIC</keyword>

    <abstract>


<?line 109?>

<t>Christian's Congestion Control Code is a new congestion control
algorithm designed to support Real-Time applications such as
Media over QUIC. It is designed to drive towards low delays,
with good support for the "application limited" behavior
frequently found when using variable rate encoding, and
with fast reaction to congestion to avoid the "priority
inversion" happening when congestion control overestimates
the available capacity. It pays special attention to the
high jitter conditions encountered in Wi-Fi networks.
The design emphasizes simplicity and
avoids making too many assumption about the "model" of
the network. The main control variables are the estimate
of the data rate and of the maximum path delay in the
absence of queues.</t>



    </abstract>



  </front>

  <middle>


<?line 126?>

<section anchor="introduction"><name>Introduction</name>

<t>Christian's Congestion Control Code (C4) is a new congestion control
algorithm designed to support Real-Time multimedia applications, specifically
multimedia applications using QUIC <xref target="RFC9000"/> and the Media
over QUIC transport <xref target="I-D.ietf-moq-transport"/>. These applications
require low delays, and often exhibit a variable data rate as they
alternate high bandwidth requirements when sending reference frames
and lower bandwith requirements when sending differential frames.
We translate that into 3 main goals:</t>

<t><list style="symbols">
  <t>Drive towards low delays (see <xref target="react-to-delays"/>),</t>
  <t>Support "application limited" behavior (see <xref target="limited"/>),</t>
  <t>React quickly to changing network conditions (see <xref target="congestion"/>).</t>
</list></t>

<t>The design of C4 is inspired by our experience using different
congestion control algorithms for QUIC,
notably Cubic <xref target="RFC9438"/>, Hystart <xref target="HyStart"/>, and BBR <xref target="I-D.ietf-ccwg-bbr"/>,
as well as the study
of delay-oriented algorithms such as TCP Vegas <xref target="TCP-Vegas"/>
and LEDBAT <xref target="RFC6817"/>. In addition, we wanted to keep the algorithm
simple and easy to implement.</t>

<t>C4 assumes that the transport stack is
capable of signaling to the congestion algorithms events such
as acknowledgements, RTT measurements, ECN signals or the detection
of packet losses. It also assumes that the congestion algorithm
controls the transport stack by setting the congestion window
(CWND) and the pacing rate.</t>

<t>C4 tracks the state of the network by keeping a small set of
variables, the main ones being 
the "nominal rate", the "nominal max RTT",
and the current state of the algorithm. The details on using and
tracking the min RTT are discussed in <xref target="react-to-delays"/>.</t>

<t>The nominal rate is the pacing rate corresponding to the most recent
estimate of the bandwidth available to the connection.
The nominal max RTT is the best estimate of the maximum RTT
that can occur on the network in the absence of queues. When we
do not observe delay jitter, this coincides with the min RTT.
In the presence of jitter, it should be the sum of the
min RTT and the maximum jitter. C4 will compute a pacing
rate as the nominal rate multiplied by a coefficient that
depends on the state of the protocol, and set the CWND for
the path to the product of that pacing rate by the max RTT.
The design of these mechanisms is
discussed in <xref target="congestion"/>.</t>

<t>Over time, we updated C4 to:</t>

<t><list style="symbols">
  <t>Focus on the pacing rate as the control variable, and use an estimation of
the largest path RTT to set the CWND, as explained in <xref target="simplify"/></t>
  <t>Improve the handling of congestion response, growth cascade and
careful resume, as explained in <xref target="revision-after-second-design"/></t>
</list></t>

</section>
<section anchor="react-to-delays"><name>Studying the reaction to delays</name>

<t>The current design of C4 is the result of a series of experiments.
Our initial design was to monitor delays and react to
dellay increases in much the same way as
congestion control algorithms like TCP Vegas or LEDBAT:</t>

<t><list style="symbols">
  <t>monitor the current RTT and the min RTT</t>
  <t>if the current RTT sample exceed the min RTT by more than a preset
margin, treat that as a congestion signal.</t>
</list></t>

<t>The "preset margin" is set by default to 10 ms in TCP Vegas and LEDBAT.
That was adequate when these algorithms were designed, but it can be
considered excessive in high speed low latency networks.
For the initial C4 design, we set it to the lowest of 1/8th of the min RTT and 25ms.</t>

<t>The min RTT itself is measured over time. The detection of congestion by comparing
delays to min RTT plus margin works well, except in two conditions:</t>

<t><list style="symbols">
  <t>if the C4 connection is competing with a another connection that
does not react to delay variations, such as a connection using Cubic,</t>
  <t>if the network exhibits a lot of latency jitter, as happens on
some Wi-Fi networks.</t>
</list></t>

<t>We also know that if several connection using delay-based algorithms
compete, the competition is only fair if they all have the same
estimate of the min RTT. We handle that by using a "periodic slow down"
mechanism.</t>

<section anchor="vegas-struggle"><name>Managing Competition with Loss Based Algorithms</name>

<t>Competition between Cubic and a delay based algorithm leads to Cubic
consuming all the bandwidth and the delay based connection starving.
This phenomenon force TCP Vegas to only be deployed in controlled
environments, in which it does not have to compete with
TCP Reno <xref target="RFC6582"/> or Cubic.</t>

<t>We handled this competition issue by using a simple detection algorithm.
If C4 detected competition with a loss based algorithm, it switched
to a "pig war" mode and stopped reacting to changes in delays -- it would
instead only react to packet losses and ECN signals. In that mode,
we used another algorithm to detect when the competition has ceased,
and switch back to the delay responsive mode.</t>

<t>In our initial deployments, we detected competition when delay based
congestion notifications leads to CWND and rate
reduction for more than 3
consecutive RTT. The assumption is that if the competition reacted to delays
variations, it would have reacted to the delay increases before
3 RTT. However, that simple test caused many "false positive"
detections.</t>

<t>We refined this test to start the pig war
if we observed 4 consecutive delay-based rate reductions
and the nominal CWND was less than half the max nominal CWND
observed since the last "initial" phase, or if we observed
at least 5 reductions and the nominal CWND is less than 4/5th of
the max nominal CWND.</t>

<t>We validated this test by comparing the
ratio <spanx style="verb">CWND/MAX_CWND</spanx> for "valid" decisions, when we are simulating
a competition scenario, and "spurious" decisions, when the
"more than 3 consecutive reductions" test fires but we are
not simulating any competition:</t>

<texttable>
      <ttcol align='left'>Ratio CWND/Max</ttcol>
      <ttcol align='left'>valid</ttcol>
      <ttcol align='left'>spurious</ttcol>
      <c>Average</c>
      <c>30%</c>
      <c>75%</c>
      <c>Max</c>
      <c>49%</c>
      <c>100%</c>
      <c>Top 25%</c>
      <c>37%</c>
      <c>91%</c>
      <c>Media</c>
      <c>35%</c>
      <c>83%</c>
      <c>Bottom 25%</c>
      <c>20%</c>
      <c>52%</c>
      <c>Min</c>
      <c>12%</c>
      <c>25%</c>
      <c>&lt;50%</c>
      <c>100%</c>
      <c>20%</c>
</texttable>

<t>Note that this validation was based on simulations, and that we cannot
claim that our simulations perfectly reflect the real world. We will
discuss in <xref target="simplify"/> how this imperfections lead us to use change
our overall design.</t>

<t>Our initial exit competition algorithm was simple. C4 will exit the
"pig war" mode if the available bandwidth increases.</t>

</section>
<section anchor="handling-chaotic-delays"><name>Handling Chaotic Delays</name>

<t>Some Wi-Fi networks exhibit spikes in latency. These spikes are
probably what caused the delay jitter discussed in
<xref target="Cubic-QUIC-Blog"/>. We discussed them in more details in
<xref target="Wi-Fi-Suspension-Blog"/>. We are not sure about the
mechanism behind these spikes, but we have noticed that they
mostly happen when several adjacent Wi-Fi networks are configured
to use the same frequencies and channels. In these configurations,
we expect the hidden node problem to result in some collisions.
The Wi-Fi layer 2 retransmission algorithm takes care of these
losses, but apparently uses an exponential back off algorithm
to space retransmission delays in case of repeated collisions.
When repeated collisions occur, the exponential backoff mechanism
can cause large delays. The Wi-Fi layer 2 algorithm will also
try to maintain delivery order, and subsequent packets will
be queued behind the packet that caused the collisions.</t>

<t>In our initial design, we detected the advent of such "chaotic delay jitter" by computing
a running estimate of the max RTT. We measured the max RTT observed
in each round trip, to obtain the "era max RTT". We then computed
an exponentially averaged "nominal max RTT":</t>

<figure><artwork><![CDATA[
nominal_max_rtt = (7 * nominal_max_rtt + era_max_rtt) / 8;
]]></artwork></figure>

<t>If the nominal max RTT was more than twice the min RTT, we set the
"chaotic jitter" condition. When that condition was set, we stopped
considering excess delay as an indication of congestion,
and we changed
the way we computed the "current CWND" used for the controlled
path. Instead of simply setting it to "nominal CWND", we set it
to a larger value:</t>

<figure><artwork><![CDATA[
target_cwnd = alpha*nominal_cwnd +
              (max_bytes_acked - nominal_cwnd) / 2;
]]></artwork></figure>
<t>In this formula, <spanx style="verb">alpha</spanx> is the amplification coefficient corresponding
to the current state, such as for example 1 if "cruising" or 1.25
if "pushing" (see <xref target="congestion"/>), and <spanx style="verb">max_bytes_acked</spanx> is the largest
amount of bytes in flight that was succesfully acknowledged since
the last initial phase.</t>

<t>The increased <spanx style="verb">target_cwnd</spanx> enabled C4 to keep sending data through
most jitter events. There is of course a risk that this increased
value will cause congestion. We limit that risk by only using half
the value of <spanx style="verb">max_bytes_ack</spanx>, and by the setting a
conservative pacing rate:</t>

<figure><artwork><![CDATA[
target_rate = alpha*nominal_rate;
]]></artwork></figure>
<t>Using the pacing rate that way prevents the larger window to
cause big spikes in traffic.</t>

<t>The network conditions can evolve over time. C4 will keep monitoring
the nominal max RTT, and will reset the "chaotic jitter" condition
if nominal max RTT decreases below a threshold of 1.5 times the
min RTT.</t>

</section>
<section anchor="slowdown"><name>Monitor min RTT</name>

<t>Delay based algorithm rely on a correct estimate of the
min RTT. They will naturally discover a reduction in the min
RTT, but detecting an increase in the max RTT is difficult.
There are known failure modes when multiple delay based
algorithms compete, in particular the "late comer advantage".</t>

<t>In our initial design, the connections ensured that their min RTT is valid by
occasionally entering a "slowdown" period, during which they set
CWND to half the nominal value. This is similar to
the "Probe RTT" mechanism implemented in BBR, or the
"initial and periodic slowdown" proposed as extension
to LEDBAT in <xref target="I-D.irtf-iccrg-ledbat-plus-plus"/>. In our
implementation, the slowdown occurs if more than 5
seconds have elapsed since the previous slowdown, or
since the last time the min RTT was set.</t>

<t>The measurement of min RTT in the period
that follows the slowdown is considered a "clean"
measurement. If two consecutive slowdown periods were
followed by clean measurements larger than the current
min RTT, we detect an RTT change and reset the
connection. If the measurement results in the same
value as the previous min RTT, C4 continue normal
operation.</t>

<t>Some applications exhibit periods of natural slow down. This
is the case for example of multimedia applications, when
they only send differentially encoded frames. Natural
slowdown was detected if an application sent less than
half the nominal CWND during a period, and more than 4 seconds
had elapsed since the previous slowdown or the previous
min RTT update. The measurement that follows a natural
slowdown was also considered a clean measurement.</t>

<t>A slowdown period corresponds to a reduction in offered
traffic. If multiple connections are competing for the same
bottleneck, each of these connections may experience cleaner
RTT measurements, leading to equalization of the min RTT
observed by these connections.</t>

</section>
</section>
<section anchor="simplify"><name>Simplifying the initial design</name>

<t>After extensive testing of our initial design, we felt we had
drifted away from our initial "simplicity" tenet. The algorithms
used to detect "pig war" and "chaotic jitter" were difficult
to tune, and despite our efforts they resulted in many
false positive or false negative. The "slowdown" algorithm
made C4 less friendly to "real time" applications that
prefer using stable estimated rates. These algorithms
interacted with each other in ways that were sometimes
hard to predict.</t>

<section anchor="chaotic-jitter-and-rate-control"><name>Chaotic jitter and rate control</name>

<t>As we observed the chaotic jitter behavior, we came to the
conclusion that only controlling the CWND did not work well.
we had a dilemma: either use a small CWND to guarantee that
RTTs remain small, or use a large CWND so that transmission
would not stall during peaks in jitter. But if we use a large
CWND, we need some form of pacing to prevent senders from
sending a large amount of packets too quickly. And then we
realized that if we do have to set a pacing rate, we can simplify
the algorithm.</t>

<t>Suppose that we compute a pacing rate that matches the network
capacity, just like BBR does. Then, in first approximation, the
setting the CWND too high does not matter too much. 
The number of bytes in flight will be limited by the product
of the pacing rate by the actual RTT. We are thus free to
set the CWND to a large value.</t>

</section>
<section anchor="monitoring-the-nominal-max-rtt"><name>Monitoring the nominal max RTT</name>

<t>The observation on chaotic jitter leads to the idea of monitoring
the maximum RTT. There is some difficulty here, because the
observed RTT has three components:</t>

<t><list style="symbols">
  <t>The minimum RTT in the absence of jitter</t>
  <t>The jitter caused by access networks such as Wi-Fi</t>
  <t>The delays caused by queues in the network</t>
</list></t>

<t>We cannot merely use the maximum value of the observed RTT,
because of the queing delay component. In pushing periods, we
are going to use data rate slightly higher than the measured
value. This will create a bit of queuing, pushing the queing
delay component ever higher -- and eventually resulting in
"buffer bloat".</t>

<t>To avoid that, we can have periodic periods in which the
endpoint sends data at deliberately slower than the
rate estimate. This would enable a "clean" measurement
of the Max RTT.</t>

<t>However, tests showed that only measuring
the Max RTT during recovery periods is not reactive enough.
For example, if the underlying RTT changes, we would need to wait
up to 6 RTT before registering the change. In practice, we can
measure the Max RTT in both the "recovery" and "cruising"
periods, i.e., all the periods in which data is sent at most
at the "nominal data rate".</t>

<t>If we are dealing with jitter, the clean Max RTT measurements
will include whatever jitter was happening at the time of the
measurement. It is not sufficient to measure the Max RTT once,
we must keep the maximum value of a long enough series of measurement
to capture the maximum jitter than the network can cause. But
we are also aware that jitter conditions change over time, so
we have to make sure that if the jitter diminished, the
Max RTT also diminishes.</t>

<t>We solved that by measuring the Max RTT during the "recovery"
periods that follow every "push". These periods occur about every 6 RTT,
giving us reasonably frequent measurements. During these periods, we
try to ensure clean measurements by
setting the pacing rate a bit lower than the nominal rate -- 6.25%
slower in our initial trials. We apply the following algorithm:</t>

<t><list style="symbols">
  <t>compute the <spanx style="verb">max_rtt_sample</spanx> as the maximum RTT observed for
packets sent during the recovery period.</t>
  <t>if the <spanx style="verb">max_rtt_sample</spanx> is more than <spanx style="verb">max_jitter</spanx> above
<spanx style="verb">running_min_rtt</spanx>, reset it to <spanx style="verb">running_min_rtt + max_jitter</spanx>
(by default, <spanx style="verb">max_jitter</spanx> is set to 250ms).</t>
  <t>if <spanx style="verb">max_rtt_sample</spanx> is larger than <spanx style="verb">nominal_max_rtt</spanx>, set
<spanx style="verb">nominal_max_rtt</spanx> to that value.</t>
  <t>else, set <spanx style="verb">nominal_max_rtt</spanx> to:</t>
</list></t>

<figure><artwork><![CDATA[
   nominal_max_rtt = gamma*max_rtt_sample + 
                     (1-gamma)*nominal_max_rtt
]]></artwork></figure>

<t>The <spanx style="verb">gamma</spanx> coefficient is set to <spanx style="verb">1/8</spanx> in our initial trials.</t>

<section anchor="preventing-runaway-max-rtt"><name>Preventing Runaway Max RTT</name>

<t>Computing Max RTT the way we do bears the risk of "run away increase"
of Max RTT:</t>

<t><list style="symbols">
  <t>C4 notices high jitter, increases Nominal Max RTT accordingly, set CWND to the
product of the increased Nominal Max RTT and Nominal Rate</t>
  <t>If Nominal rate is above the actual link rate, C4 will fill the pipe, and create a queue.</t>
  <t>On the next measurement, C4 finds that the max RTT has increased because of the queue,
interprets that as "more jitter", increases Max RTT and fills the queue some more.</t>
  <t>Repeat until the queue become so large that packets are dropped and cause a
congestion event.</t>
</list></t>

<t>Our proposed algorithm limits the Max RTT to at most <spanx style="verb">running_min_rtt + max_jitter</spanx>,
but that is still risky. If congestion causes queues, the running measurements of <spanx style="verb">min RTT</spanx>
will increase, causing the algorithm to allow for corresponding increases in <spanx style="verb">max RTT</spanx>.
This would not happen as fast as without the capping to <spanx style="verb">running_min_rtt + max_jitter</spanx>,
but it would still increase.</t>

</section>
<section anchor="initial-phase-and-max-rtt"><name>Initial Phase and Max RTT</name>

<t>During the initial phase, the nominal max RTT and the running min RTT are
set to the first RTT value that is measured. This is not great in presence
of high jitter, which causes C4 to exit the Initial phase early, leaving
the nominal rate way too low. If C4 is competing on the Wi-Fi link
against another connection, it might remain stalled at this low data rate.</t>

<t>We considered updating the Max RTT during the Initial phase, but that
prevents any detection of delay based congestion. The Initial phase
would continue until path buffers are full, a classic case of buffer
bloat. Instead, we adopted a simple workaround:</t>

<t><list style="symbols">
  <t>Maintain a flag "initial_after_jitter", initialized to 0.</t>
  <t>Get a measure of the max RTT after exit from initial.</t>
  <t>If C4 detects a "high jitter" condition and the
"initial_after_jitter" flag is still 0, set the
flag to 1 and re-enter the "initial" state.</t>
</list></t>

<t>Empirically, we detect high jitter in that case if the "running min RTT"
is less that 2/5th of the "nominal max RTT".</t>

</section>
</section>
<section anchor="monitor-rate"><name>Monitoring the nominal rate</name>

<t>The nominal rate is measured on each acknowledgement by dividing
the number of bytes acknowledged since the packet was sent
by the RTT measured with the acknowledgement of the packet,
protecting against delay jitter as explained in
<xref target="rate-measurement"/>, without additional filtering
as discussed in <xref target="not-filtering"/>.</t>

<t>We only use the measurements to increase the nominal rate,
replacing the current value if we observe a greater filtered measurement.
This is a deliberate choice, as decreases in measurement are ambiguous.
They can result from the application being rate limited, or from
measurement noises. Following those causes random decrease over time,
which can be detrimental for rate limited applications.
If the network conditions have changed, the rate will
be reduced if congestion signals are received, as explained
in <xref target="congestion"/>.</t>

<section anchor="rate-measurement"><name>Rate measurement</name>

<t>The simple algorithm protects from underestimation of the
delay by observing that
delivery rates cannot be larger than the rate at which the
packets were sent, thus keeping the lower of the estimated
receive rate and the send rate.</t>

<t>The algorithm uses four input variables:</t>

<t><list style="symbols">
  <t><spanx style="verb">current_time</spanx>: the time when the acknowledment is received.</t>
  <t><spanx style="verb">send_time</spanx>: the time at which the highest acknowledged
packet was sent.</t>
  <t><spanx style="verb">bytes_acknowledged</spanx>: the number of bytes acknowledged
 by the receiver between <spanx style="verb">send_time</spanx> and <spanx style="verb">current_time</spanx></t>
  <t><spanx style="verb">first_sent</spanx>: the time at which the packet containing
the first acknowledged bytes was sent.</t>
</list></t>

<t>The computation goes as follow:</t>

<figure><artwork><![CDATA[
ack_delay = current_time - send_time
send_delay = send_time - first_sent
measured_rate = bytes_acknowledged /
                max(ack_delay, send_delay)
]]></artwork></figure>

<t>This is in line with the specification of rate measurement
in <xref target="I-D.ietf-ccwg-bbr"/>.</t>

<t>We use the data rate measurement to update the
nominal rate, but only if not congested (see <xref target="congestion-bounce"/>)</t>

<figure><artwork><![CDATA[
if measured_rate > nominal_rate and not congested:
    nominal_rate = measured_rate
]]></artwork></figure>

</section>
<section anchor="congestion-bounce"><name>Avoiding Congestion Bounce</name>

<t>In our early experiments, we observed a "congestion bounce"
that happened as follow:</t>

<t><list style="symbols">
  <t>congestion is detected, the nominal rate is reduced, and
C4 enters recovery.</t>
  <t>packets sent at the data rate that caused the congestion
continue to be acknowledged during recovery.</t>
  <t>if enough packets are acknowledged, they will cause
a rate measurement close to the previous nominal rate.</t>
  <t>if C4 accepts this new nominal rate, the flow will
bounce back to the previous transmission rate, erasing
the effects of the congestion signal.</t>
</list></t>

<t>Since we do not want that to happen, we specify that the
nominal rate cannot be updated during congested periods,
defined as:</t>

<t><list style="symbols">
  <t>C4 is in "recovery" state,</t>
  <t>The recovery state was entered following a congestion signal,
or a congestion signal was received since the beginning
of the recovery era.</t>
</list></t>

</section>
<section anchor="not-filtering"><name>Not filtering the measurements</name>

<t>There is some noise in the measurements of the data rate, and we
protect against that noise by retaining the maximum of the
<spanx style="verb">ack_delay</spanx> and the <spanx style="verb">send_delay</spanx>. During early experiments,
we considered smoothing the measurements for eliminating that
noise.</t>

<t>The best filter that we could defined operated by
smoothing the inverse of the data rate, the "time per byte sent".
This works better because the data rate measurements are the
quotient of the number of bytes received by the delay.
The number of bytes received is
easy to assert, but the measurement of the delays are very noisy.
Instead of trying to average the data rates, we can average
their inverse, i.e., the quotients of the delay by the
bytes received, the times per byte. Then we can obtain
smoothed data rates as the inverse of these times per byte,
effectively computing an harmonic average of measurements
over time. We could for example 
compute an exponentially weighted moving average
of the time per byte, and use the inverse of that
as a filtered measurement of the data rate.</t>

<t>We do not specify any such filter in C4, because while
filtering will reduce the noise, we will also delay
any observation, resulting into a somewhat sluggish
response to change in network conditions. Experience
shows that the precaution of using the max of the
ack delay and the send delay as a divider is sufficient
for stable operation, and does not cause the response
delays that filtering would.</t>

</section>
</section>
<section anchor="early-congestion-modification"><name>Early Congestion Modification</name>

<t>We want C4 to handle Early Congestion Notification in a manner
compatible with the L4S design. For that, we monitor
the evolving ratio of CE marks that the L4S specification
designates as <spanx style="verb">alpha</spanx>
(we use <spanx style="verb">ecn_alpha</spanx> here to avoid confusion),
and we detect congestion if the ratio grows over a threshold.</t>

<t>We did not find a recommended algorithm for computing <spanx style="verb">ecn_alpha</spanx>
in either <xref target="RFC9330"/> or <xref target="RFC9331"/>, but we could get some
concrete suggestions in <xref target="I-D.briscoe-iccrg-prague-congestion-control"/>.
That draft, now obsolete, suggests updating the ratio once per
RTT, as the exponential weighted average of the fraction of
CE marks per packet:</t>

<figure><artwork><![CDATA[
frac = nb_CE / (nb_CE + nb_ECT1)
ecn_alpha += (frac - ecn_alpha)/16
]]></artwork></figure>

<t>This kind of averaging introduces a reaction delay. The draft suggests mitigating that
delay by preempting the averaging if the fraction is large:</t>

<figure><artwork><![CDATA[
if frac > 0.5:
    ecn_alpha = frac
]]></artwork></figure>

<t>We followed that design, but decided to update the coefficient after
each acknowledgement, instead of after each RTT. This is in line with
our implementation of "delayed acknowledgements" in QUIC, which
results in a small number of acknowledgements per RTT.</t>

<t>The reaction of C4 to an excess of CE marks is similar to the
reaction to excess delays or to packet losses, see <xref target="congestion"/>.</t>

</section>
</section>
<section anchor="competition-with-other-algorithms"><name>Competition with other algorithms</name>

<t>We saw in <xref target="vegas-struggle"/> that delay based algorithms required
a special "escape mode" when facing competition from algorithms
like Cubic. Relying on pacing rate and max RTT instead of CWND
and min RTT makes this problem much simpler. The measured max RTT
will naturally increase as algorithms like Cubic cause buffer
bloat and increased queues. Instead of being shut down,
C4 will just keep increasing its max RTT and thus its running
CWND, automatically matching the other algorithm's values.</t>

<t>We verified that behavior in a number of simulations. We also
verified that when the competition ceases, C4 will progressively
drop its nominal max RTT, returning to situations with very low
queuing delays.</t>

<section anchor="no-need-for-slowdowns"><name>No need for slowdowns</name>

<t>The fairness of delay based algorithm depends on all competing
flows having similar estimates of the min RTT. As discussed
in <xref target="slowdown"/>, this ends up creating variants of the
<spanx style="verb">latecomer advantage</spanx> issue, requiring a periodic slowdown
mechanism to ensure that all competing flow have chance to
update the RTT value.</t>

<t>This problem is caused by the default algorithm of setting
min RTT to the minimum of all RTT sample values since the beginning 
of the connection. Flows that started more recently compute
that minimum over a longer period, and thus discover a larger
min RTT than older flows. This problem does not exist with
max RTT, because all competing flows see the same max RTT
value. The slowdown mechanism is thus not necessary.</t>

<t>Removing the need for a slowdown mechanism allows for a
simpler protocol, better suited to real time communications.</t>

</section>
</section>
<section anchor="congestion"><name>React quickly to changing network conditions</name>

<t>Our focus is on maintaining low delays, and thus reacting
quickly to changes in network conditions. We can detect some of these
changes by monitoring the RTT and the data rate, but
experience with the early version of BBR showed that
completely ignoring packet losses can lead to very unfair
competition with Cubic. The L4S effort is promoting the use
of ECN feedback by network elements (see <xref target="RFC9331"/>),
which could well end up detecting congestion and queues
more precisely than the monitoring of end-to-end delays.
C4 will thus detect changing network conditions by monitoring
3 congestion control signals:</t>

<t><list style="numbers" type="1">
  <t>Excessive increase of measured RTT (above the nominal Max RTT),</t>
  <t>Excessive rate of packet losses (but not mere Probe Time Out, see <xref target="no-pto"/>),</t>
  <t>Excessive rate of ECN/CE marks</t>
</list></t>

<t>If any of these signals is detected, C4 enters a "recovery"
state. On entering recovery, C4 reduces the <spanx style="verb">nominal_rate</spanx>
by a factor "beta":</t>

<figure><artwork><![CDATA[
    # on congestion detected:
    nominal_rate = (1-beta)*nominal_rate
]]></artwork></figure>
<t>The cofficient <spanx style="verb">beta</spanx> differs depending on the nature of the congestion
signal. For packet losses, it is set to <spanx style="verb">1/4</spanx>, similar to the
value used in Cubic. For delay based losses, it is proportional to the
difference between the measured RTT and the target RTT divided by
the acceptable margin, capped to <spanx style="verb">1/4</spanx>. If the signal
is an ECN/CE rate, we may
use a proportional reduction coefficient in line with
<xref target="RFC9331"/>, again capped to <spanx style="verb">1/4</spanx>.</t>

<t>During the recovery period, target CWND and pacing rate are set
to a fraction of the "nominal rate" multiplied by the
"nominal max RTT".
The recovery period ends when the first packet
sent after entering recovery is acknowledged. Congestion
signals are processed when entering recovery; further signals
are ignored until the end of recovery.</t>

<t>Network conditions may change for the better or for the worse. Worsening 
is detected through congestion signals, but increases can only be detected
by trying to send more data and checking whether the network accepts it.
Different algorithms have done two ways: pursuing regular increases of
CWND until congestion finally occurs, like for example the "congestion
avoidance" phase of TCP RENO; or periodically probe the network
by sending at a higher rate, like the Probe Bandwidth mechanism of
BBR. C4 adopt the periodic probing approach, in particular
because it is a better fit for variable rate multimedia applications
(see details in <xref target="limited"/>).</t>

<section anchor="no-pto"><name>Do not react to Probe Time Out</name>

<t>QUIC normally detect losses by observing gaps in the sequences of acknowledged
packet. That's a robust signal. QUIC will also inject "Probe time out"
packets if the PTO timeout elapses before the last sent packet has not been acknowledged.
This is not a robust congestion signal, because delay jitter may also cause
PTO timeouts. When testing in "high jitter" conditions, we realized that we should
not change the state of C4 for losses detected solely based on timer, and
only react to those losses that are detected by gaps in acknowledgements.</t>

</section>
<section anchor="rate-update"><name>Update the Nominal Rate after Pushing</name>

<t>C4 configures the transport with a larger rate and CWND
than the nominal CWND during "pushing" periods.
The peer will acknowledge the data sent during these periods in
the round trip that followed.</t>

<t>When we receive an ACK for a newly acknowledged packet,
we update the nominal rate as explained in <xref target="monitor-rate"/>.</t>

<t>This strategy is effectively a form of "make before break".
The pushing
only increase the rate by a fraction of the nominal values,
and only lasts for one round trip. That limited increase is not
expected to increase the size of queues by more than a small
fraction of the bandwidth*delay product. It might cause a
slight increase of the measured RTT for a short period, or
perhaps cause some ECN signaling, but it should not cause packet
losses -- unless competing connections have caused large queues.
If there was no extra
capacity available, C4 does not increase the nominal CWND and
the connection continues with the previous value.</t>

</section>
</section>
<section anchor="fairness"><name>Driving for fairness</name>

<t>Many protocols enforce fairness by tuning their behavior so
that large flows become less aggressive than smaller ones, either
by trying less hard to increase their bandwidth or by reacting
more to congestion events. We considered adopting a similar
strategy for C4.</t>

<t>The aggressiveness of C4 is driven by several considerations:</t>

<t><list style="symbols">
  <t>the frequency of the "pushing" periods,</t>
  <t>the coefficient <spanx style="verb">alpha</spanx> used during pushing,</t>
  <t>the coefficient <spanx style="verb">beta</spanx> used during response to congestion events,</t>
  <t>the delay threshold above a nominal value to detect congestion,</t>
  <t>the ratio of packet losses considered excessive,</t>
  <t>the ratio of ECN marks considered excessive.</t>
</list></t>

<t>We clearly want to have some or all of these parameters depend
on how much resource the flow is using.
There are know limits to these strategies. For example,
consider TCP Reno, in which the growth rate of CWND during the
"congestion avoidance" phase" is inversely proportional to its size.
This drives very good long term fairness, but in practice
it prevents TCP Reno from operating well on high speed or
high delay connections, as discussed in the "problem description"
section of <xref target="RFC3649"/>. In that RFC, Sally Floyd was proposing
using a growth rate inversely proportional to the
logarithm of the CWND, which would not be so drastic.</t>

<t>In the initial design, we proposed making the frequency of the
pushing periods inversely proportional to the logarithm of the
CWND, but that gets in tension with our estimation of
the max RTT, which requires frequent "recovery" periods.
We would not want the Max RTT estimate to work less well for
high speed connections! We solved the tension in favor of
reliable max RTT estimates, and fixed to 4 the number
of Cruising periods between Recovery and Pushing. The whole
cycle takes about 6 RTT.</t>

<t>We also reduced the default rate increase during Pushing to
6.25%, which means that the default cycle is more on less on
par with the aggressiveness of RENO when
operating at low bandwidth (lower than 34 Mbps).</t>

<section anchor="absence-of-constraints-is-unfair"><name>Absence of constraints is unfair</name>

<t>Once we fixed the push frequency and the default increase rate, we were
left with responses that were mostly proportional to the amount
of resource used by a connection. Such design makes the resource sharing
very dependent on initial conditions. We saw simulations where
after some initial period, one of two competing connections on
a 20 Mbps path might settle at a 15 Mbps rate and the other at 5 Mbps.
Both connections would react to a congestion event by dropping
their bandwidth by 25%, to 15 or 3.75 Mbps. And then once the condition
eased, both would increase their data rate by the same amount. If
everything went well the two connection will share the bandwidth
without exceeding it, and the situation would be very stable --
but also very much unfair.</t>

<t>We also had some simulations in which a first connection will
grab all the available bandwidth, and a late comer connection
would struggle to get any bandwidth at all. The analysis 
showed that the second connection was
exiting the initial phase early, after encountering either
excess delay or excess packet loss. The first
connection was saturating the path, any additional traffic
did cause queuing or losses, and the second connection had
no chance to grow.</t>

<t>This "second comer shut down" effect happened particularly often
on high jitter links. The established connections had tuned their
timers or congestion window to account for the high jitter. The
second connection was basing their timers on their first
measurements, before any of the big jitter events had occured.
This caused an imbalance between the first connection, which
expected large RTT variations, and the second, which did not
expect them yet.</t>

<t>These shutdown effects happened in simulations with the first
connection using either Cubic, BBR or C4. We had to design a response,
and we first turned to making the response to excess delay or
packet loss a function of the data rate of the flow.</t>

</section>
<section anchor="sensitivity-curve"><name>Introducing a sensitivity curve</name>

<t>In our second design, we attempted to fix the unfairness and
shutdowns effect by introducing a sensitivity curve,
computing a "sensitivity" as a function of the flow data
rate. Our first implementation is simple:</t>

<t><list style="symbols">
  <t>set sensitivity to 0 if data rate is lower than 50000B/s</t>
  <t>linear interpolation between 0 and 0.92 for values
between 50,000 and 1,000,000B/s.</t>
  <t>linear interpolation between 0.92 and 1 for values
between 1,000,000 and 10,000,000B/s.</t>
  <t>set sensitivity to 1 if data rate is higher than
10,000,000B/s</t>
</list></t>

<t>The sensitivity index is then used to set the value of delay and
loss thresholds. For the delay threshold, the rule is:</t>

<figure><artwork><![CDATA[
    delay_fraction = 1/16 + (1 - sensitivity)*3/16
    delay_threshold = min(25ms, delay_fraction*nominal_max_rtt)
]]></artwork></figure>

<t>For the loss threshold, the rule is:</t>

<figure><artwork><![CDATA[
loss_threshold = 0.02 + 0.50 * (1-sensitivity);
]]></artwork></figure>

<t>For the CE mark threshold, the rule is:</t>

<figure><artwork><![CDATA[
loss_threshold = 1/32 + 1/32 * (1-sensitivity);
]]></artwork></figure>

<t>This very simple change allowed us to stabilize the results. In our
competition tests we see sharing of resource almost equitably between
C4 connections, and reasonably between C4 and Cubic or C4 and BBR.
We do not observe the shutdown effects that we saw before.</t>

<t>There is no doubt that the current curve will have to be refined. We have
a couple of such tests in our test suite with total capacity higher than
20Mbps, and for those tests the dependency on initial conditions remain.
We will revisit the definition of the curve, probably to have the sensitivity
follow the logarithm of data rate.</t>

</section>
<section anchor="cascade"><name>Cascade of Increases</name>

<t>We sometimes encounter networks in which the available bandwidth changes rapidly.
For example, when a competing connection stops, the available capacity may double.
With low Earth orbit satellite constellations (LEO), it appears
that ground stations constantly check availability of nearby satellites, and
switch to a different satellite every 10 or 15 seconds depending on the
constellation (see <xref target="ICCRG-LEO"/>), with the bandwidth jumping from 10Mbps to
65Mbps.</t>

<t>Because we aim for fairness with RENO or Cubic, the cycle of recovery, cruising
and pushing will only result in slow increases increases, maybe 6.25% after 6 RTT.
This means we would only double the bandwidth after about 68 RTT, or increase
from 10 to 65 Mbps after 185 RTT -- by which time the LEO station might
have connected to a different orbiting satellite. To go faster, we implement
a "cascade": if the previous pushes at 6.25% was successful, the next
pushing will use 25% (see <xref target="variable-pushing"/>), or an intermediate
value if the observed ratio of ECN marks is greater than 0. If three successive pushes
all result in increases of the
nominal rate, C4 will reenter the "startup" mode, during which each RTT
can result in a 100% increase of rate and CWND.</t>

</section>
</section>
<section anchor="limited"><name>Supporting Application Limited Connections</name>

<t>C4 is specially designed to support multimedia applications,
which very often operate in application limited mode.
After testing and simulations of application limited applications,
we incorporated a number of features.</t>

<t>The first feature is the design decision to only lower the nominal
rate if congestion is detected. This is in contrast with the BBR design,
in which the estimate of bottleneck bandwidth is also lowered
if the bandwidth measured after a "probe bandwidth" attempt is
lower than the current estimate while the connection was not
"application limited". We found that detection of the application
limited state was somewhat error prone. Occasional errors end up
with a spurious reduction of the estimate of the bottleneck bandwidth.
These errors can accumulate over time, causing the bandwidth
estimate to "drift down", and the multimedia experience to suffer.
Our strategy of only reducing the nominal values in
reaction to congestion notifications much reduces that risk.</t>

<t>The second feature is the "make before break" nature of the rate
updates discussed in <xref target="rate-update"/>. This reduces the risk
of using rates that are too large and would cause queues or losses,
and thus makes C4 a good choice for multimedia applications.</t>

<t>C4 adds two more features to handle multimedia
applications well: coordinated pushing (see <xref target="coordinated-pushing"/>),
and variable pushing rate (see <xref target="variable-pushing"/>).</t>

<section anchor="coordinated-pushing"><name>Coordinated Pushing</name>

<t>As stated in <xref target="fairness"/>, the connection will remain in "cruising"
state for a specified interval, and then move to "pushing". This works well
when the connection is almost saturating the network path, but not so
well for a media application that uses little bandwidth most of the
time, and only needs more bandwidth when it is refreshing the state
of the media encoders and sending new "reference" frames. If that
happens, pushing will only be effective if the pushing interval
coincides with the sending of these reference frames. If pushing
happens during an application limited period, there will be no data to
push with and thus no chance of increasing the nominal rate and CWND.
If the reference frames are sent outside of a pushing interval, the
rate and CWND will be kept at the nominal value.</t>

<t>To break that issue, one could imagine sending "filler" traffic during
the pushing periods. We tried that in simulations, and the drawback became
obvious. The filler traffic would sometimes cause queues and packet
losses, which degrade the quality of the multimedia experience.
We could reduce this risk of packet losses by sending redundant traffic,
for example creating the additional traffic using a forward error
correction (FEC) algorithm, so that individual packet losses are
immediately corrected. However, this is complicated, and FEC does
not always protect against long batches of losses.</t>

<t>C4 uses a simpler solution. If the time has come to enter pushing, it
will check whether the connection is "application limited", which is
simply defined as testing whether the application send a "nominal CWND"
worth of data during the previous interval. If it is, C4 will remain
in cruising state until the application finally sends more data, and
will only enter the the pushing state when the last period was
not application limited.</t>

</section>
<section anchor="variable-pushing"><name>Variable Pushing Rate</name>

<t>C4 tests for available bandwidth at regular pushing intervals
(see <xref target="fairness"/>), during which the rate and CWND is set at 25% more
than the nominal values. This mimics what BBR
is doing, but may be less than ideal for real time applications.
When in pushing state, the application is allowed to send
more data than the nominal CWND, which causes temporary queues
and degrades the experience somewhat. On the other hand, not pushing
at all would not be a good option, because the connection could
end up stuck using only a fraction of the available
capacity. We thus have to find a compromise between operating at
low capacity and risking building queues.</t>

<t>We manage that compromise by adopting a variable pushing rate:</t>

<t><list style="symbols">
  <t>If pushing at 25% did not result in a significant increase of
the nominal rate, the next pushing will happen at 6.25%</t>
  <t>If pushing at 6.25% did result in some increase of the nominal CWIN,
the next pushing will happen at 25%, otherwise it will
remain at 6.25%</t>
</list></t>

<t>If the observed ratio of ECN-CE marks is greater than zero, we will
use it to modulate the amount of pushing. We leave the pushing rate
at 6.25% if the previous pushing attempt was not successful, but
otherwise we pick a value intermediate between 25% (if 0 ECN marks)
and 6.25% (if the ratio of ECN marks approaches the threshold).</t>

<t>As explained in <xref target="cascade"/>, if three consecutive pushing attempts
result in significant increases, C4 detects that the underlying network
conditions have changed, and will reenter the startup state.</t>

<t>The "significant increase" mentioned above is a matter of debate.
Even if capacity is available,
increasing the send rate by 25% does not always result in a 25%
increase of the acknowledged rate. Delay jitter, for example,
may result in lower measurement. We initially computed the threshold
for detecting "significant" increase as 1/2 of the increase in
the sending rate, but multiple simulation shows that was too high
and caused lower performance. We now set that threshold to 1/4 of the
increase in the sending rate.</t>

</section>
<section anchor="pushing-rate-and-cascades"><name>Pushing rate and Cascades</name>

<t>The choice of a 25% push rate was motivated by discussions of
BBR design. Pushing has two parallel functions: discover the available
capacity, if any; and also, push back against other connections
in case of competition. Consider for example competition with Cubic.
The Cubic connection will only back off if it observes packet losses,
which typically happen when the bottleneck buffers are full. Pushing
at a high rate increases the chance of building queues,
overfilling the buffers, causing losses, and thus causing Cubic to back off.
Pushing at a lower rate like 6.25% would not have that effect, and C4
would keep using a lower share of the network. This is why we will always
pushed at 25% in the "pig war" mode.</t>

<t>The computation of the interval between pushes is tied to the need to
compete nicely, and follows the general idea that
the average growth rate should mimic that of RENO or Cubic in the
same circumstances. If we pick a lower push rate, such as 6.25% or
maybe 12.5%, we might be able to use shorter intervals. This could be
a nice compromise: in normal operation, push frequently, but at a
low rate. This would not create large queues or disturb competing
connections, but it will let C4 discover capacity more quickly. Then,
we could use the "cascade" algorithm to push at a higher rate,
and then maybe switch to startup mode if a lot of capacity is
available. This is something that we intend to test, but have not
implemented yet.</t>

</section>
<section anchor="adaptation-to-ecnl4s"><name>Adaptation to ECN/L4S</name>

<t>Tests with L4S active queue management showed the tension between the
periodic updates and L4S goal to minimize queue sizes. Typical L4S deployment
start marking packets with ECN/CE when the queue size is about 1.5ms, and
increase the mark rate progressively as the queue size increases,
reaching 100% when the queue size is about 2ms. If C4 pushes at 25% every 6 RTT,
and if the bandwidth estimate is accurate,
the queue size will increase by 25% of the RTT during the first roundtrip,
before any correction signal can be applied. The increased marking
rate will affect all connections sharing the bottleneck, which is
not desirable.</t>

<t>L4S is tuned for the "Prague" algorithm, which increases CWIN by one packet every
RTT. In a typical trial with a 20ms RTT and a 100 Mbps data rate, it takes 0.12ms
to send a packet, and thus 12.5 RTT before building a queue of 1.5ms. In the same
conditions, C4 would have increased the rate by 25% after 6 RTT in the
aggressive scenario, thus triggering a high rate of marking.</t>

<t>The cascade process made the problem even worse. If a push at 6.25% does increase
the nominal rate, the next push will be at 25%. If that push and the next one
did increase the nominal rate, C4 will reenter the initial phase, even if some
of the pushes did cause ECN/CE marks. The initial phase will then cause a lot
of packet losses, which will degrade performance.</t>

<t>To mitigate this issue, we had to add a "very low" pushing mode, setting the
pushing rate to only 3.125% if the previous push resulted in a high rate of ECN/CE marks.
We also replaced the somewhat adhoc "count of successive probes" by the management
of a "probe level", defining 4 levels:</t>

<t><list style="symbols">
  <t>level 0: pushing at 3.125%, spend 1 cycle in cruising before pushing.</t>
  <t>level 1: pushing at 6.25%, spend 4 cycles in cruising before pushing.</t>
  <t>level 2: pushing at 25%, spend at most 1 cycle in cruising before pushing.</t>
  <t>level 3: pushing at 25%, spend at most 1 cycle in cruising before pushing.</t>
</list></t>

<t>The "probe level" is updated after the recovery phase as follow:</t>

<t><list style="symbols">
  <t>if the previous probe was successful and did not result in a high rate of ECN/CE marks,
increase the probe level by 1. If the probe level was already at 3, reenter the startup phase.</t>
  <t>if the previous probe was successful but did result in a high rate of ECN/CE marks,
remain at the same probe level.</t>
  <t>if the previous probe was not successful but did not result in a high rate of ECN/CE marks,
stay at probe level 0 if already at that level, otherwise move back to probe level 1.</t>
  <t>if the previous probe was not successful and did result in a high rate of ECN/CE marks,
move to probe level 0.</t>
</list></t>

<t>This logic treats the CE marking differently from other congestion signals, because
the CE marks are an intentional indication of congestion by the network, and is thus
less ambiguous than delay increases or packet losses, which can be caused by other
factors such as delay jitter or random transmission issues. Simulations show that
this logic allows to quickly discover the available capacity in L4S networks, whithout spuriously
reentering the startup phase and causing packet losses. It is equivalent to the
previous logic when the network does not support L4S.</t>

</section>
</section>
<section anchor="revisiting-the-initial-phase"><name>Revisiting the Initial Phase</name>

<t>Our November 2025 design of C4 included a "rate based"
initial phase, during which C4 will send at twice the "nominal rate",
monitor acknowledgments and increase the nominal rate if measurements
increase, and exit if congestion is detected or if the measurements
do not increase for 3 consecutive RTT. That algorithm works
well in most scenario, but we were observing early exits in
"high delay jitter" scenarios, such as Wi-Fi networks with lots of
packet collisions.</t>

<t>After observing that phenomenon, we realized that the
rate based algorithm was failing in case of high delay jitter
because it was setting the CWND to the product of pacing rate
and the "nominal" max RTT. The nominal Max RTT was set to a fixed
value, observed either before the initial phase or on the first
roundtrip in that phase. It would work if the initial phase
started during a high jitter event and the initial RTT was large
enough, but in many case it was not and became a limiting
factor.</t>

<section anchor="why-not-increasing-max-rtt-during-initial-phase"><name>Why not increasing Max RTT during Initial phase?</name>

<t>In the initial phase, the algorithm tries to discover the bandwidth
and does not yet have a good estimate of delay jitter, which typically
requires a series of measurements. In these conditions, it is
easy to underestimate the max RTT. On the other hand, the flow is
deliberately probing at a high data rate. If the algorithm
allows updates of max RTT during that phase, the risks of
spiraling into buffer boat are very high, but if the CWND
remains too low, the risk of exiting startup with a severely
underestimated data rate is also very high.</t>

<t>We tried to develop simple rules to classify the delay measurements
between caused by jitter, and caused by congestion. If we could do that,
we would be able to increase the max RTT safely, when appropriate.
However, we could not find variables that were both easy to monitor
and well correlated with the actual cause of the delay.</t>

</section>
<section anchor="building-a-robust-initial-estimator"><name>Building a robust initial estimator</name>

<t>The "rate based" initial estimator requires estimating both the
data rate and the max RTT simultaneously. In contrast, the "CWND based"
initial estimator use in algorithms like Reno or Cubic
only requires estimating the CWND, plus a possibly
loose estimate of the data rate. The Reno algorithm is remarkably
simple: just increase the CWND by the number of bytes acknowledged,
without any explicit dependency on the measured latency.</t>

<t>The Reno algorithm terminates when packet losses are observed,
leading to bufferbloat. Hystart improves that by terminating when
the measured delays start increasing, but this can lead to early
exit in case of delay jitter. The rate based algorithm terminate when
the measured bandwidth stops growing, which provides good
results. Our proposal is to combine a Reno like growth of the
CWND with a rate-control like exit condition.</t>

<t>Of course, things are not that simple. The "rate" test only stops the
growth of the CWND after the third "non growing" round. If CWND doubles
after each round it becomes excessive, buffers fill up, and lots
of packets are lost. We dealt with that problem by essentially
freezing the increases of after the first "non growing" round.
If a larger measurement happens before 3 RTT, the increases
resume, otherwise, C4 exits the initial phase.</t>

<t>When the initial phase completes, we retain as estimate of the
data rate the highest value measured so far.
We also want to obtain a reasonable estimate of the "max RTT".
In the Reno logic, the "ssthresh" is set to half the CWND
value before congestion is detected. C4 will not use the
ssthresh variable after exiting the Initial phase, but it
can set the max RTT to the quotient of ssthresh by the
final rate estimate.</t>

</section>
</section>
<section anchor="revision-after-second-design"><name>Revision after the second design</name>

<t>The first design, presented to the IETF in March 2026, was showing some good
promises, but it needed some extra work. we have been able to develop and test
three significant improvements: better reaction to a drop in path bandwidth,
resolving the issues with the cascade design, and improve the handling
of the "careful resume" scenario in the initial phase.</t>

<section anchor="reaction-to-a-drop-in-path-bandwidth"><name>Reaction to a drop in path bandwidth</name>

<t>In some scenarios, the bandwidth of a path may suddenly drop. 
This will normally cause congestion events such as packet losses or ECN marks,
and C4 will react by reducing the nominal rate by the specified "beta" coefficient.
However, while these reductions in bandwidth are adequate for the small decreases
due to increased competition, they are not sufficient for the large drops.
Such large drops can happen after routing events. In satellite
based network, this happens if the connection switches to a different satellite.</t>

<t>Simulation showed that in the large drop scenario C4 reacted by a series of
small reductions until finally matching the available bandwidth. This means
operating for a long period in conditions of congestion, with large queues
and packet losses. We solved that problem by detecting the persistence of
condition and reacting forcefully to sustained congestion.</t>

<t>We improved C4 by monitoring the number of "recent congestions". If C4
observes more than 2 successive congestion events it will drop the nominal
rate to the value of the "recent maximum rate", which hopefull reflects the
new path bandwidth.</t>

<t>This change resulted in a significant improvement in the performance measured
in simulations of path bandwidth reductions.</t>

</section>
<section anchor="two-steps-cascade-or-continuous-push"><name>Two steps cascade or continuous push</name>

<t>When C4 engages in pushing, we see a clear difference in the amount of
data in flight, between the consecutive cruising, pushing and recovery phase,
as shown on the conceptual figure below:</t>

<figure><artwork><![CDATA[
 ^
B|              :         :
y|              :         *
t|              :        *:*
e|              :       * : *
s|              :      *  :  *
 |              :     *   :   *
i|              :    *    :    *                     
n|              :   *     :     *
 |              :  *      :      *
f|              : *       :       *
l|              :*        :        *
i|    ...********         :         *...
g|              :         :              
h|    cruising  : pushing : recovery
t|              :         :
 +---------------------------------------->
                                      time
]]></artwork></figure>

<t>Before entering the pushing phase, C4 is sending at the nominal rate, and
the bytes in transit are proportional to the product of the nominal rate by
the RTT. The sending rate increases during the pushing phase, until reaching
the product of the pushing rate by the RTT. During the recovery period, the
bytes in transit decrease, and by the end of that period they should
be equal to the nominal rate times the RTT.</t>

<t>The pushing period ends when the first packet sent during "pushing" is
acknowledged. The recovery period ends when the last packet sent during the
pushing period is acknowledged. The rate measurements during the recovery period
correspond to the transmission during the the pushing period.</t>

<section anchor="two-steps-cascade"><name>Two steps cascade</name>

<t>If the highest rate measured during the recovery period is higher than the
nominal rate, C4 assesses that the pushing was successful, which indicates
that the previous nominal rate was smaller than the path capacity, possibly
because the path capacity increased. We use these measurements to tune the
rate at which C4 is pushing.</t>

<t>By default, C4 tries small rate increases during pushes, 6.25% by default
or 3.25% if the path is providing ECN feedback. If the pushing detects
available capacity, C4 may try larger increases, such as 25%, 50%, 100%
or even 200%, inorder to quickly adapt to the new path capacity. However,
trying larger increases has a risk: if the increased rate exceeds the
path capacity, queues will build, and packets may well be lost. C4
attempts to find the right push level by assessing the result of
the previous push at the end of the recovery phase:</t>

<t><list style="symbols">
  <t>if the new rate measurement grew by less than 25% of the rate increase,
C4 will reset the pushing rate to its default value.</t>
  <t>if the rate measurement grew by at least 75% of the rate increase, C4
will start pushing at the next level.</t>
  <t>if the rate measurement is intermediate, C4 might keep the increase
rate unchanged, or might decide to only push at a lower level.</t>
</list></t>

<t>In short, the two step process allows C4 to perform a "cautious cascade",
increasing the push level fast enough to adapt quickly, but backing off
as soon as the path appears saturated.</t>

</section>
<section anchor="finding-out-why-the-cascade-does-not-work"><name>Finding out why the cascade does not work.</name>

<t>We need to program the different levels of the cascade. We know that we
should not set the first level too large, because adopting a large value
causes the queue size and the RTT to periodically increase. Our philosophy
is to use a small increase, like 6.25%, that causes minimal disruption.
This allows C4 to start pushing frequently, and thus reduce the delay
needed to detect a change in bandwidth.</t>

<t>We have also observed that increasing too fast may cause queues and losses.
The whole point of the two step approach is to proceed cautiously and always
test the result of the previous increase before increasing the push rate.
In practice, this means limiting the largest levels to 100% increase, on par
with slow start.</t>

<t>This leaves a choice for the second level of the cascade. We tried two
values: 25%, similar to the BBR push rate; 50%, twice that rate, since we
are twice more cautious. (We could have tried 56.25%, equivalent to 2
BBR rounds at 25%). The following table compares the increments applied
by BBR after each successive RTT and the multiplier from the original
rate. BBR increases by 25% after each RTT, but that C4 only
increases the data rate every other RTT. The cascade helps, and once
C4 starts increasing at 100% per period, it does catch up. However,
BBR will be more aggressive for the first rounds.</t>

<texttable>
      <ttcol align='right'>Nb rounds</ttcol>
      <ttcol align='right'>BBR-INC</ttcol>
      <ttcol align='right'>C4-25-INC</ttcol>
      <ttcol align='right'>C4-50-INC</ttcol>
      <ttcol align='right'>BBR-BW</ttcol>
      <ttcol align='right'>C4-25-BW</ttcol>
      <ttcol align='right'>C4-50-BW</ttcol>
      <c>0</c>
      <c>0</c>
      <c>0</c>
      <c>0</c>
      <c>1</c>
      <c>1</c>
      <c>1</c>
      <c>1</c>
      <c>25%</c>
      <c>6.25%</c>
      <c>6.25%</c>
      <c>1.25</c>
      <c>1.06</c>
      <c>1.06</c>
      <c>2</c>
      <c>25%</c>
      <c>0%</c>
      <c>0%</c>
      <c>1.56</c>
      <c>1.00</c>
      <c>1</c>
      <c>3</c>
      <c>25%</c>
      <c>25%</c>
      <c>50%</c>
      <c>1.95</c>
      <c>1.33</c>
      <c>1.59</c>
      <c>4</c>
      <c>25%</c>
      <c>0%</c>
      <c>0%</c>
      <c>2.44</c>
      <c>1.06</c>
      <c>1.06</c>
      <c>5</c>
      <c>25%</c>
      <c>100%</c>
      <c>100%</c>
      <c>3.05</c>
      <c>2.66</c>
      <c>3.19</c>
      <c>6</c>
      <c>25%</c>
      <c>0%</c>
      <c>0%</c>
      <c>3.81</c>
      <c>1.33</c>
      <c>1.59</c>
      <c>7</c>
      <c>25%</c>
      <c>100%</c>
      <c>100%</c>
      <c>4.77</c>
      <c>5.31</c>
      <c>6.38</c>
      <c>8</c>
      <c>25%</c>
      <c>0%</c>
      <c>0%</c>
      <c>5.96</c>
      <c>2.66</c>
      <c>3.19</c>
</texttable>

<t>The BBR probe BW or the BBR cascade stop when the measured rate
stops increasing. The main advantage of the two steps approach is
to reduce the amount of queuing when that happens. However,
if the cascade starts using large increments, the benefits over
BBR's continous approach are not obvious. The BBR algorithm is
continuous, and when it stops, the probe bandwidth always
exceed the nominal bandwidth by just 25%. The C4 algorithm is
not continuous. If it stops during the first RTT, the excess bandwidth
will be at most 6.125% of the available bandwidth, but up to 25% if it stops
in the second RTT and up to 100% later. In short, the cautious
approach pays off during the initial "6%" probing stage, grows
slower than BBr after that, and also produces larger queues. In short,
we have a bug.</t>

</section>
<section anchor="addind-a-pushing-state"><name>Addind a Pushing state</name>

<t>We can capture the lessons of the previous analysis by splitting
the "pushing" state in two:</t>

<t><list style="symbols">
  <t>A "probing" state executed frequently, with a low 6.125% probing
margin.</t>
  <t>A "pushing" state similar to the "probe-BW" state of BBR, pushing
at 25%, remaining in the same state until the measurements
stop increasing.</t>
</list></t>

</section>
<section anchor="keeping-probing-and-pushing-as-separate-state"><name>Keeping Probing and Pushing as separate state</name>

<t>The design recomended in this section separates the Probing and Pushing states.
We considered simplifying the design and merging the two states, and tried
that in an experiment: just enter the pushing state and use the 6.125% increase
for the first RTT, and then switch to 25% as soon as a measurement shows an increase
in rate.</t>

<t>The results were mixed. One test out of 22 did improve significantly, i.e.,
competition with a BBR connection that starts after the C4 connection, showing performance
more than 20% better than the previous version. This is probably because the merging
of the two states makes C4 more aggressive. However, several other tests showed regressions,
including the "drop and back" test, which showed a 6% regression. This is probably
due to the reduced agility of the merged state: each cycle of cruising-pushing-recovery
lasts 5 RTT instead of 4, causing the change in bandwidth to be detected later.</t>

<t>The merged state also caused regressions in the testing of competiton between C4 connections,
and in the Wi-Fi scenarios, probably due to the excessive aggressivity of the merged solution.
The separation of Probing and Pushing states appear to be a good compromise between agility 
and aggressivity.</t>

</section>
</section>
<section anchor="support-for-careful-resume"><name>Support for careful resume</name>

<t>The performance measurements of the previous version of C4 showed
worse performance in the "geo stationary satellite" scenario. The typical slow
start algorithm doubles the congestion window after every RTT, which requires
a number of RTT proportional to the logarithm of the bandwidth delay product.
Transmission via geostationary satellite has a 600ms RTT, which means large
bandwith delay product, and a long time to reach the available bandwidth.</t>

<t>The "careful resume" algorithm specified in <xref target="RFC9959"/> was designed to address
that issue, and we had implemented it in C4. However,
the previous implementation of careful resume was inefficient, because it was
too tightly enmeshed with the "slow start" logic. It is simpler to treat "resuming"
as a state by itself, rather than a complication of startup.</t>

<t>The resuming state is entered when the stack sets the seed CWIN, from which we
deduce the the seed rate. During that state, pacing rate and CWIN are pegged
to the seed values. The state lasts for 2 eras, giving enough time for the
rate measurement to stabilize. The eras are expanded if the connection is app
limited, to avoid exiting too early. After two eras, or at any time if congestion
is detected, the state transitions to recovery.</t>

<t>The performance of the satellite test are significantly improved. They are better
than BBR, almost on par with Cubic, and within the 7 second performance target
set for that test:</t>

<texttable>
      <ttcol align='left'>average time for simple tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>c4_pushing</ttcol>
      <ttcol align='right'>this PR</ttcol>
      <c>satellite</c>
      <c>7660817</c>
      <c>7431946</c>
      <c>6704246</c>
      <c>7660783</c>
      <c>6807146</c>
</texttable>

<texttable>
      <ttcol align='left'>top 90% time for simple tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>c4_pushing</ttcol>
      <ttcol align='right'>This PR</ttcol>
      <c>satellite</c>
      <c>7661569</c>
      <c>7432276</c>
      <c>6704247</c>
      <c>7661405</c>
      <c>6807183</c>
</texttable>

<t>It might be possible to improve a bit more by some further tuning, for example
exiting directly to cruising instead of recovery if the nominal rate matches the
seed rate. This might be something for further work.</t>

</section>
</section>
<section anchor="state-machine"><name>State Machine</name>

<t>The state machine for C4 has the following states:</t>

<t><list style="symbols">
  <t>"startup": the initial state, during which the CWND is
set to twice the "nominal_CWND". The connection
exits startup if the "nominal_cwnd" does not
increase for 3 consecutive round trips. When the
connection exits startup, it enters "recovery".</t>
  <t>"resuming": management of careful resume, during which the CWND and pacing rate are
pegged to the seed values. The state lasts for 2 eras,
giving enough time for the rate measurement to stabilize.
The eras are expanded if the connection is app limited,
to avoid exiting too early. After two eras, or at any time
if congestion is detected, the state transitions to recovery.</t>
  <t>"recovery": the connection enters that state after
"startup", "pushing", or a congestion detection in
a "cruising" state. It remains in that state for
at least one roundtrip, until the first packet sent
in "recovery" is acknowledged. Once that happens,
the connection goes back
to "startup" if the last 3 pushing attemps have resulted
in increases of "nominal rate", or enters "cruising"
otherwise.</t>
  <t>"cruising": the connection is sending using the
"nominal_rate" and "nominal_max_rtt" value. If congestion is detected,
the connection exits cruising and enters
"recovery" after lowering the value of
"nominal_cwnd".
Otherwise, the connection will
remain in "cruising" state until at least 4 RTT and
the connection is not "app limited". At that
point, it enters "pushing".</t>
  <t>"probing": the connection is using a rate and CWND 6.15%
larger than "nominal_rate" and "nominal_CWND". After
1 RTT, it moves back to "recovery" in order to assess
the results. If the data rate appears to have increased,
the connection moves to the "pushing" state.</t>
  <t>"pushing": the connection is using a rate and CWND 25%
larger than "nominal_rate" and "nominal_CWND".
It remains in that state for at least one round trip,
and until the measured rate stops growing. If the
pushing lasts more than 3 RTT, C4 re-enters the
initial state.</t>
</list></t>

<t>These transitions are summarized in the following state
diagram.</t>

<figure><artwork><![CDATA[
                    Start
                      |
                      v
                      +<-----------------------+
                      |                        |
                      v                        |
                 +----------+                  |
                 | Startup  |                  |
                 +-|--|-----+                  |
         +---------+  |                        | 
         |            |                        |
         v            |                        |
   +----------+       |                        |
   | Resuming |       |                        |
   +-----|----+       |                        |
         +---------+  |                        |
                   |  |                        |
                   v  v                        |
                 +------------+                |
  +--+---------->|  Recovery  |                |
  ^  ^           +----|---|---+                |
  |  |                |   | Rate increase      |
  |  |                |   +---------+          |
  |  |                |             |          |
  |  |                v             |          |
  |  |           +----------+       |          |
  |  |           | Cruising |       |          |
  |  |           +-|--|-----+       v          |
  |  | Congestion  |  |        +---------+     |
  |  +-------------+  |        | Pushing |     |
  |                   |        +----|--|-+     |
  |                   v             |  |       |
  |              +----------+       |  +-------+
  |              | Probing  |       |   Rapid
  |              +----|-----+       |   increase
  |                   |             |
  +<------------------+             |
  ^                                 |
  |                                 |
  +---------------------------------+

]]></artwork></figure>

<t>C4 exits the pushing state after one era, or if a congestion
signal is received before that. In an exception to
standard congestion processing, the reduction in <spanx style="verb">nominal_rate</spanx> and
<spanx style="verb">nominal_max_RTT</spanx> are not applied if the congestion signal
is tied to a packet sent during the probing or pushing state.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>We do not believe that C4 introduce new security issues. Or maybe there are,
such as what happen if applications can be fooled in going to fast and
overwhelming the network, or going to slow and underwhelming the application.
Discuss!</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>




    <references title='Informative References' anchor="sec-informative-references">

&RFC9000;
&I-D.ietf-moq-transport;
&RFC9438;
&I-D.ietf-ccwg-bbr;
&RFC6817;
&RFC6582;
&RFC3649;
<reference anchor="TCP-Vegas" target="https://ieeexplore.ieee.org/document/464716">
  <front>
    <title>TCP Vegas: end to end congestion avoidance on a global Internet</title>
    <author initials="L. S." surname="Brakmo">
      <organization></organization>
    </author>
    <author initials="L. L." surname="Peterson">
      <organization></organization>
    </author>
    <date year="1995" month="October"/>
  </front>
  <seriesInfo name="IEEE Journal on Selected Areas in Communications ( Volume: 13, Issue: 8, October 1995)" value=""/>
</reference>
<reference anchor="HyStart" target="https://doi.org/10.1016/j.comnet.2011.01.014">
  <front>
    <title>Taming the elephants: New TCP slow start</title>
    <author initials="S." surname="Ha">
      <organization></organization>
    </author>
    <author initials="I." surname="Rhee">
      <organization></organization>
    </author>
    <date year="2011" month="June"/>
  </front>
  <seriesInfo name="Computer Networks vol. 55, no. 9, pp. 2092-2110" value=""/>
</reference>
<reference anchor="Cubic-QUIC-Blog" target="https://www.privateoctopus.com/2019/11/11/implementing-cubic-congestion-control-in-quic/">
  <front>
    <title>Implementing Cubic congestion control in Quic</title>
    <author initials="C." surname="Huitema">
      <organization></organization>
    </author>
    <date year="2019" month="November"/>
  </front>
  <seriesInfo name="Christian Huitema's blog" value=""/>
</reference>
<reference anchor="Wi-Fi-Suspension-Blog" target="https://www.privateoctopus.com/2023/05/18/the-weird-case-of-wifi-latency-spikes.html">
  <front>
    <title>The weird case of the wifi latency spikes</title>
    <author initials="C." surname="Huitema">
      <organization></organization>
    </author>
    <date year="2023" month="May"/>
  </front>
  <seriesInfo name="Christian Huitema's blog" value=""/>
</reference>
&I-D.irtf-iccrg-ledbat-plus-plus;
&RFC9330;
&RFC9331;
&RFC9959;
&I-D.briscoe-iccrg-prague-congestion-control;
<reference anchor="ICCRG-LEO" target="https://datatracker.ietf.org/meeting/122/materials/slides-122-iccrg-mind-the-misleading-effects-of-leo-mobility-on-end-to-end-congestion-control-00">
  <front>
    <title>Mind the Misleading Effects of LEO Mobility on End-to-End Congestion Control</title>
    <author initials="Z." surname="Lai">
      <organization></organization>
    </author>
    <author initials="Z." surname="Li">
      <organization></organization>
    </author>
    <author initials="Q." surname="Wu">
      <organization></organization>
    </author>
    <author initials="H." surname="Li">
      <organization></organization>
    </author>
    <author initials="Q." surname="Zhang">
      <organization></organization>
    </author>
    <date year="2025" month="March"/>
  </front>
  <seriesInfo name="Slides presented at ICCRG meeting during IETF 122" value=""/>
</reference>


    </references>



<?line 1521?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>TODO acknowledge.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA7W9bXcbR5Iu+D1/RV349BlJBiCSIvXW17MjyfK05tqyR9aM
99yzZ8wiUCCrBaDQVQXSbEvz2zfiiYjMyEJRtnvv6tgSCVTla2RkvDwRMZvN
Ql/36+p5Mfm66urLbdGsildXbd31dbn9p6541WwvK/ql2fKPfdus6d9lVdx7
dXp/EsqLi7a6ppdfnRby/iQsyr66bNrb50W9XTUhLJvFttxQD8u2XPWzq33d
V5tytljcXM4Wp7MlXpsdnYZuf7Gpu4666m939Pyb1++/Cdv95qJqn4cltfo8
LJptV227ffe86Nt9Fepdi5+6/uTo6NnRSSjbqqTh/FRdFOV2WbzZ9lW7rfri
fVtuu13T9pPwobq9adrl81DMilen+Ptgjvzpu6pc9/Wmos82m/22pnnRE/zN
d9WyLovmumqLf/+PN69CKPf9VdNyi6EoaNo0vFfz4i8yU/5IFiCuq/+qaS+f
Fz+09TVNsPh+0Te7fUfjXsz5S3qmXj8vdM3+Rf+d04x8Xz/Oi7c02/LDflO2
qbsf91dlN/iGeiu39d8xFRpQ3S0a10+3lYf/ZcFfzBfNZjClf6u223p72bk5
7dfrapt98fk+Vuv9anX7L3VdzxdlCNum3dCT17S5TC7xF3rh3Tevnh0dHeHn
N7Ov53XVr2ab5m+z3jYzPnb66Gn+GKiLiNOeePz0+En8+ezpif386PHps+eB
f3n/6ofZf1aXZYevir5sL6uelr7vd93zhw/rqqp+2a2btprzj3Oa5EOi7P2m
2vYPTx+fPjl+LO/paaLmCmmuqIgQ+wb/LBKllddNvSy3i6rgX4rLdXNRriPB
TtAYiL6YPDoGYdA5KI6fPTuT77qqreno0JrRE29ev35d/Fuzb7fUBrX3Y7Wu
Fn21LF7Qeeho+3Ii7op7xX826z1v4PGjafGm6/b049Np1s996SgSN/+ZyT9K
Ed/OifRetuWHTTP+9bfz4oeKZtTRweGv/nL7Iy1sr40N13jZ1FjX46P58dHx
44d/ZQqkxZifHB0fz4/4v1N901a53BDVFf1VVdCMd1fltqd+31Y3vJ1Ft25u
io47lJnYev7bflsV3KZ+7JeS1mm3pxFTIz2xiQ9dcd2s58XZ2bTYNvPi2bTY
7eb08rOT2cnx8ZE0kC0RMQhbhXg8/1Lad/lXb+bFu6uqwtq82l/UixkzlNnL
dXM5ToY3NzfznTCLRngFr9FDmsyzh8fH/F+92a0rpkpamNkCbSaq4x+Zv83q
7exv+3rxMKPZN+5VGY4nWH2Vienf6dWMQt8218UxkQ+PY4Q8DxgfXSwXNMdD
ArP1GfJQ/vinevZNPftx3+3oCuDJ/APLdPLo4dHZw+OnD4lkZjdV3S5ni7Kr
Zs1qdlOv6tma3tgubmfdrv5QdfOrfrPOjzVRGl4r+DW+LJn2+NVCXy3k1Wx5
vitvdXlOHv3/tjzgfS3xvnqxaC9n62p5Ufaz3Xrf4S/hcswsHz06ep5+Po4/
Pzt7FpnoRctsu9K2dm15ua9G6Eief/Xq3b/Ovn39/fhe0BqUxLEXH6oWvBlH
fFNVTGUPj09OHhLLp9Uo193Dbl2TODCjD7VjOt3LGW8VCQbrqlwyTVerFfG2
jrdsXTV0IVzU67q/ndGoKn66wT8jNH90lG3ldzXzZdq972LbxWtpm/eV5lN8
p20zS30tbdM/I/LCYLfbxVVx/AT7Pcatf8Q0i11bkTDDXLrsZRELXZZiuW/5
H5aAClqN3yCE/z0vvi3r8c9HPv73efHT/vDjv9z59P8mvnoZwmw2K8qLjvey
D+H3CIl1RzfblrjxIRsJ5ZqExLq/2hQiAVa4JLv9ji92CF+z9yx9lbvdOl5b
3Z5WtuzCQAKbF2967sy3tKTjX9EPN2W77Aq+CZbVurztpuGGei0um2YZeyO5
A5QwcZ0V63pDh2s5KS6qq/K6btqwaqu/7WnH1rf0xp4I4eaKRJ99x1t1XRIJ
X6yromU5jhhBwwQ1ZSlUOlyVXV/QbbxA4zRAtyb0G8QBGQQxLl6ZWxKIaILM
6SbFFY2sYglL+hxhy7wY/BGfpi5wQ+U1CVwY06LclQtqEeu0o0UgJlUt6MgR
5fXM72UM9FK4qi+vir/WPV+B1PSyloXnCe1ZNqHFpQsArJh2Vq7IeWC2KItP
Yh5dw139dyLwju+imjvGMmCKXbEpP+DObhr6cUtfkfCx2YlMdNHse1mEDdHP
ekIHEVPRnuYFd0RyZJq2rTtRWluJIKCLEJQ5M/+RXWGNQD/clL/Um/2GFoO2
BoTB0+IFIAqvIJWtCtrsPV0CQvmberlc0039BctobbPcYyN/3zlgZen/yGHY
7KGSMPH7czGV/VzR7+v1bbjjKaVUPjDFr7+qdP3pE5YFfJDfCPFQFVHMpqfH
5e9Pn7AjXX5KAx+TmnbDHTpdeyK2ovrlqr6oe1qMeGbcFnU8lFtaEJaD+RMQ
5AW9flMvaa+0bZZSOjkLtF3g3W21IvLkrVu1pJp0gbukIdB05PXPvr2sV3i9
51MhDczDT5UsAl/tNC5i0/WW9uWRkOBlQ3cWXauz4us7eE1xr6sqWj0ce749
5ONPn+5P6a0fdXs/z3WsDf1C333HLRYswn0gbsTchHk0T0SPij+82kKiO2qE
qNodWlb6T5lCieXvaj7kF3Tp7VvarB3fXLyqQj1xncIID4pk3IGlMhVNScPr
aZNvVaAUwiN97dOnKakDkM7pQ1UM+EPetpcv33miM22Ovg5EITfVeq2UQuL9
fnnLRx1LO2t4sLhS01D00iiiSkZNR23v0yfQybevv3754r2MjnVFpuw3xJCW
soZT6rO4KdEyLfaHqtqh99hLAK8TFkMaF7YkSuK01rS64HNVJ3TEL6fzRauw
+EDLH5hR84Gg+fC+lGvhlHjc645pctU1aJnnyEtD7WybG5L9LoXIp8W79+9J
rCi7fWufvH71VlsnQUcuviUpacLPqOcdy2o9kXHX0SHgK4OebA7HPzagoKTQ
jc6QiKqr+t5UNtfADQljzU249+qnt1/fjxyJby0+2XT8ZA0hR9rG86FUdm5E
Tx3w3vBLZdFtiBtyh3yLxHtiqvyfDnCzpelcVPw0bpnJtiGBk84/dziRB+Nn
dGPwWk6mwUa32Ld8EPKRxJWQu4oWli7hjgVIOT98EWIWtgjUOvaIr68lCd17
WnXcsSNsQw+tHyYf2sFS0brSwGjdhbMp+WwayB8LPrp2RdqgE3tNMkOiuq2Q
xjzrW5fDur+gJoths3bJ0nMBVLMgFadZ0Lrxevh9k7u3OLx7i5+YSd9UYdlQ
17ST9ER7XemVLXIKbxQNY9HU2wUEa7B6t7bz8EbaF4lbOrB36Sbqrpr9mlie
yA9E5TqBEPdGd9wmJO/OmWfe1ERjCzEaEM3JNgR3l+W7hauZuL1w2JLeJHWG
RCSmI16isKxIzlt2tkAZbe3apm8WzVp4JBM2f8pHhtltEDLgqTf2OEsp8nbZ
ZyRCneuEZIHyu6DHnb6p+FKpO+IyxJoGtOkvEyLL71lqYKEDnHK/Y1VoyevT
N3RDPii+aehlm5QfiC7SUJyTKe5ZstgaXTGfoJNc4IU1a5ldLxPmPWJ5ya3I
lFtmix0ddBuzyKOrW+L5D4o3G1qfa9lymuYSrJbm7piSHKKOBnPZNjfUD+n8
i3IJLk/DWNCRXe3X/NieJ37YYVtd17BUlCT5tLOu4ktZLd40CJIlf+Try1iB
1w5UgPj1iyETEBZgvGd4f0szHVEZf1aq3sk/y02OK2AevqcjWG9rCDvaxA3v
BInkDX1Mt4L2z7uAEdB3RJtrEZQXbFWsYFfc8OUKSiWRiRphef43RIN1/aFy
lzF1JrcvRCnr3zPY7AjKkaQn69XBQzQGvoSrXxZVlT3O9L5poCCUbG0FI+hp
DzdERjVd7z3NSE4gb2PpqUCuSmW9E3lT35vwkvOv1PyyWpW87LSGx0fFBouT
JplkDD5r1AsvN5HS3/Z8CCCJyqFz60SSaxX1gWlxQapRLTz0ooInhJgdi2o8
3a5jCZS6hLhM2kAF2TcapZKq9o0urm0/0Y30gZPLk6l74yAsPXegpOOHT4n+
ja87tnhytul0bezjuu+q9YqXRuWOpWjqzB7irSh3yuDA0TIyKy3Z+BGUApkm
tWE2Y+nKF2KbZUlwigXY9bhEbhon+IKglExomukqK3BdbHZibMF1QaoS3S9X
ovXaY+DIRbFsiNb59rGToNcPmJUpYCpklv59ufIh+E7TUOzSU0WI31k3WGXb
LbubqD1R/Jl10kC6hs7YUPdmLQUCGkt+qqWQ+EiCYVuuD0cjcvJF2WVCcpDl
qKbKjbE2tlTNli0eZd3qDOiM06VH6kkVT/6BSGFXb/GTsldVoGiLVRCis0QM
qVmSUgBDPcl/20mIlw5N7Isviu/KbQm15pUbEjbsWxJPi5eYxot0Zn794prP
26zr2/3l5boidunfvKBVq+isiS7C9FvqXg4WpGCLIIgPj+K47eFr4KkPZCZl
Tb4ht+ys4lzTm3zwaTF3dNZpG7f0DV3aC88JqTcs9QW3tVs3t3KPKAsloT5U
2+u6bbYqyPMxuKqJ7ujERhqVbWl0DyssVuA+3lGfquCcPT0hvZ8YASY3L0BD
sktLE6Y8BXT7ym+c6jrpFCehN7xZCUfpxf+0GG5bCb1iuNwihtEDiyuaJZvD
iDpqOpplOynYFCQST9/QYdALSUVb6L1yFSnDmM24sRsW6QKpsz1tpCxrPL2Z
goOWnUoEvQ+kyv1OA4szGKuyh0Qi4AM8z8i/s+my83XB9+RSVAaZHs2cFCHl
r0IxKmYwA+cuifBpBE12QzMx6KbfVHesLo/BkaC/hGnoMA6JOSCRNkuOuOHZ
XEZ8Wmxa0N3TbflIvO6LPTtm5UwzD3dmu7qLbGe4CFhzNchie4JnmrZPQrTu
2bQ4Sdi4qGhcVXgkQ/gLXU3XIvtTz0qRPd9WixL7BdviZEU7SgJn09U8+kmI
NKuMkyQ4iGsgerzOciSMEpBUhQYDzYzWXZWPZYG7JC6J56iQaeNKdlFXNCUA
S853P2minazvVbmO6lL2XIj90blbVCr20hAnShiTgk2txLMbcGY3wkBrQttM
z5650RSjo6n9YE4fnuGeD2MDkiW7Lte1iPdp0fzFDc2p5S0uzvmth9+9+L9/
5h/OQVgTvD+hVVtANmaSFh0PKjDt5J6uQRYAyoySOtJcqf1GNINJt9vTL/vu
sCHufuLIN9urtBgTGfmqbpm2SLaSAbC5yg2iYCpywyCR4h2mJjOjBfooC0L/
2pDYXOz/fBz8S3/CC76dLyt669HRn+jvJ2d/CtLa6TP+/fjo6E/hfbMj+Yp/
ffSE/352/Cf1fNAn+Pzpoz+Fl03fNxt98AStnZ3Qg8QRqZ0TfEqt/8+zI2tY
ngvhbWNmTeykbiyYSWksGgKwrAaWWEioxHKRKEqrFRak8mzkQ+Za7vGCbnh2
qIH5rhiSYHrOmgW49RLiAavQpl4OFbXiCjINWyY32ljkYcSX+bSykii3QODu
G8g9ptawauo4afULS9COqhI35ykLG0l6PR4HPeWXkTK6ZCxJwkDkVyK//MU0
y1dXJTHhRfG1cMHw46EoFy3j4kHmpVCB0Kzs+gWTKSmvFzCr3ohhBTwvsU31
4HilPfz66wBiwEbOn7zVid7fQKlr2mS6wpujvnd9n48tTg2J+smFkyQ5NmWr
rzXOYWpHDpyf76dFtYymxdvA1iqanEi/ZqkXibZc/rVkK9Zw9XgYdNRX9SWr
HEEpI6qm6rxb1Hrl8+C2VbzveWj2ttI6X/2sNSvVXtXLZcV36RKmFdp2iACq
bdOqQTpfkKAm7EiMKjJI2hLajRN6GCZRhbl5WaLkjWWLQrS/BJFPZKVoHcpW
XI97EVp4aM1WHRYQKprVyhli+R4jQaca9qlSEsuVimBoq11VijiRxg6728g3
Yr8TNWE4Ah5A3PXAiiroUmw12rEID/mquEPIp46VmdC3sKGznbYvRbgj/k0f
Nu0SqhFLVHu67uCRVZGuE15C8jPMh0tHeSb09YPj4ud8KHdFvTiKXDj3Sza6
w0jPWt9koWfbH72J3Yl7vcvaPRByY0bSqChFfdl9ke50WgWSkK6KFr7nvq13
U6gMF1ggGKvpgERDNVrsxVsM8yRJBRnVEC2Vcg0tD83cdNH993//d9CPf6aP
f277vviquPekeFAMP/6yoHbst/vFw+Lpn/E6qwNe4LA5MbNNV3R/U6t4o1pj
NEWA99ry2sJGBV+tw7Kl9qEw8qqXNkRjiNYSbADMJbpZMM3Qhi/N/5YZJERw
v7H7ZQmpiG1cN1VcVFl4s0KxWDARhcFABU59Y2Ml8xtVSlZy4SSniFheJl7m
mjizjChGOE0t39b7SndJIDc/L25otF/R+SGx8IFtET78MsLO5M893qqLW5KA
fuZjsSxmhX+ed/BEdhDMsYY/j6/1aXGO5s/N2FjiprbV8+bszAsRzJ3gfSbJ
asJrVf0i1rtjvl4ni3Zfs7o5YeH2eH5yxjL4ZLfvrvDhmEtTmML5YGpxpGox
DuWGkQy8+niKOeFqXV9eKW8A+ewXRCOrPY5I8qipIB6iIG6MAmK4WsFMAKCR
uG05L0h6vVibTVw8iNH3zO7v/orO9eUVbj67vsW5B5bZwtMD6ty3bCcs2rr7
4KS32G8AZahjAvw3rRJ4AjzJ8ibaYFfvdm3qPasjmKE0Qz3mK3ouy6wOBKPc
UpTE9hrwXW/hz0kU+tGQRPlDobb/6MwW7n0Eui+3bLYVd2fcz1Y9h2yelsle
kKSWBCi6+pggzXF26BvnW6q6btY0aGekNAEQ26QmaVDxIS+T5cDTYhoWfnAX
z2IyHnJD0mCijsuWMBBD1V01azCJ4/kZhtV5n5Sax9RabhbSX79gUxpb0j6F
8PWoYaut1rcCOcYBXRy47WIPTHa3MrNt2e9b3BgsLGKhyqRLmfuOXgxYEZZY
VNOGChWJMz6ZvIcMKKgXJEJBXmpFnOQjt2WT45plSpa5Fa6h/rPM2BaczTya
Makjkph6brlUcNdafKMbHvzyuiS54rKa3H3r595PhkDZ3SxCap2W3ZQnOhWB
5KOS5QmsFmMRWrV22s5MCrF7Tg3lJzY82FXZKQGlnFhEtAsYueBA8q7waYey
UmNujTivfyCZFPaZSRLCEgZBTIkvX76bqs8/mBUB9JuZYnWUbbNrQDusmfQi
9zMfV6wENLXfAJ0qjIKWN8SRlAKoAPfQzkSo7JjxJ6ngLIi/rBMdgfZ712W2
EOYGrG/HZnhqYWArQQSHd1qoeGA+i4SMYPKPG6qOSqyK+K5XdIU3N10+blhK
oyOGNnlBiims2LFZWoCV+SWiGSI2ID2IrydIF+IaRkMZcMMYnohM6S4NXmhS
g2Qp0xCxRZ14Jk85j36h4plfBdFnOlsCGPflKlBXbVz22K/4Vuis75lY2025
Dg1NrBTUgKi6GRDNFF2bPa28cpjkChBCD3p5Q1fxUgJv1l1gOOYUAecJ9xpf
sxm+CwdzQUxlaUiv4q10H+LGMJlEoZ/okt2GDqbFwN1kNgsHZxWHWM93GQ88
b0Qi8NNCCZxeX/4e+ja0jn0R8Qnib1d0pNvLjHBLW+N8knAdZUR8QHq0hy+G
JOvEO1hhBtdBg9UG1AX3L1Na5N2eq4rWbq44k5lBdRdN368revLDVBSfiEzw
DWzoGnAoNQy+asMh7Mkw3hyK87c9seu/R4nfO5aj0VUknLy3OXz2ap0yUWXg
SKc72MxXtG4ryHHCPq/FQq1Agzs0zVW1VsPIMizbegUwGws/q7bZZC9NEr6W
jZkcKCOW+eTVEzU3+imSGQs21KGQIg5nu48hsu+3CsWgEe5qlhEYFLiifRIp
7Fb5hVwvbHMPucmdaVY+2VaXEA5lkO46TDaLDYMriJvgYK14R5eCbpzAZMin
fZJzEnhod4B+qvza9bDImVAjJvku4lTT2tR8N4vHAZ4pITH4eNixBt+zGDrZ
LE08DDIYndUWS0qd0n3Zixz2KlvJ6FOJ+N7wosscCGBp+TuG95yKZXVjCCzm
1wu6Ss0fLTzNlEqjQeE3JIGwIQ4yLrvG50EIib2cNd2+m/J5UdWYIqA1CpEz
ieNyX7aMcRSJm49QR9sLqBwehOggL4pJBy92jYpEzsoUxK0Dq2APa6ywwl1V
fsDVYgiql/teXReu3SAAnhumGeaIfH+w/lkIOFEPsSoDYO9V2+F8BFOpbIRJ
2TMLEePOFTc7L16IcQgIMyax+u8m4Mmglk30p/L1WXq1RDdqW9hxF9B9coUG
AHw701+iySBvRn2NJbs+O48PCIbanxZ/3ZMkA9gMA2PZ1Qt63kLMXdVtBwNh
2/yiMClIV8FDLXWLG8GHRGfxpgTtAYtPqvi8EDUJMbdjGjKUgYvKUMqmBSrS
zBD3I0AzOmfEcqOhS7D6e940prYmZGC2ZOZQmdfrOjajgRIl4pwcMOXr2+ER
i45PcO1lVUKKyLU7h1l0ejdIMHLG24I/JzWnEpWTFzsebb54riAq8dR4y2Fv
6wCDey8XjfUwgnuUoeqjFoch5koGDC5gu4o2b7OfwJ6qL6mBN70kUErry6iL
XXniwKF7EkqhmcttCaIBoL9yrIslvmAz1y+phwgtSVOG6K8WGxP1+NBwkHZx
2egx5mYS/r8DnbHln/71wq6ZRoPXgsTGwdAtPlQsUSpyFKE31nUaYRiMkA0s
rXXF0U2M3mamsoeQKFcbDHPbMLnYs0zDgXllz2rj+xS0U/aRGYBdRG3KBNyI
1GBSIRa1o9kL5+pk8mUPC/cFS828F50ELtj0BVBqd5rNHjxW7EpJ9/BSjx3I
7wzmGZLbnBrrGPl6YxwP94q8bIfhOzNQCPduK6j+t2laDhbFd321ZROWYMxU
UJ+as2zPXHoNoSmpJoJn0MuiElnlpqz7sN/xj48FuwfHP/VyWXeqTuv9SS0I
kfE9Xi8iSzb9y0+e94AkSgErTmwqJgmZtTFEOq3n1Xwa0T4HG4ldA/qPNhJg
ETYtqvXHeFOka5gZVubjXlYC7IfYkTDMKrzGAXvxNYDUa5YElhV8fiBdZRA3
ESiGu0/DC1jzNZNOpo/2tnHdPoGPm2Js0Uj2EAzMhq+gGPdwwCIY1sO2dRCA
Q516YmS0TrnrrYscTJ1OejTSmf8IUkLQtZNQhBu5QMp+JFRNld4mIZK7Jpin
ES6lD1WhE02glegwZfbcXTHgkhfO1gHdxi87hUx1bDfU43PhDk8xcnhysjM6
8yoauNGtGLknJrBGFRmwefGuynOPhRVf1gwuY184W9iaLZzCFqmY0dC8+DoO
JbUMjqzeNjFxjdkeLm4zcSJDcIPx5vwqB70TZ308ZwyCcrU6N7j1CP4VuWDH
7hBuQJZEAHcqUeEGNRmKnzlXh9PPgvs9NwuFu8PTvcUIeZMBcWjdvgwY25z6
UbI46KL2jit8K5RzzntzXYVz9fP9TPPnF8+nanoR387w6+LLwrUR7iUg8TRv
XYHG1MTJ2dGmu69jHBuftxOdDzx1NBy2MR58LFIRkaIKXA+Kas3IIu5z7GG1
6hfFgSvwq+KyJEXjQT4wmufABWWeqOMZnr//YNCQ+A9ZoDnHA+eZcyktx/nx
w6fnd5AUy41fFD+IooCbZ7+FLv2dCY2vzEMbj6tz8ZH0f1GVraLq2VVCHG1C
OygKuRm1J3zN6uuAHJMGK4iGrnDhtFOHZXurxyOyl8WiaVlxWd/KmpsczDyo
yCM5vIvpoJ1t+uwdg/pmbHh5O4gXAqV6sZxuow+q05jnY1XbzVfv1AQQBS0I
lHNq+3vj2L9knAatrOqtsTdv8b8qnauqOJQj93TdcOQ5LRgpeL22QC8JpEtN
FX4t/dx51F1qSuR2fnGOmElGM5Ag0tdr9wyNgZ8i/i4qh8XKgFPgum4Fdoo1
wHA5m4eDV4K8FGmUrOYJSszKUpfdCazhiMzwGxyBRO292vGY5Hu4mYgSb2FR
83EWJXAhIuuLNGGIg4yRw58npq7zKFRgJadow1hiBnMtcT2xcS4PLcsiQc51
i88V6JxMAIriYT8vm+RLidCyUG+SCXaqC/yetYiYUVkMG4Ke9TfKAH5gjyx2
LB71dPnlftvpmDoZoZJxEVOYXlDOg2sKyjd/IaKQ7ZSpK8ldwwtxiSgTdk1p
IBpzjoxFiHCpmymuYgOhxblh1AUxJmYWdFVfDz2TOOfMoVivp50DrUh8UDK1
aiyWInGIAYTysmS89EggBJC6G1gAzB7EVh3JXAHvM6z2Ju0KTtTZlGGf/oxc
9CbfDyP5EP29jMLMgkYGWPvo3n4/bE0tUdE/IacfUWOi0MkZZ1//FLbvsus4
741io+SZAKUvIjegZpTLZgfbrIGPWWgtgc2BoPKdIZfKYrUuLyNo92fEgv3s
GBk+FstTUxzx3fuvsDWZPJ4DhYpSTcq0JTAJawP8ngffs8F/4mjL+aCNuImL
jY9KRhwZztE0gnEK+YqDnNStNIOPU8TbiEsGvIPI4PVmV7eSlcC7p3ySidoA
PHAPr1ROzk/dJDiQcl+cKEg5V7Yi7ulz1iIcjV+/UKPPjH/9NB5Um2KXFHY1
CK1GzBfJ3st4+gZWs0PgiInOjEMTNyRpRWogcwrfMgWwDvtMBjZqY8og0Ohk
18ObwT8HEYnh1195djN3IXDAvTFjC3YvcfuLps0x5YPIT+IOs/g9gj9/qgxA
UnlbjVw4HAhv3v/hTkxDW9HwFlGlV3SQ8NIM0s4p0iB/tDo4hvh7F5Xx2dIZ
UkgXbGAWgDPPRy06Jxm0ys1Ffblv9gLavIXuqcBOnDHshXP/SdA4ulBTKGzj
MEH7trdNjRj6b6I2Q0vNLiVh8C0doWYTh+Z01mAXwVaigXoJ3eStoX58x5k/
ZB4Bd4dIF+i/CmRTAQH3hCIm4b4TX+dB8KPwSA4er6/5ZU9XYSwcmK/id4h3
dovx6xcH1CdHz3InRJFD6Vps+mI5ymKAwYr0CrhVCpHFRQS1IkXh+DEb50V1
4D8X7bV3lrmIIoXLB5IsrNSWU4DfEhVWD2L0MgVdnJRoBm7MSh1BijZIM8T2
r0RlIQUkpbHB3XGuB+FnpoXz58mcEwONImPYqDZkm8PXwDn3e/Cun6nYPPmu
d0yKFY2cOaGxiPyKD2qrn2N4rOwpZ9ORtTH4zg1PEHvZbLlLSFU/8wjunICO
lO91IkPmVIUTyDLeK6NLc5IAaih+QlCX7A4BCpFPqaq21MTPQmJfFX6AxayI
44e7KT4VP6ZH0gyMHywN+3a4nsXDA92YLrN7cQTTIvVz3/Ri4XYcI0CnMN0Y
MRGQHZV2cAxDwu3kqVWEkRsPTyb5DFDQKNYAxyVj5ZDacA0A4dYbF6HpHYA1
ZxckJi2qT5/uy1rX0VCoq/TPhccGgkqyJiUJWvbMV3kTskzMh16wkV5CSCNb
e4n+iSMdjiniwSBg+7D5aebCZYO7i1zGyxOBCom+I8ipSFMPPFutE7hkenAr
ynEGN55qqgGS6iBmddFUxUczM2epnp327RDpbt2L9irycM82jvy8DKz9amlS
065XjP1bmMatQ51SJyMEtFjDIWoJKhTg4mev3XHCnAWHdXeiYHDirJzecNpZ
78ANVugWZPGVsYMsAkJeJwGhS2yjSon/8rVK4f8/QoQTsxC87KUhbADW4y0X
rDZO4G00fWTHxF1HliRDlzsdFzPM0k0mwYml3AqWocl7LwRHrZ6/aMaUrCHM
8SrN2ebMqYeTY4tL0459gzbsanFC7EV1WW+V6+qSxc5pYVUCeNv0SZI8lAx/
/SIXJUPI/a0QniJidGDEyGhdMbiVCcRRGsYeSDsX7M/TuyKzEqs4cR7Z7Xm8
v88T3z2P1vNDvhBuMm232zSkQI9OGQg2Fty2pg+TwILx6bV0ITGJa/WIKGyA
NVgjBkHW4VoLeU+SLrAaWR3oSbiZdnwP3/Yi3UyipYZ9yXQ9Cw4lOrXHL4GY
aS/8bd/0tVNLhgJBJByVBLCQ81GIQXy07oLlzyJNvGp7MwccYDVjizIg0B4v
5S2n+4kRFn17q8YljXXJJ9ZFx61+zaocJzqQtTQ3oFgLZbZd1rnOLeTTmEap
pYtLLpAN606idnQHmQvEEZkXI9/ObtjcNAjPou7WLtKogA+6ZQV3EaecO+K6
4JDuPxl9eXBliEiVYcDQTcVWINa9Gkjctmq6JBmNpRw+B9MhqkeujDFV7oB+
RTBRrmvclS1CQD/oYeEU16cJkkGC4roKifkoPp8vVb1v607cxTHkTPYzcMMO
RjLNUABApjBzQtRlt95fXtbdVbBEQSkhAY/nUAebF68jUjGw790ZyOmuoqGb
1JYMsWzWUBbFN5uGLXkFI0UyiUGCV6Nzvt3AW6uwuIjLVVSfAYHSmbe5xPwr
cFCmhWRiERPLazBCJ1V91yyj6Ik9wxUpVkzNAXLwzluXmqCAtWzDcZktSJA+
5UFH4fbb0x8trreQPDaKvFB7DuwwiOZQ9bxukBrpNWeN+eAWmxvKJOUgzdr5
0yCncE+BaefVYvuzBj7hjooZWzlmFOC8+zFYTI1cXtxbmcJJA+JcUl2hMRQx
0EOJXBF87DwBpJZWYcP4Nu9PEDu8nXc3NEQICrxP0iw+enQkeT7s12O292jk
rRz7S1KimKABM2w5YUhHRC3j7hLG/3fmg2YtAumNUOuBU6bf8GFq1pVEe6Hl
LrcH6zaxaLET4O7UWKAPMI2cxzE1iIBtaVbhEDeaWZBIqqrN8VOkImwvfqZn
Hhb35Icv+YPXr94f3w9xFYsvvyru4fFZET+8//D4sVO8PtSSSVaGoqwBPjom
n5THSy48QWXxgqQV2BBDuHQyQLxLiA1UnFbD3DCph8F0zdH7PKpQGPQ/F0fz
M1GP0pS+wncygZ/Mt27ABcMeS9AOZ9Bb5npe5niFnTiMGUTZlB2vXTVS82OK
pDvUVxGun4eFwMGKteCNHuSynCD1POcUFTtAcKEKBmVNcsXwbdCEgKBEVo5k
oxwKdx3gdZ5lZIE24MI+S5uPJZVkmoPsMqy6DwMVASI/yGc0yC7TCcCkvJEz
OMhq9Mm2biTCq7Mst8tQxjzPk6pblDsJpZqIGWkldlefDQHmNjcEQE41R9C7
SsBbzTZHf3BIQ0RYxf1H/hJ8p36zDQLcocpZ8DxSx4ntr81iF2KLYRB8Fg3J
iFvIE8ppvQKJAXReG4wweZwtr6QTEcWY210x/XMUUTAf+F8j5knflxjdbuAk
JP2SP1SfhYKX6Spv2F4J34fAe+1MD3b6nzqxd2tGGjrwdCtFVJFlAQaNJ+p2
STYEOMMx8/mro0mJkJCoS25+2ovLVrLHrW8De7oxl4MYR7oZ9u1WJemu7veK
vwfpQvQmjhIUemmh/pAS3jaC7IMQopj/Ts4gpxTb6oEbz8LlsmGWmmcT3suw
QkjLFXyf8YDG9OcHScheOC+GGMBinOQnTR+KfvY7QTlwqzDJJnE/nHP84CB8
8FySY031yPloHxdL51JhJJCV4Br8pMSaEc30CwCjHRuOXmZGn733J6n2cF9R
TSQZYVpJphkBcMWoIUsMq3hk5pnrtc+jKGQ5pvYXJvD7YLJv1lGgRQalSoOd
JOlsVFIqMZLFbkUQYvggX9ouUgony8Wbiv0+DZ/t+CQ5sUeIe9ZLxtYkirbV
L3XXy4UTydnUhMP178CwIVtzDIYxoog6drF7Lsqyk8Fyd7QcRNIl283Cu0rV
JHHJ6Ckox5ooJUgL32sy6dYlfFXlvNvXmiErBsTw+F1lH1wufyg7uDeCfhIQ
ywrZWpH5L2bg4LeHCd0xacvGFob9iattTAsS6LkJyjD2xKwn9ioydmY+XA/L
cMYNkluCCwCLyoLYabSCArfPsRMO8AwNgwVTvlgut9JPnhqOB4lMQzQlMLn9
lnlWOMhqp3fke1UtJECqEGrcNFGaY7MoDYSzza0qDpWVnNgxIeRaRRU1mEeZ
/X70B0JmR/5z1vyIXaUwa5+Oe2sXXcAJZN2S9F1AKw1Pn9aWk8PGwimRd9sN
IadQVZrPkFG2X+HRSJUDcyaSxHrMmnDKWmruz+QGwGbfS0C1bQ50owU58U20
Gr6eb989FmktwKGQ+GiUUfh+35tgtm1mu77BEj8aa5H26qEJg8Bwwz5gJhlz
j2b2/GSsLz3iVzARjJmLUeH2Jd4R64QoPufetXEekCqa5DUO9Z8QKygnCX9Z
fFE0WUEQG8ioj+Te8Yzfv5/lXkBT4hSLcv45P3auYbOdXsQONwShLCphzreg
9nLo5wNRuB7gNk8ZjZoL1+L53yvYQI/VN5aPWOWDvD0g7loFLmgzFu3L/gD1
OvZevvSsRDJTCCQJ5hOYVsXJyg4I2E0sTzCD1YQBY/wxglpmzTAVOl9KMzFI
bFPeBglvy8aaAmYzZKvXkDK9HUbtgxFkwLYBkHlqk4uZHjPRHU5uzSrj1Ggx
F2e58Ad5y3mJR3A37w9HIGJVFEXFOytkEbqoTx6eCCA5nHtp7mxGwYMSaEX5
yFZajOegoT8Xq30LgVvfQvQR+D0D0yIWtBKNPjm9wttDHsexxmrfs0hlvZgZ
/KGf0Escs/AT/yOykuMOhaZ5GcFYaIbnCKmElTimg5XXgRaKFm1Y/yRXG2KI
kNWsktICtBr9leKyjFubQ63u5+Fri4f3ihRkz2VD1McJCzgE9nmx27fdXlb0
Erk00gjZ4sKEJavoZrSqJf2FpHWYioLmDcygMMc0YjFETWnJW4Gcta/ffv9n
XlyTqdHsDpzczSxc3MZkOixVW0iXnED0zk/LDfAy5upL0hfNhKQD5H0Brk8s
sjGKi95D0xxjWS6uBtlFYjSc8KPSaGJVS2WpvDTUHVkLAu78lHMvq/gimtTX
TZ6EOr/Q4E7DXRYCyvdIJoa1ASftUswAM5flLmV6kPx4oj1lWA45ryzelP0/
wcDVXLBqbKwe3SU7er39K4LNZXwShrTvJxFdo5asH95/jy8R0YLkB5bjFV8j
e0eXcrsBOS6uU8YSe94QPMY2ju7QzRnF/gwkx4dakiDAbe2GZeUnLGifXa/j
iEpxI+URxOwKRmEJpBRVtoGFtpoOjJIn+tCNiSyCzaXr25R/k0cjGe9CnsdY
sGT6uuiTrUtVRztt+zs0hglB/UfSLX3QgPLkHzR8UmFbooh+QhmWmGZxWObF
UjwL0ioaiGANOogN8jkyUmYv9X7LbbKrkOGJKSvNICkAgziezsfp4QZPqfIK
F2hVwdquzjgDbtHgXrz6X6qgbaubYeovw1zG8hbZXKyWxaAARIYzlfItQNXy
75e45LwTr4xR7hMEqelpuKAN/6DXqy6TEEKGq7Ro68OrPMsf1ImbAu/zEROV
k1l+Wis56RFgmJI34YQFyYkpMkg2BK76lmq3DGsuwEAbhoOLmVP/nwdyKjXW
BWGKAjm3mAuJDc7UhQOhTvXrKyZGk4E48Ktqr/goSFNQOFPKbwQLa2iBloJJ
LjGVVfSQzWZ02QGInKwGPhmJGG/EFCPRJFZDTuTEVlAZW7YcExHEEP+UShaq
QLRdjCJnTZgLuQEmYnpcAZwIgIlx9KhVVmuqlWiA+/UL+5EO+Hes4pjpgQ1j
kqc+PswyyN5gFHXKXMFxljhlMnOxpmh0DdasvDRbo9AEKKIC9REDFc+Vk3Dw
jqXb8CtRty7hbtMKtEONEEJxWXVFy6KXxyTgnheDneogIZ5LXptXpwbajKM2
W6UAcVBgcis1rWKtBbQuNzowO+KykZv1NsrWQ2Y31Se9HmB5FkFLlj5D3ht9
XPQ1/3TmlR4uh7Uhhy7lmxOVu8yZhksh45NjPvD+u6HyPVag5OAVPoTiZxl7
XONI1mLJEbyVJuQQm1ELA17UxkkkKzcoN636auA0/M2NeBpohs2+VUsmTK21
lkQcZp6LEVuNqflCGLVAuVNse8wrWliBBVeUgbvRukFmTPA3HnQob7MZiMAT
cZcBNCEyb6bl8viY36rwA2LsxEiF0qYIx6al2MRza/pFjJYPnIHLImxihQhJ
MyQwAdYj2NbUZHVliJ9KFhFNphDZn+DsfbSAULtZZKtuQbcLPzrh3G52DUDJ
5ULsmi0OPIQ+mhY/Qn79Zt3cLsE3JbiOj7mVovALfPdi8Vqvm8symsJ5XJpk
BnuVYtUuEAm4bOlqRNpIrRw2kqgpRvpZQdORox4G6S8+P8ZiOEb1JcUQwMtK
E7NJMj51HO7bQYUsg41IUjhMUF2CXYoMdyDCKHL9VLmVUHxjCtiKeSI5SQPr
k2DQIJCV0YRQiKOJ/1H4OPkqDp1zyhDJszMrtNW6VitL3pOamVf1LyJtnMo9
CC8YG1JfadqGuLxm7HlnZgR+XQVZMc/eEJerwuJ2wVoofJISU/9YfcNWTMfC
Ibw3RalMLyI9xyYm901AkLutOIklW4c4sTakZ4si54KfuFS2pB21Lu7n4M5h
TVgS26WzWSLs3t2F91wU/qPT4ruLXae644uUYYZ5FvGzmk89c0AxaYfvFd2q
i62ypqPoVOZGZhIXItq5kMRwXa1UD7D7x+fR0rzuY8QvqZoCjDDKqWPam8zP
9CNzc022Zm7lKr3UXUn9KOy/3ANAlW3jIR64ItjJ7osW3PBlEEQJwj0Tw0VN
oNyK8HnT3CEGskWjODnCBkisoUiy7IFbV2KiOD6Tr7OAEXUNc9kO/nLOxR2u
sqblfEYVsDy42RGXxhHLGpeWCUv0HUiU4/fO+P58NH+iXaVcWI25+1LSWilj
I/lTZAQDeSwhRS0xMHvPZEvZSBqQs0Kwqjc8SrANMARJjWlCLJQ93sIqVw+C
RalJcTfxxE8TEM5c0jq8CwWEKuxtNkPsME42PodEIKTvDj2nSsOOe3KIF3qp
5svBaMNlW17ERDEjNSGmWmjK5Z9NTQQLZhZkB9KwcfTn9tZXmIKnWLP70ZG5
7ejgBp+8Rww4vGHZ8MoucKDoaNyzRRCbBVYLfAPiLKJ4likdYg9+d3KeDAnL
EvJ+iQD6fVu6jCGyELc+zFCzQwaGvYm6ZQiCaBZxW3wwPU6RuG2SsxzSgCnZ
k/g8L3hEd0xU405BGsmQxxZLLlEdTN6xvGH19oNOtQJBIUHMQPFbIlniUs5D
gM0GiCB3PmOqauR74Lx0ZjN2vaGfMLqXbBJKapd1sdXfZRfynJdqQUg+K6TH
zrKLY+gw1EZLmiqwnLd5c1Guy6EbZXgMDI8VDQOiAApeIVV7yjfS7kmFPIZU
aWNT3Fp+Xpa9aefgK7cQjbhx9TZn23Z5HpCjCIuKjJRqfHAGi5YnFeo0TSYu
lTJV/jRMp0yZMTAiiTiZz6tZgxMT3FFh9rHfZraPxDQNy7gG/X6RasyrgspC
U096e3/LsWjXHLnkPpvhsxS5pMTjZFVO87fZqc2GbnjxRm+jSs/WBFtos0kx
J68/P4xpcLhzPnHx+4ngkYczXlmeACQ0mxcAG2BpBzjA2orxQItml6HvnOPk
2YycFlBSEJjsc3ZEf14+7OhV9qXBacEJRZq1he8KMR+BJo/mz07UUM8GMg4l
0u/PjqbUEB465p+m0uz8N9vlFvHWeLuxMXnoaND2yHSPD6brEuRRy1kbGlXr
WiDGU/2ihRC2hWWFtaSLMYtXBJfD3pWsAp3BrQ/sBZZpBDKtc0rjsZ+jse+r
4vjh8ePiy+LescRP2sjuP3jE0Nr0SrJEfMUQoXtcX3Q6aG6YKkhjIm2I+djH
RshPZD0dzY9OaHRH87Oj4gE7yf0Q/5w3r2iAP9jD8cNH3AP+uasHMF8RWyQi
2vJ3K1xX6l3xDVSzn8G4D2NgY5p1D02RHH8oHxLF4sLL1+UaKWhYN+yRN0wJ
NGTVUpV1u/RisYzmqZj3Ab0EN8Xv7EpzIRsWwQ/eP+Tm0VVCQrjcVnMXB0a3
+7LZX1ic3VVKESBsENKiJXa7iOX8lKdfV6ght9d84QgXkTXRdFGoAAdMld4e
DUfYR6OsP2InRywlqz4KSkAgI1qTcyGKxuJ2XNPQxCmiY0swCteGjsoh3kiM
UthrEat8md2rzw+2pow/NB744BnOT6yFq+mbN9F9++sXWs/6kyaz0xTHSRZM
iUYzq9ZY3TODbbXlrl6ubwc5IOGbL0e1JdTo0YxFqeG4B+ydYxJY00x+4j3i
6b4mkY0tvyiWxgkz17UkW+74Z5UH7n37+vv7AImwwFC2nRinL8XP0fX6GN4q
BZ/IznMbBB2xHlIT83k28lo/QgRBy3lCB4vJ5d1oJEnf8RHq15xZqvcDIE3I
Rm3IrzevXr371xlNAGVtomSTlvuv+w0yEsBadwzahAXiTNTG8NLioGhR601u
7EdzsCc0URwCzcE04UAQ08LyYkIMMlsWyFc9kbH2GeypLh2U/jTlDaSDCdOI
qhqPreS8ZFnZdikHKFqV7R5MWF5VW81TMW01CYwQdCGQNVQ1a3nl+OkZJNHZ
jAUaJWIrCkErbJQgKnoQD45Qp9ySfntBcoAc2z6TuE56R4PMVpUk746iTOAY
cTlik+fm9o4uGV5ONj/1ujip8BBXHtKw8OqXPmTrzpvKTyuhGLZgpg+BXtgu
vhXRBECD3nBV9SCX74gdnvbE8qxAlDpSiBMnM9bRocAPBh9KqXqjROCRIaDt
PGDbEIXUVEoZBKTwfieFFQclUSx8JLh0LMDBo4il9wNmnmZJ0s+5t1vs1QuX
uOVb9Wm+crrbr18Y0gLObRY9JWoC2Akpv46LV5q8s+6EYjSlSh3rkRari0G7
QZhjVar9SokAwxigrp3TahiLMfLqoGOYJRsSRCU02EcKrCog9axIu0jb+qGV
xlK9xyqpxkLUJlJH36PkIc5TxDh0UxbnA9RnqdBrNILk5aKUhOxC8RWIUtUH
X1VT61RgQAzhHziPkxNY+YR4HdwTE9OBOMJ4kKzUZIo4DESPmgnMK+CsqE5G
9kOK7a3Egy6ROS5ZGa629FKwTUxh+jGktGrbBrjvLWtHsZSQfN4p6DcozMIK
zjok4SAvTdT6RxZ1rgq2No0Y6MViD9LL0uf6tIDJHue9ARMUqhD7StLz3Tlx
+GwcJOanc0DNo8+VK2LInaL65iF0gVEdPvrKEWFe4Vr9fYan1UJnc9OLoB0P
jsAI4mKAcQVSVqAfBzmxPELmk54Cj+fl7kMM65Uw7wjYQZY+qVbAxgbJVxet
YVXnjGEhou7F8M0Ct/j7JNOVlO4e509zcLdyyVk5bxrxPxhzcBG66e2QVdpg
g+1zWnLkKQWXsXsppneJX/nbCEOOEDh7B3zk7jtMpVbXWUIjjfWDAhs4Troh
Ec7waVjIy+4gpDFkRFfK/S3nUSEkEh2M9noOBl9Hwub6uKJxREd+zMjOVyiv
VHDRV7FncDFoXAPjqAE0xUhqqHWkrRbnGrIBDjZUCAiJpEgQ6TNpHJ3oJSyH
OIJ+OAxFvU/peYy21kRSK9ZabWhYE4v20cOM2kmtlNE12CXnZ5mgDksFH7YV
Vnqj4f5iteumI1LkRZVQUFFK0qds8UlMphuuXnpwi3Ud/f+xe9+7IaZ0ALEo
0/iVHHHTgtXRcheshqJGYwNhTGFudhSTCZpG4iIFPQMbCChvLGdKPmCFZLOg
ue8ZWCCp1YeLIanJsybjUD9Uu5gLKC8ch4oF4GyFZilF5Bo7sySshNj5JSPP
bV0nnE2XYY5qptelC35/zHWMWrNtjD2sR6uGIwr6RqJeKi5xE5oLyMLmRgAa
yHpTx0jUSjOWqFj2BM2K5uTqsmVNl3tDlac+mr5H76N5iBkwYnoIPgWa7TnH
tDiYMT+8XcJFLuOdBg9wjlGEuPsPPB6F4RfonRtGOOESDlqREYrgN69f3U/Y
7Gkss8O1aq/rJadtzgfHmWnrjQr8iLZDYyyVpaoPKp4h9IlpX1NMFdQbUGfA
qpZrVD8aJtMBpORCC9XQ2ki/cq1IUWqL5mWH/16ctW9cYhBG8AINhihIltMM
0MTFbSV1FFRwD17P+eeo8GV7T5KdFtRNmZOiYO3bHFRyQzKvrOhuIHYsKUZx
7l2q2qi+2WHEFME6vYbDtwvLuHa5qKyX4g38EAwuL/VAIqBf7AyJTyatyZ9A
FSLtugFsWmMv2P2H/TxcM7lg/9OuZbtd30l61IMbGXssxi7cRiMGIBayNEJg
yK8U3O5v5fuH1S9zHmmRQpzuldRdXpRDBLHGTcvlu6GZLTrUxmBNA1EXTcR2
sh3pokol+1D/R7NpxlDKXFwCQrje5is9Pdg93OqaT0FiMkKKyRgFPQ/SPLNa
Qopba5V6gtRbAx+LeTBMfDZNYW7J1wUywMLbFFKD3XcaXZwhm1RWbHbitfOp
njIcKYPWNb6w6/d0IIVdgQoP8cWRGiKcVUuP77tom9WEJsx3WlqJLjkUPZyF
FbNk+oPRmfgwf3exr9fguxa/D5PlptyWlrHdN33r0Z2jsify9CfpwMjM8q94
YwPrq9Atthn2WBPHHeakQzb8TMqx/Odq6TnoWew/3LczqAnwJIc6JyJ683Zq
A/hMd8B6gEBuaolP0Vx5Kv7GEZlAMmoZmvlkGJlx6O9V28QkSkFDYNg72ixF
i+wjrgeXqQGxuAh1ZeZsvy0hrsaYtUyWS7R41cYzixlHAqfZMkSvZnuupRN2
9rBIfTClUV9HyQR2H+dPRnEvy9yTGcosGMhiIMzXw7rLi4NAALO0f9J6SFIb
LBWEHUyvC44SRuhP7hpL9B2dI67GUiwid1cCYFe1Ol0sao2L+bvfw0Q3MgAu
M7XlZiuDDCPySevJwZV4gSZeM0aaDUZ2qvm5CHYPA3E5JsxVpFJCwqtM4g8m
E+7whGQhG+Jj/toF+0x9FNo08KWQWhSrUFYq6aeImUnpC5b5fkPsS1HYfrUm
WcKS44cnwwIeFqYShcqYSDXWSk1idOEShjH1WzW/EOtSLHUKxFE5kIRVEkyB
Ic3i6wWdmFOS3coPT01NHJbo9mMSaeEHr7vjnhaiVn+zWiCgsfDWQVNqzcLF
UfDXmrfQrCdq4AzJLjiPnaCE3k0DTDepBesIJeiep5wQ47fPVOr13v5ZcFfr
rhGtU1KDmjQ7rHHQQVxTUnJeVESeCsg7E/DHUwBgJTQVzcDkILouD6FZrXiI
dXSNdoNIabUk97c7jXhUlh6lPG/PG1QxiEsYYiRkDlzVgspRYx1crVNkB2Rd
LNr8pIdkCMyRWfsufiETZ1esTnMefkjXXKnkqdnLP5hXyBcKudbbXAwC0sWr
UwXJIRWPaU7SliAF7XoUnpes0DdXty7FHzMQ6O9StwK3jEHUrS6umOQPMkTH
cysCbbw+1IfDNsRa5D8ZB35WXzz9TucCSLutJWKVPbikHeS4EZSihJVECFry
m3lou4YlQcSVBTJIsLnwdCoBuMtF3S72G3ZrLtQKki5DZRF2OKexhqRsBmmh
4rE7PpkDzFwpdpXFxwsBKCKGikOsqjbJ+LrqC4VfhhLTdmLZc2QDQVCqT0Po
UcY9rxKAmvQfhEFh4YN6MlqIyAdY8ToQW+j37YXLEpRhGKx4DBPDukJewshI
kruZJfdYHvY911gNMVeeycrRqZdXycFMDsKPQ7IaYl2T39guW6Y5sCzaG2ys
uytDZG+JqmESUQOdgCd4E7ZCfqSjyVRxlthfEd2RRJQCrGM8+LLcKW3TW5yw
4NvTH4nuBTHC/IzzmGhZR6mTJMI2MnRG5GnC8zt8YIiB02Yt5yXg9i4bgXsj
9w8jWLRKE/3I9CPsTrM87tbNLZyoWCYIXXVM0KJj1EQLkS2m5rTMFa3D8RwI
Ilals2g6YHhwuLIcWJZ60DcVhS54H7Dy8EB+tt+TTWd1d5Knl09YVr0PycmG
zqzoWkEShMVe6GjQUVa7ycQl5VOD8jri8wPugcM7uXxrhIU6k5OmfNaaE1Bx
xaXnK47pPoRYO6IoBS0oqZSSV9XwRvl15Uw1fJL51m9B3SHwtjMjBYrWgLGT
H5BqcuItYdpCvM5YG0JY+zaWBcAaB6T+esOiot6kUhfOopRPjjZdzAQCp7Lg
BlxuIVZn4Gg5mh/ThgZLulBaOHC6A5lf+nKl8VrVemm8N6BFjXHSIvc+hJzN
R2A0OLtpzaNxRHfZwSiM7bvQym5RbWnpG61dQVO+vKw0NVmSBjjXjmylXXcK
EdKEGsXGrKgWvsVwYUtu8cbM0k59bRzu46Ac1UA1juZqORPRTaBtqrUYj9Ou
Ah9+dxGZUWDBoMRXpWoIUp02yccAV56523yuH6N7D5jXfEjV1kKSmWGHoZU4
xpTx02aO9iJ5gCVeM4BWZpOFMf4mQpHLJaySllpvEjVEwUm4YpzBK9DRdf+I
CPYONVpVHlFNBzSRLYELhuIqPUqJ0VddLq+aBafxUPXew0PY+d5NLBgkXR0B
6oE659e0K+vJVOFvNINT+aiDdQY/FkfPvaVEZjVl7xzQtRpN5eysevrM1BDb
OX5+YHGxZk6lme53tXPyfGAzslasnt8fGdSj/xONiZLuVxRhXVpdQHiFOJss
M8+VaqSxNsXskE7QXA5JkozRIxayOylISjm6c+tGybRxHP0D/osbZPekl5a3
2PPpqIkCs5j/3qEjuW1mYPuNYScLmbFqP8bP95vbpWLff2jZaJqYvV8YYN7d
ykiwPX/lrXxwTlsVDP/68R8atW327x6xOcWzEVs0zrq5ZM2FBXeRr/RNJugI
r0PhYo4+NtX8MEOSWKyDa0FLkQjebatuNnaSpRI4vk7LrdcU5frW7I1BchRY
JTCxcArc3QHbDpKaZYW6UhZOzCFIzrYu6lhZ4hkU8kIBsKw8Ca4Cun9+dCgw
FrhNQ4yrqSkjackt8+K4YcTpE1sI14bqxeAlqs6gROvboIfNAQDSeYs1UJMo
bm5ALSvOWHJSB7VYEK4nIzUZdRSaDfQQTXyGr6MhahZLIKRtIFlpT8lT+ZYm
C5zbydHJmaHYNEGDlErHJSqyE4tSkzCQCzInlMkRnbLg/qbWSMg8G9o0aF4X
Z27UyhjbzwgqRT0ow5Aqr/J7qOh4J7QOYNcs4Ym0oRj72CkLzo8y07Lm3y59
Nlhsv6BLuBoeIClRbNT88IjXTamirOxJDfh8mLgUAJYOyZroklFByotGGPmN
ILiRVNeCoxZ0CwF2yK5kAUPmFd1orypaR/p/O5JmKUIhhrmDb1Bvtl6LJzKa
9g7G7dN3SZGwVOfclWH2RZhdFj1T7yOJTCyKXSTIQeJK60GAxYi1FmzuNPle
NFDN5cLKxVDk60mKXYiKXWG1NOVu5BMp+gTOWb06bCtYol5DxWRxjxJPbBO0
F20WML8EKQsVc0tsoFOWaTVhu98uFfDBIjM7oFmDFN4o5oifrm49GfNQBmVi
s6Ku/9dBXgZXydfZZNpaoG0ZX0wQxqwCxm2lNhN1knoI5TJzIQyMsyHmVuAI
OXQ5qLdiGl/nQqotfWWsduOrHJqFQuloxNOL3ZccJiHVu9TceNHeKrQeQ0FM
2IorFPQKMTsNlMJBdV4jJ41yqrsPOLzdjhR3PVts8IWNmBR9xTRC0OTulTJS
yo0gklVnxYlTu0hEq9HKdusY0pUVes5Qnq3SMo+IS9Hd3LGEdSsmiUM7SR5p
dhZZxdFaIA0p+LtyBYpy/mp2rXSzGxk4t8vFrePaZm/Vsk0C24EVMYammyF1
YJD6RZNvr2AtlpgZ9jLuOIaWZN0I44mtx1ohsX6k2QTbSqL1jbysQorEs8JW
09KKYhVduVmUg89qsmsNCxzTl8mmoUn27PzpllAHoo64K/fwmZSNxPKWsFrT
yCBC2tMIJLaVYYmoL7cVBBWcKgOZa40r8OvBTZ+63Yt3a1g5AGlvzI5uKfYO
B2gEPC126z0f9h0JPvUFEeW64ViwIebanTteEvSSeFMtEWHtBw7v0oTfz6Xi
QEYVMiOVWj9TcHMaEyQwB2bvc00i3yAszUkPS6QjoM9VgRwMj13ltZTDAR0e
QM3idTUNnCEbC2RsQKtl/+VWTLc1ewCujTR5Ltq4wrLEBxrHpcU09N14IVga
nDpPyw2xJIjslC55z7Bl+UdFhDjLkWEkcywC1OCOwTCE/fOUAEflyyLEKEyW
SiUxEGshwmEaUim2fK9gjUFy6ttxWX6M0wFJbgmz8SzmFu8N2q7vWUbct8KS
aUiyH8wKJPc+aElmPZHsvYhzBGHLXLjTbAiaU26VAGZ1u2SRZmvznoj9WEza
SGOFKK0uuEovEllX95r0rXOJv6KbcoUgpp2wT5YEk/1M5kEkJo53xmfF4BHV
hNkOSQTECX+1IllYkb7ydzufWQRSmo4YwMemg4zelq/SFyEzuLBKYY8k4izr
A7vO2Oqoe0vub4jIB8KJpZw8lOcsD70lEZWq8d2QoTjGyG1YBV8Bt0Sy7TgU
rU2mO8uaJvXmpDiRhPEecqxJSuWs4pVQLOttymC7TvADE5fJ+6pcu+tdxqPL
dleYkGlaTLTqVQvWdAJspUr3Qx1QJRJx6SE8zGLZ7a5Qod2XKIwdaAbrVdLM
bCWc3skp2SIBZRkVOCOqPjLDIzP5eiZff/KBVpaDgZTgTlxwOrA3r99/wxzr
u7Klk0P66+Op6AZXUqYT+C/wFnWfJg8mu5crTVSDNJKFeL1vJOZZE+SqiGFy
D+5SmmbQUD6P6RH+DHnnuSUv9nE2ZSGFYbaSyygltuEToMXWQNawXCRxwlwK
tgjQjqUzIWGOOGFVwOhvQQyAbU9ysJJCaX764YH6Qktd/MY4oS1IXp+koeYu
N8HZI1NTyYUFl3RnriWREsk+4n8WgtWkyiIjHaRVjIpvfmGSdBGRY+L0Sz6L
UlJtjMY9ZRmVYkSKlADw6R+9bGixa12V4sJg23ZYXbaYLUnGsXgXtI8CWlaL
ntSKfSajLj3kRav92r2Tag3G1sQ5z+tHaj0ydrlPcIMbTBGHjLgxDrnl6uQN
sxDbINd2tNlBBjD+XA/r0KiDXaT70dBs1PLNUFUubCEfe6JAFGgoLa+y0/SC
rJtbagF5G6g7K/00Apw29DIHQrvcbhL0A8i9orklpNLAfJlZU0PEPSAipAiJ
aKHzmfjyCzXh12Dp4JopXa8J45KL0tJALGyECz6tkp2gI8lV8I5OE4IKpice
JH9Y1CXJtBOpE+Te7ybqQQ8RJ5USCp94f9PhOTSkB3bRHalgXjL+LCY+AffR
/q0usJj6VNy7op3huXLIzlpBl1XgoKec1Zi9WzN35J62O5iukZ3zEcb7PAyS
HEFY8h06whOG+P6GkSUVDpkmfWgtNXD0AKosgkoll6VW6onBGJoxpJTUq4Ur
pqEjjZBekUk4lyNyM0+zNFHeCGneqxT/JbTkXVLToPff1nQVrklZ7aCTSr5x
al88Vsgz81/h5cci+/M8/RRu7/zuQejv+u7B8wehuuPLB/TTg9CNf/sAPz0I
xejXD/SnB6Ee+/5B/tPBn7AdeeuBb3+s3wf5AMPq4JEHRfYIPbMePvOgGDwT
5zCfzx/on+LgoeIBfR0u796e/ItwhSejj7NIjtHnkUru3jXa7eLL2e/888+h
+F1/OCJE8vK8FGE2c4vEADiRRDVvQKpBcYhSsIzdorvzSWKvT91bGZODhJjO
4DwiE6CtaGb2aF2nBfnApXzAckkZnimM9JfBClQGQX+frTcTS2G7CZpMIRKg
NqUFV+QmkhsOMoXWTOCgUI7fi5hKP3sJCLQBBZ8Z/7frzmRVA1IqbsbaZQVn
3h/Ob9CqxFodNtofJP49LGcTbRJZZfXlnUsrsYGcaS6qEJnX0L3ZH6wGboaR
qyHGfZgy6Ue0/MxoBgnI5DIcYnK4fnsqTeFHNUx1YoguOG0rTdTTezd1tv14
XXPHxwArXIsJAh6Ncz7IKXsmSbaQjPSZbrAjvNb7bZXcTKisqd7COsalsIH0
5a3lxsX0xfug0uHosRQA0lQBVBfx9YDErB6+U0oODDE68au+hFwCUejyalxI
OPQAY2Cs4fQMKxKrh4spMeUFSJSzI/qLcY48HOCnTo74o5p0IEbDO79zyWjS
hH6+yRc6xZ8Gy+w/6Blo/xJOgOfJT2V6h2joSPsqYtdgqxUBLJAytlBPXXiw
FG2CxfvCjEskUFqcTYxNEycEA50hIEWIihBxOgYAQ2iO7RxVpSQb+doQcYNM
hvUqrtHw9HNo1Q13mWIUHaQzoyCGWyQF0kwfQxwYm6EsWbOGgD9wpcjHOwei
hPnak7v65uUr1FEOG62DMMncfukNJXN3f3WXBWQJYWL9gfL3FMBoHAmejcFL
nOUCD0vB6oh6SxBsgbnrMKD/M2Bd1P5e+WDEOqob7BXqQKsYXiB5E0cx7yO/
nBwELDli4QxQhbhDBcDHZ0JPiNhu+LAijnK1gqjbNFuDG4OkNU+ZZYeojG9/
U2uiA3bMX93mthXzX8IGBIVLww8E11xuxBkR1WBB2MU8c9IMOCBKH6j7KLhC
KEZfconKZGPOEldLNYVciiIKmgsW5HqVoZfNtaOmuqy8l+27WtOvajq1ze7q
Nog9XZCXwlcTUaZ4kqnMQfsF1JwT99ddu9+JVgoNLdvznJB9NIIrc6rZAdQl
FtQMl0pjlKb1eVuLbIk4ltkeG738anBI1NRIEjEpMjfMdWCx9iw2IIU9XXD1
NspqkaItKlF9DyDwCn7KXuA9GhOFWBi4BTK2ll+6CV0uAvAY7Ut42JtUVULt
M5LYzZz9yazSRQrk8DOfx2sqpcVbyW6EhHLYlggh44jRDqscU90426zQ5QhZ
qwv4phHTdPdcgZZZ4UnkpooT+rNcfob/KXsLlaklST5qCMq3MEjY8s6LezGb
hMQyoe8zpcscG3WCuDe4ISw24L4mwgAuE8smt3ezoXWpusQVFW0kEH0umcNN
OU+MM434UpeximMrQDv+rKFbLxpG5mgo3csZ4NzSsbmCFHR6mO+G9EbvPZ8a
6yDAhairGOu6qtaWUZP1fE4xgA3vPKFRJ6CSnSsOzSpFg4wgHEmz3zkBg4dv
2HJsjQPGG8G4cAi2mXws3l7YNnzk+c/evH1FP706nZ2cpZ/PjvRnfuLlT/EB
+5G+5x+pudns+d1/8f/0zFGR/3+c/g/yE6/7RxUN07/FMf1Q8IPzo8fxH3rl
JL5yFP/ieIPH+vBRbPxRfFL+PrNnn2nDjx7hn7NnePx0rOGT+enp2CjO4sPY
tPgPibNHaP1k/phfeDQ/ltYfj7X+aP70eGwoT+5q/XT+5Am/cDZ/dIzFevQU
Lzwda/1s/uzx4VDAWcEEpEjkT4VSC39mFMve06T+RT0JODDxrCbKFVoXELGV
ix+y687z69A3/pJJYfOWE187LqNz0tF9nfE9O0caronbOPEN9X1U22rFIiKL
qHxu/qlTMyGz/jguM/FnmXrAbRyUIST7ogaWaz4pl9t1kI/P7iCR6zMVPytX
AUQEQkS4Y9Yqfb+IBox9WyoW2YqDAKjowdUs7b62RIxGARbysQRPDPNb+JIO
zAL3O/Bx0dOs3xDjp3EtGfuVZ0GwDLxoxcWRZFK7QkJc+R2jIDhU2E3EHGCT
x3+aRKhXx6Q1hWe7C53LbfjyZRt9mKXGKkEIEUtP1ZkiZkk14pCC+RJLmuil
iqEvlkvJ4mExvZIbLGg1d1LIkC4PVz2tr5qrM4kiFq/gTEo7TltmxqdkiJGE
NryKNw10phcS3eC+rH5huzKHiTlJzWpPktyg+6dvMTYd5Zvn2lje00AQkEgK
4uX2fYPK8dFwTa1ZrIYg2RRfij1niOMw008GJyuEhzg2IWv7v0jp4YZ+MPhe
qltUADHKcfC9pWMDs1JndAusxXZpBbdghlRPmL4lt/JY02iu0xxYsQAbECT1
6taozsoicLXhqr2MdiZwsTKWaYKwE8yRRhQhaWt44opsSlEcefYiHBC10eje
pcS+2a2NMxwjalMsLaSUpFKVma4piRPKlKCWz6iIO0GLVgO+oyWKGJTLoMtK
cTN7cOGTE4RDmP/a+XKY+Op5NZ+Gg6QApVwfyTkpCB3hzglekKVbn0YMgHMI
Bef4IhaiTvpk/Ip1Htl1xxhECxaOGcS9HUx3MWTXEQglppUcCE8uh5hVOxSp
TpJCqRO1reR5JKUVBL4RywSOONh/SQueaKCyWNL07bJ4/CfXxOEczCUtKovU
5yov6yzHG83MMqs+F4k1prU274JltZpFx4IUQj3TgEq6mUvYcE7z3Kcj2p2m
nY8gfWHtQlR+KK7AcLZKxjgsSZlLPeFiqgfZ+CVoWF4UfL2DNcT9dmsVYVhp
Q0eWzFK2aZJUsA4NoLmbdajNQtfBcpEeZnmybcLY/Sg4GvKLmK4ZMnqOAlHr
/qFvVHSg4Q2jB0CjQISyAqJWszYs8cNl1VgCcE7AFTECCXsigocFEPP1qhHp
SRBRKJwQyUG5H1WeoAmNVOQLPlkzE+DvKQzoKDCvmhvee6fAdU07UjVjE1ST
6+MjDYLOy9YJtl86GfYRy1mhwmQt6fzgSLpLWrIYxSG8J62gz7Yq9SCfPTt7
9ukTTP0+B3e5XDLpBJ/BUkv0cOCsz3UgiFAu8JPMz5l1I684g7wLfnzou95G
jE2ydEloQ2CLTc9WSOTm21RILBLBT5NkwZgIhM5CpCxJIu8tB8Qx8oA6ZJEk
YFOEZXD5nb6r1qsp31XR1VKm5I06bMXKz9NdtklXK4dk8a1bLZPiQt8sPrBZ
r1NJlcEZnFJMrAIavlyFZdJG4nOaU8lFB2haPBcTo0n83rwV12Z1yUXklZLR
SMrbZ+JSKkV9UtDtQozsUsoUm0GV6UxFgXBgTPZVUbROV1sKnJRkkFKEowOg
UA3uZdm4URQPRVgT4rBRfPG80CTtdFHK6BpU6WOoNUaWhW0FB3Wc2oL3lblD
wfdxZOT2mR9yOD3k6bBCEEFyWC92RGgN5ixwLJEMgsr/JLZqxmGxrblURZYB
jCHE6O2JqSx+JD0zgj6wCVhWn438NJjnbDeJqWri7mh0BYSCj8WCbQcXFy39
vUCOGv7oZxP9Poqw+sM7NZronwI/P7/zb3o2rQuN4cnjx0dPj9k08OT00fGz
U9bpHz85Oj3BT/ztk6dsRXj89OjJMX+GkbMQ/owEqX9w5O9l5P9fB3589viZ
DPzk5Eka+BMZ+PHp0ZkNnKcQQiyJflGZg1M8PSqUkrZW95rb+VYQj6t9K7wD
Fbuz/GexNOCy5hQgguOKEAwnB0U/Vj2CRNhoQtgeVesih9CUnDrYlLIGlUh0
TOqyoNsf5+M7YBH0wpcjs5GPtCC3JAXLDKQihUBNjKUknmeqsrKng2yjmmSU
NTKBMR9Ge/6MXLBqtEwVGwuFeFuMkq5KfGtxs11OomPGh8AfBmcKZJ6D9xif
pwyaXnFsKusMxk8w9M5V8GXFNl0iz32qnoNr7a6lUJdp4uEtj0OYd/EHmTe9
eDf7PvQFZuyb3v1jDNxS2iIh5j/Mwnmb7oq9/V1M/IHbj+fDkeqOpftSpELq
NFLtNBkmZGx+MKmcRM30V7qs9ZqrkWULi6yrt74nrs1cJL8uZ8lJqYCcneIA
IwPK9XWiD0As32/NP2Lp3TUpqZv6JZ8D1vlke1LBF91PgGgeDRJgarJKg0/K
SLLgjkFENsqT6rFICf2LFJqBDYrfHGyQA29FhY93x860xNHwGZkMis9N1LfO
tsc7yOdwUeRMR16L8G+MnvtMCy6qAyx6poQaZNUPDgyHD873fQxEGXSY533N
yh5kBqtIJqdmuTwcfC0O54k7e8QkX4hLiHkGeyYzRhXLJPAmmC1vbA8suV+e
Cvrx/PjsT9SwWish23xuZ5Rtv9Ajdiz6DW7GayVGkKKjbBKkDdQiiA+ddiqv
NyzZac56q8wW8Soj2y39RgNjZn+UNdGPfv+anPwDK0IvfI5LjPCIQvKFFWKh
G5o0FZqTxcfZSjEd6JGW6yEZsDSWCoj6WeSM4MD+zo4VYD3LhQy832xIG/57
Fa0gA3kgLOuSkQ/zVI9y+OdH5kJ3AEE/3vH59R2ff/k/70CafnlXB3dBTu/s
+Q+84HCwX/6uFz7KYpAgMzaw0R4+zvi/3+zhSz+SuyddBPdz9sVdb6QXspX5
/AsjC/P5Fz4W70yX/vi7XpAePv7+HuTP71ymMdr4+EdfuP6HiWlks/kFesI9
9M80mnemLRwOjV/4L/yX9/BR/x/tYWyOH/H/O49L++0XvhybyedeGP3trhfy
Zf38C58nxZEXPhavTFYYIcXRHg7O6PXIC6+SwJK1MFwqfSHH2Htq/Rjtwh/9
Cwd/8h4wxi8/+8LBssb5H74wvqz26ZeHL3yMlu1sWd9xDdM7mv84bN7DFD87
4zjqsfviy4On/qv4rT93LdnhU78dG/GlXJUhi18eOOkkNc8WutlU8xF5LSVo
AlGkNlhUNaPcYhIbTgjwRr2CHNMjIZtsSt8uuQCOE50VlQlzRXT1qPJTnHsp
5xwC6rmXyEm0OI+gBQVIOdUxzygWXOLm8g4kf3SzN22+ICxOwXhBunzLvg3L
Ey6hWsFVQL6oaBiW2hrJqaSsugCBO2vAMn9932qu4B5VqGg202DQ7JukbWH9
fYk2TUK2apq1yEaXjejAAizktWLOfHNVrTcx/s6iKml68XGYrkXkWw6edx3O
w9eSx/1/8DK8efH2xcESwAq0bBZ7jalHsSw8WcaYtRlXZmX9kBp5kefTCr8+
F99ItfxqsirXXTXh6Orvv/7eK6LsQsKf/xd7fgUWzgoBAA==

-->

</rfc>

