<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.24 (Ruby 3.0.5) -->
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc editing="no"?>
<?rfc tocompact="yes"?>
<?rfc iprnotified="no"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-alto-new-transport-18" category="std" consensus="true" tocDepth="3" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.1 -->
  <front>
    <title abbrev="ALTO TIPS">The ALTO Transport Information Publication Service</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-alto-new-transport-18"/>
    <author initials="K." surname="Gao" fullname="Kai Gao">
      <organization>Sichuan University</organization>
      <address>
        <postal>
          <street>No.24 South Section 1, Yihuan Road</street>
          <city>Chengdu</city>
          <code>610000</code>
          <country>China</country>
        </postal>
        <email>kaigao@scu.edu.cn</email>
      </address>
    </author>
    <author initials="R." surname="Schott" fullname="Roland Schott">
      <organization>Deutsche Telekom</organization>
      <address>
        <postal>
          <street>Ida-Rhodes-Straße 2</street>
          <city>Darmstadt</city>
          <code>64295</code>
          <country>Germany</country>
        </postal>
        <email>Roland.Schott@telekom.de</email>
      </address>
    </author>
    <author initials="Y. R." surname="Yang" fullname="Yang Richard Yang">
      <organization>Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect Street</street>
          <city>New Haven</city>
          <code>CT</code>
          <country>USA</country>
        </postal>
        <email>yry@cs.yale.edu</email>
      </address>
    </author>
    <author initials="L." surname="Delwiche" fullname="Lauren Delwiche">
      <organization>Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect Street</street>
          <city>New Haven</city>
          <code>3408</code>
          <country>USA</country>
        </postal>
        <email>lauren.delwiche@yale.edu</email>
      </address>
    </author>
    <author initials="L." surname="Keller" fullname="Lachlan Keller">
      <organization>Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect Street</street>
          <city>New Haven</city>
          <code>3408</code>
          <country>USA</country>
        </postal>
        <email>lachlan.keller@yale.edu</email>
      </address>
    </author>
    <date/>
    <area>Transport Area</area>
    <workgroup>ALTO</workgroup>
    <abstract>
      <t>The ALTO Protocol (RFC 7285) leverages HTTP/1.1 and is designed for the simple,
sequential request-reply use case, in which an ALTO client requests a
sequence of information resources and the server responds with the complete
content of each resource one at a time.</t>
      <t>ALTO incremental updates using Server-Sent Events (SSE) (RFC 8895) defines a
multiplexing protocol on top of HTTP/1.x, so that an ALTO server can
incrementally push resource updates to clients whenever monitored network
information resources change, allowing the clients to monitor multiple resources
at the same time. However, HTTP/2 and later versions already support concurrent,
non-blocking transport of multiple streams in the same HTTP connection.</t>
      <t>To take advantage of newer HTTP features, this document introduces the ALTO
Transport Information Publication Service (TIPS). TIPS uses an incremental
RESTful design to give an ALTO client the new capability to explicitly,
concurrently (non-blocking) request (pull) specific incremental updates using
native HTTP/2 or HTTP/3, while still functioning for HTTP/1.1.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Application-Layer Traffic Optimization Working Group mailing list (alto@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/alto/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/ietf-wg-alto/draft-ietf-alto-new-transport"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>Application-Layer Traffic Optimization (ALTO) provides means for network
applications to obtain network status information. So far, the ALTO information
can be transported in two ways:</t>
      <ol spacing="normal" type="1"><li>The ALTO base protocol <xref target="RFC7285"/>, which is designed for the simple use case
in which an ALTO client requests a network information resource, and the
server sends the complete content of the requested information (if any)
resource to the client.</li>
        <li>ALTO incremental updates using Server-Sent Events (ALTO/SSE) <xref target="RFC8895"/>,
which is designed for an ALTO client to indicate to the server that it wants
to receive updates for a set of resources and the server can then
concurrently and incrementally push updates to that client whenever
monitored resources change.</li>
      </ol>
      <t>Both protocols are designed for HTTP/1.1 <xref target="RFC9112"/>, but HTTP/2 <xref target="RFC9113"/> and
HTTP/3 <xref target="RFC9114"/> can support HTTP/1.1 workflows. However, HTTP/2 and HTTP/3
provide features that can improve certain properties of ALTO and ALTO/SSE.</t>
      <ul spacing="normal">
        <li>First, consider the ALTO base protocol, which is designed to transfer only
complete information resources. A client can run the base protocol on top of
HTTP/2 or HTTP/3 to request multiple information resources in concurrent
streams, but each request must be for a complete information resource: there is
no capability for the server to transmit incremental updates. Hence, there can be a large
overhead when the client already has an information resource and then there are
small changes to the resource.</li>
        <li>Next, consider ALTO/SSE <xref target="RFC8895"/>. Although ALTO/SSE can transfer
incremental updates, it introduces a customized multiplexing protocol on top
of HTTP, assuming a total-order message channel from the server to the client.
The multiplexing design does not provide naming (i.e., a resource identifier)
to individual incremental updates. Such a design cannot use concurrent data
streams available in HTTP/2 and HTTP/3, because both cases require a resource
identifier. Additionally, ALTO/SSE is a push-only protocol, which denies the
client flexibility in choosing how and when it receives updates.</li>
      </ul>
      <t>To mitigate these concerns, this document introduces a new ALTO service called
the Transport Information Publication Service (TIPS). TIPS uses an incremental
RESTful design to provide an ALTO client with a new capability to explicitly,
concurrently issue non-blocking requests for specific incremental updates using
native HTTP/2 or HTTP/3, while still functioning for HTTP/1.1.</t>
      <t>While ALTO/SSE <xref target="RFC8895"/> and TIPS both can transport incremental updates of
ALTO information resources to clients, they have different design goals. The
TIPS extension enables more scalable and robust distribution of incremental
updates, but is missing the session management and built-in server push
capabilities of ALTO/SSE. From the performance perspective, TIPS is optimizing
throughput by leveraging concurrent and out-of-order transport of data, while
ALTO/SSE is optimizing latency as new events can be immediately transferred to
the clients without waiting for another round of communication when there are
multiple updates. Thus, we do not see TIPS as a replacement but as a complement
of ALTO/SSE. One example of combining these two extensions is as shown in
<xref target="tips-sse"/>.</t>
      <t>Note that future extensions may leverage server push, a feature of HTTP/2
<xref target="RFC9113"/> and HTTP/3 <xref target="RFC9114"/>, as an alternative of SSE. We discuss why
this alternative design is not ready in <xref target="push"/>.</t>
      <t>Specifically, this document specifies:</t>
      <ul spacing="normal">
        <li>Extensions to the ALTO Protocol for dynamic subscription and efficient
uniform update delivery of an incrementally changing network information
resource.</li>
        <li>A new resource type that indicates the TIPS updates graph model for a
resource.</li>
        <li>URI patterns to fetch the snapshots or incremental updates.</li>
      </ul>
      <t>Some operational complexities that must be taken into consideration when
implementing this extension are discussed in <xref target="ops-considerations"/>, including
load balancing <xref target="load-balancing"/>, fetching and processing incremental updates
of dependent resources <xref target="cross-sched"/></t>
      <t><xref target="sec-bcp-http"/> discusses to what extent the TIPS design adheres to the Best
Current Practices for building protocols with HTTP <xref target="RFC9205"/>.</t>
      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
      <section anchor="notations">
        <name>Notations</name>
        <t>This document uses the same syntax and notations as introduced in
<xref section="8.2" sectionFormat="of" target="RFC7285"/> to specify the extensions to existing ALTO resources and services.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>TIPS Overview</name>
      <section anchor="requirements">
        <name>Transport Requirements</name>
        <t>The ALTO Protocol and its extensions support two transport mechanisms:
First, a client can directly request an ALTO resource and obtain a complete
snapshot of that ALTO resource, as specified in the base protocol <xref target="RFC7285"/>;
Second, a client can subscribe to incremental changes of one or multiple ALTO
resources using the incremental update extension <xref target="RFC8895"/>, and a server pushes
the updates to the client through Server Sent Events (SSE).</t>
        <t>However, the current transport mechanisms are not optimized for storing,
transmitting, and processing (incremental) updates of ALTO information
resources. Specifically, the new transport mechanism must satisfy the following
requirements:</t>
        <dl>
          <dt>Incremental updates:</dt>
          <dd>
            <t>Incremental updates can reduce both the data storage on an ALTO server and the
transmission time of the updates, especially when the change of an ALTO
resource is minor. The base protocol does not support incremental updates and
the current incremental update mechanism in <xref target="RFC8895"/> has limitations (as
discussed below).</t>
          </dd>
          <dt>Concurrent, non-blocking update transmission:</dt>
          <dd>
            <t>When a client needs to receive and apply multiple incremental updates, it is
desired to transmit the updates concurrently to fully utilize the bandwidth
and to reduce head-of-line blocking. The ALTO incremental update extension
<xref target="RFC8895"/>, unfortunately, does not satisfy this requirement -- even though
the updates can be multiplexed by the server to avoid head-of-line blocking
between multiple resources, the updates are delivered sequentially and can
suffer from head-of-line blocking inside the connection, for example, when
there is a packet loss.</t>
          </dd>
          <dt>Long-polling updates:</dt>
          <dd>
            <t>Long-polling updates can reduce the time to send the request, making it
possible to achieve sub-RTT transmission of ALTO incremental updates. In
<xref target="RFC8895"/>, this requirement is fulfilled using server-sent event (SSE) and
is still desired in the ALTO new transport.</t>
          </dd>
          <dt>Backward compatibility:</dt>
          <dd>
            <t>While some of the previous requirements are offered by HTTP/2 <xref target="RFC9113"/> and
HTTP/3 <xref target="RFC9114"/>, it is desired that the ALTO new transport mechanism can
work with HTTP/1.1 as many development tools and current ALTO implementations
are based on HTTP/1.1.</t>
          </dd>
        </dl>
        <t>The ALTO new transport specified in this document satisfies all the design
requirements and hence improves the efficiency of continuous dissemination of
ALTO information. The key idea is to introduce a unified data model to describe
the changes (snapshots and incremental updates) of an ALTO resource, referred to
as a TIPS view. Along with the data model, this document also specifies a
unified naming for the snapshots and incremental updates, independent of the
HTTP version. Thus, these updates can be concurrently requested.</t>
        <t>This document assumes the deployment model discussed in  <xref target="sec-dep-model"/>.</t>
      </section>
      <section anchor="terminology">
        <name>TIPS Terminology</name>
        <t>In addition to the terms defined in <xref target="RFC7285"/>, this document uses the following terms:</t>
        <dl>
          <dt>Transport Information Publication Service (TIPS):</dt>
          <dd>
            <t>Is a new type of ALTO service, as specified in this document, to enable a
uniform transport mechanism for updates of an incrementally changing ALTO
network information resource.</t>
          </dd>
          <dt>Network information resource:</dt>
          <dd>
            <t>Is a piece of retrievable information about network state, per <xref target="RFC7285"/>.</t>
          </dd>
          <dt>TIPS view (tv):</dt>
          <dd>
            <t>Is defined in this document to be the container of incremental transport
information about the network information resource. The TIPS view has one
basic component, updates graph (ug), but may include other transport
information.</t>
          </dd>
          <dt>Updates graph (ug):</dt>
          <dd>
            <t>Is a directed, acyclic graph whose nodes represent the set of versions of an
information resource, and edges the set of update items to compute these
versions. An ALTO map service (e.g., Cost Map, Network Map) may need only a
single updates graph. A dynamic network information service (e.g., Filtered
Cost Map) may create an updates graph (within a new TIPS view) for each unique
request.</t>
          </dd>
          <dt>Version:</dt>
          <dd>
            <t>Represents a historical content of an information resource. For an information
resource, each version is associated with and uniquely identified by a
monotonically and consecutively increased sequence number. This document uses the term
"version s" to refer to the version associated with sequence number "s".</t>
          </dd>
          <dt>Start sequence number (start-seq):</dt>
          <dd>
            <t>Is the smallest non-zero sequence number in an updates graph.</t>
          </dd>
          <dt>End sequence number (end-seq):</dt>
          <dd>
            <t>Is the largest sequence number in an updates graph.</t>
          </dd>
          <dt>Snapshot:</dt>
          <dd>
            <t>Is a full replacement of a resource and is contained within an updates graph.</t>
          </dd>
          <dt>Incremental update:</dt>
          <dd>
            <t>Is a partial replacement of a resource contained within an updates graph,
codified in this document as a JSON Merge Patch or JSON Patch. An incremental
update is mandatory if the source version (i) and target version (j) are
consecutive, i.e., i + 1 = j, and optional or a shortcut otherwise. Mandatory
incremental updates are always in an updates graph, while optional/shortcut
incremental updates may or may not be included in an updates graph.</t>
          </dd>
          <dt>Update item:</dt>
          <dd>
            <t>Refers to the content on an edge of the updates graph, which can be either a
snapshot or an incremental update. An update item can be considered as a pair
(op, data) where op denotes whether the item is an incremental update or a
snapshot, and data is the content of the item.</t>
          </dd>
          <dt>ID#i-#j:</dt>
          <dd>
            <t>Denotes the update item on a specific edge in the updates graph to transition
from version i to version j, where i and j are the sequence numbers of the
source node and the target node of the edge, respectively.</t>
          </dd>
        </dl>
        <figure anchor="fig-overview">
          <name>Overview of ALTO TIPS</name>
          <artwork type="drawing" align="center"><![CDATA[
                                   +-------------+
    +-----------+ +--------------+ |  Dynamic    | +-----------+
    |  Routing  | | Provisioning | |  Network    | | External  |
    | Protocols | |    Policy    | | Information | | Interface |
    +-----------+ +--------------+ +-------------+ +-----------+
          |              |                |              |
+-----------------------------------------------------------------+
| ALTO Server                                                     |
| +-------------------------------------------------------------+ |
| |                                         Network Information | |
| | +-------------+                         +-------------+     | |
| | | Information |                         | Information |     | |
| | | Resource #1 |                         | Resource #2 |     | |
| | +-------------+                         +-------------+     | |
| +-----|--------------------------------------/-------\--------+ |
|       |                                     /         \         |
| +-----|------------------------------------/-----------\------+ |
| |     |       Transport Information       /             \     | |
| | +--------+                     +--------+        +--------+ | |
| | |  tv1   |                     |  tv2   |        |  tv3   | | |
| | +--------+                     +--------+        +--------+ | |
| |     |                          /                     |      | |
| | +--------+            +--------+                 +--------+ | |
| | | tv1/ug |            | tv2/ug |                 | tv3/ug | | |
| | +--------+            +--------+                 +--------+ | |
| +----|----\----------------|-------------------------|--------+ |
|      |     \               |                         |          |
+------|------\--------------|-------------------------|----------+
       |       +------+      |                         |
       |               \     |                         |
   +----------+       +----------+                 +----------+
   | Client 1 |       | Client 2 |                 | Client 3 |
   +----------+       +----------+                 +----------+

tvi   = TIPS view i
tvi/ug = incremental updates graph associated with tvi
]]></artwork>
        </figure>
        <t><xref target="fig-overview"/> shows an example illustrating an overview of the ALTO TIPS
service. The server provides the TIPS service of two information resources (#1
and #2) where #1 is an ALTO map service, and #2 is a filterable
service. There are 3 ALTO clients (Client 1, Client 2, and Client 3) that are
connected to the ALTO server.</t>
        <t>Each client uses the TIPS view to retrieve updates. Specifically, a TIPS view
(tv1) is created for the map service #1, and is shared by multiple clients. For
the filtering service #2, two different TIPS views (tv2 and tv3) are created upon
different client requests with different filter sets.</t>
      </section>
    </section>
    <section anchor="tips-updates-graph">
      <name>TIPS Updates Graph</name>
      <t>In order to provide incremental updates for a resource, an ALTO server creates
an updates graph, which is a directed, acyclic graph that contains a sequence of
incremental updates and snapshots (collectively called update items) of a
network information resource.</t>
      <section anchor="data-model">
        <name>Basic Data Model of Updates Graph</name>
        <t>For each resource (e.g., a cost map, a network map), the incremental updates and
snapshots can be represented using the following directed acyclic graph model,
where the server tracks the change of the resource maps with version IDs that are
assigned sequentially (i.e., incremented by 1 each time):</t>
        <ul spacing="normal">
          <li>Each node in the graph is a version of the resource, where a tag identifies the
content of the version (a tag is valid only within the scope of resource).
Version 0 is reserved as the initial state (empty/null).</li>
          <li>Each edge is an update item. In particular, the edge from i to j is the update
item to transit from version i to version j.</li>
          <li>Version is path-independent (different paths arrive at the same version/node
has the same content)</li>
        </ul>
        <t>A concrete example is shown in <xref target="fig-ug"/>. There are 7 nodes in the graph,
representing 7 different versions of the resource. Edges in the figure represent
the updates from the source version to the target version. Thick lines represent
mandatory incremental updates (e.g., ID103-104), dotted lines represent optional
incremental updates (e.g., ID103-105), and thin lines represent snapshots (e.g.,
ID0-103). Note that node content is path independent: the content of node v can
be obtained by applying the updates from any path that ends at v. For example,
assume the latest version is 105 and a client already has version 103. The base
version of the client is 103 as it serves as a base upon which incremental
updates can be applied. The target version 105 can either be directly fetched as
a snapshot, computed incrementally by applying the incremental updates between
103 and 104, then 104 and 105, or if the optional update from 103 to 105 exists,
computed incrementally by taking the "shortcut" path from 103 to 105.</t>
        <figure anchor="fig-ug">
          <name>TIPS Model Example</name>
          <artwork type="drawing" align="center"><![CDATA[
                                                        +======+
                                                  ------|  0   |
                                                 /      +======+
                                        ID0-101 /        |   |
                                              |/__       |   |
                                       +======+          |   |
                       tag: 3421097 -> | 101  |          |   |
                                       +======+          |   |
                               ID101-102  ||             |   |
                                          \/             |   |
                                       +======+          |   |
                       tag: 6431234 -> | 102  |          |   |
                                       +======+          |   |
                               ID102-103  ||             |   |
                                          \/             |   |
                                       +======+          /   |
    +--------------+   tag: 0881080 -> | 103  |<--------/    |
    | Base Version |   =======>        +======+ ID0-103      |
    +--------------+             103-104  ||    ..           |
                                          \/     ..          |
                                       +======+  ..          |
                       tag: 6452654 -> | 104  |  .. ID103    |
                                       +======+  .. -105     |
                               ID104-105  ||     ..          | ID0-105
                                          \/   |._           /
                                       +======+             /
                       tag: 7838392 -> | 105  |<-----------/
                                       +======+
                               ID105-106  ||
                                          \/
                                       +======+
                       tag: 6470983 -> | 106  |
                                       +======+
]]></artwork>
        </figure>
      </section>
      <section anchor="updates-graph-modification-invariants">
        <name>Updates Graph Modification Invariants</name>
        <t>A server may change its updates graph (to compact, to add nodes,
etc.), but it must ensure that any resource state that it makes
available is reachable by clients, either directly via a snapshot
(that is, relative to 0) or indirectly by requesting an earlier
snapshot and a contiguous set of incremental updates.  Additionally,
to allow clients to proactively construct URIs for future update
items, the ID of each added node in the updates graph must increment
contiguously by 1.  More specifically, the updates graph <bcp14>MUST</bcp14> satisfy
the following invariants:</t>
        <ul spacing="normal">
          <li>Continuity: At any time, let ns denote the smallest non-zero version (i.e.,
start-seq) in the update graph and ne denote the latest version (i.e.,
end-seq). Then any version in between ns and ne <bcp14>MUST</bcp14> also exist. This implies
that the incremental update from ni to ni + 1 exists for any ns &lt;= ni &lt;= ne,
and all versions in the update graph (except 0) is an integer interval
<tt>[ns, ne]</tt>.</li>
          <li>Feasibility: Let ns denote the start-seq in the update graph. The server <bcp14>MUST</bcp14>
provide a snapshot of ns and, in other words, there is always a direct link
to ns in the update graph.</li>
          <li>"Right shift" only: Assume a server provides versions in <tt>[n1, n2]</tt> at time t
and versions in <tt>[n1', n2']</tt> at time t'. If t' &gt; t, then n1' &gt;= n1 and n2' &gt;=
n2.</li>
        </ul>
        <t>For example, consider the case that a server compacts a resource's updates graph
to conserve space, using the example model in <xref target="data-model"/>. Assume at time 0,
the server provides the versions <tt>{101, 102, 103, 104, 105, 106}</tt>. At time 1,
both <tt>{103, 104, 105, 106}</tt> and <tt>{105, 106}</tt> are valid sets. However, <tt>{102,
103, 104, 105, 106}</tt> and <tt>{104, 105, 106}</tt> are not valid sets as there is no
snapshot to version 102 or 104 in the update graph. Thus, there is a risk that
the right content of version 102 (in the first example) or 104 (in the second
example) cannot be obtained by a client that does not have the previous version
101 or 103, respectively.</t>
      </section>
    </section>
    <section anchor="workflow">
      <name>TIPS Workflow and Resource Location Schema</name>
      <section anchor="workflow-overview">
        <name>Workflow</name>
        <t>At a high level, an ALTO client first uses the TIPS service (denoted as TIPS-F
and F is for frontend) to indicate the information resource(s) that the client
wants to monitor. For each requested resource, the server returns a JSON object
that contains a URI, which points to the root of a TIPS view (denoted as
TIPS-V), and a summary of the current view, which contains the information to
correctly interact with the current view. With the URI to the root of a TIPS
view, clients can construct URIs (see <xref target="schema"/>) to fetch incremental updates.</t>
        <t>An example workflow is shown in <xref target="fig-workflow-pull"/>. After the TIPS-F
service receives the request from the client to monitor the updates of an ALTO
resource, it creates a TIPS view service and returns the corresponding
information to the client. The URI points to that specific TIPS-V instance and
the summary contains the start-seq and end-seq of the update graph, and a
server-recommended edge to consume first, e.g., from i to j.</t>
        <t>An ALTO client can then continuously pull each additional update with the
information. For example, the client in <xref target="fig-workflow-pull"/> first fetches the
update from i to j, and then from j to j+1. Note that the update item at
<tt>&lt;tips-view-uri&gt;/ug/&lt;j&gt;/&lt;j+1&gt;</tt> may not yet exist, so the server holds the
request until the update becomes available (long polling).</t>
        <t>A server <bcp14>MAY</bcp14> close a TIPS view at any time, e.g., under high system load or due
to client inactivity. In the event that a TIPS view is closed, an edge request
will receive error code 404 in response, and the client will have to request a
new TIPS view URI.</t>
        <t>If resources allow, servers <bcp14>SHOULD</bcp14> avoid closing TIPS views that have active
polling edge requests or have recently served responses until clients have had a
reasonable interval to request the next update.</t>
        <figure anchor="fig-workflow-pull">
          <name>ALTO TIPS Workflow Supporting Client Pull</name>
          <artwork type="drawing" align="center"><![CDATA[
Client                                 TIPS-F           TIPS-V
  o                                       .                .
  | POST to create/receive a TIPS view    .  Create TIPS   .
  |           for resource 1              .      View      .
  |-------------------------------------> |.-.-.-.-.-.-.-> |
  | <tips-view-uri>, <tips-view-summary>  .                |
  | <-------------------------------------| <-.-.-.-.-.-.-.|
  |                                                        .
  | GET /<tips-view-path>/ug/<i>/<j>                       .
  |------------------------------------------------------> |
  | content on edge i to j                                 |
  | <------------------------------------------------------|
  |                                                        .
  | GET /<tips-view-path>/ug/<j>/<j+1>                     .
  |------------------------------------------------------> |
  .                                                        .
  .                                                        .
  | content on edge j to j+1                               |
  | <------------------------------------------------------|
  |                                                        .
  o                                                        .
                                                           .
                                         TIPS View Closed  o
]]></artwork>
        </figure>
      </section>
      <section anchor="schema">
        <name>Resource Location Schema</name>
        <t>The resource location schema defines how a client constructs URI to fetch
incremental updates.</t>
        <t>To access each update in an updates graph, consider the model
represented as a "virtual" file system (adjacency list), contained within the
root of a TIPS view URI (see <xref target="open-resp"/> for the definition of tips-view-uri).
For example, assuming that the update graph of a TIPS view is as shown in
<xref target="fig-ug"/>, the location schema of this TIPS view will have the format as in
<xref target="fig-ug-schema"/>.</t>
        <figure anchor="fig-ug-schema">
          <name>Location Schema Example</name>
          <artwork type="drawing" align="center"><![CDATA[
  <tips-view-path>  // root path to a TIPS view
    |_ ug    // updates graph
    |  |_ 0
    |  |  |_ 101    // full 101 snapshot
    |  |  |_ 103
    |  |  \_ 105
    |  |_ 101
    |  |  \_ 102    // 101 -> 102 incremental update
    |  |_ 102
    |  |  \_ 103
    |  |_ 103
    |  |  |_ 104
    |  |  \_ 105    // optional shortcut 103 -> 105 incr. update
    |  |_ 104
    |  |  \_ 105
    |  \_ 105
    |     \_ 106
    \_ ...
]]></artwork>
        </figure>
        <t>TIPS uses this directory schema to generate template URIs which allow
clients to construct the location of incremental updates after receiving the
tips-view-uri from the server. The generic template for the location of the
update item on the edge from node 'i' to node 'j' in the updates graph is:</t>
        <artwork><![CDATA[
    <tips-view-uri>/ug/<i>/<j>
]]></artwork>
        <t>Due to the sequential nature of the update item IDs, a client can long poll a
future update that does not yet exist (e.g., the incremental update from 106 to
107) by constructing the URI for the next edge that will be added, starting from
the sequence number of the current last node (denoted as end-seq) in the graph
to the next sequential node (with the sequence number of end-seq + 1):</t>
        <artwork><![CDATA[
    <tips-view-uri>/ug/<end-seq>/<end-seq + 1>
]]></artwork>
        <t>Incremental updates of a TIPS view are read-only. Thus, they are fetched using
the HTTP GET method.</t>
      </section>
    </section>
    <section anchor="ird">
      <name>TIPS Information Resource Directory (IRD) Announcement</name>
      <t>To announce a TIPS information resource in the information resource directory
(IRD), an ALTO server <bcp14>MUST</bcp14> specify the "media-type", "capabilities" and "uses"
as follows.</t>
      <section anchor="media-type">
        <name>Media Type</name>
        <t>The media type of the Transport Information Publication Service resource is
"application/alto-tips+json".</t>
      </section>
      <section anchor="caps">
        <name>Capabilities</name>
        <t>The capabilities field of TIPS is modeled on that defined in
Section 6.3 of <xref target="RFC8895"/>.</t>
        <t>Specifically, the capabilities are defined as an object of type
TIPSCapabilities:</t>
        <figure anchor="tips-cap">
          <name>TIPSCapabilities</name>
          <artwork align="left"><![CDATA[
     object {
       IncrementalUpdateMediaTypes incremental-change-media-types;
     } TIPSCapabilities;

     object-map {
        ResourceID -> String;
     } IncrementalUpdateMediaTypes;
]]></artwork>
        </figure>
        <t>with field:</t>
        <dl>
          <dt>incremental-change-media-types:</dt>
          <dd>
            <t>If a TIPS can provide updates with incremental changes for a
resource, the "incremental-change-media-types" field has an entry
for that resource-id, and the value is the supported media types
of incremental changes, separated by commas. For the implementation of this
specification, this <bcp14>MUST</bcp14> be "application/merge-patch+json",
"application/json-patch+json", or
"application/merge-patch+json,application/json-patch+json", unless defined by
a future extension.
</t>
            <t>When choosing the media types to encode incremental updates for a
resource, the server <bcp14>MUST</bcp14> consider the limitations of the
encoding.  For example, when a JSON merge patch specifies that the
value of a field is null, its semantics are that the field is
removed from the target and hence the field is no longer defined
(i.e., undefined).  This, however, may not be the intended result
for the resource, when null and undefined have different semantics
for the resource.  In such a case, the server <bcp14>MUST</bcp14> choose JSON
patch over JSON merge patch if JSON patch is indicated as a
capability of the TIPS.  If the server does not support JSON patch
to handle such a case, the server then needs to send a full
replacement.</t>
          </dd>
        </dl>
      </section>
      <section anchor="uses">
        <name>Uses</name>
        <t>The "uses" attribute <bcp14>MUST</bcp14> be an array with the resource-ids of every
network information resource for which this TIPS can provide service.</t>
        <t>This set <bcp14>MAY</bcp14> be any subset of the ALTO server's network information resources
and <bcp14>MAY</bcp14> include resources defined in linked IRDs. However, it is <bcp14>RECOMMENDED</bcp14>
that the ALTO server selects a set that is closed under the resource dependency
relationship. That is, if a TIPS' "uses" set includes resource R1 and resource
R1 depends on ("uses") resource R0, then the TIPS' "uses" set should include R0
as well as R1. For example, if a TIPS provides a TIPS view for a cost map, it
should also provide a TIPS view for the network map upon which that cost map
depends.</t>
        <t>If the set is not closed, at least one resource R1 in the "uses" field of a TIPS
depends on another resource R0 which is not in the "uses" field of the same
TIPS. Thus, a client cannot receive incremental updates for R0 from the same
TIPS service. If the client observes in an update of R1 that the version tag for
R0 has changed, it must request the full content of R0, which is likely to be
less efficient than receiving the incremental updates of R0.</t>
      </section>
      <section anchor="an-example">
        <name>An Example</name>
        <t>Extending the IRD example in Section 8.1 of <xref target="RFC8895"/>, <xref target="ex-ird"/> is the IRD of an
ALTO server supporting ALTO base protocol, ALTO/SSE, and ALTO TIPS.</t>
        <figure anchor="ex-ird">
          <name>Example of an ALTO Server Supporting ALTO Base Protocol, ALTO/SSE, and ALTO TIPS</name>
          <artwork align="left"><![CDATA[
    "my-network-map": {
      "uri": "https://alto.example.com/networkmap",
      "media-type": "application/alto-networkmap+json"
    },
    "my-routingcost-map": {
      "uri": "https://alto.example.com/costmap/routingcost",
      "media-type": "application/alto-costmap+json",
      "uses": ["my-network-map"],
      "capabilities": {
        "cost-type-names": ["num-routingcost"]
      }
    },
    "my-hopcount-map": {
      "uri": "https://alto.example.com/costmap/hopcount",
      "media-type": "application/alto-costmap+json",
      "uses": ["my-network-map"],
      "capabilities": {
        "cost-type-names": ["num-hopcount"]
      }
    },
    "my-simple-filtered-cost-map": {
      "uri": "https://alto.example.com/costmap/filtered/simple",
      "media-type": "application/alto-costmap+json",
      "accepts": "application/alto-costmapfilter+json",
      "uses": ["my-network-map"],
      "capabilities": {
        "cost-type-names": ["num-routingcost", "num-hopcount"],
        "cost-constraints": false
      }
    },
    "update-my-costs": {
      "uri": "https://alto.example.com/updates/costs",
      "media-type": "text/event-stream",
      "accepts": "application/alto-updatestreamparams+json",
      "uses": [
          "my-network-map",
          "my-routingcost-map",
          "my-hopcount-map",
          "my-simple-filtered-cost-map"
      ],
      "capabilities": {
        "incremental-change-media-types": {
          "my-network-map": "application/json-patch+json",
          "my-routingcost-map": "application/merge-patch+json",
          "my-hopcount-map": "application/merge-patch+json"
        },
        "support-stream-control": true
      }
    },
    "update-my-costs-tips": {
      "uri": "https://alto.example.com/updates-new/costs",
      "media-type": "application/alto-tips+json",
      "accepts": "application/alto-tipsparams+json",
      "uses": [
          "my-network-map",
          "my-routingcost-map",
          "my-hopcount-map",
          "my-simple-filtered-cost-map"
      ],
      "capabilities": {
        "incremental-change-media-types": {
          "my-network-map": "application/json-patch+json",
          "my-routingcost-map": "application/merge-patch+json",
          "my-hopcount-map": "application/merge-patch+json",
          "my-simple-filtered-cost-map": "application/merge-patch+json"
        }
      }
    },
    "tips-sse": {
      "uri": "https://alto.example.com/updates/tips",
      "media-type": "text/event-stream",
      "accepts": "application/alto-updatestreamparams+json",
      "uses": [ "update-my-costs-tips" ],
      "capabilities": {
        "incremental-change-media-types": {
          "update-my-costs-tips": "application/merge-patch+json"
        }
      }
    }
]]></artwork>
        </figure>
        <t>Note that it is straightforward for an ALTO server to run HTTP/2 and
support concurrent retrieval of multiple resources such as "my-
network-map" and "my-routingcost-map" using multiple HTTP/2 streams.</t>
        <t>The resource "update-my-costs-tips" provides an ALTO TIPS service, and this is
indicated by the media-type "application/alto-tips+json".</t>
      </section>
    </section>
    <section anchor="tips-management">
      <name>TIPS Management</name>
      <t>Upon request, a server sends a TIPS view to a client. This TIPS view may be
created at the time of the request or may already exist (either because another
client has already created a TIPS view for the same requested network resource
or because the server perpetually maintains a TIPS view for an often-requested
resource).</t>
      <section anchor="open-req">
        <name>Open Request</name>
        <t>An ALTO client requests that the server provide a TIPS view for a given resource
by sending an HTTP POST body with the media type
"application/alto-tipsparams+json". That body contains a JSON object of type
TIPSReq, where:</t>
        <figure anchor="fig-open-req">
          <name>TIPSReq</name>
          <artwork align="left"><![CDATA[
    object {
       ResourceID   resource-id;
       [JSONString  tag;]
       [Object      input;]
    } TIPSReq;
]]></artwork>
        </figure>
        <t>with the following fields:</t>
        <dl>
          <dt>resource-id:</dt>
          <dd>
            <t>The resource-id of an ALTO resource and <bcp14>MUST</bcp14> be in the TIPS' "uses" list
(<xref target="ird"/>). If a client does not support all incremental methods from the set
announced in the server's capabilities, the client <bcp14>MUST NOT</bcp14> use the TIPS
service.</t>
          </dd>
          <dt>tag:</dt>
          <dd>
            <t>If the resource-id is a GET-mode resource with a version tag (or
"vtag"), as defined in Section 10.3 of <xref target="RFC7285"/>, and the ALTO
client has previously retrieved a version of that resource from
ALTO, the ALTO client <bcp14>MAY</bcp14> set the "tag" field to the tag part of
the client's version of that resource.  The server <bcp14>MAY</bcp14> use the tag
when calculating a recommended starting edge for the client to
consume.  Note that the client <bcp14>MUST</bcp14> support all incremental
methods from the set announced in the server's capabilities for
this resource.</t>
          </dd>
          <dt>input:</dt>
          <dd>
            <t>If the resource is a POST-mode service that requires input, the
ALTO client <bcp14>MUST</bcp14> set the "input" field to a JSON object with the
parameters that the resource expects.</t>
          </dd>
        </dl>
      </section>
      <section anchor="open-resp">
        <name>Open Response</name>
        <t>The response to a valid request <bcp14>MUST</bcp14> be a JSON object of type
AddTIPSResponse, denoted as media type "application/alto-tips+json":</t>
        <figure anchor="fig-open-resp">
          <name>AddTIPSResponse</name>
          <artwork align="left"><![CDATA[
    object {
      URI               tips-view-uri;
      TIPSViewSummary   tips-view-summary;
    } AddTIPSResponse;

    object {
      UpdatesGraphSummary   updates-graph-summary;
    } TIPSViewSummary;

    object {
      JSONNumber       start-seq;
      JSONNumber       end-seq;
      StartEdgeRec     start-edge-rec;
    } UpdatesGraphSummary;

    object {
      JSONNumber       seq-i;
      JSONNumber       seq-j;
    } StartEdgeRec;
]]></artwork>
        </figure>
        <t>with the following fields:</t>
        <dl>
          <dt>tips-view-uri:</dt>
          <dd>
            <t>URI to the requested TIPS view. The value of this field <bcp14>MUST</bcp14> have the
following format:
</t>
            <artwork><![CDATA[
    scheme "://" tips-view-host "/" tips-view-path

    tips-view-host = host [ ":" port]
    tips-view-path = path
]]></artwork>
            <t>where scheme <bcp14>MUST</bcp14> be "http" or "https" unless specified by a future
extension, and host, port and path are as specified in Sections 3.2.2, 3.2.3,
and 3.3 in <xref target="RFC3986"/>. An ALTO server <bcp14>SHOULD</bcp14> use the "https" scheme unless
the contents of the TIPS view are intended to be publicly accessible and does
not raise security concerns.</t>
            <t>A server <bcp14>MUST NOT</bcp14> use a URI for different TIPS views, either for different
resources or different request bodies to the same resource. URI generation is
implementation specific, for example, one may compute a Universally Unique
Identifier (UUID, <xref target="RFC4122"/>) or a hash value based on the request, and
append it to a base URL. For performance considerations, it is <bcp14>NOT
RECOMMENDED</bcp14> to use properties that are not included in the request body to
determine the URI of a TIPS view, such as cookies or the client's IP address,
which may result in duplicated TIPS views in cases such as mobile clients.
However, this is not mandatory as a server may intentionally use client
information to compute the TIPS view URI to provide service isolation between
clients.</t>
          </dd>
          <dt>tips-view-summary:</dt>
          <dd>
            <t>Contains an updates-graph-summary.
</t>
            <t>The updates-graph-summary field contains the starting sequence
number (start-seq) of the updates graph and the last sequence
number (end-seq) that is currently available, along with a
recommended edge to consume (start-edge-rec).  How the server
calculates the recommended edge depends on the implementation.
Ideally, if the client does not provide a version tag, the server
<bcp14>SHOULD</bcp14> recommend the edge of the latest snapshot available.  If
the client does provide a version tag, the server <bcp14>SHOULD</bcp14> calculate
the cumulative size of the incremental updates available from that
version onward and compare it to the size of the complete resource
snapshot.  If the snapshot is bigger, the server <bcp14>SHOULD</bcp14> recommend
the first incremental update edge starting from the client's tagged
version.  Otherwise, the server <bcp14>SHOULD</bcp14> recommend the latest snapshot
edge.</t>
          </dd>
        </dl>
        <t>If the request has any errors, the TIPS service <bcp14>MUST</bcp14> return an HTTP
"400 Bad Request" to the ALTO client; the body of the response
follows the generic ALTO error response format specified in
Section 8.5.2 of <xref target="RFC7285"/>.  Hence, an example ALTO error response
has the format shown in <xref target="ex-bad-request"/>.</t>
        <figure anchor="ex-bad-request">
          <name>ALTO Error Example</name>
          <artwork align="left"><![CDATA[
    HTTP/1.1 400 Bad Request
    Content-Length: 131
    Content-Type: application/alto-error+json

    {
        "meta":{
            "code":  "E_INVALID_FIELD_VALUE",
            "field": "resource-id",
            "value": "my-network-map/#"
        }
    }
]]></artwork>
        </figure>
        <t>Note that "field" and "value" are optional fields.  If the "value"
field exists, the "field" field <bcp14>MUST</bcp14> exist.</t>
        <ul spacing="normal">
          <li>If the TIPS request does not have a "resource-id" field, the error code of
the error message <bcp14>MUST</bcp14> be <tt>E_MISSING_FIELD</tt> and the "field" field, if
present, <bcp14>MUST</bcp14> be "resource-id". The TIPS service <bcp14>MUST NOT</bcp14> create any TIPS
view.</li>
          <li>If the "resource-id" field is invalid or is not associated with the TIPS, the
error code of the error message <bcp14>MUST</bcp14> be <tt>E_INVALID_FIELD_VALUE</tt>. If present,
the "field" field <bcp14>MUST</bcp14> be the full path of the "resource-id" field, and the
"value" field <bcp14>MUST</bcp14> be the invalid resource-id.</li>
          <li>If the resource is a POST-mode service that requires input, the client <bcp14>MUST</bcp14>
set the "input" field to a JSON object with the parameters that that resource
expects. If the "input" field is missing or invalid, TIPS <bcp14>MUST</bcp14> return the
same error response that resource would return for missing or invalid input
(see <xref target="RFC7285"/>).</li>
        </ul>
        <t>Furthermore, it is <bcp14>RECOMMENDED</bcp14> that the server uses the following HTTP codes to
indicate other errors, with the media type "application/alto-error+json".</t>
        <ul spacing="normal">
          <li>429 (Too Many Requests): when the number of TIPS views open requests exceeds
the server threshold. The server <bcp14>MAY</bcp14> indicate when to re-try the request in
the "Re-Try After" headers.</li>
        </ul>
        <t>It is <bcp14>RECOMMENDED</bcp14> that the server provide the ALTO/SSE support for the TIPS
resource. Thus, the client can be notified of the version updates of all the
TIPS views that it monitors and make better cross-resource transport decisions
(see <xref target="cross-sched"/> for related considerations).</t>
      </section>
      <section anchor="open-example">
        <name>Open Example</name>
        <section anchor="basic-example">
          <name>Basic Example</name>
          <t>For simplicity, assume that the ALTO server is using the Basic
authentication.  If a client with username "client1" and password
"helloalto" wants to create a TIPS view of an ALTO Cost Map resource
with resource ID "my-routingcost-map", it can send the
request depicted in <xref target="ex-op"/>.</t>
          <figure anchor="ex-op">
            <name>Request Example of Opening a TIPS View</name>
            <artwork align="left"><![CDATA[
    POST /tips HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-tips+json, application/alto-error+json
    Authorization: Basic Y2xpZW50MTpoZWxsb2FsdG8K
    Content-Type: application/alto-tipsparams+json
    Content-Length: 41

    {
      "resource-id": "my-routingcost-map"
    }
]]></artwork>
          </figure>
          <t>If the operation is successful, the ALTO server returns the
message shown in <xref target="ex-op-rep"/>.</t>
          <figure anchor="ex-op-rep">
            <name>Response Example of Opening a TIPS View</name>
            <artwork align="left"><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/alto-tips+json
    Content-Length: 255

    {
      "tips-view-uri": "https://alto.example.com/tips/2718281828",
      "tips-view-summary": {
        "updates-graph-summary": {
          "start-seq": 101,
          "end-seq": 106,
          "start-edge-rec" : {
            "seq-i": 0,
            "seq-j": 105
          }
        }
      }
    }
]]></artwork>
          </figure>
        </section>
        <section anchor="example-using-digest-authentication">
          <name>Example using Digest Authentication</name>
          <t>Below is another example of the same query using Digest authentication, a
mandatory authentication method of ALTO servers as defined in <xref section="8.3.5" sectionFormat="of" target="RFC7285"/>. The content of the response is the same as in <xref target="ex-op-rep"/> and thus
omitted for simplicity.</t>
          <figure anchor="ex-op-digest">
            <name>Open Example with Digest Authentication</name>
            <artwork align="left"><![CDATA[
    POST /tips HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-tips+json, application/alto-error+json
    Authorization: Basic Y2xpZW50MTpoZWxsb2FsdG8K
    Content-Type: application/alto-tipsparams+json
    Content-Length: 41

    {
      "resource-id": "my-routingcost-map"
    }

    HTTP/1.1 401 UNAUTHORIZED
    WWW-Authenticate: Digest
        realm="alto.example.com",
        qop="auth",
        algorithm="MD5",
        nonce="173b5aba4242409ee2ac3a4fd797f9d7",
        opaque="a237ff9ab865379a69d9993162ef55e4"

    POST /tips HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-tips+json, application/alto-error+json
    Authorization: Digest
        username="client1",
        realm="alto.example.com",
        uri="/tips",
        qop=auth,
        algorithm=MD5,
        nonce="173b5aba4242409ee2ac3a4fd797f9d7",
        nc=00000001,
        cnonce="ZTg3MTI3NDFmMDQ0NzI1MDQ3MWE3ZTFjZmM5MTNiM2I=",
        response="8e937ae696c1512e4f990fa21c7f9347",
        opaque="a237ff9ab865379a69d9993162ef55e4"
    Content-Type: application/alto-tipsparams+json
    Content-Length: 41

    {
      "resource-id": "my-routingcost-map"
    }


    HTTP/1.1 200 OK
    Content-Type: application/alto-tips+json
    Content-Length: 258

    {....}
]]></artwork>
          </figure>
        </section>
        <section anchor="tips-sse">
          <name>Example using ALTO/SSE</name>
          <t>This section gives an example of receiving incremental updates of the TIPS view
summary using ALTO/SSE <xref target="RFC8895"/>. Consider the <tt>tips-sse</tt> resource, as
announced by the IRD in <xref target="ex-ird"/>, which provides ALTO/SSE for the
<tt>update-my-cost-tips</tt> resource, a client may send the following request to
receive updates of the TIPS view (authentication is omitted for simplicity).</t>
          <figure anchor="ex-tips-sse">
            <name>Example of Monitoring TIPS view with ALTO/SSE</name>
            <artwork align="left"><![CDATA[
    POST /updates/tips HTTP/1.1
    Host: alto.example.com
    Accept: text/event-stream,application/alto-error+json
    Content-Type: application/alto-updatestreamparams+json
    Content-Length: 76

    {
      "add": {
        "tips-123": { "resource-id": "update-my-cost-tips" }
      }
    }
]]></artwork>
          </figure>
          <t>Then, the client will be able to receive the TIPS view summary as follows.</t>
          <artwork><![CDATA[
    HTTP/1.1 200 OK
    Connection: keep-alive
    Content-Type: text/event-stream

    event: application/alto-tips+json,tips-123
    data: {
    data:   "tips-view-uri": "https://alto.example.com/tips/2718281828",
    data:   "tips-view-summary": {
    data:     "updates-graph-summary": {
    data:       "start-seq": 101,
    data:       "end-seq": 106,
    data:       "start-edge-rec" : {
    data:         "seq-i": 0,
    data:         "seq-j": 105
    data:       }
    data:     }
    data:   }
    data: }
]]></artwork>
          <t>When there is an update to the TIPS view, for example, the <tt>end-seq</tt> is
increased by 1, the client will be able to receive the incremental update of the
TIPS view summary as follows.</t>
          <artwork><![CDATA[
    event: application/merge-patch+json,tips-123
    data: {
    data:   "tips-view-summary": {
    data:     "updates-graph-summary": {
    data:       "end-seq": 107
    data:     }
    data:   }
    data: }
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="pull">
      <name>TIPS Data Transfers - Client Pull</name>
      <t>TIPS allows an ALTO client to retrieve the content of an update item
from the updates graph, with an update item defined as the content
(incremental update or snapshot) on an edge in the updates graph.</t>
      <section anchor="request">
        <name>Request</name>
        <t>The client sends an HTTP GET request, where the media type of an
update item resource <bcp14>MUST</bcp14> be the same as the "media-type" field of
the update item on the specified edge in the updates graph.</t>
        <t>The GET request <bcp14>MUST</bcp14> have the following format:</t>
        <artwork><![CDATA[
    GET /<tips-view-path>/ug/<i>/<j>
    HOST: <tips-view-host>
]]></artwork>
        <t>For example, consider the updates graph in <xref target="fig-ug-schema"/>. If the client
wants to query the content of the first update item (0 -&gt; 101) whose media type
is "application/alto-costmap+json", it sends a request to
"/tips/2718281828/ug/0/101" and sets the "Accept" header to
"application/alto-costmap+json,application/alto-error+json". See <xref target="iu-example"/>
for a concrete example.</t>
      </section>
      <section anchor="response">
        <name>Response</name>
        <t>If the request is valid (<tt>ug/&lt;i&gt;/&lt;j&gt;</tt> exists), the response is encoded
as a JSON object whose data format is indicated by the media type.</t>
        <t>A client <bcp14>MAY</bcp14> conduct proactive fetching of future updates, by long polling
updates that have not been provided in the directory yet. For such updates, the
client <bcp14>MUST</bcp14> indicate all media types that may appear. It is <bcp14>RECOMMENDED</bcp14> that the
server allows for at least the long polling of <tt>&lt;end-seq&gt; -&gt; &lt;end-seq + 1&gt;</tt>.</t>
        <t>Hence, the server processing logic <bcp14>MUST</bcp14> be:</t>
        <ul spacing="normal">
          <li>If <tt>ug/&lt;i&gt;/&lt;j&gt;</tt> exists: return content using encoding.</li>
          <li>Else if long polling <tt>ug/&lt;i&gt;/&lt;j&gt;</tt> is acceptable: put request in a
backlog queue, then either a response is triggered when the content is ready
or the request is interrupted, e.g., by a network error.</li>
          <li>Else: return error.</li>
        </ul>
        <t>It is <bcp14>RECOMMENDED</bcp14> that the server uses the following HTTP codes to
indicate errors, with the media type "application/alto-error+json",
regarding update item requests.</t>
        <ul spacing="normal">
          <li>404 (Not Found): if the requested update does not exist, or the requested
TIPS view does not exist or is closed by the server.</li>
          <li>410 (Gone): if an update has a seq that is smaller than the start-seq.</li>
          <li>415 (Unsupported Media Type): if the media type(s) accepted by the
client does not include the media type of the update chosen by the
server.</li>
          <li>425 (Too Early): if the seq exceeds the server long-polling window</li>
          <li>429 (Too Many Requests): when the number of pending (long-poll)
requests exceeds the server threshold. The server <bcp14>MAY</bcp14> indicate when to re-try
the request in the "Re-Try After" headers.</li>
        </ul>
      </section>
      <section anchor="iu-example">
        <name>Example</name>
        <t>Assume the client wants to get the contents of the update item on
edge 0 to 101.  The format of the request is shown in <xref target="ex-get"/>.</t>
        <figure anchor="ex-get">
          <name>GET Example</name>
          <artwork align="left"><![CDATA[
    GET /tips/2718281828/ug/0/101 HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-costmap+json, \
              application/alto-error+json
]]></artwork>
        </figure>
        <t>The response is shown in <xref target="ex-get-res"/>.</t>
        <figure anchor="ex-get-res">
          <name>Response to a GET Request</name>
          <artwork align="left"><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/alto-costmap+json
    Content-Length: 50

    { ... full replacement of my-routingcost-map ... }
]]></artwork>
        </figure>
      </section>
      <section anchor="new-next-edge-recommendation">
        <name>New Next Edge Recommendation</name>
        <t>While intended TIPS usage is for the client to receive a recommended
starting edge in the TIPS summary, consume that edge, then construct
all future URIs by incrementing the sequence count by 1, there may be
cases in which the client needs to request a new next edge to
consume.  For example, if a client has an open TIPS view yet has not
polled in a while, the client may request the next logical
incremental URI but the server has compacted the updates graph so it
no longer exists.  Thus, the client <bcp14>MAY</bcp14> request a new next edge to
consume based on its current version of the resource.</t>
        <section anchor="request-1">
          <name>Request</name>
          <t>An ALTO client requests that the server provide a next edge recommendation for a
given TIPS view by sending an HTTP POST request with the media type
"application/alto-tipsparams+json". The URL of the request <bcp14>MUST</bcp14> have the format of</t>
          <artwork><![CDATA[
    <tips-view-path>/ug
]]></artwork>
          <t>and the <tt>HOST</tt> field <bcp14>MUST</bcp14> be the <tt>&lt;tips-view-host&gt;</tt>.</t>
          <t>The POST body has the same format as the TIPSReq <xref target="fig-open-req"/>. The
<tt>resource-id</tt> <bcp14>MUST</bcp14> be the same as the resource ID used to create the TIPS view,
and the optional <tt>input</tt> field <bcp14>MUST NOT</bcp14> be present.</t>
        </section>
        <section anchor="response-1">
          <name>Response</name>
          <t>The response to a valid request <bcp14>MUST</bcp14> be a JSON merge patch to the object of type
AddTIPSResponse (defined in <xref target="open-resp"/>), denoted as media type
"application/merge-patch+json". The "update-graph-summary" field <bcp14>MUST</bcp14> be present
in the response and hence its parent field "tips-view-summary" <bcp14>MUST</bcp14> be present
as well.</t>
          <t>If the <tt>tag</tt> field is present in the request, the server <bcp14>MUST</bcp14> check if any
version within the range [start-seq, end-seq] has the same tag value. If the
version exists, e.g., denoted as tag-seq, the server <bcp14>MUST</bcp14> compute the paths from
both tag-seq and 0 to the end-seq, and choose the one with the minimal cost. The
cost <bcp14>MAY</bcp14> be implementation specific, e.g., number of messages, accumulated data
size, etc. The first edge of the selected path <bcp14>MUST</bcp14> be returned as the
recommended next edge.</t>
          <t>If the <tt>tag</tt> field is NOT present, it <bcp14>MUST</bcp14> be interpreted as the tag-seq is 0.</t>
          <t>It is <bcp14>RECOMMENDED</bcp14> that the server uses the following HTTP codes to
indicate errors, with the media type "application/alto-error+json",
regarding new next edge requests.</t>
          <ul spacing="normal">
            <li>404 (Not Found): if the requested TIPS view does not exist or is
closed by the server.</li>
          </ul>
        </section>
        <section anchor="example">
          <name>Example</name>
          <t>We give an example of the new next edge recommendation service. Assume that a
client already creates a TIPS view as in <xref target="open-example"/>, whose updates graph
is as shown in <xref target="fig-ug"/>. Now assume that the client already has tag 0881080
whose corresponding sequence number is 103, and sends the following new next
edge recommendation request (authentication is omitted for simplicity):</t>
          <artwork><![CDATA[
    POST /tips/2718281828/ug HTTP/1.1
    HOST alto.example.com
    Accept: application/merge-patch+json, application/alto-error+json
    Content-Type: application/alto-tipsparams+json
    Content-Length: 62

    {
      "resource-id": "my-routingcost-map",
      "tag": "0881080"
    }
]]></artwork>
          <t>According to <xref target="fig-ug"/>, there are 3 potential paths: 103 -&gt; 104 -&gt; 105 -&gt; 106,
103 -&gt; 105 -&gt; 106, and 0 -&gt; 105 -&gt; 106. Assume that the server chooses shortest
update path by the accumulated data size and the best path is 103 -&gt; 105 -&gt; 106.
Thus, the server responds with the following message:</t>
          <artwork><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/merge-patch+json
    Content-Length: 193

    {
      "tips-view-summary": {
        "updates-graph-summary": {
          "start-seq": 101,
          "end-seq": 106,
          "start-edge-rec": {
            "seq-i": 103,
            "seq-j": 105
          }
        }
      }
    }
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="ops-considerations">
      <name>Operation and Processing Considerations</name>
      <t>TIPS has some common operational considerations as ALTO/SSE <xref target="RFC8895"/>,
including:</t>
      <ul spacing="normal">
        <li>server choosing update messages (<xref section="9.1" sectionFormat="of" target="RFC8895"/>);</li>
        <li>client processing update messages (<xref section="9.2" sectionFormat="of" target="RFC8895"/>);</li>
        <li>updates of filtered map services (<xref section="9.3" sectionFormat="of" target="RFC8895"/>);</li>
        <li>updates of ordinal mode costs ({Section 9.4 of RFC8895}).</li>
      </ul>
      <t>There are also some operation considerations specific to TIPS, which we discuss
below.</t>
      <section anchor="load-balancing">
        <name>Considerations for Load Balancing</name>
        <t>There are two levels of load balancing in TIPS. The first level is to balance
the load of TIPS views for different clients, and the second is to balance the
load of incremental updates.</t>
        <t>Load balancing of TIPS views can be achieved either at the application layer or
at the infrastructure layer. For example, an ALTO server <bcp14>MAY</bcp14> set
<tt>&lt;tips-view-host&gt;</tt> to different subdomains to distribute TIPS views, or simply
use the same host of the TIPS service and rely on load balancers to distribute
the load.</t>
        <t>TIPS allows a client to make concurrent pulls of incremental updates for the
same TIPS view potentially through different HTTP connections. As a consequence,
it introduces additional complexities when the ALTO server is being load
balanced. For example, a request may be directed to a wrong backend server and
get incorrectly processed if the following two conditions both hold:</t>
        <ul spacing="normal">
          <li>the backend servers are stateful, i.e., the TIPS view is created
and stored only on a single server;</li>
          <li>the ALTO server is using layer-4 load balancing, i.e., the
requests are distributed based on the TCP 5-tuple.</li>
        </ul>
        <t>Thus, additional considerations are required to enable correct load
balancing for TIPS, including:</t>
        <ul spacing="normal">
          <li>Use a stateless architecture: One solution is to follow the
stateless computing pattern: states about the TIPS view are not
maintained by the backend servers but are stored in a distributed
database.  Thus, concurrent requests to the same TIPS view can be
processed on arbitrary stateless backend servers, which all
fetches data from the same database.</li>
          <li>Configure the load balancers properly: In case when the backend
servers are stateful, the load balancers must be properly
configured to guarantee that requests of the same TIPS view always
arrive at the same server.  For example, an operator or a provider
of an ALTO server <bcp14>MAY</bcp14> configure layer-7 load balancers that
distribute requests based on the tips-view-path component in the URI.</li>
        </ul>
      </section>
      <section anchor="cross-sched">
        <name>Considerations for Cross-Resource Dependency Scheduling</name>
        <t>Dependent ALTO resources result in cross-resource dependencies in
TIPS.  Consider the following pair of resources, where my-cost-map
(C) is dependent on my-network-map (N).  The updates graph for each
resource is shown, along with links in between the respective updates
graphs to show dependency:</t>
        <figure anchor="fig-cross">
          <name>Example Dependency Model</name>
          <artwork type="drawing" align="center"><![CDATA[
                       +---+   +---+   +---+   +---+   +---+
  my-network-map (N)   | 0 |-->|89 |-->|90 |-->|91 |-->|92 |
                       +---+   +---+   +---+   +---+   +---+
                                 |   \       \       \
                                 |    \       \       \
                       +---+   +---+   +---+   +---+   +---+
  my-cost-map (C)      | 0 |-->|101|-->|102|-->|103|-->|104|
                       +---+   +---+   +---+   +---+   +---+
                        |_______________________|
]]></artwork>
        </figure>
        <t>In <xref target="fig-cross"/>, the cost-map versions 101 and 102 (denoted as C101 and C102)
are dependent on the network-map version 89 (denoted as N89). The cost-map
version 103 (C103) is dependent on the network-map version 90 (N90), and so on.</t>
        <t>Thus, the client must decide the order in which to receive and apply the
updates. The order may affect how fast the client can build a consistent view
and how long the client needs to buffer the update.</t>
        <ul spacing="normal">
          <li>Example 1: The client requests N89, N90, N91, C101, C102 in that
order.  The client either gets no consistent view of the resources
or has to buffer N90 and N91.</li>
          <li>Example 2: The client requests C101, C102, C103, N89.  The client
either gets no consistent view or has to buffer C103.</li>
        </ul>
        <t>To get consistent ALTO information, a client must process the updates following
the guidelines specified in <xref section="9.2" sectionFormat="of" target="RFC8895"/>. If resource permits
(i.e., sufficient updates can be buffered), an ALTO client can safely use long
polling to fetch all the updates. This allows a client to build consistent views
quickly as the updates are already stored in the buffer. Otherwise, it is
<bcp14>RECOMMENDED</bcp14> to request</t>
      </section>
      <section anchor="shared-tips-view">
        <name>Considerations for Managing Shared TIPS Views</name>
        <t>From a client's point of view, it sees only one copy of the TIPS view
for any resource.  However, on the server side, there are different
implementation options, especially for common resources (e.g.,
network map or cost map) that may be frequently queried by many
clients.  Some potential options are listed below:</t>
        <ul spacing="normal">
          <li>An ALTO server creates one TIPS view of the common resource for
each client.</li>
          <li>
            <t>An ALTO server maintains one copy of the TIPS view for each common
resource and all clients requesting the same resources use the
same copy.  There are two ways to manage the storage for the
shared copy:  </t>
            <ul spacing="normal">
              <li>the ALTO server maintains the set of clients that have sent a polling
request to the TIPS view, and only removes the view from the storage when
the set becomes empty and no client immediately issues a new edge request;</li>
              <li>the TIPS view is never removed from the storage.</li>
            </ul>
          </li>
        </ul>
        <t>Developers may choose different implementation options depending on
criteria such as request frequency, available resources of the ALTO
server, the ability to scale, and programming complexity.</t>
      </section>
      <section anchor="considerations-for-offering-shortcut-incremental-updates">
        <name>Considerations for Offering Shortcut Incremental Updates</name>
        <t>Besides the mandatory stepwise incremental updates (from i to i+1),
an ALTO server <bcp14>MAY</bcp14> optionally offer shortcut incremental updates, or
simple shortcuts, between two non-consecutive versions i and i+k (k &gt;
1).  Such shortcuts offer alternative paths in the update graph and
can potentially speed up the transmission and processing of
incremental updates, leading to faster synchronization of ALTO
information, especially when the client has limited bandwidth and
computation.  However, implementors of an ALTO server must be aware
that:</t>
        <ol spacing="normal" type="1"><li>Optional shortcuts may increase the size of the update graph, in
the worst case being the square of the number of updates (i.e.,
when a shortcut is offered for each version to all future
versions).</li>
          <li>Optional shortcuts require additional storage on the ALTO server.</li>
          <li>Optional shortcuts may reduce concurrency when the updates do not
overlap, e.g., when the updates apply to different parts of an
ALTO resource.  In such a case, the total size of the original
updates is close to the size of the shortcut, but the original
updates can be transmitted concurrently while the shortcut is
transmitted in a single connection.</li>
        </ol>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations (Section 15 of <xref target="RFC7285"/>) of the base
protocol fully apply to this extension.  For example, the same
authenticity and integrity considerations (Section 15.1 of <xref target="RFC7285"/>)
still fully apply; the same considerations for the privacy of ALTO
users (Section 15.4 of <xref target="RFC7285"/>) also still fully apply.</t>
      <t>The additional services (addition of update read service and update
push service) provided by this extension extend the attack surface
described in Section 15.1.1 of <xref target="RFC7285"/>.  The following sub-sections discuss the
additional risks and their remedies.</t>
      <section anchor="tips-denial-of-service-attacks">
        <name>TIPS: Denial-of-Service Attacks</name>
        <t>Allowing TIPS views enables new classes of Denial-of-Service attacks. In
particular, for the TIPS server, one or multiple malicious ALTO clients might
create an excessive number of TIPS views, to exhaust the server resource and/or
to block normal users from the accessing the service.</t>
        <t>To avoid such attacks, the server <bcp14>SHOULD</bcp14> choose to limit the number of active
views and reject new requests when that threshold is reached. TIPS allows
predictive fetching and the server <bcp14>SHOULD</bcp14> also choose to limit the number of
pending requests. If a new request exceeds the threshold, the server <bcp14>SHOULD</bcp14> log
the event and return the HTTP status "429 Too many requests".</t>
        <t>It is important to note that the preceding approaches are not the only
possibilities. For example, it may be possible for TIPS to use somewhat more
clever logic involving TIPS view eviction policies, IP reputation,
rate-limiting, and compartmentalization of the overall threshold into smaller
thresholds that apply to subsets of potential clients. If service availability
is a concern, ALTO clients <bcp14>MAY</bcp14> establish service level agreements with the ALTO
server.</t>
      </section>
      <section anchor="alto-client-update-overloading-or-instability">
        <name>ALTO Client: Update Overloading or Instability</name>
        <t>The availability of continuous updates can also cause overload for an ALTO
client, in particular, an ALTO client with limited processing capabilities. The
current design does not include any flow control mechanisms for the client to
reduce the update rates from the server. For example, TCP, HTTP/2 and QUIC
provide stream and connection flow control data limits, which might help prevent
the client from being overloaded. Under overloading, the client <bcp14>MAY</bcp14> choose to
remove the information resources with high update rates.</t>
        <t>Also, under overloading, the client may no longer be able to detect
whether information is still fresh or has become stale.  In such a
case, the client should be careful in how it uses the information to
avoid stability or efficiency issues.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to register the following media types from the registry available at <xref target="IANA-Media-Type"/>:</t>
      <ul spacing="normal">
        <li>application/alto-tips+json: as described in <xref target="open-resp"/>;</li>
        <li>application/alto-tipsparams+json: as described in <xref target="open-req"/>;</li>
      </ul>
      <ul empty="true">
        <li>
          <t>Note to the RFC Editor: Please replace This-Document with the RFC number to be assigned to this document.</t>
        </li>
      </ul>
      <section anchor="applicationalto-tipsjson-media-type">
        <name>application/alto-tips+json Media Type</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>alto-tips+json</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>Encoding considerations are identical to those specified for the
"application/json" media type. See <xref target="RFC8259"/>.</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>See the Security Considerations section of This-Document.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>This document specifies the format of conforming messages and the interpretation
thereof.</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="open-resp"/> of This-Document.</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>ALTO servers and ALTO clients either stand alone or are embedded within other
applications.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <t><br/>
            </t>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Magic number(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>This document uses the media type to refer to protocol messages and thus
 does not require a file extension.</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>Internet Engineering Task Force (mailto:iesg@ietf.org).</t>
          </dd>
          <dt>Provisional registration?:</dt>
          <dd>
            <t>No</t>
          </dd>
        </dl>
      </section>
      <section anchor="applicationalto-tipsparamsjson-media-type">
        <name>application/alto-tipsparams+json Media Type</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>alto-tipsparams+json</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>Encoding considerations are identical to those specified for the
 "application/json" media type. See <xref target="RFC8259"/>.</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>See the Security Considerations section of This-Document.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>This document specifies the format of conforming messages and the interpretation
thereof.</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="open-req"/> of This-Document.</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>ALTO servers and ALTO clients either stand alone or are embedded within other
applications.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <t><br/>
            </t>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Magic number(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>This document uses the media type to refer to protocol messages and thus
 does not require a file extension.</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>Internet Engineering Task Force (mailto:iesg@ietf.org).</t>
          </dd>
          <dt>Provisional registration?:</dt>
          <dd>
            <t>No</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC7285">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Protocol</title>
            <author fullname="R. Alimi" initials="R." role="editor" surname="Alimi"/>
            <author fullname="R. Penno" initials="R." role="editor" surname="Penno"/>
            <author fullname="Y. Yang" initials="Y." role="editor" surname="Yang"/>
            <author fullname="S. Kiesel" initials="S." surname="Kiesel"/>
            <author fullname="S. Previdi" initials="S." surname="Previdi"/>
            <author fullname="W. Roome" initials="W." surname="Roome"/>
            <author fullname="S. Shalunov" initials="S." surname="Shalunov"/>
            <author fullname="R. Woundy" initials="R." surname="Woundy"/>
            <date month="September" year="2014"/>
            <abstract>
              <t>Applications using the Internet already have access to some topology information of Internet Service Provider (ISP) networks. For example, views to Internet routing tables at Looking Glass servers are available and can be practically downloaded to many network application clients. What is missing is knowledge of the underlying network topologies from the point of view of ISPs. In other words, what an ISP prefers in terms of traffic optimization -- and a way to distribute it.</t>
              <t>The Application-Layer Traffic Optimization (ALTO) services defined in this document provide network information (e.g., basic network location structure and preferences of network paths) with the goal of modifying network resource consumption patterns while maintaining or improving application performance. The basic information of ALTO is based on abstract maps of a network. These maps provide a simplified view, yet enough information about a network for applications to effectively utilize them. Additional services are built on top of the maps.</t>
              <t>This document describes a protocol implementing the ALTO services. Although the ALTO services would primarily be provided by ISPs, other entities, such as content service providers, could also provide ALTO services. Applications that could use the ALTO services are those that have a choice to which end points to connect. Examples of such applications are peer-to-peer (P2P) and content delivery networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7285"/>
          <seriesInfo name="DOI" value="10.17487/RFC7285"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8895">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Incremental Updates Using Server-Sent Events (SSE)</title>
            <author fullname="W. Roome" initials="W." surname="Roome"/>
            <author fullname="Y. Yang" initials="Y." surname="Yang"/>
            <date month="November" year="2020"/>
            <abstract>
              <t>The Application-Layer Traffic Optimization (ALTO) protocol (RFC 7285) provides network-related information, called network information resources, to client applications so that clients can make informed decisions in utilizing network resources. This document presents a mechanism to allow an ALTO server to push updates to ALTO clients to achieve two benefits: (1) updates can be incremental, in that if only a small section of an information resource changes, the ALTO server can send just the changes and (2) updates can be immediate, in that the ALTO server can send updates as soon as they are available.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8895"/>
          <seriesInfo name="DOI" value="10.17487/RFC8895"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC4122">
          <front>
            <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="R. Salz" initials="R." surname="Salz"/>
            <date month="July" year="2005"/>
            <abstract>
              <t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier). A UUID is 128 bits long, and can guarantee uniqueness across space and time. UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group). Information from earlier versions of the DCE specification have been incorporated into this document. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4122"/>
          <seriesInfo name="DOI" value="10.17487/RFC4122"/>
        </reference>
        <reference anchor="RFC9205">
          <front>
            <title>Building Protocols with HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>Applications often use HTTP as a substrate to create HTTP-based APIs. This document specifies best practices for writing specifications that use HTTP to define new application protocols. It is written primarily to guide IETF efforts to define application protocols using HTTP for deployment on the Internet but might be applicable in other situations.</t>
              <t>This document obsoletes RFC 3205.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="56"/>
          <seriesInfo name="RFC" value="9205"/>
          <seriesInfo name="DOI" value="10.17487/RFC9205"/>
        </reference>
        <reference anchor="IANA-Media-Type" target="https://www.iana.org/assignments/media-types/media-types.xhtml">
          <front>
            <title>Media Types</title>
            <author>
              <organization/>
            </author>
            <date year="2023" month="June"/>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="sec-dep-model">
      <name>A High-Level Deployment Model</name>
      <t>Conceptually, the TIPS system consists of three types of resources:</t>
      <ul spacing="normal">
        <li>(R1) TIPS frontend to create TIPS views.</li>
        <li>(R2) TIPS view directory, which provides metadata (e.g., references) about the
network resource data.</li>
        <li>(R3) The actual network resource data, encoded as complete ALTO network
resources (e.g., cost map, network map) or incremental updates.</li>
      </ul>
      <figure anchor="fig-service-model">
        <name>Sample TIPS Deployment Model</name>
        <artwork type="drawing" align="center"><![CDATA[
                      +------------------------------------------------+
                      |                                                |
 +------+             |R1: Frontend/Open  R2: Directory/Meta  R3: Data |
 |      | "iget" base |     +-----+           +-----+         +-----+  |
 |      | resource 1  |     |     |           |     |         |     |  |
 |      |-------------|---->|     |           |     |         |     |  |
 |      | incremental |     |     |           |     |-------->|     |  |
 |      | transfer    |     |     |           |     |         |     |  |
 |      | resource    |     |     |           |     |         |     |  |
 |      |<------------|-----------------------|     |         |     |  |
 |Client|             |     |     |           +-----+         +-----+  |
 |      | "iget" base |     |     |                                    |
 |      | resource 2  |     |     |           +-----+         +-----+  |
 |      |-------------|---->|     |           |     |         |     |  |
 |      | incremental |     |     |           |     |         |     |  |
 |      | transfer    |     +-----+           |     | ------->|     |  |
 |      | resource    |                       |     |         |     |  |
 |      |<------------|-----------------------|     |         |     |  |
 +------+             |                       +-----+         +-----+  |
                      |                                                |
                      +------------------------------------------------+
]]></artwork>
      </figure>
      <t>Design Point: Component Resource Location</t>
      <ul spacing="normal">
        <li>Design 1 (Single): all the three resource types at the same, single server (accessed via
relative reference)</li>
        <li>Design 2 (Flexible): all three resource types can be at their own server (accessed via
absolute reference)</li>
        <li>Design 3 (Dir + Data): R2 and R3 must remain together, though R1 might not be
on the same server</li>
      </ul>
      <t>This document supports Design 1 and Design 3. For Design 1, the TIPS service
simply needs to always use the same host for the TIPS views. For Design 3, the
TIPS service can set tips-view-host to a different server. Note that the
deployment flexibility is at the logical level, as these services
can be distinguished by different paths and potentially be routed to different
physical servers by layer-7 load balancing. See <xref target="load-balancing"/> for a
discussion on load balancing considerations. Future documents may extend the
protocol to support Design 2.</t>
    </section>
    <section anchor="sec-bcp-http">
      <name>Conformance to "Building Protocols with HTTP" Best Current Practices</name>
      <t>This specification adheres fully to <xref target="RFC9205"/> as further elaborated below:</t>
      <ul spacing="normal">
        <li>TIPS does not "redefine, refine, or overlay the semantics of
generic protocol elements such as methods, status codes, or
existing header fields" and instead focuses on "protocol elements
that are specific to <tt>[the TIPS]</tt> application -- namely, <tt>[its]</tt> HTTP
resources" (<xref section="3.1" sectionFormat="of" target="RFC9205"/>).</li>
        <li>There are no statically defined URI components (<xref section="3.2" sectionFormat="of" target="RFC9205"/>).</li>
        <li>No minimum version of HTTP is specified by TIPS which is
recommended (<xref section="4.1" sectionFormat="of" target="RFC9205"/>).</li>
        <li>The TIPS design follows the advice that "When specifying examples of
protocol interactions, applications should document both the
request and response messages with complete header sections,
preferably in HTTP/1.1 format" (<xref section="4.1" sectionFormat="of" target="RFC9205"/>).</li>
        <li>TIPS uses URI templates which is recommended (<xref section="4.2" sectionFormat="of" target="RFC9205"/>).</li>
        <li>TIPS follows the pattern that "a client will begin interacting
with a given application server by requesting an initial document
that contains information about that particular deployment,
potentially including links to other relevant resources.  Doing so
ensures that the deployment is as flexible as possible
(potentially spanning multiple servers), allows evolution, and
also allows the application to tailor the "discovery document" to the client"
(<xref section="4.4.1" sectionFormat="of" target="RFC9205"/>).</li>
        <li>TIPS uses existing HTTP schemes (<xref section="4.4.2" sectionFormat="of" target="RFC9205"/>).</li>
        <li>TIPS defines its errors "to use the most applicable status code"
(<xref section="4.6" sectionFormat="of" target="RFC9205"/>).</li>
        <li>TIPS does not "make assumptions about the relationship between
separate requests on a single transport connection; doing so
breaks many of the assumptions of HTTP as a stateless protocol and
will cause problems in interoperability, security, operability,
and evolution" (<xref section="4.11" sectionFormat="of" target="RFC9205"/>).  The only relationship
between requests is that a client must first discover where a TIPS view of
a resource will be served, which is consistent with the URI discovery in
<xref section="4.4.1" sectionFormat="of" target="RFC9205"/>.</li>
      </ul>
    </section>
    <section anchor="push">
      <name>Push-mode TIPS using HTTP Server Push</name>
      <t>TIPS allows ALTO clients to subscribe to incremental updates of an ALTO
resource, and the specification in this document is based on the current best
practice of building such a service using native HTTP. Earlier versions of this
document had investigated the possibility of enabling push-mode TIPS, i.e., by
taking advantage of the server push feature in HTTP/2 and HTTP/3.</t>
      <t>In the ideal case, push-mode TIPS can potentially improve performance (e.g.,
latency) in more dynamic environments and use cases, with wait-free message
delivery. Using native server push also results in minimal changes to the
current protocol. While not adopted due to the lack of server push support and
increased protocol complexity, push-mode TIPS remains a potential direction of
protocol improvement.</t>
    </section>
    <section anchor="persistent-http-connections">
      <name>Persistent HTTP Connections</name>
      <t>Previous versions of this document use persistent HTTP connections to detect the
liveness of clients. This design, however, does not conform well with the best
current practice of HTTP. For example, if an ALTO client is accessing a TIPS
view over an HTTP proxy, the connection is not established directly between the
ALTO client and the ALTO server, but between the ALTO client and the proxy and
between the proxy and the ALTO server. Thus, using persistent connections may
not correctly detect the right liveness state.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors of this document would like to thank Mark Nottingham and Spencer
Dawkins for providing invaluable reviews of earlier versions of this document,
Adrian Farrel, Qin Wu, and Jordi Ros Giralt for their continuous feedback, Russ
White, Donald Eastlake, Martin Thomson, Bernard Adoba, Spencer Dawkins, Linda
Dunbar and Sheng Jiang for the directorate reviews, Martin Duke for the Area
Director review, and Mohamed Boucadair for shepherding the document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+296XYbR7Iw+L+eogb6YfITABKgVrqlaVqU3LxX2xWp9ulu
+1gFoAiUBVTBVQXSuJS+V5l5lpkXm1gzIwsFkpK7b/c50/CxCNSSS2RkZOzR
6/WiSTHOk0V6GE/K5LzuZWl93kvmddHL08teXSZ5tSzKujdP6rSqozqr5/Bs
52yWxkcvz97EZ/pEfJKfF+UiqbMij9+uRvNszN9P0/IiG6edKBmNyvQCXuYX
T96ediJ4Jp0W5fowrupJNIFfh/HV8dHZ889RlC3Lw7guV1U93N9/vD+MkjJN
Dk2PR/A7uizKj9OyWC0PaUBRVNVJPvk5mRc5tLVOq2iZHUYxtF9m45qvxPG4
WCzSvK70d5bPM30+jtNJVmf59DDOC/hVF2O9AV+LxTLx7cCFSbqsZ4fxAbay
LPOizs6zdCLvVjDOMj13/VTrhf3ZaK1ajdwVeD1KVvWsKHH0PfgfRwlv/mc/
/j4p6Dcv3H8mmbsCs0xTeLvzuugP78WnBbQAKzCmlRh0479ks1WSx++KZNKh
F8ZZDcB/Nkvz6WTFV4oJNPpgsA8fubDK65KeyvKELhUlAOc0G1Nj7/PsIi0r
aIjupYskmx/GH5NsmhR/rMarfjpZ9cd5FE7jXT8+Hc+KujYzeVfMYe3sdZ3P
ySTpvZvByKreKSDl//t/pfHQjP84KRew7pPazuDe8PH9cALfp4Cg+dpP4Thd
1dUYcPksnacfi4WdAA+mz4P5Y80P9CdpYx5/6eNU/pLkUzMR/Bm/A/gk5cTf
08ncH8Rvy6JawrLEp3TNTOV1ehn/KblIczOVZ2fhPN6fHvk5/CWZp1vWYF2u
/ziu+mt4AhehMfKXfZj//BJGmZqhv0xWZZqHd7564PsP7g/3v27scxoHwJvH
8cftk/jPdD5Py2AK4xmsnb3xz5kBDaP/kYZhJpAznbxIcWe/e/FsOBg8lq8P
h4/uy9dHw/t69dHg4T39+uixPvB4MBj6rwf+qz578PjRg0Ogo0qYXYf3BkP3
5nCf2js5en3UewWEL+mdrZf0IFA3pvZ0OcbLFV9OyikCc1bXy+pwb+/y8rKf
JXnSB4jsJVWVTXMirnsLaq/GF+33/m+zejGnppjiD/eHB739B1HU6/XiZASL
BSQwitwhA0uGlHce78CIY4TRbjxPAeTJNK3iP52dvd0b9Acx0o6sioFIwAjS
SQzTjmtoo8oWy3najar01xWMK0vmcYlfq7pXpsv5Ol5VaTxOqrQLOBVfzgDf
oC3uejzP4BV9vooTaWWcxsV5nJkzr0yrYlWOYUA4DuoXTr60xBvLIp9U8WUG
xBhvIJGfp3UajYu8xuahqRSwxbURw+EVJ3WcwBIs0n4U0ViyfFymCFmYwGqJ
oKtg6HBQ0Rmblr1TbOv5BcI+3jk9fb7LAEOc2QWwnMMRhzNYrOZ1BgP4DV9d
KmxhCnWxxKEIQH/rwvEF48VxCDRkRuMkj8xgAILLVWVGr4OrC4EfzB1OGFyx
eFHkWV2UsDx5WuPhHbUDEWhnPoUVgeaLSxwoAU5ag4alnVgn41+NYMAEfiAG
DL/4T8Uldt7lqQ1phZCjKWPat0UOYJkDNzFZwxm8JOYClma8KoEE1V3YsHlv
NC/GH2kcjv8AULnekcAkiwoRyPWNnWE7OZ+/sIxnAM/kIyzt5CIByE0JiYDR
goHQw+dpUgPZq7rQCGJyMV4hiKHVuiwmK4RLLZsiujXnFe8gr7XbJ5YLcR0x
1CJT9O756dn5ai47B6E7BWLR3APYM4wVVn+ZjLI5UDt8Mv1tCR0CoVh3Iw8z
QIkdC7Vd3UHxznI1n+/GSIKBURpvR+ooJ5KlS1YwiPYOurhDCeLZfB6fr3IC
Lq7MuT4DxKDPxGSRTSZzOLLvAJAYhASZqzsEUWAyj5ZLhVfvZbKGhQC4nuPA
3iwBd7L/ZlDuICB2cbNcZACleJEC8KlDxeLEN0T4WYzqBJBBbsNoYWUrSzCA
/yni86TsuiW1d4EzzuNR6rENNgzi1mURXybrCsj6ABZUXxwB8fI7+epKTpLP
n7tCzraTRUf8IjpSbyJ/bkJtu7arpA/bElpRpUj6LNWLDdXD69I4TdC3uZOd
Q2vrXWzKEZa6MGQAlnjYj7+CMuIre0QeCVJIHgFS2FE7sJr7oID+JrjWbkAy
V6KVWQ0rBP1ge3C7TMcporEOixqEF2j6W88MXH34SZxIsKvojNskvYbi0iBk
qEp1sRlPeJtEFgD5XQFHkyIQjKZMQxC4M5YghpwH4tZoVev21OsHnz/jGCPe
q+7yPbiMc1Lq6tpDXDoHCl+1E2luJpJ95+ijTBLJ2ALvAUqkJe03+LWErxk8
A/ClZcN2dMmRLMQvsrKquwjXChot/f4LtlHb1kHw4oY8h7eKfL4WEY6wuvUY
A/zUtcDRlis+HsL96k5eaK5J7RiFmHS6w6b9xITZe1RhiRePJF4mYS+0IfgH
iAvj4rUzOMTxAjZkiM95YYm/oyOC/AKbRVa37UdYX+SautKekLcEjmFgJqFt
WMRyBicw4azZ5e5gniVybm0OUndPLo0D+uL8F7A/BMUr3an6CiHC6/Q3iweK
JJYswALOQQhfTWf+Nm1OQQPSHWxMthtnwaENQAaQF3CcABJdx34hIJgBA1pa
VasFPgNcYAGN94oSR7lIqwo5B5xYnsIJWBaL5joYGhnTKRH0Kcf8pICR5UWt
pxpKT3h7J+unfejegxdu5qTWKHdJ50H0D15ZwYxbl/p0hWeIdgTwwm7ooHEI
iqx/4rE0Ti5AaEpGhN2bFACQOB0n2MIIKRWeVxWhc4bL7UaKq+HGCks3QUVO
kSOd7Pr1y3BBkGz2cA9vbHhoIGNGC7c3I+E5gk7wHvfZrCjoeJkVlzRKQtqs
VmpfOVAQzwdbIpvScTFLBQhpmV/H5SXEaTmeG7m4McwinUS4tv9Q1k+xoXHq
kfCSfAkDmAH+AlJZ3tnxEUg7/gdYwB/osbZ9TatGUBGEyg1j3zYgoM5NHs3Q
Xi/pEIFDagXjnmTnQCII2Rm80yKZV8S3RdQ30J80R/kjTnPEfWAs4YSOK1hr
2go4yLIYIbmeZKjBBFKOT5Po6RfRUR2k9IBRCwC9ikyw5tTBAgT0Kb1ArY5W
2bzuASoL1cDtELmFNccnnZrxCyUycLjS/FEAhu+kSYEl6jIsoe+C2WZcvXpW
IuFcwqBGaxXYcVyGCuBYilXdK86FvAXiFdIIWezIbl/fCYlx+RgYo4pwM2Ue
T46XbEFqhzoFdFSKXdI5HllxEnEbBgF8G+l9hekr8DAB8K9wiOekMl7lusEu
w9PGHc2OBJ7NVrAgl4AEBRHZKk0ZRniMxah3SMa8HLhodJEPYrwWBcB/k6eA
KQlx6zyQUZbL+gI5QZnAIVJF1K2KK6BMuNOjqysYWNWrqhQOsyh6XRAZAu7p
fIWslH1zkbhVSi1e4FkgnJdTDwyjBscXb3J83ZiP7GQOkrZsZXif5vQD7o4K
TkVUDawjIoT2OdkwGZ9QzAEAtl5d4YBoJqdCPpi4h5RUSEuKclIvjp/7Ocrp
GKqVcL0nazz+xqiDr8ZltqRVxnmlKA1mzFLFgACI/rLMMMo5av7WOK2QsALC
EeeBy9QiMlmphlgR4BMRfb2ks17KOqmswUIUE3KhSdMyWc6AZExSnkOy2ez7
dyfxMqkRsDT587QesxKqypMlYAmgP7zZdooDiIsFrBhs84RPUcHQ35hA0OiU
lUS1BgIACaHwU36jRJkiNmMtLJWnfCRrMCqwjHt1VQDCBq1UiEwwxvlqgoRl
XgCfOAIamY+xwasrvNBzF/BhmicxT7CEcKSNUyaJLRPFzTZJlyCnsqirNP3q
alwWFWyd8SydfP4cAcZX6bg3Gi97qPkEtNdhE2QvERw0rdqvlKBxMkFK4bDv
OzSlPRMK+BaVndlYREOkyxPLGIrakNRDvLeG+/dpA9y5E79jDoi0rfFLQLcV
bF1WnH6EQwiwDmTvzqv3p2edLv+NX7+h7++e/9f7k3fPj/H76Z+OXr50XyJ5
4vRPb96/PPbf/JvP3rx69fz1Mb8MV+PgUtR5dfSXDqsCOm/enp28eX30ssOK
MbtHcd0BHkilc0DPZZmiCiCpIoAZbMARI8N3z97+P//34B5M/f8QTTnAnX+g
Vhx+IIJxb8TN8U88g1ElkyaI2zEJAskyg1Wvup484qIAIP/X3xAyPx3Gf4C1
Hdx7KhdwwsFFhVlwkWC2eWXjZQZiy6WWbhw0g+sNSIfjPfpL8Fvhbi4SwgD5
5w2FSGJXg3hDp7ms1rBBfiOg5voGgs1xqBM+WtSy+Kg/RBLo1E64sEyD19Ro
GhBgICAVUQKiwqEORLhdpD53eAu9ucBLQBuv7hTy9TPNxXPBwTa4ulOan5/b
zAikRKkrOyxVTOBh6lmQRYpEPKsWcJCI1iCx8vwEuhkjr6uStTLNgWQqqkAv
aUdKe1kFBnQjeIkxVI6wiaqUt+r4vo1gGYp80hibHGSjlAU2T/ZUIoa+0cxg
deikWPYLsnJc5CbZNBTcatFowonlHoDAYguBhir1OmViEUVNF28YMAANnFqI
XhOi2bZERFGQWxDuUFRXIHeXMI1upNoJRL1u81zYMTPcNUz/pmLW6HaaLAjr
x1vGxsdkBQ1UsiPOC7FrRBZbgV052TygDqPDuOUya5RS3I4sxGC7yDHTlMm4
kDctN14/K9Bg4QCtJKqOdcJESihIrIzXyRDuCLtD2GK0syR55EXJiukQX52y
QTdam4yFisM4WOcWvPNAzQLUIwXRHBZe6dVOgjorz1qMUoA4YtQzb9oJxVPp
wYIGYf8Dzt7trTxNJ5XV7BLGL9GOaBR0W1RCNCLgCUqjTESFmd0hgRCNLNsK
lwAEvzngtJCCfHKZTeoZtEYrWigeoAYNZSn0Zol1XsZQcN0+hsaCnbxCpK9X
OYlPXbOCDo0zp4OhM6TXI/ErZn2ZrKRF1pFRROGCrBt6q+SiyCbtc4DWRsBG
p9D8psWvG/TEymtizFM8UNToK9pzNF6iqw2K5qw8a+0Q3QtQDcKWC7XhdYmk
iDDWZeY2dipSVCsl449pHc+BcQRMe1nk094StrrHLtrNbdftdsZOaU/iOZqK
aUDOmC7IaTxAlEiW0FGGqgIEH3C8sABI+Xvvzs7CLe5JWYu+7mRj8TcWF34C
Ip5nqISSg4EXrlfhbZK7xejM2xheYP2M4rucYzSKgE6i/QHAdonOMuT/VIuq
jTcfaXoKT6CAU7zIilUwPF71gtQthFhbzBJxq5hKO9Pvy5kYkDdHaogPoxHJ
dY5BZy8EFKTzNTR3AQRnuWCTEVlVEPuEsPFaqFgkPFlMs0DCicysVWSdtQ+n
wSQEIjDtUpTTkPmlo4FkkSiEWo77DZU5YkhhJlBl3vGaFQ4ouK0Q5EBNqxSI
fCJqqA2dGNMaFD5g8yQIVuI+hG2EDYISNA6YDioWXeEJ5fkjf8gAAfciasPs
pZi7a04iwz6VqdfzkGaFGEnkHFGdD3vPu2L4YTR1CCAqFF6RALK1jlzU5M78
cdMgUXL18iUjMdnH1PlAlUWszmkQzOA0cKbSfpN/J2OBrB50Ni/WdJkBHIjX
MYux8FCP7qosSTA6S0s8wufFdA2MdO1/fUbOBORYVqgrF4cPVOJZMnHnsZqe
63YJw7E+/DrwPF+qzyaGSJXkpClR6ibiQxsHbcbSJSkkZxVr5LU6bfscl9mw
g9u1PMINXWcfR/3bNbfdtJZZyv5FIBOXQNLFLOLfSEaorrS+BTDlJZxnBv6I
Ior28U59oVAzqxUuEAvjct6hxIJGzkDR7AFEZq/meJgBvmb6RBv8oJBhAwkE
j/akysZE++E3rk+o4dpZTXdZuY0qStYDAXxIP7tlSDD79xttOACz3JaiyDRe
A183locuZ0WFMsSErEtw0FSqzRGDvXMXIlRoQCF0g0gnUxWp+V3ht7I6XbDB
AKa7UqMQNKVtA40SirZIls78s5P2p/1u/KwAQeJVsuzGiknwY5fggowp60DI
rgY46fXRPD+0Rques22hGn29yFAhm+Kpqd1yT4AQOBPYC411QrJKki5uTLfQ
u8w0oQUadhpQMBIaiJLBMv2Zp41r805BjmsEuImS25jUjs5hZIsFuB+/YEeN
UMfqV4R6FwizirwqxmgZmIhlC1aMBzdfexsisRIIzUUBnG+Rs6jHBzmsVDpe
obJ6vuZNQue2cw/MV4tRSrJQKxVE2gcNd3RMVYfZ+HNvwtVbzbE2uog7VQeV
tXWCHEHj3k6Fl4FH+1WxnzASTeOor0Dx57/Tsth4L8s3lhf6eJ5vTBCQJZ80
2yejfrU5mvZWT+UEddsTJZ7ARIILH+pUsspRKYZKe9ObYrMnsgAXdgXd1s+N
HXTJ/2OyhQMjzuM/Tt+8jl+lAI74bYKqd0BTuka/aKtbS17sqARxkfC1KAG7
mPGVYSla7GS7LP2RO66//MuuOEAYFAUehIz6WXw3HsRP4l9EY7oUxT47Jc2A
jMLzTFkvswq21SsdRLujAzGsyRxd0toWVw212s+edrGlNSQuqI9CalbUrBsm
Yj/ZgjrvPU1lAgLbx+uYlGzQq0iPGzoOM8jxTBmuNKNzhWioU9OVjYNfWqD1
M3TdMG1kvCCFNuFahp4iOwXQbeQ4d1FyRIFlid4GBQ4FLvB5NpOmsqatXjsq
wsHxShIfm1XhvM9da7gVju9kvTu/IJiOpU8PCu4SAeXN8gQwEdpCOq+ai0zI
LEnRjrjibf3xS1dmmtEof2GtP52JAWWolC+OFcvxEHZecYLidE1mhaPrkm81
W6Dna5jj/4YPBjJdZhJyccPnbs9+7kbNa3cbT8CFT3F8LEcofD6Fj0d8LX4H
7BDyhPD9E6qdL7JKHBTwgju6Y34AzZMl7sL4kzTw1hl/6Pk4flsAk7LWFyyX
zL+hgXMgYtLADVO4e83vuwZsn0JgNX5u3o8aPX3F5270iVkfUQh/zedT9Kk5
5y8dBbWxMd+tH13PxrpQG01gb/u0PadtNFd868xbnvNtvNNz7c7g2jb8c8NG
G79/Lnzn0+2WYU/+/hiui47zNp899+1HP8MvG8ee+f6jHYfChj/tMmxzFH4k
GzBtB+fmbXPFr21cXwy2AoVuD+1tunLAo/g7jsPCo+Wz13r1k/65bhzXjK4V
HgCOvdU0HAxeHW5cdbcO+Nbfbxx3HYo5BNbPdsRzdwyu858fG/1dt4X9V6XJ
0u6PW3rbPg5zJGi7dwMQXDOO5ov6+bH1auNFQ0QU2C2X/OduY8Sf4mdssPHU
zl0atuKA3Dz4O/Qf1RcZXHtitB0ZXkMce9LK+jJn1RT14BViaqKrw/jOeTbt
qQkcGCk6c3rJPJvmTzrjFHmADofsPek4o7kqxijcmnxYbCufP5MnBHGa6mGW
zecrjMCr2XsmLkxTTiuOzUWiLmC1jlp8NULGucCoUgFfvyy2+E/u3BlEyOzd
GSprDIcUc8BNTQjzu3A2kb3lnHQUqCALhsNuebCUxoUVelGM6DpE4NZ05Xcl
3K2k0LycdESByxjPEiVh1CeIRdDJ9H6xSZQn3Z1xCQzNxUYrHe0AvdolmZY0
Kz5Gx2qA7gy6KvpWs0TsHM4YJnMkRQhp0RkyaqehBmC2uATeLdWNoEINITtc
AyUkAdKNZbUEJt+/0wwJIjz1t7lb1HkZHw5VxX2PSE6aZHH29O7GbXuC4xOs
Wi0MQ6QBVlGr1MmRG9tVfRxBwhJ+RR4LLqwz2mKbNqr+HWDO5yp4iGt2oOBj
y0R0gzb4zp34O1J9HqP49oqU9fBeAK746g4Kd6Ksj6IXqktzegpR16F/CQZ3
oHLQx2nBz93uFh8Otrj7WYn06jSfztIXqu0VpA2IshUl4u1rDbtlMv5YNdwH
bCwGjlHwSOXGk+PKb0UOKW7aciVMwc2K98OAYYPG011x/sTfJDmKLMujJeTQ
7hoDUqE1AcFz6rWBGhPQFLCd5kWer+ILoMrqj8aqI4LHuFimNuxrF8MzYlGA
xvsxmVwJaqQ34EXLSEtFOn5Y6cWyXu/lGELZ97NjSb3yChKW+YETZS3XeDXX
OEN6lOR1ktN/UZ0Bv0cxgKgJ8BL+dcI9D+HPXqu6TOpZz1q7djxhwHuoLyrJ
Z8KE6Epze7hGOIBZYjzRBNS7UXREpjD0EvRHlfdzjvlgW00xZMcfAA9FmW+X
vhs5BEdsfmiIl1XvB9FC8XPS5ksz0BP6QrtmAgcnH48TquvUZBZo60g9PP4Y
zyk02zdodH8tu1Y2/MnxYP+gN9i/t4veGTXugEY7TvHWStIazdzf1fhNmGaz
IUP66K3o5Hgf3jnY7cfepZx2mW4OQQdr/DxsqqfohQuypQPdYT85UbqjQ42S
ngC0aFunhqlLii6FvxdsAVDPjIjtoaKMxtQ1VvkPcxU/tZYYM30OJucdmaIG
pZD3qK0D8oysmdxVrPAj5yc8OPUo2ozWcCFwGDicTrivhi4XB4qPiU5ylHqP
Q3JwZofZxOgCxajUDBJtQrQNHcS/JqIZAXQAsbocVQff5Mr9LnmLMxCc9liI
Di0Pvg2ojiMnP88Ko4K2jalmTxZsrKOq4Q6vbqOxr1DutX7uPqHP3a9oQASj
GAi1kW1u/9n7yhHwTht48fnTV/T/ae/nn7/mdR2taem61+H8O4wP7g0H+48f
xr2n8DCOPJBI/4G96wcp2gBgNoRnQ0HvS0H3Y6iz+IeD7sG9g8Hw4J6CbvhP
Ad0QCfu/GOj23Osb6mwB3f6jR4P9R/sKOpzAH/QhGooq179D2qxMCw6LO3vy
dKN3OeNkAtt69x85jhV0/b6d/5eDzr7/FaC71euCdfeHD+47rLtHqwWvE2fw
9b0jT3G7wWNH9/hxwbpg8LIQ978UhJ/6P5tLe1+Pfde9TRB8+Ojg0cHjoULw
vkU+xL8v7fo2ALsPIHmAAPsisPy9RiKI83D/8aMDnfaDr8CUUL21mt6g2CJ1
AgvKz5nX63A0SCgzvyKrvDiPneQXSZlRTg6QIkQqJT8WFkcxFKThyCLuOcmY
fcWSyYQFiW4EbFdfnJEyCX9L82pVCguM3KmTa1lo06wgi+QjKit8nDvy1yC+
0Q9ghlwAsXB7jtW7yJLY83jRDjdYofVzztGSMMT9XY7jc2+NnLugKPLSpIQe
Sh98IiwwendOybtTHJVaXYTDYPoIgYL6AJuSaVkWiVOJgBRVl6txjRGIrMmR
gFORNElLwjLpybFLgAWATieBtN6IdUR4u/FFfuw84QGM8xVFUG9EZoTtUHyX
OLJHoXYjc9jC+oNn7P1KGeKOeIFRu9CN52iRrsSAv8WtxvtqoLKC0uI4f5xw
hqoAxpCr1DbaEF98S+p3Q5JDTgNzMk7uvOXzStukOZNXKzHm4pmEPsgZJ3Zz
js8tTgfEjuck/ufsRMLcvcRKr7GfPzzBe/hvSgMk/JrPvVTdNuGd9LdxuqwR
f9XjoU6n5CsE+/6CfGLiD3/DbAl5+tMHVjm8SJNKfcTjl5vroDBu6zFQVyNM
sAOX9CC2oVkMO8oKx86GFFCpKUwoYpk8X1TLiFLzR8n70z5dHn7nXTadgcA4
y85B3EE1EaAWC6zJhiLdQg/gMAA4DH/6QBoUihBQSDef+wYf/MY++Q2c6CC5
fRM/jWuR7OCx+CksGCfPg+fhFzaYD/uiadRQhyBbDubfEHrnlLFMLiujsP2m
QVYjCQ7GF2CHJqho8/pFVeqwyzJpdIzeExOxCIRkOvvdyCgZA7uDA8WHKxAE
ushI4z8HXZZpSYyF0+rzhz7uaGpt0I0ohgrf2HyOoIO3/AVAANbykabbJy/C
p4bd6NpWGlclbM03J8o/xrG88BTbKN9QOID1QW5tC5KvAkyNy6z6SGtGYCsJ
A40qxra74/RcJR5vvDC72p3erSjqMHK3Jc1LU5HjQ/1g5VwQEeXHCKI5ZAAR
CozU08GGe49YE36QnFEET+et8LJQX/HxLF0k8dUdzS3FDIJ7y9/omYBSJO3x
DKBCKRDm3tigGWAIFqGpx/nLMu0hpS3e6L0gY9YLCpopKMoI4TzZDXOHzdpT
Lu1Uu54Uc+8RZRQzaQ9F22WSOpm8Xl2rfS9TOHVz54pYjH4BgEZN6wcc0mo1
WRaZ9EV4UhTiFmmcyf10ycW89+ddF/e5WiwSzodgw/jwNedmp702518XcJ6X
wr0Q9Qd6YpJmmrb68Q96GRMctI414k6VP0E1WoMp2cGcHFdXFeHL58+7Pj9C
ezqEI28kVQxqUUE75MJEh0S3zmshm4IbijYuWZCJ7vLqY59tTlNdWjbGRGD6
ZQcmU2xiwXppf5RNRtCBFbGl5CZFjVq4FGYIfGBSIgmDGkntPQUZCTBirqbE
MGhVIhQUbAiW3B/O5CXPTEzomKlmPMKpSMLMAFqUtBsZRLJiyGmCZ8I5x2az
PttYN3jR7DbWxHomqIly6AGbogxoFmo1FQGjIMopOButRngLGgj9YK0tG5Is
Z8XDdfkTc776C129O7A69qbPJtDzD3+gFC+41r1VmT3dW033/vDLU/j/7uDp
B+dNu05rZtokr6sjEbNizikaI0XCFcBmbrsaIfBTm6Vrh+KoJIYRjVFOsnp1
9BeABgZSWCRMLOvMC7XKkZ8gmlutK5wMJfbAZCyrNHIplQCmJFYAs0cmLWIW
LtyRYjtBCzr2POk6j1+ZUnSZkU85h+ymZVmUlOE5vscHKG+Eyqew9Hmv4D0+
rXwmPjTsmgAH3BzoYRskdER5oiswqWLJ9cARrjhGZHuM+Z2mQt2wCBVpdKid
BKVqoYdwIhQRJtZCHX4lS6dUjx6eJbiNMD6hyCWUiFlrOyUO3vmtVs/mhr5d
PCRu+jCFa174M6a1u6VeoL9xISKP2DcgvCBKEH3bc7HXZhH45Wccm0KX9WX/
wdPYieeD1p7/LG3Jy1s9pOznafyp37P/PSVFyKe4sTO79oJQx6ctc5aXb9U3
Phd0/qkx5y/6MMC+f34W75mhokWGyUqGZOXpdS/fatBtEKSejc8+W7XZSn3T
50sAtgnBfyTAlA7/YwC2gTlfMuzf9fLmUulpdcPL/9ylui0Zan35qz9f8DIR
LqJBz+gkgyGHKtKAsbhBW+p89bz0c8r5N/BoEZr+FtoRJeo1wpRwyRyK7kjo
XJ/j2y7JPOXFdDyXst2VcuvEBrX5JHC+zGSMaVkkYlB4nbbgokAnQXqCyPou
kSW+c5GV9SqZd9AzLVVGYyeZ/JKMKcB9DhzRbncz2Iv4oRbpB6cgkkOxTPMe
Hr3I3wmDThDINEtjQP6BSwrYRpfgtcnYsWas0e9GXj/1d2H+s7kSxFBnlWnA
cDKk8ERelpM6ucZ6KgttmtubxC2O9/ZY4mJnjCJwaERM/vRzvJriF3gw1APR
XXpg332nn2QsphcoBBB/OrV348EDc+FHvHDfNAsvNm8PpWFsE4gnXtjEv6CJ
YbOJg+D2QXNE9zZGJF06PwkXYIdmNRrEfRpEv637zeb0QvgrlgsPIvna7/eb
RhVZ1xuoRXPTGwOLzx/LMY6k7kT3JGkYSwakOWbrw8hWeAu/kJAt+eSRG46M
rcCL4gHytlsf4oREaGb6RF8YBVurmQWZZVYaEsinbkS6SW1/RhTTILjQUY6s
Ed9k35BWl77/8k27dSJDkwFCHleiTShj7okeiY5XJn28K0ySuzSbTUHv5Lhq
ZPhyEhhw94FxpaFrc4Kfenxdp+NHK15dRIP9h7tklNJ1UjUtkj8FI8kLLItj
h0Rg0KMJjThdFvQpUwa0G7UE/TW1RPOkEh8yq1BTM0fgwxcJ5GgEFnz0ttMZ
tXSoCoe78WD3htWSR5+6b/iSrF5bPq4GwU7IRRBTC+XztVHIrumO+m9xomMc
LKUEQUZykdazYuL1nTagyJ3Qx24L7py8O96Nj/K8WOUSx3x1Jysnn/ksles6
tNb86QLa1ntur0fU0YYXNpvSTLK/ji/1gwkibVLhDmeFRELSwcwsbHWr2BPa
lxliJoOacek9SH926zwhJidZ1DGlOfaotB2u9d1fQBrucM/PbN7jqzswYs0b
GGREPs/SOaUC1lzHxHJwrh7ecS61RqSZER/0D/ANm1F+M3Vtox9OYMVNcQZd
1toSGBA82L8ds8FjffRKOU6DqGwiJzBTMSdLA3psC++ZMk3fchOf42Z330a2
qx7GKLjuHIKeHOMJd1pjBIJr6ZrBfBvpkUU7EQDSPK3mKVrLjB+AHRMeUrTt
aZGo6tV1c8MoaDSGyaZAaqomQN3N1Fpb3sSNTLu8hJ3re+wI+kgZgxRriWEj
TEsTn3i2l028Euoima9S9dGW1HlYQsBtDTLcNk5NGSgqn5ZJmYhnPGpPE44P
4c0eJJ9SfpFM1IqenPGMTnza5UDbg820wLwGyA6OZ7ydyOwbPIKXgyfiotx4
qNlO9/oWVvkcxQPdIiOCY7KR0LpPaErJ+1y+/jqgK5yNNB8X18WfbK60JXyB
CGKzD7p4du6A0vCFWuNLTitIZhmCQEyzNDmnVC7AVhgT6IhhRELTIDDJXXJf
qYAJgxNwXEmAvcgT+iTPYVGgqtBxSuJr7FOA2Tew1gfyF+iHwnDGNiTmAhW3
dG23H5MXQRcFPrZ/mtwNfKTUrLIHEK7mtcf4RrRFTpORNCy6so0k+m6Sba30
kdTBFqHCE1zMbWOtEAtSAjjZ/DkfB97eWIPsnK/Jr8pZ7ZgiUxCIr4KgxxOQ
kj6RFdPzRuJL3654CsBunaBkumXobKfXpJOUDZAzpPCiuuQlfJS9h6OVjy4+
ZeOk5rIBqdvCmJG9LJO1N60Z0kOIiyu5vjZ2icDPrL2XMi0V1WA8yVOGnkVo
F6Du15SbNnXxM4ab+Ka6NoNURXZVbEiTQHmFu8lrhW4Y8A3YFWuZ5yx/JoNy
FGb6cwWrMLCrkiJN4mslZgUxWViYudTh43XE/liw+2fZEhk+cdPK9Jz5RhcF
W5YZVL6ldwMx0UkxE/jNjWOarHiH3901z++LF4ciX9A+CJur+cQB6t0+MlyX
KW4ygMKgYcJyY/SeFJaX1UpBGl+W1ZG0Tw5F3n0mfIVZdBeIZiMixALNDUYy
TzaiMPLXmvzfWXRAQkhRRMCsxRZowr3K3B2XJmZgA0JX08FD0IcKYldbWqol
GiniHc6cvBXFuEYBmyS2HSTQlxdStTG3T5RqSJvFSKJJrN6LUmwPPHV3kUUJ
ZSOMoAfkLvj4n3Sdf6I18ZBexbh9IA45EMyzjynnnB2lEZ2xrvgB9pqHEnjr
TKlJJkVHuWoQoogqMEz0RdiYPoYrj30W8UGDV+7Cj/S3Hgozn5ULwpc5+1qw
a71as62UlxbT6LpqYEytPePcWax7gqrI0XYOHU/bAYEQfna03CmKEH0Zfh+4
qj15Dd/q6jtGBjqMNyUQ/wozNfQa16CjkZScQAb3x5eOBt+BV/ZME7celrxr
mDnqEXfDYfy3Joh+ck8EMt6hkQY6NAPsr4e1ebkZEMbtBDs/yeOfm1CYFUuq
uvu1IND3/wXn74a2dfJcnrF3Lkn4er8HF7SRPW70d8ID1fPLurruDe7wfxiP
unEDtN3G+6zMStCJBRo4h6MrbYU+E7MeDBNfq74E4kIH9/jFLXCuQUbZIxeG
Hpc/ux1spW16AwW7RbUFwMba1IR1t3GvSWia94Mt2Ly5FUXludss7A1Ss322
jUhfL2zeMNnD24iz24Bx08vu3c8GDeWYkmVHhKzLYg5t1eXqVrhIuquvQEgA
2+X1SHmNluxW2ImP/xsr/9Wx8tbAuj16t6KtFh37GtpJKP5PIp1bNtw/AGm2
bOyvg7pTnjK3fK3q9LkvJaeqfC2/0mCiKVLy7U1MNKpevX8iS9l0zE5nNYgl
lNbfllH29R6wHK4v9Rltll53CbDnQbF1L/Sz0qQiVI7sHmRDQ8vukogD15b0
L2VI+w3/hi3Y4GXk3MMhTFBEapGsirziSMpdeJS4luZ6888rV7kR852SNkQK
QSReZ0FpEMIERInx3w0cAVBFBwKe5vcRadLWgFGJUXKxanoENSJqNgKuyCpS
tVh3WcEtL7guWvQClN7DO6+rmsBpPwrfg43zSMtliv4cWG4FOTlxYG+oKlCf
XZNzhrTvvKR3WTh9s0xzqhuF07y6I54cv37ecBh2rpdO7A4jTlrUJNMMq6C4
iYzWtD4ShUdWPvJmHBUTo4PzWuktBitLtkS5RC0YL37j4R/YimCektLGWIqa
hiJjuImtRvBbfeBv2DwbdCj889uf3J033BZ9sny5quUe246ge2/dofRjAu0b
LTzwJlKXyEHJh+mRcgYtX2aoZNU5CxWabRUiaIOqOjRr0Z+hTxDpu6+uSPew
22djkeDEhk4Xo9ysNoQtuDYXTCpxWmyMdcVQnNbTniqBQ7lWoot1I5BSC9ry
GlYMxRV7VkOby5E/3z8/oygqP38p5msVSDtil7mAH51dKqBgNKqqohnsG3um
1nlQY5VUQIgNIdDoHqpdwfnQJs28S8b2xa4C0AQ21fWqWYXF0V9EKQu0E8cp
KjqXWmdK+Y64kroB4jfV1h77cRAOCB0onKE1bIVsE+NkjjmUOJI2tpEIzsmB
/UWEtrnYDQIHBylAT6EXv13gLYiEr7fh0i0RibSCBInMq5n7aBuFLdqGMowv
SJ0YYTRyREBGhWMq3uFdNUwFC0Rz0RWi58wahQTKxVXEaIoB2pbWlLtbwePG
lP6GMWBVQLfZ290T7mrpPRP5FvXHIXV6mjkDSCuhPJpMmORoIIDxQTGuCNed
2dupK3rNhJ/A30RpLA4AfT9PJXDGPibu4t8KYW0MV2zyzW6Z7aWYeN+mioTk
SdNstzGE9nYRfq/ZpYY/Lqjn221PiAuN3qdqBZhU6106Ni3gLsJIHx1NywRu
O6L01162dTR49xftxI6l9aCqrvdFaCyFc0XYcmAFK0+70MawOYbI1Cw6c54A
6tXJe4oQWj062SjqeiPb2SHByvmGxOyuB0gM4lfH4NYM7TCd4BJ6dUb6WuPJ
JzH9AWHpEHhhoFs/bT5IXqFPyDlUxyDklAqc0zCcUwGKhB3kNlk47KiJ35fw
oUhStvBjM87Iz6cPDqcbMwXFuo7YN1UmaFQBkmOsig/6w/6wS38OXKz6AZxt
WsPo4PGjBxS8FwotEsajZ4QOV+bDo3ZnD1tZKmse9p5hzjDOZXeW5MSEtUXI
9znT6u/IamCDZGFKsorCbgFvamL8xljWmf0cfPiVZRgS56/XlvTTpZoIHmC7
skpYwatKSYHxzHwtT+Hk9UDFHsUZlPOtYYMNbxN1MWnU00PLHiXmkNI4MPwc
6/hVxO+/1+Ix8YmmZCzjnffvT467vGj3BsMhxnESFw7sx0x2jauoZnZYV+rB
YV60lOrB8pFBhqP3716yfdSWuw8rUqs9GSCNrRizMrazYusTvO5LZWucty1p
YYUt4uaZZZikXHordS6XoW9h1wm+46L4mPEyBfzOyVt0w4RFqbq87dDEh6Bl
Pwzse7Lig8zSGjI4oguCF60XxSgz+WWxNVOSlYRcmpZPWZhUXjLlgk24DyR1
CIFGoprjsH5SWBOp4XJvUsUqV5JVBdvbXeo6x3ziptg4OonWPnPiUt5+EPJ2
OvPOveFtIb2bIa2caZf9TWnHbhTgaa0+4rhn8n5ta8A5wDpfBFcPzoVjAjb7
unbisrQ9XHYnPGzRiweW1PCRBEjheV18cqM9Y1ffdCfryy5lD8cssG076clL
0EYQ6TaGIRTXdR8752yBpuRH8VltFCbkihMKAtz3jf1qpw4ErpXVYiUpdyos
xqoVVtpc1l2krDDuCeG7k0Ny0otxJSlUSaZCgWgUpm2tGe31CbGv/WK8jXT6
gB+jbDrVgsnhhBwUdUIcldxWFRYhHHhwh/QFIDZlnzCXyTR+U0vZoGu7bls0
OtKhR+//oUSR3SXXHLErknGQe4GOO45qV/VK1Lm3vx9/l0xUwdMJcnjzHL6l
C0RzfbJX4t8i8UqmixpCQG9y2LATMSSExnIYkfdluM810W1FPthmuLm7Nt16
S8ORZsDVDnyCgfS33iiZqFrLxekQ++UqkDZmTzefMTPSe5nm03p2GA8OBsF1
9ME9jDdkGxoYCTfMCxptN8hrSefQqrTJzDpBNX3cef7zyes/H708Of75xcnz
l8c/w/f3zwPrAzxEpBR13kZl0XyGTnB8JjSy7N1p6sI/+6CXEErX8+4I/ucE
fhPu4gV1GSOrk3ksXGpWY3qYrfcbUR6K+JiQFKh8R5oyvDsnYqKcQCeGSdSB
h9lSkhBO3I5kdfbx7F73wRcXwAJgLXDltT88//nVyenpyevveWU+uAMoGB8S
bZLMOZqu63l1OwZT0THYj8h+uiKBa6eyImnGzrZlQuxsKQm0S2UuNuoiSLdO
CxFA4PrptyDmB9Lv6VwVgC0LJl6t5EVFUkaxdSJOLxZ5NG5pSudqGghA9LWq
GauSYXXhF2llWlQyRmvGIhirZdxaBg1TLfiKTC2Ulo4m2RWDhiHZAh8SIRrk
NdQMXpK3obyFQsNm8zx70ttyfKajvKj0f7Eq8XxaFGXa4gu6od5vKVdLqvsx
5RMHNt3l8WGfQj2gWhT6LTojT1c7tNr3ho/jnbOiQGPPWgl3tXvI6kdyo3QR
TIZZR/2Et1BgJrV0guKWmUc9AxBiho9+U9HpJsB9YCqIXl2ug+M3k/Lmcedd
2juDm5TMpkMl0wE18Ly+EZLKbukBjCZEp/BUjSmRCFsodhWqwSVZNtACPmob
qfdtCBaXu44MmFwGRk6kwxnxMB0jCg41VZIoqqrncM3XAZ7A0U6pxCJBKX4S
5f2JBP2S0286aYiHYmZifaVzg7zjCj64SyhlkhE+G4NQL0HBRktstQ8AaJ8v
jdqJkhV8R6d4yUsT2CkIFwGRS/SZgsOZrg46oiOpKkxnF3VmKSA4YmUndmmm
lHgbIczYUbQarKcH1JOD38lxuxcHJShKclfS3uWbAVkiG9daQhqO72IZ8jZk
MCPHAMfmMM8DbQPb0vAkoFtH5A7QwtM4fW33Wn6H2gDoFmX23/TEoSzdX4a/
Lf/6w/39V2fL4q8//FaNhi+qyfeP/vM2/FTDkNfKmt0bhLxWcLYctkK2hQEq
rtdZqunTOAMgqrKBw+UgQF7oRJO9e4UO6gZQSwXHYHcDSU2GqUhP35CDLZaw
1ZZbmNchMK9vbg3L7VAc3r/fAGOgd73WEQWf3Bs+HDwaPsL/vZfIhkohdABp
VRg0/T6cPgBuYHZCe09EfbrzoLv5lkrsnThsFB9AfTe8uN/dvP4LNWjTJ3+O
mt/amGheqBvwSE7rmxEJiZ8+xWTsOKMqwUcBDYui71LJrKb++qlv2+kbAX3L
ddhOSAthd5syGuE9MaoFZeOR00kaxey9NHfQv4+stZHlzmZBKQsrQbqAPRwo
ZVgIEV84w1UVFYus1npP/hQwbun/Jny3IXxN+XcQv3999P7sT2/enfz1+THd
/eGHH3oG0WCMjDVuI8CJN1886TRBauTRX4sl3Ic2zLVkPgU41TN489XxfXMj
R+38k87g4cHofjJK7g3hv/3HaTpMxgfJvfPJw8cPzx9PHpo3imUCSA09DA8e
np8/TkaPHtw/ePg4efB48vjx44PBg2F6fv9+eq8T/QthRgOIymw8ccxG9wsA
DHT5SSd0/2OoI9DbYA4g/z0Qz8dP9vljyPBY2vnr2fTg1dnJwevjF4tXx/+1
//q/Twbw9+DVD88P/nr24pe/Ll7df3X2Ons1PHkSzJJpwJPOo/TxwcMkffD4
wXhwfzBM750/frx/ngwHYxjHwb2vW/p//lb7Rx3Xj2REffgE/oxANSdC4K85
iCyjzYxv6+nSfhA5seTqjjqufnaRi3wETClTp1HcUR0vDYfaEgoVmDEitSA0
+zS5ARAuPp74gw7mgy2Ch0GQ6v0hPoUYE6WHDDksuWSu6qjoehOBK/oQejbS
8gTdqBCBFhxl2I0w7ILKikgj37ZNPN5pnL4A1vaDb3fj5LM+wV9M5zachbs3
UbcbcHiLG3ErRj980NhiyWQSsou0uoPhAV7d2IEty9O5zutXUeW2rr+vWBYO
0lDyvlFU6bBLTR7I4S7HC1o2SGfAax8uuGJ6kOLjBlY/5412GH9M0yWO/iJt
WZKNJWUg05VrDzYFNj2OicV1Kfj730E+aGmoKQLoIzfKCv7BbRJD8ESL3NDS
wqb0YB/alCFa7lpJwt7+3LgS/ra/GGmjH0SvVTYKF4qhxli6AwcBoooy2w/s
Xo2qikqKP94aVVssXpKw4ZZI3IJwG1ksvgTl/j6YYvHg4ZcuibibUylSyrRz
jiJRz6YJhPOR0hlLQrCE7WSNTOm29m0dCklhgcrImRWb5VvJih08axPimEaj
nbaVLJ1hcZfDviWXaEvOLlHTqamMk/7wPMSpPveJmZzriK9xGiYpSvIglZhT
iFmFvwqFpFU1wS0u3NxUkwwyknk743WzwQmYsYY+Ym0OYk4Fc1PSVybecCof
2mxZ6Hr1lBu5pmBEI0+aL9fpMw6GEfA+4z0L+vWmtC0Z+Q2gdvY5q94Ai0hj
qg/jVA9U5qb4Vi7iyJEUhr3pNOk9wmR/D7phTSpVbKDVZL5DteP07rVdXseO
dPrxKWmcs1VPYPr5c6R5GMJCqH1N3snm46YN3RWk3fngV/OD2CalOLBVXXBG
nEmUNGMKGKhINNQ0HWRGsQEuBHTKCm58t7FeBKb8c4WCOAsaWXHOw/pAVReb
sznGXd1Mnyqb88ykLuuIc6ny+QnXac2eXOTO5NpGSm99lp0tBK0HQYIg7Ixi
YJbLNCkBS7faOyRRvVJFWipNWUE+D2YyON8PLsEcYm2QYw7L3IirQGhIId9A
eH1eTLOxkpVDtRe2LO+hmsx087Dw4XIScRHhOS78eTjCoDE8owm58TA9jJer
2piI2OFolIw/wrBwv65SSUwi7oVJqBkryT8FTblq3DI1YylwCNtz+X0cElPa
8nK1pGrenMmQ3EI1dIg2j5+Rm7pev9lUdXuj31eb+7D68DQpKRwoPCvYisfj
x6z0O68BvV+AoDfZPVQXKu8eLO86FwHJ7B9CjT10PEsTPi32dUltI7vXVbjH
UQz2453vizzlAfgTeSYufr/G6pPGpa8olZmcVsq0alP34533uU9h5rP9+dl5
GGINFEY4NzKcSdODTJPbbJ7E5gwdI9XKTSvBFIf32fD6PCnnaz8UnJvYUy2C
4A7p6Q4B/JgUl9LM7e23SwkG23GN7eKommbc32XEVRcGs0mvteIiD6TC4dUd
c+QABfeVlJWx1qN5Kj4FTU/nkHmJiF3Z50K+Awm4kfOj2DipQlMR9BDaiYhJ
2XYe/35FaHA6xz8GppT4Wt2otZtQWrVrxHCchE2u2zh/N0CAlunfbS6zU2tV
WNzfF4UFZhBmFxeTXowCcDe0gvTo5+bkcby3sxqR/wmCQz31OA/5a6BVrzG1
K0ZlwD1xHRT70A+zbG4c6CU3MdoZpd6SwVUj9wWBW1EYuGWCAFXu6zp3WS40
Do/JqeZy4kbILQjbQsmOR6Zeu9rpXQ5aCtL3YmqZukBc8rfOfGYsN3qX9s25
ssVYeMTk3cWaSRpetpnQy4bk5uwt4g8DTAuMd4CQUrURZp8SHEWjqA37jTfq
hBAL0qgsj47aWBnTkC7KSMW14dJJiyxQFZhMzGcbZLaFqETDBQTJ3c1w8M7+
mBfRFY0Ky7ebWLg7gfj35cG/fgxlgKaSPJJjgT3QtwUD68S+Ph6YohaaBLUp
/QnRbc17rPIeawPUK/ADSnwfWhzXPjSFwA8iffrgZvVjJZHXJ5zXnQZQFznQ
hV+zXTX6YJShH7ZKz9bfZFVxKI04roQ6JDcZ57X5gVzFgmmhz+IoVSdAjxkq
VAVU+uboQptNUpRa1wccYtJrY3o2tQV2t8QiRtfnimCkUEVyqD1qrKdMOnIR
KTIknxsUNxN6qVMlPHy1RXe10ZwkHPRe3R/qZPrBewjKc41AmLbEnen4I3Og
60i3si/TEJdUxvdvjuXsarThTyEKYoAwOWKqssE1pn66LFUYaMMr3OLGmEyk
Cu4cDtDlIpLyEoFvX1dfhsRuoZKKlLAiT82uz/JsgSl8Cy7QCocD+Vpx6syt
QVQ8bM9iit8NZikcS8wCTAcF9whjC+CFeszoISUeTTwF579MJYpOl5RFKad/
i2w4iCOBWxca95bzJM78XiGJbomqDKfYU9jBW/v/ijJbeO58qdR2vSjGIk6r
NGZslsAApWSObFgj+WS+3H4iuVyTR8bHMFE9SJizI8ypoT4sRJScNqorCqGw
uEdYpyT2dUqwit3lhn9jo/cZ77l4/9Gjwf6j/Yh7CCoVbmT1hx6pWigr4/JJ
Ex0UKFEbUJR8395GedjmnROKIw1B5A0VXr6lHLJhRrjRJePv4A/wYPjF/gDe
KS6Z4iOyYsYXEdipMawcp/0s4kbFGgzPhf8P4mVB4YEJe9RXh746yj0tkkJ/
HlBV3cYlobHBxRDBDalgqltxHRbk90RQJUonO65JMDkYSxmIEaIKPc5I1+g4
8kyr84YktK3ilohwodKHN5pGt6xuE1NaV3bw+GCrH+Q/2Ylxqw8j7ubf7cWI
Bq03zmkVF/Ct158+C5y1KY9E1Qs9uNXIhRSpKhYUibcocu8IS8d00ExStXp1
dCPWU0HHpKq12GjUgHpoY9YZdTx8zClxXVO738L7QjKNOvjaFoabLRhPDc38
RvmZ5YRoNHBwbQO0wTHnDUalUJIseNu/fM++vMsigmx9Sh1NoPXOxQ2IuhKz
QD843odl5EvU8VfjVVVFI/QWlToe4ctIt19iRdHvknmSjxFQV3ewxGhvpBc+
2/HUlwUXf6Z5US1S9yAeZZr9WbkmepY02oU8mEas6E98mRCOQAgj8CVG2WfO
4VLaYVPEZmlT7aXSXoZDDLuUiIlkPOOsO6qLZ4po6Eg8T9bINpaR3Mvy8zJh
DQdqNuh2I114swYMJ+aJNmVCnJDJ4L8aTYoFx03j9Upz09ucBHrariOX+wuZ
d0o5YV2LwrLG8zXK/GbRKHLJduLWpt8wX9tSyxgUYvLPobW72laVSl2paHie
WXLnGabSnsGxOZ0ZEAhvqu4uFR5WbNJTtgbIBYpEdVlMVlRJ1pck5mDg3zi5
j1MtN0JERilbiJJJJJCYNFfPcT2sgRJ7WSrxYJcl2oHQnpMSR8VWrXwSTTlt
vSvSLRQIRdbzxtmGewlxOuOtSGIRKrDZVkVHadA+F66AA6JOKaqAC00EYjzZ
KjihHFJ54vbqoiRlD68+Htb5dK6H77eur9YgGsLr3r3GRjddB1p5KsrjcGkS
5pQ4e/Y2vt+rV2yLlfzwdtnCY6JMNWJvwhVIyEVF4GpXTgz1QvrCUwRLPeCM
EWSULCUpYavXKW3aw/gNiJVVMV8pM4tVF2l1nBXEvciiLPYFvAQcBvkh34Qm
R4Vo88LkJTmHbGsCPi+vNBcVlYG8sLRQpF80UMRGkMlCYDqVX5D+UfVvJtOI
HwqTOGzEYyKiQTnK6hJdd/wcGwPr+rp0+LqW5WbTts3S74dHMIcTBpjYlTh/
NKgNJ/yYrw+xEgkqdf0Wle699amJ7y3NUe7+UeqaJelQ+yfEma6ArQd2z0SB
cpXo8zZoJfPLZE0yZlKWJD7W/jEtm7dB5vloLkpOqiJ6T8rMYALCbOVvByHe
Xw83aLJkQjDU3w082FSNXEKIpUVu1EVcdLv92H9GYXq+WJqr0UG1DSerOTMD
NpovivSpOswWWJmcKY1AQVf7IyMFvtSHCJ14PU1cJlnJbsPSsDoSqZMnVsLY
ebaL23XixoLRKkHoe7zzercfZCgRVTp5ysF57+IonTEpSA+C1VFInpesKU7l
l7JPhjQaUaNcdAbLufo6J4cbxUFbP3d7vd7dm/7Cy5uzi7Gw5T5WRn766dFj
/vtYfj8eyN8hVRL+XT3f8MHimj/Kd/f3dq/d/r0vgJIzuiGOSFcCFZDB5O9Q
/h7I33v/ICh9+rn98ymsPUob5oa6o2p4Nrv0FVbWo+hD1SBRQ1rs1kFC9LcV
lXVFjgDrutrqkc/0BnwZ7kZcWs9sLVaaeexThTCgnW3m9aPHuxryJRtVn0Qt
wA60frC5b7c1Dri88/rx/q6orIqYipVtGLzoAMAIZPFwAEkL+RdnJzSmTSwK
BRw9uziogEDj5ZfIgwlYUGAvcC+fq0+Sja5eZVjOh5mVitxxKGqB86tdsnNQ
m21ytELe1pj2xAVHVnVwyHBrWNQAot0YgID/DLq0TvTvkMk7nxE0eKF10oCI
MVN0usuL5mibBr5KPIlIreiGCt0SyKDncKzD9rH6wdG/B10cfTAs7OamkTVH
gS1xvWvkq83jdPqYxFg2GANRQpidwJjqThmScqYrwJk5VeIO8t9tVwuQRcSd
G0vMPlZXkdR7q1auDJD2J9IlTyWdmLKgBqWq5DyVjF+IPZE6zmgFcI3Vjw3G
ovp4Uy5j5GyAtIqAhx5/nK/VduByL5FygRXKnvMkPozG27epiigVRNTI31aq
QbidvaCU3DiT01lSqlr/zyR2X92p6FrPsS9AxV4gS6nz+QY4xSJjjwp2cSe/
U9SmsByDRGYZVJXjnciZrdc2d63LxKY+wpIPHMZrlaw+t1+z6uNSktnR8c8y
6zklUiFdl2eBuHJwZIt50WNcv0tyk4k0eV5yQV5oC513JX3jAo13mp0tjk9R
7+NVvzIQGi1mX8Z3ULHDok4jC6OaKBBUQYICPhuCoWsOXComLwnR29r0ycS3
LoBjsKQPlg9NSmlEZ61xLRjkvEBsjsRKE0iSPJAsuD8mKEYXhew6KyUwATw3
A9ic+ETD9D6jILbA6T57GyKvnxvjCKGeK8bt3GnJFps4f1s65r0fdMOmThMm
hOXCktw2g8kJUDJaFIO4Oe1/hEYYeCddLOs1NYUUk7d7tiC7XI2kI6uqFdmi
0IZjLW7fmqkGGoI8ZbV7o9ilDKWPXP4FINaSJCxMNcmWWK+gad8hcrCTmi2P
xiUI2mWWuCSJCiZB/TEm8nAJ4EwyTV/wULyF+cDXQpLIa4+TuZQQADoPPPhi
gZ06zc9avPVaqNIbnAJTJakzb6tUSypdDK+vKCSQLKAuQB623BIJYquma4fg
mOH4sruDXXSo2BD81LcCSRidb67afUuLVAaWa4+459DlWyWSSyy1npNGPoVb
yOM4Vi8j4GR3P8Y7H+On0QCFoVNcB9eQDCBBzXbO6frYRB/ETPj8ixFVrjRq
OyCG5GLLcijGwlC2IbEjGMV7cR61zm4OZ4+edMBrITTW+XhWFrlETmvqgSg4
5w0V9r7R3oeL6suS7imfXGaTWgZP6hvN/+LLXSoeY8KbTVldtQvJJZAPqoQJ
1AO9M9+oj4wHJyfx5EAr3k0mQaEFZpcTBvE+h4OiqlkPwipJevPXVeLr23uP
BYdpxHFQG1If16ORrKtYZIkQuwSORex98ehtRRc0OQzbpyU6OKupU4pVbGhW
oZmD7dCBQa3GRnM8NguoU5sUqjejorNzrKPJjhsbjwovb1XnmNhe1pFNx1ZF
saX4bV0gUtrFKspsitYaakJ7Ux/wtvSTOs2u8+trbULYQdkqteRD8olKyacw
aFDcHYJXMqPC9SpyqoRyqlmPQ7rHblk2JbIlijuubMH9RipGl4sVNU6R1okk
p9e1hz6lt/X1pBvKMT3WfQ6mTM4ydGuZ3jAgU+tShhQBtzAPxvCtZx3Gm+Se
PI/K7CIZrx01wfwLYTf3NmbOZrdmX+K8Z/eCMwbqRb9RKUwjsMDw9Wi5qmZ6
fdfH5ZB62AKTv7H1K6nrZPwR0Lc8T8ZpBGcTnK+jRuEJANgGyJwvuWrYqtWo
V2mObzEQEp9kplVm1cdKLW8ZsQopZrPmcxV5icP4OM2BCveK896pTPGIxgj4
dqR9GVMbK/ArYlLG86Sq+KjfbIVnijnz8gg3dIbpZctukAUtVsYA+VDMc6eV
ihYJOqAUq8rKWZhmbzqrI5dtkcIH4HC6aE8Z1yWDw2+zZFUFrhGWj92Dsxll
rnkBq5Lj6TSPGbEcOyVZyp2Lsyv2DHT4osgmQot4uq2pdcUBruBDrXEacHRY
xNBl+x65TiKAnVQuVJO02BIeIQFEqM/tx8bGBzsc1rgRcuaNr3ZgtDuuHV2k
jKBz/uKka2ZwQQyHG10bHOYFS+wUTyxT1cSIbCtEGwGseQdDTDDCZMEiIHfd
cS5ycNwDYU1YXM6DQiNLVBOxy/GSQu9mIiOj+xmRdGDjQTjHtPNSOaRZHdrJ
dvzUPHVmKc12jnb8SxICQd4GOS/lcBkMU8vyi2J+EWYaSC8y3tggbaBqAZDk
5C3GGwgn041K9Fol8JNVzmdKrpnZMowUzQH6Y3WCw4Uc2WmOS4rcZU3GrjSe
S5HTfvXSqBNTYWEdkWN+nhh1cnLTBPzdcD8iLwxLAxQh86RQfAWSaZkST2b8
gYwwIHWTKcUetXYoXHv8BhmGgnlKAPxJjh3wUJhsm8GRcFdgAMIKiYU9ohm5
qaZWIS3a0mwiniMXF1vy1FDtiBWBeVHDDNvSM+K8KnY8IOnZNN+M20JUPkeb
pBTCjBcpFs7LqkVLIEckTJZhOkvWffnKOGzECnD37NnbrqkyF//X+5NnkUsl
TzkkBLmU4QiHRDZBmq2zGhLJjWfpfEkFjlCvYkZKw2GOV4GM5Og9lY4v/EJu
BDc4qhOx+KrOGC5BvhckaQlmMIwAEhhvCyvclTL12/rCrewDLkyGBCw7MK4j
IKykybRdU00/YhlwH6kyk8V4JFHzgAeNPA+qwfRcLR46GwPlAb4DcQzVylnt
PXjDYgCRnCS1w+vS1SMfq2qAmMOTo9dHG4whXcycaM4W0zKdZiSOhZY5G/Hr
sImfLU2WfbSYXl1hwz0KXySfvM+fQXD6Xy3BYS73yCHnlTNcTeDe/+32143b
5jWN/EptPJXyUszDA48UP59ghpfD+O2cBDcJ5iIda++4GK8WbjPrG3LGcUkS
4GNg06YTxwlP5B3RQGyfsAnuBPKE7tWYEwzLL5h3ouh0NaqDm2GaqOid+kj4
XMT42Ou9oyhycljLvecS3NxgmvH+lltckWXC7r9znjBuRa889wq3jdquHRvx
LkH7qFcf3n9MQXun7dIJDuc05U2+RbpxyaeQhbOrhqc+mtDIOC+7Y7P1M7to
bi5Bank+KvCHcUh13LH3z+cVi1mlXJxD/29XdMBhCTTx0eOMcNBvgN1tYz/y
EJTjmPWhmY1uwZbC5IxadFRPWjG4AIEg3avwy7iUKaDxZCLJwmGrcIHKAGWR
crwAWZ9gk/l6MptgJJw68gKEoVJUUeQPo/IpaSOPU+S0uODlPMPIOixVLqiD
Ljg0K3hQ2oRvrxJkkHjb7VS7jbsvUGh2IpO/Hy6sI58mnIFI3TlvZSfdNpZ3
VYlx1x3LTiGCXqGm576MdYwsFVB/ukv9YJBFY9xvYa1EUZYugHBqHRopQAIS
AWd9Pud83E1w4pbgHIPVN1jkDF9N3U4QxKewkxU7Tx/GaLl58xrpBXqUiPSH
SaH1AV5BavRWXTyj4r3KAQD7iG/RhsvTGmjINMtT1rSeJdVHZDeArO7gZOvi
EHbY9I9ZWp/3i3KK2qe3yGtUInzymUKz/T9paAUR05uo/++lqNb//1+Urv6b
sN6esP76/wO6qmT1tlT130T130TVENVer0delygfHMV/AlGp95JkcMCnebGm
RSYvI7TYp+PeJF1SYQ1MbvYMBfslV5m2JYfWFWa0EC8EseaVaSqCg/XsI7P1
zrvBLr8JMkXO6k4XoexVcn1+drhrowM1gdFGIk8su0MiKVvkGSPRbRwzpqi7
LmBOs542ybHS1cEu6U0BaWCK7U92NQtULPH7VIOKyIQ8H9kqgTIY9QfoxsZR
YJdLdLQFMNzCjRC90L7os81l7dM2T7Ztn0+Rdn43vP5ucBi/kBXdo7yz8bsh
pkKWNdt7BWsE1w4OOZkeNPRJx9DJpmnd4SqDn8wEbRfNK+63bcit1kCnZv+N
W6+436ahAHb06+nXNRQs8Q0j0v6etjZUS/LBZhNfPCIHo9/Z0B82YNTyubYh
VueFKLhtRLda/k082mxo66cVRsPfN6J/Ch5d39AmHm3uNX3xWoTcxKPNz/8I
HrXToy0jum7VrpnCF3y2NfQVNDtwGhalOZ/HNzgPn7LnJqcubRztHXLqJ9Xz
W/S4A67GBRG42ICXhUpPvVgeHsQ7p2SF3j10Lop80vsSQXTkmwiKbhh7FO+w
iQwO0IssobNSCke6A3vX9DiMd16ge8/I9NnSn8b01WK7xBj7Lf0lI4r+2dLf
QbwDx1V8lw4o6PEd68bfHbBfSIlMJupgp6QJRh6IwtjeDUT3zZkXoRv1O/Qx
JJI33YtHnPKt8sDFnnQcrKzXW5v1HdlJaO29jTmKJd4MDQxsqMxY2bYPOKQr
iBzkWkR1s7w1BcGZoEWxKry2RrVo4nHtnFaOhcXMIYXkR2LLT1dcVCtnLK0i
WUyMgwHMWbHMN1oHPh/otEQuR8Y5CbNxFCtRaHvPzuVsXVGHLvZq3RaCg0kf
RZZuhMJ+lpRFYjcn8ThvhsGGYhxAmLNf6WqzN4y37XvXCjK1cc0vxXnS3T9j
KZkjXou48x16+mJPb+VNMXagBacTf4fG1WdiVXpbop0Y2U9m4UfjZQ9zdmOR
As7dbwVoEJlQxq7E6YESErx78ezxcP8+VmSpnOwEG3VUlEnDBZUQxwl1nTLl
bD3EgNPfQgwuiWbugDnB6CqpyKiFRB1A0rlYAl2hZapJU3XV4ksJTMhRLo45
SwiCRXLLctnJjribgFxClrwxia0w185GN5wRUMpQ27DqD3/TXfPThyAsGAQo
FLVRBPrwt6yu4DZVV40N49+xkeIHLlidgbrLjrbeqTUvaG6IpbACmu4Ik4a5
4K4qbHDY1uDrgvPkrBY2rxcZy7NGzXhaNZag2N/I5q0xPd3bOnRZeEZZWxk2
mfj6ix1KZ849rympHFsfdfHdapDeJxmL07VVm6iFzNFNziQURKGKf4AkZ3Ka
B9ofTkYTBFE3mC73j4dAMkKP2txnmWAdQec2gOAce9AZ1eJOoS8yvSpot8O1
dQVZKDbAlMBTgaYpYEcp3KdZ7iHHkiKnCI85vZrFWjkOR85HQlKtAcKQaV/h
6/aDq+RtrY8qSSe1MYTHnuYzVA1RdrG5El4HG4trV8G5n14kua9kic7vxwV5
K1Gt9zSvVqVmGkZYmJOFc+mcC2eA39X/At/cCV1Wk5yqbjl/ITkHMDSDAZ1e
SDwweVNQICj6AyQGpw0gUVmbZHM5VTt4KiB9WzsIuqrKvFiU+CVY+htxyRE1
dnTBTOBh7glsYzsCMQGpKDcZ53aKO+KNQpo7PMtlRgg9Q1Y3x/pgey+O5lNy
AMpfpMEKLjyauTu4NsuWthp9laIe3Ya42jB1X2fSOx98Cx165BiVafKxYp8f
cXSxA1Cyx+l4XbCzIzeyzLSN2O0DbgEsFuQKnTU03V3nSNmN7WWNtnf406QY
zWVmwinBAR4wNCHx8HbwyNQhJwhx4gQbinMSJhtWo6RReQZZqz0Q1k+6njKZ
oCFn60Yi5hGafZavw1ziVN6uqhnX3hUMdph7yjQHH6AKCdWsUSEhUK+L0xEZ
8smjvr12kPrkmJI86rAWsDXk024Z7qwRR61OOJi7CPgx5pmwh5GyWuI4rGwx
z0wc53GCfcqOjFp854RPyAhHqut1liAjcoEEd5poqk/vU0boS36SFAkdgFJT
LozWUZ18JHo9QZKZ2KR0nHYTIXyeJsRz6knGogt9PSBVNltYJik6cpEfSthd
3PT2BwmjRHcbQHnHikq8E55y+Xi9i52hY1s8WQNPBIxTml9kZZEzB0f+r5im
DBO5Sn65yySre+cow8k5HWFEHuJbP35vAWynRvSYo81ph7p0gKQ71zQIzq1K
93k/5pS4VCl7UlDS7MnK+YLM0bu2OA96Ul4cKYSvoeIIhw832YAey4YVBQqp
vxyrq5kR8yy/wFVdRmI0YshOpG3ji/5UqNBPL8i5tYligU0G1yhow2RS8R5M
BCQEdo7U0Mc6SXwhM3NddD/iUAlH4sVkR1krPbWgjeNh7jcQ742NtLuht5yk
zmcXOSZhEZMwTqvC8wBI/bbW4GbniCbVz507Ia5rJslXTPR+ZPtTKmFsfOy8
b8P9216gIRBC2Cfd1WajWqSZqYVZF7skIA1GDFjNGeNXKC5JleDWic4vQpSj
8ce8uJynkymLLleHbMxLJ08657BHXNbshA1Om6jC1cLn2UfZBEn+MX6VlB9R
iEeOYyZOf6dL1IyU0XFy+TETv3o2tXDOJ8wWKjFcUnEbqNgWWuh670ZHkzKD
lX2RwKxB9v8v2Mo/rJiA/wfmy4rfFVX8fVYmc6e3yErrtHmephO0XnXjd5jj
6gdM7NIFtjFPYFrPk6qeAy/SxSnVmJhqViwoU+B3GO9UTuKjSTFKujq7WGbX
jV9m+SSJjlf5KCl5/iC3TOP/gMFOnQJFbU/MtojXuPR0vProgg/jI6AakVo9
5FGe5KsCAAzI+l2xGicTTHtBORRn6RIO8om6jXt/sv8P9wfiFokeAQA=

-->

</rfc>
