<?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.17 (Ruby 2.7.0) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-netconf-transaction-id-07" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.2 -->
  <front>
    <title abbrev="NCTID">Transaction ID Mechanism for NETCONF</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-transaction-id-07"/>
    <author initials="J." surname="Lindblad" fullname="Jan Lindblad">
      <organization>Cisco Systems</organization>
      <address>
        <email>jlindbla@cisco.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="19"/>
    <area>General</area>
    <workgroup>NETCONF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>NETCONF clients and servers often need to have a synchronized view of
the server's configuration data stores.  The volume of configuration
data in a server may be very large, while data store changes typically
are small when observed at typical client resynchronization intervals.</t>
      <t>Rereading the entire data store and analyzing the response for changes
is inefficient for synchronization.  This document
specifies a NETCONF extension that allows clients and servers to
keep synchronized with a much smaller data exchange and without any
need for servers to store information about the clients.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Network Configuration Working Group mailing list (netconf@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/netconf/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/netconf-wg/transaction-id"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>When a NETCONF client <xref target="RFC6241"/> wishes to initiate a new configuration transaction
with a NETCONF server, a frequently occurring use case is for the
client to find out if the configuration has changed since the client
last communicated with that server.  Such changes could occur, for
example, if another NETCONF client has made changes, or another system
or operator made changes through other means than NETCONF (e.g., local configuration).</t>
      <t>One way of detecting a change for a client would be to
retrieve the entire configuration from the server, then compare
the result with a previously stored copy at the client side.  This
approach is not popular with most NETCONF users, however, since it
would often be very expensive in terms of communications and
computation cost.</t>
      <t>Furthermore, even if the configuration is reported to be unchanged,
that will not guarantee that the configuration remains unchanged
when a client sends a subsequent change request, a few moments later.</t>
      <t>In order to simplify the task of tracking changes, a NETCONF server
may implement a meta level transaction tag or timestamp for an entire
configuration datastore or YANG subtree, and offer clients a way to
read and compare this tag or timestamp.  If the tag or timestamp is
unchanged, clients can avoid performing expensive operations.  Such
tags and timestamps are referred to as a 'transaction id' (txid) in this
document.</t>
      <t>Note that several server implementors have built proprietary and mutually
incompatible mechanisms for obtaining a transaction id from a NETCONF
server. This document solves the interoperability issue.</t>
      <t>RESTCONF, <xref target="RFC8040"/>,
defines a mechanism for detecting changes in configuration subtrees
based on Entity-Tags (ETags) and Last-Modified headers. An example is depicted in Appendix B.2.2 of <xref target="RFC8040"/></t>
      <t>In conjunction with this, RESTCONF
provides a way to make configuration changes conditional on the server
configuration being untouched by others.  This mechanism leverages
conditional requests per <xref section="13" sectionFormat="of" target="RFC9110"/>.</t>
      <t>This document defines similar mechanism for NETCONF,
<xref target="RFC6241"/>, for config true data.  It also ties this in
with YANG-Push, <xref target="RFC8641"/>, and "Comparison of Network
Management Datastore Architecture (NMDA) Datastores",
<xref target="RFC9144"/>.  'Config false' data (operational data, state, and statistics)
is left out of scope from this document.</t>
      <t>This document does not change the RESTCONF protocol in any way, and
is carefully written to allow implementations to share much of the
code between NETCONF and RESTCONF.  Note that the NETCONF txid
mechanism described in this document uses XML attributes, but the
RESTCONF mechanism relies on HTTP Headers instead, and use none of
the XML attributes described in this document, nor JSON Metadata
(see <xref target="RFC7952"/>).</t>
      <section anchor="how-to-read-this-document">
        <name>How to Read this Document</name>
        <t>At the heart of this document, in chapter <xref target="txid-mechanisms">Txid Mechanisms</xref>, there are two transaction-id handling mechanisms defined, the "Etag" and "Last-Modified" Transaction-id mechanisms.</t>
        <t>The common and general principles for all transaction-id mechanisms are defined in the chapter before that, <xref target="netconf-txid-extension">NETCONF Txid Extension</xref>.  Since the two Transaction-id mechanisms defined in this document have a lot in common, and the future might bring additional such mechanisms, this arrangement keeps the repetition to a minimum.  By necessity, this chapter is a bit abstract.  The details of how the principles are expressed in a specific Transaction-id mechanism follows in the <xref target="txid-mechanisms">Txid Mechanisms</xref> chapter.</t>
        <t>Next after the central chapter with the definitions of the Transaction-id handling mechanisms, there is an extensive chapter with usage examples.  This chapter is called <xref target="txid-mechanism-examples">Txid Mechanism Examples</xref>.</t>
        <t>Towards the end, there is also a chapter with <xref target="yang-modules">YANG Modules</xref>.  These are necessary for a correct implementation, but reading them will not provide much for the understanding of this document.  The mechanisms defined in this document are largely on the NETCONF protocol level, and most aspects cannot be described by YANG modules.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>This document uses the terminology defined in
<xref target="RFC6241"/>,
<xref target="RFC7950"/>,
<xref target="RFC7952"/>,
<xref target="RFC8040"/>,
<xref target="RFC8641"/>, and
<xref target="RFC9144"/>.</t>
      <t>In addition, this document defines the following terms:</t>
      <dl>
        <dt>C-txid:</dt>
        <dd>
          <t>Client side transaction-id, i.e., a txid value maintained or provided
by a NETCONF client.</t>
        </dd>
        <dt>Etag:</dt>
        <dd>
          <t>One protocol mechanism that conforms to the definitions in the
<xref target="netconf-txid-extension">NETCONF Txid Extension</xref> section in this
document.  Also the name of the XML attribute that this mechanism
uses in the NETCONF stream, and the message header used in RESTCONF.</t>
        </dd>
        <dt>Last-Modified:</dt>
        <dd>
          <t>Another protocol mechanism that conforms to the definitions in the
<xref target="netconf-txid-extension">NETCONF Txid Extension</xref> section in this
document.  Also the name of the XML attribute that this mechanism
uses in the NETCONF stream, and the message header used in RESTCONF.</t>
        </dd>
        <dt>S-txid:</dt>
        <dd>
          <t>Server side transaction-id, i.e., a txid value maintained or sent by
a NETCONF server.</t>
        </dd>
        <dt>Transaction-id Mechanism:</dt>
        <dd>
          <t>A protocol implementation that fulfills the principles described in
the first part, <xref target="netconf-txid-extension">NETCONF Txid Extension</xref>, of
this document.  See also Etag and Last-Modified.</t>
        </dd>
        <dt>Txid:</dt>
        <dd>
          <t>Abbreviation of Transaction-id.  A transaction-id is an UTF-8
string of characters.  The specific format depends on the protocol
mechanism used (e.g. Etag or Last-Modified).</t>
        </dd>
        <dt>Txid History:</dt>
        <dd>
          <t>Temporally ordered list of txid values used by the server.  Allows
the server to determine if a given txid occurred more recently than
another txid.</t>
        </dd>
        <dt>Versioned node:</dt>
        <dd>
          <t>A node in the instantiated YANG data tree for which
the server maintains a transaction id (txid) value.</t>
        </dd>
      </dl>
    </section>
    <section anchor="netconf-txid-extension">
      <name>NETCONF Txid Extension</name>
      <t>This document describes a NETCONF extension which modifies the
behavior of <tt>&lt;get-config&gt;</tt>, <tt>&lt;get-data&gt;</tt>, <tt>&lt;edit-config&gt;</tt>, <tt>&lt;edit-data&gt;</tt>,
<tt>&lt;discard-changes&gt;</tt>, <tt>&lt;copy-config&gt;</tt>, <tt>&lt;delete-config&gt;</tt>, and <tt>&lt;commit&gt;</tt> operations such
that clients are able to conditionally retrieve and update the
configuration in a NETCONF server.</t>
      <t>For servers implementing YANG-Push <xref target="RFC8641"/>, an extension for conveying txid
updates as part of subscription updates is also defined.  A similar
extension is also defined for servers implementing
"Comparison of NMDA Datastores" <xref target="RFC9144"/>.</t>
      <t>Several low level mechanisms could be defined to fulfill the
requirements for efficient client/server txid synchronization.
This document defines two such mechanisms, the 'etag txid' mechanism (<xref target="sec-etag"/>)
and the 'last-modified txid' mechanism (<xref target="sec-lm"/>). However, additional txid mechanisms may be defined in the future. Such mechanisms have to adhere
to the principles defined in <xref target="sec-principles"/>.</t>
      <t>This document is divided into a two
main parts; the first part discusses the txid mechanism in an abstract,
protocol-neutral way.  The second part,
<xref target="txid-mechanisms">Txid Mechanisms</xref>, then adds the protocol layer,
and provides concrete encoding examples.</t>
      <section anchor="sample-use-cases">
        <name>Sample Use Cases</name>
        <t>The common use cases for txid mechanisms are briefly discussed in this section.</t>
        <dl>
          <dt>Initial configuration retrieval:</dt>
          <dd>
            <t>When a client initially connects to a server, it may be interested
to acquire a current view of (parts of) the server's configuration.
In order to be able to efficiently detect changes later, it may also
be interested to store meta level txid information for
subtrees of the configuration.</t>
          </dd>
          <dt>Subsequent configuration retrieval:</dt>
          <dd>
            <t>When a client needs to retrieve again (parts of) the server's configuration,
it may be interested to leverage the txid metadata it has
stored by requesting the server to prune the response so that it does
not repeat configuration data that the client is already aware of.</t>
          </dd>
          <dt>Configuration update with txid return:</dt>
          <dd>
            <t>When a client issues a transaction towards a server, it may be
interested to also learn the new txid metadata that the server
has stored for the updated parts of the configuration.</t>
          </dd>
          <dt>Conditional configuration change:</dt>
          <dd>
            <t>When a client issues a transaction towards a server, it may specify
txid metadata for the transaction in order to allow the server to
verify that the client is up to date with any changes in the parts of
the configuration that it is concerned with.  If the txid
metadata in the server is different than the client expected, the
server rejects the transaction with a specific error message.</t>
          </dd>
          <dt>Subscribe to configuration changes with txid return:</dt>
          <dd>
            <t>When a client subscribes to configuration change updates through
YANG-Push, it may be interested to also learn the updated txid
metadata for the changed data trees.</t>
          </dd>
        </dl>
      </section>
      <section anchor="sec-principles">
        <name>General Txid Principles</name>
        <t>All servers implementing a txid mechanism MUST maintain a top level
server side txid (s-txid) metadata value for each configuration datastore
supported by the server.
Txid mechanism implementations MAY also maintain txid
metadata values for nodes deeper in the YANG data tree.  The nodes
for which the server maintains txids are collectively referred to as
the "Versioned Nodes".</t>
        <t>Server implementations MAY use the YANG extension statement
ietf-netconf-txid:versioned-node to inform potential clients about
which YANG nodes the server maintains a txid value for.  Another way
to discover (a partial) set of Versioned Nodes is for a client to
request the current configuration with txids.  The returned
configuration will then have the Versioned Nodes decorated with their
txid values.</t>
        <t>Regardless of whether a server declares the Versioned Nodes or not,
the set of Versioned Nodes in the server's YANG tree MUST remain
constant, except at system redefining events, such as software upgrades
or entitlement (a.k.a. "license") installations or removals.</t>
        <t>The server returning txid values for the Versioned Nodes
MUST ensure that the txid values are changed every time there has
been a configuration change at or below the node associated with
the txid value.  This means any update of a config true node will
result in a new txid value for all ancestor Versioned Nodes, up
to and including the datastore root itself.</t>
        <t>This also means a server MUST update the txid value for any
nodes that change as a result of a configuration change, and their
ancestors, regardless
of source, even if the changed nodes are not explicitly part
of the change payload.  An example of this is dependent data under
YANG <xref target="RFC7950"/> "when" or "choice" statements.</t>
        <t>A server MUST NOT change the txid value of a versioned node
unless the node itself or a child node of that node has
been changed.  The server MUST NOT change any txid values due to
changes in config false data, or any kind of metadata that the
server may maintain for YANG data tree nodes.</t>
      </section>
      <section anchor="initial-configuration-retrieval">
        <name>Initial Configuration Retrieval</name>
        <t>When a NETCONF server receives a <tt>&lt;get-config&gt;</tt> or <tt>&lt;get-data&gt;</tt> request (<xref section="3.1.1" sectionFormat="of" target="RFC8526"/>)
containing requests for txid values, and assuming no authorization or validation error is encountered,  it MUST, in the reply, return
txid values for all Versioned Nodes below the point requested by
the client.</t>
        <t>The exact encoding varies by mechanism, but all txid mechanisms
would have a special "txid-request" txid value (e.g., "?") which is
guaranteed to never be used as a normal txid value.  Clients MAY use
this special txid value associated with one or more nodes in the
data tree to indicate to the server that they are interested in
txid values below that point of the data tree.</t>
        <figure anchor="fig-baseline">
          <name>Initial Configuration Retrieval.  The client annotated the get-config request itself with the txid request value, which makes the server return all txid values in the entire datastore, that also fall within the requested subtree filter.  The most recent change seems to have been an update to ace R8 and R9.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config (txid: ?)                          |
       |     acls                                        |
       |                                                 |
       |   <------------------------------------------   |
       |   data (txid: 5152)                             |
       |     acls (txid: 5152)                           |
       |       acl A1 (txid: 4711)                       |
       |         aces (txid: 4711)                       |
       |           ace R1 (txid: 4711)                   |
       |             matches ipv4 protocol 17            |
       |             actions forwarding accept           |
       |       acl A2 (txid: 5152)                       |
       |         aces (txid: 5152)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |             actions forwarding accept           |
       |           ace R9 (txid: 5152)                   |
       |             matches tcp source-port port 22     |
       |             actions forwarding accept           |
       v                                                 v
]]></artwork>
        </figure>
        <ul empty="true">
          <li>
            <t>The call flow examples in this document use a 4-digit,
strictly increasing integer as txid.  The same txid value
is also used for all changed nodes in a given transaction.
These conventions of the examples are convenient and enhances
readability of the examples, but do not necessarily
reflect a typical implementation.</t>
          </li>
        </ul>
        <t>Txid values are opaque strings that uniquely identify
a particular configuration state.  Servers are expected to know which
txid values it has used in the recent past, and in which order they
were assigned to configuration change transactions.  This information
is known as the server's Txid History.</t>
        <t>How many historical txid values to track is up to each server
implementor to decide, and a server MAY decide not to store any
historical txid values at all.  The more txid values in the server's
Txid History, the more efficient the client synchronization may be, as
described in the coming sections. Servers may expose a configuration parameter
to control the history depth. Such control depends on the local server capabilities.
Refer to <xref target="sec-histo-size"/> for more considerations about history size.</t>
        <t>Some server implementors may decide to use a strictly increasing
integer as the txid value or a timestamp.  Doing so obviously makes
it very easy for the server to determine the sequence of historical
transaction ids.</t>
        <t>Some server implementors may decide to use a completely different txid
value sequence, to the point that the sequence may appear completely
random to outside observers.</t>
      </section>
      <section anchor="subsequent-configuration-retrieval">
        <name>Subsequent Configuration Retrieval</name>
        <t>Clients MAY request the server to return txid values in the response
by adding one or more txid values received previously in <tt>&lt;get-config&gt;</tt> or
<tt>&lt;get-data&gt;</tt> requests.  Txid values sent by a client are refered to as
c-txid.</t>
        <t>When a client sends a c-txid value of a node that matches the
server's s-txid value for that Versioned Node, or matches a more recent
s-txid value in the server's Txid History,
the server prunes (i.e., does not return) that subtree from
the response.  Since the client already knows the txid for that part
of the data tree, or a txid that occurred more recently, it
is obviously already up to date with that part of the configuration.
Sending it again would be a waste of time and energy.</t>
        <t><xref target="tab-rules"/> describes in detail how the client side (c-txid) and
server side txid (s-txid) values are determined and compared when the
server processes each data tree reply node from a get-config or
get-data request.</t>
        <t>Servers MUST process each of the config true nodes as follows:</t>
        <table anchor="tab-rules">
          <name>The Txid rules for response pruning.</name>
          <thead>
            <tr>
              <th align="left">Case</th>
              <th align="left">Condition</th>
              <th align="left">Behavior</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">1. NO CLIENT TXID</td>
              <td align="left">In its request, the client did not specify a c-txid value for the current node, nor any ancestor of this node.</td>
              <td align="left">In this case, the server MUST return the current node according to the normal NETCONF specifications.  The rules below do not apply to the current node.  Any child nodes MUST also be evaluated with respect to these rules.</td>
            </tr>
            <tr>
              <td align="left">2. CLIENT ANCESTOR TXID</td>
              <td align="left">The client did not specify a c-txid value for the current node, but did specify a c-txid value for one or more ancestors of this node.</td>
              <td align="left">In this case, the current node MUST inherit the c-txid value of the closest ancestor node in the client's request that has a c-txid value.  Processing of the current node continues according to the rules below.</td>
            </tr>
            <tr>
              <td align="left">3. SERVER ANCESTOR TXID</td>
              <td align="left">The node is not a Versioned Node, i.e. the server does not maintain a s-txid value for this node.</td>
              <td align="left">In this case, the current node MUST, for the purposes of these rules, temporarily inherit the server's s-txid value of the closest ancestor that is a Versioned Node (has a server side s-txid value).  The datastore root is always a Versioned Node.  Processing of the current node continues according to the rules below.</td>
            </tr>
            <tr>
              <td align="left">4. CLIENT TXID UP TO DATE</td>
              <td align="left">The client specified c-txid for the current node value is "up to date", i.e. it matches the server's s-txid value, or matches a s-txid value from the server's Txid History that is more recent than the server's s-txid value for this node.</td>
              <td align="left">In this case the server MUST return the node decorated with a special "txid-match" txid value (e.g. "=") to the matching node, pruning any value and child nodes.</td>
            </tr>
            <tr>
              <td align="left">5. CLIENT TXID OUT OF DATE</td>
              <td align="left">The specified c-txid is "outdated" or "unknown" to the server, i.e. it does not match the server's s-txid value for this node, nor does the client c-txid value match any s-txid value in the server's Txid History that is more recent than the server's s-txid value for this node.</td>
              <td align="left">In this case the server MUST return the current node according to the normal NETCONF specifications.  If the current node is a Versioned Node, it MUST be decorated with the s-txid value.  Any child nodes MUST also be evaluated with respect to these rules.</td>
            </tr>
          </tbody>
        </table>
        <t>For list elements, pruning child nodes means that top-level
key nodes MUST be included in the response, and other child nodes
MUST NOT be included.  For containers, child nodes MUST NOT
be included.</t>
        <section anchor="when-there-is-no-change">
          <name>When there is No Change</name>
          <t>Here follows a couple of examples of how the rules above are applied.
See <xref target="fig-baseline">the example above</xref> for the most recent server
configuration state that the client is aware of, before this happens:</t>
          <figure anchor="fig-pruning">
            <name>Response Pruning.  Client sends get-config request with known txid values.  Server prunes response where the c-txid matches expectations.  In this case, the server had no changes, and pruned the response at the earliest point offered by the client.</name>
            <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls (txid: 5152)                           |
       |       acl A1 (txid: 4711)                       |
       |         aces (txid: 4711)                       |
       |       acl A2 (txid: 5152)                       |
       |         aces (txid: 5152)                       |
       |                                                 |
       |   <------------------------------------------   |
       |   data                                          |
       |     acls (txid: =)                              |
       v                                                 v
]]></artwork>
          </figure>
          <t>In this case, the server's txid-based pruning saved a substantial
amount of information that is already known by the client to be sent
to and processed by the client.</t>
        </section>
        <section anchor="when-there-is-an-out-of-band-oob-change">
          <name>When there is an Out-Of-Band (OOB) Change</name>
          <t>In the following example someone has made a change to the
configuration on the server.  This server has chosen to implement
a Txid History with up to 5 entries.  The 5 most recently used
s-txid values on this example server are currently: 4711, 5152, 5550,
6614, 7770 (most recent).  Then a client sends this request:</t>
          <figure anchor="fig-oob-change">
            <name>Out of band change detected.  Client sends get-config request with known txid values.  Server provides updates only where changes have happened.  (Txid 7770 does not appear in this subtree, so that transaction must relate to some changes elsewhere.)</name>
            <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls (txid: 5152)                           |
       |       acl A1 (txid: 4711)                       |
       |       acl A2 (txid: 5152)                       |
       |                                                 |
       |   <------------------------------------------   |
       |   data                                          |
       |     acls (txid: 6614)                           |
       |       acl A1 (txid: =)                          |
       |       acl A2 (txid: 6614)                       |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: =)                      |
       |           ace R8 (txid: =)                      |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       |             actions forwarding accept           |
       v                                                 v
]]></artwork>
          </figure>
          <t>In the example depicted in <xref target="fig-oob-change"/>, the server returns the acls container because
the client supplied c-txid value (5152) differs from the s-txid value
held by the server (6614), and 5152 is less recent in the server's
Txid History than 6614.  The client is apparently unaware of the
latest config developments in this part of the server config tree.</t>
          <t>The server prunes list entry acl A1 is because it has the same s-txid
value as the c-txid supplied by the client (4711). The server returns
the list entry acl A2 because 5152 (specified by the client) is less
recent than 6614 (held by the server).</t>
          <t>The container aces under acl A2 is returned because 5152 is less recent
than 6614. The server prunes ace R7 because the c-txid for this
node is 5152 (from acl A2), and 5152 is more recent than the closest
ancestor Versioned Node (with txid 4711).</t>
          <t>The server also prunes acl R8 because the server and client txids
exactly match (5152). Finally, acl R9 is returned because of its less
recent c-txid value given by the client (5152, on the closest ancestor
acl A2) than the s-txid held on the server (6614).</t>
        </section>
        <section anchor="when-a-txid-value-is-inherited-from-an-ancestor-node">
          <name>When a Txid value is Inherited from an Ancestor Node</name>
          <t>In the example shown in <xref target="fig-vn"/>, the client specifies the c-txid for a node that
the server does not maintain a s-txid for, i.e., it is not a
Versioned Node.</t>
          <figure anchor="fig-vn">
            <name>Versioned Nodes.  Server lookup of dscp txid gives 4711, as closest ancestor is ace R7 with txid 4711.  Since the server's and client's txid match, the txid value is '=', and the leaf value is pruned.</name>
            <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls                                        |
       |       acls A2                                   |
       |         aces                                    |
       |           ace R7                                |
       |             matches                             |
       |               ipv4                              |
       |                 dscp (txid: 4711)               |
       |                                                 |
       |   <------------------------------------------   |
       |   data                                          |
       |     acls                                        |
       |       acl A2                                    |
       |         aces                                    |
       |           ace R7                                |
       |             matches                             |
       |               ipv4                              |
       |                 dscp (txid: =)                  |
       v                                                 v
]]></artwork>
          </figure>
          <t>Here, the server looks up the closest ancestor node that is a
Versioned Node.  This particular server has chosen to keep a s-txid
for the list entry ace R7, but not for any of its children.  Thus
the server finds the server side s-txid value to be 4711 (from ace R7),
which matches the client's c-txid value of 4711.</t>
          <t>Servers MUST NOT use the special txid values, txid-match,
txid-request, txid-unknown (e.g., "=", "?", or "!") as actual
txid values.</t>
        </section>
      </section>
      <section anchor="candidate-datastore-configuration-retrieval">
        <name>Candidate Datastore Configuration Retrieval</name>
        <t>When a client retrieves the configuration from the (or a) candidate
datastore, some of the configuration nodes may hold the same data as
the corresponding node in the running datastore.  In such cases, the
server MUST return the same s-txid value for nodes in the candidate
datastore as in the running datastore.</t>
        <t>If a node in the candidate datastore holds different data than in the
running datastore, the server has a choice of what to return:</t>
        <ul spacing="normal">
          <li>The server MAY return a txid-unknown value (e.g., "!").  This may
  be convenient in servers that do not know a priori what txids will
  be used in a future, possible commit of the candidate.</li>
          <li>If the txid-unknown value is not returned, the server MUST return
  the s-txid value the node will have after commit, assuming the client
  makes no further changes of the candidate datastore.  If a client
  makes further changes in the candidate datastore, the s-txid value
  MAY change again, i.e. the server is not required to stick with the
  s-txid value just returned.</li>
        </ul>
        <t>See the example in
<xref target="candidate-datastore-transactions">Candidate Datastore Transactions</xref>.</t>
      </section>
      <section anchor="conditional-transactions">
        <name>Conditional Transactions</name>
        <t>Conditional transactions are useful when a client is interested
to make a configuration change, being sure that relevant parts of
the server configuration have not changed since the client last
inspected it.</t>
        <t>By supplying the latest c-txid values known to the client
in its change requests (<tt>&lt;edit-config&gt;</tt>, for example), it can request the server
to reject the transaction in case any relevant changes have occurred
at the server that the client is not yet aware of.</t>
        <t>This allows a client to reliably compute and send configuration
changes to a server without either acquiring a global datastore lock
for a potentially extended period of time, or risk that a change
from another client disrupts the intent in the time window between a
read (<tt>&lt;get-config&gt;</tt>, for example) and write (<tt>&lt;edit-config&gt;</tt>, for example) operation.</t>
        <t>Clients that are also interested to know the s-txid assigned to the
root Versioned Node in the model immediately in the
response could set a flag in the <tt>&lt;rpc&gt;</tt> element to request the server
to return the new s-txid with the <tt>&lt;ok&gt;</tt> element.</t>
        <figure anchor="base-edit-config">
          <name>Conditional transaction towards the Running datastore successfully executed.  As all the txid values specified by the client matched those on the server, the transaction was successfully executed.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (request new txid in response)    |
       |     config (txid: 5152)                         |
       |       acls (txid: 5152)                         |
       |         acl A1 (txid: 4711)                     |
       |           aces (txid: 4711)                     |
       |             ace R1 (txid: 4711)                 |
       |               matches ipv4 protocol 6           |
       |               actions forwarding accept         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 7688)                               |
       v                                                 v
]]></artwork>
        </figure>
        <t>After the above edit-config, the client might issues a get-config to
observe the change.  It would look like this:</t>
        <figure anchor="fig-updated-all">
          <name>The txids are updated on all Versioned Nodes that were modified themselves or have a child node that was modified.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls (txid: ?)                              |
       |                                                 |
       |   <------------------------------------------   |
       |   data                                          |
       |     acls (txid: 7688)                           |
       |       acl A1 (txid: 7688)                       |
       |         aces (txid: 7688)                       |
       |           ace R1 (txid: 7688)                   |
       |             matches ipv4 protocol 6             |
       |             actions forwarding accept           |
       |       acl A2 (txid: 6614)                       |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |             actions forwarding accept           |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       |             actions forwarding accept           |
       v                                                 v
]]></artwork>
        </figure>
        <t>When a client sends in a c-txid value of a node, the server MUST consider it a match if the server's s-txid value is identical to the client, or if the server's value is found earlier in the server's Txid History than the value supplied by the client.</t>
        <section anchor="error-response-on-out-of-band-changes">
          <name>Error Response on Out-of-Band Changes</name>
          <t>If the server rejects the transaction because one or more of the
configuration s-txid value(s) differs from the client's expectation,
the server MUST return at least one <tt>&lt;rpc-error&gt;</tt> with the following
values:</t>
          <artwork><![CDATA[
   error-tag:      operation-failed
   error-type:     protocol
   error-severity: error
]]></artwork>
          <t>Additionally, the error-info tag MUST contain an sx:structure <xref target="RFC8791"/>
containing relevant details about one of the mismatching txids.
A server MAY send multiple rpc-errors when multiple txid mismatches
are detected.</t>
          <figure anchor="fig-cond-fails">
            <name>Conditional transaction that fails a txid check.  The client wishes to ensure there has been no changes to the particular acl entry it edits, and therefore sends the c-txid it knows for this part of the configuration.  Since the s-txid has changed (out of band), the server rejects the configuration change request and reports an error with details about where the mismatch was detected.</name>
            <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config                                   |
       |     config                                      |
       |       acls                                      |
       |         acl A1 (txid: 4711)                     |
       |           aces (txid: 4711)                     |
       |             ace R1 (txid: 4711)                 |
       |               matches ipv4 dscp 20              |
       |               actions forwarding accept         |
       |                                                 |
       |   <------------------------------------------   |
       |   rpc-error                                     |
       |     error-tag       operation-failed            |
       |     error-type      protocol                    |
       |     error-severity  error                       |
       |     error-info                                  |
       |       mismatch-path /acls/acl[A1]               |
       |       mismatch-etag-value 6912                  |
       v                                                 v
]]></artwork>
          </figure>
        </section>
        <section anchor="sec-histo-size">
          <name>Txid History Size Consideration</name>
          <t>It may be tempting for a client implementor to send a single
c-txid value for the tree being edited.  In many cases, that
would certainly work just fine.  This is a way for the client to
request the server to go ahead with the change as long as there
has not been any changes more recent in the subtree below the
c-txid provided.</t>
          <t>Here the client is sending the same change as in
<xref target="base-edit-config">the example above</xref>, but with only a single
c-txid value that reflects the latest txid the client is
aware of anywhere in the configuration.</t>
          <figure>
            <name>Conditional transaction towards the Running datastore successfully executed.  As all the c-txid values specified by the client were the same or more recent in the server's Txid History, so the transaction was successfully executed.</name>
            <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (request new txid in response)    |
       |     config                                      |
       |       acls                                      |
       |         acl A1 (txid: 8602)                     |
       |           aces                                  |
       |             ace R1                              |
       |               matches ipv4 protocol 6           |
       |               actions forwarding accept         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 9009)                               |
       v                                                 v
]]></artwork>
          </figure>
          <t>This approach works well in the example above because the c-txid
value 8602 is inherited down in the child nodes, from acl A1 to aces,
ace R1, and onwards. The server compares the c-txid value 8602
with the s-txid value in the data tree.  The server finds that the
values do not match (e.g., s-txid 7688 for ace R1 is not equal to
c-txid 8602), but finds that 8602 is a more recent txid than 7688
by looking in the server's Txid History, and therefore accepts the
transaction.</t>
          <t>Clients relying on the server's Txid History being long enough,
could see their changes rejected if some of the s-txid have
fallen out of the server's Txid History (e.g., if the txid 7688
happened so long ago that the it is no longer in the server's
Txid History).  Some servers may have a Txid History size of zero.
A client specifying a single c-txid value for a change like the one
above towards such a server would not be able to get the transaction
accepted.</t>
        </section>
      </section>
      <section anchor="candidate-datastore-transactions">
        <name>Candidate Datastore Transactions</name>
        <t>When using the (or a) Candidate datastore, the txid validation
happens at commit time, rather than at individual edit-config or
edit-data operations.  Clients add their c-txid attributes to the
configuration payload the same way.  In case a client specifies
different c-txid values for the same element in successive edit-config
or edit-data operations, the c-txid value specified last MUST be used
by the server at commit time.</t>
        <figure>
          <name>Conditional transaction towards the Candidate datastore successfully executed.  As all the c-txid values specified by the client matched those on the server at the time of the commit, the transaction was successfully executed.  If a client issues a get-config towards the candidate datastore, the server may choose to return the special txid-unknown value (e.g., "!") or the s-txid value that would be used if the candidate was committed without further changes (when that s-txid value is known in advance by the server).</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (operation: merge)                |
       |     config (txid: 5152)                         |
       |       acls (txid: 5152)                         |
       |         acl A1 (txid: 4711)                     |
       |           type ipv4                             |
       |                                                 |
       |   <------------------------------------------   |
       |   ok                                            |
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (operation: merge)                |
       |     config                                      |
       |       acls                                      |
       |         acl A1                                  |
       |           aces (txid: 4711)                     |
       |             ace R1 (txid: 4711)                 |
       |               matches ipv4 protocol 6           |
       |               actions forwarding accept         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok                                            |
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     config                                      |
       |       acls                                      |
       |         acl A1                                  |
       |           aces (txid: ?)                        |
       |                                                 |
       |   <------------------------------------------   |
       |     config                                      |
       |       acls                                      |
       |         acl A1                                  |
       |           aces (txid: 7688  or !)               |
       |             ace R1 (txid: 7688 or !)            |
       |               matches ipv4 protocol 6           |
       |               actions forwarding accept         |
       |             ace R2 (txid: 2219)                 |
       |               matches ipv4 dscp 21              |
       |               actions forwarding accept         |
       |                                                 |
       |   ------------------------------------------>   |
       |   commit (request new txid in response)         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 7688)                               |
       v                                                 v
]]></artwork>
        </figure>
      </section>
      <section anchor="dependencies-within-transactions">
        <name>Dependencies within Transactions</name>
        <t>YANG modules that contain 'when' statements referencing remote
parts of the model will cause the s-txid to change even in parts of the
data tree that were not modified directly.</t>
        <t>Let's say there is an energy-example.yang module that defines a
mechanism for clients to request the server to measure the amount of
energy that is consumed by a given access control rule.  The
"energy-example" module augments the access control module as follows:</t>
        <sourcecode type="yang"><![CDATA[
module energy-example {
...

  container energy {
    leaf metering-enabled {
      type boolean;
      default false;
    }
  }

  augment /acl:acls/acl:acl {
    when /energy-example:energy/energy-example:metering-enabled;
    leaf energy-tracing {
      type boolean;
      default false;
    }
    leaf energy-consumption {
      config false;
      type uint64;
      units J;
    }
  }
}
]]></sourcecode>
        <t>This means there is a system wide switch leaf metering-enabled in
energy-example which disables all energy measurements in the system when
set to false, and that there is a boolean leaf energy-tracing that
controls whether energy measurement is happening for each acl rule
individually.</t>
        <t>In this example, we have an initial configuration like this:</t>
        <figure>
          <name>Initial configuration for the energy example.  Note the energy metering-enabled leaf at the top and energy-tracing leafs under each acl.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     energy (txid: ?)                            |
       |     acls (txid: ?)                              |
       |                                                 |
       |   <------------------------------------------   |
       |   data (txid: 7688)                             |
       |     energy metering-enabled true (txid: 4711)   |
       |     acls (txid: 7688)                           |
       |       acl A1 (txid: 7688)                       |
       |         energy-tracing false                    |
       |         aces (txid: 7688)                       |
       |           ace R1 (txid: 7688)                   |
       |             matches ipv4 protocol 6             |
       |             actions forwarding accept           |
       |       acl A2 (txid: 6614)                       |
       |         energy-tracing true                     |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |             actions forwarding accept           |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       |             actions forwarding accept           |
       v                                                 v
]]></artwork>
        </figure>
        <t>At this point, a client updates metering-enabled to false.  This causes
the when-expression on energy-tracing to turn false, removing the leaf
entirely.  This counts as a configuration change, and the s-txid must
be updated appropriately.</t>
        <figure>
          <name>Transaction changing a single leaf.  This leaf is the target of a when-statement, however, which means other leafs elsewhere may be indirectly modified by this change.  Such indirect changes will also result in s-txid changes.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (request new txid in response)    |
       |     config                                      |
       |       energy metering-enabled false             |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 9118)                               |
       v                                                 v
]]></artwork>
        </figure>
        <t>After the transaction above, the new configuration state has the
energy-tracing leafs removed.  Every such removal or (re)introduction
of a node counts as a configuration change from a txid perspective,
regardless of whether the change has any net configuration change
effect in the server.</t>
        <figure>
          <name>The txid for the energy subtree has changed since that was the target of the edit-config.  The txids of the ACLs have also changed since the energy-tracing leafs are now removed by the now false when-expression.  Both acl A1 and acl A2 have their txids updated, even though energy-tracing was already false for acl A1.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     energy (txid: ?)                            |
       |     acls (txid: ?)                              |
       |                                                 |
       |   <------------------------------------------   |
       |   data (txid: 9118)                             |
       |     energy metering-enabled false (txid: 9118)  |
       |     acls (txid: 9118)                           |
       |       acl A1 (txid: 9118)                       |
       |         aces (txid: 7688)                       |
       |           ace R1 (txid: 7688)                   |
       |             matches ipv4 protocol 6             |
       |             actions forwarding accept           |
       |       acl A2 (txid: 9118)                       |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |             actions forwarding accept           |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       |             actions forwarding accept           |
       v                                                 v
]]></artwork>
        </figure>
      </section>
      <section anchor="other-netconf-operations">
        <name>Other NETCONF Operations</name>
        <dl>
          <dt><tt>&lt;discard-changes&gt;</tt>:</dt>
          <dd>
            <t>The <tt>&lt;discard-changes&gt;</tt> operation resets the candidate datastore to the
contents of the running datastore.  The server MUST ensure the
txid values in the candidate datastore get the same txid values
as in the running datastore when this operation runs.</t>
          </dd>
          <dt><tt>&lt;copy-config&gt;</tt>:</dt>
          <dd>
            <t>The <tt>&lt;copy-config&gt;</tt> operation can be used to copy contents between
datastores.  The server MUST ensure the txid values are retained
and changed as if the data being copied had been sent in through an
edit-config operation.</t>
          </dd>
          <dt><tt>&lt;delete-config&gt;</tt>:</dt>
          <dd>
            <t>The server MUST ensure the datastore txid value is changed, unless it
was already empty.</t>
          </dd>
          <dt><tt>&lt;commit&gt;</tt>:</dt>
          <dd>
            <t>At commit, with regards to the txid values, the server MUST
treat the contents of the candidate datastore as if any txid
value provided by the client when updating the candidate was provided
in a single edit-config towards the running datastore.  If the
transaction is rejected due to txid value mismatch,
an rpc-error as described in section
<xref target="conditional-transactions">Conditional Transactions</xref> MUST be sent.</t>
          </dd>
        </dl>
      </section>
      <section anchor="yang-push-subscriptions">
        <name>YANG-Push Subscriptions</name>
        <t>A client issuing a YANG-Push establish-subscription or
modify-subscription request or configures a YANG-Push subscription
towards a server that supports
ietf-netconf-txid-yang-push.yang MAY request that the server
provides updated txid values in YANG-Push on-change subscription
updates.</t>
        <t>This functionality pertains only to on-change updates.  This RPC may
also be invoked over RESTCONF or other protocols, and might
therefore be encoded in JSON.</t>
        <t>To request txid values (e.g. etag), the client adds a flag in the
request (e.g., with-etag).  The server then returns the txid
(e.g., etag) value in the yang-patch payload (e.g., as etag-value).</t>
        <figure>
          <name>A client requests a YANG-Push subscription for a given path with txid value included.  When the server delivers a push-change-update notification, the txid value pertaining to the entire patch is included.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   rpc                                           |
       |     establish-subscription                      |
       |       datastore running                         |
       |       datastore-xpath-filter /acls              |
       |       on-change                                 |
       |       with-etag true                            |
       |                                                 |
       |   <------------------------------------------   |
       |   ok                                            |
       |                                                 |
       |   <------------------------------------------   |
       |   notification                                  |
       |     eventTime 2022-04-04T06:00:24.16Z           |
       |     push-change-update                          |
       |       id 89                                     |
       |       datastore-changes                         |
       |         yang-patch                              |
       |           patch-id 0                            |
       |           edit                                  |
       |             edit-id edit1                       |
       |             operation delete                    |
       |             target /acls/acl[A1]                |
       |           edit                                  |
       |             edit-id edit2                       |
       |             operation merge                     |
       |             target /acls/acl[A2]/ace[R7]        |
       |               value                             |
       |                 matches ipv4 dscp 10            |
       |                 actions forwarding accept       |
       |           etag-value 8008                       |
       |                                                 |
       v                                                 v
]]></artwork>
        </figure>
      </section>
      <section anchor="comparing-yang-datastores">
        <name>Comparing YANG Datastores</name>
        <t>A client issuing an NMDA Datastore compare request towards a server
that supports ietf-netconf-txid-nmda-compare.yang MAY request that
the server provides updated txid values in the compare reply.
Besides NETCONF, this RPC may also be invoked over RESTCONF or other
protocols, and might therefore be encoded in JSON.</t>
        <t>To request txid values (e.g. etag), the client adds a flag in the
request (e.g. with-etag).  The server then returns the txid
(e.g. etag) value in the yang-patch payload (e.g. as etag-value).</t>
        <t>The txid value returned by the server MUST be the txid value
pertaining to the target node in the source or target datastores
that is the most recent.  If one of the datastores being
compared is not a configuration datastore, the txid in the
configuration datastore MUST be used.  If none of the datastores
being compared are a configuration datastore, then txid values
MUST NOT be returned at all.</t>
        <t>The txid to return is the one that pertains to the target node, or
in the case of delete, the closest surviving ancestor of the target
node.</t>
        <figure>
          <name>A client requests a NMDA Datastore compare for a given path with txid values included. When the server delivers the reply, the txid is included for each edit.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   rpc                                           |
       |     compare                                     |
       |       source ds:running                         |
       |       target ds:operational                     |
       |       with-etag true                            |
       |                                                 |
       |   <------------------------------------------   |
       |   differences                                   |
       |     yang-patch                                  |
       |       patch-id 0                                |
       |       edit                                      |
       |         edit-id edit1                           |
       |         operation delete                        |
       |         target /acls/acl[A1]                    |
       |         etag-value 8008                         |
       |       edit                                      |
       |         edit-id edit2                           |
       |         operation merge                         |
       |         target /acls/acl[A2]/ace[R7]            |
       |           value                                 |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |         etag-value 8008                         |
       |                                                 |
       v                                                 v
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="txid-mechanisms">
      <name>Txid Mechanisms</name>
      <t>This document defines two txid mechanisms:</t>
      <ul spacing="normal">
        <li>The etag attribute txid mechanism (<xref target="sec-etag"/>)</li>
        <li>The last-modified attribute txid mechanism (<xref target="sec-lm"/>)</li>
      </ul>
      <t>Servers implementing this specification MUST support the etag
attribute txid mechanism and MAY support the last-modified
attribute txid mechanism.</t>
      <t>Section <xref target="netconf-txid-extension">NETCONF Txid Extension</xref> describes
the logic that governs all txid mechanisms.  This section describes
the mapping from the generic logic to specific mechanism and encoding.</t>
      <t>If a client uses more than one txid mechanism, such as both etag and
last-modified in a particular message to a server, or particular
commit, the result is undefined.</t>
      <section anchor="sec-etag">
        <name>The ETag Attribute txid Mechanism</name>
        <t>The etag txid mechanism described in this section is centered around
a meta data XML attribute called "etag".  The etag attribute is
defined in the namespace "urn:ietf:params:xml:ns:netconf:txid:1.0".
The etag attribute is added to XML elements in the NETCONF payload
in order to indicate the txid value for the YANG node represented by
the element.</t>
        <t>NETCONF servers that support this extension MUST announce the
capability "urn:ietf:params:netconf:capability:txid:etag:1.0".</t>
        <t>The etag attribute values are opaque strings chosen freely.  They MUST
consist of ASCII printable characters (VCHAR), except that the etag
string MUST NOT contain space, backslash or double quotes. The point of
these restrictions is to make it easy to reuse implementations that
adhere to section 2.3.1 in <xref target="RFC7232"/>.  The probability
SHOULD be made very low that an etag value that has been used
historically by a server is used again by that server if the
configuration is different.</t>
        <t>It is RECOMMENDED that the same etag txid values are used across all
management interfaces (i.e. NETCONF, RESTCONF and any other the server
might implement), if it implements more than one.  It is RECOMMENDED
that the etag txid has an encoding specific suffix, especially when it
is not encoded in XML.  E.g. a response encoded in JSON might append
"+json" at the end of the etag value. This is in line with the language
in <xref target="RFC7232"/> and traditions in the HTTP world at large.</t>
        <t>The detailed rules for when to update the etag value are described in
<xref target="sec-principles"/>.  These
rules are chosen to be consistent with the ETag mechanism in
RESTCONF, specifically Sections <xref target="RFC8040" section="3.4.1.2" sectionFormat="bare"/>, <xref target="RFC8040" section="3.4.1.3" sectionFormat="bare"/> and <xref target="RFC8040" section="3.5.2" sectionFormat="bare"/> of <xref target="RFC8040"/>.</t>
      </section>
      <section anchor="sec-lm">
        <name>The Last-Modified Attribute txid Mechanism</name>
        <t>The last-modified txid mechanism described in this section is
centered around a meta data XML attribute called "last-modified".
The last-modified attribute is defined in the namespace
"urn:ietf:params:xml:ns:netconf:txid:1.0".  The last-modified
attribute is added to XML elements in the NETCONF payload in
order to indicate the txid value for the YANG node represented by
the element.</t>
        <t>NETCONF servers that support this extension MUST announce the
feature last-modified defined in ietf-netconf-txid.yang.</t>
        <t>The last-modified attribute values are yang:date-and-time values as
defined in ietf-yang-types.yang, <xref target="RFC6991"/>.</t>
        <t>"2022-04-01T12:34:56.123456Z" is an example of what this time stamp
format looks like.  Servers MUST ensure the timestamps provided are
strictly increasing for as long as the server's operation is
maintained.</t>
        <t>It is RECOMMENDED that the same last-modified txid values are used
across all management interfaces (i.e. NETCONF and any other the
server might implement), except RESTCONF.</t>
        <t>RESTCONF, as defined in
<xref target="RFC8040"/>,
is using a different format for the time stamps which is
limited to one second resolution.  Server implementors that support
the Last-Modified txid mechanism over both RESTCONF and other
management protocols are RECOMMENDED to use Last-Modified timestamps
that match the point in time referenced over RESTCONF, with the
fractional seconds part added.</t>
        <t>The detailed rules for when to update the last-modified value are
described in <xref target="sec-principles"/>.  These rules
are chosen to be consistent with the Last-Modified mechanism in
RESTCONF, <xref target="RFC8040"/>,
specifically sections 3.4.1.1, 3.4.1.3 and 3.5.1.</t>
      </section>
      <section anchor="common-features-to-both-etag-and-last-modified-txid-mechanisms">
        <name>Common features to both etag and last-modified txid mechanisms</name>
        <t>Clients MAY add etag or last-modified attributes to zero or
more individual elements in the get-config or get-data filter, in
which case they pertain to the subtree(s) rooted at the element(s)
with the attributes.</t>
        <t>Clients MAY also add such attributes directly to the get-config or
get-data tags (e.g. if there is no filter), in which case it
pertains to the txid value of the datastore root.</t>
        <t>Clients might wish to send a txid value that is guaranteed to never
match a server constructed txid.  With both the etag and
last-modified txid mechanisms, such a txid-request value is "?".</t>
        <t>Clients MAY add etag or last-modified attributes to the payload
of edit-config or edit-data requests, in which case they indicate
the client's txid value of that element.</t>
        <t>Clients MAY request servers that also implement YANG-Push to return
configuration change subsription updates with etag or
last-modified txid attributes.  The client requests this service by
adding a with-etag or with-last-modified flag with the value 'true'
to the subscription request or yang-push configuration.  The server
MUST then return such txids on the YANG Patch edit tag and to the
child elements of the value tag.  The txid attribute on the edit tag
reflects the txid associated with the changes encoded in this edit
section, as well as parent nodes.  Later edit sections in the same
push-update or push-change-update may still supercede the txid value
for some or all of the nodes in the current edit section.</t>
        <t>Servers returning txid values in get-config, edit-config, get-data,
edit-data and commit operations MUST do so by adding etag and/or
last-modified txid attributes to the data and ok tags.  When
servers prune output due to a matching txid value, the server
MUST add a txid-match attribute to the pruned element, and MUST set
the attribute value to "=", and MUST NOT send any element value.</t>
        <t>Servers returning a txid mismatch error MUST return an rpc-error
as defined in section
<xref target="conditional-transactions">Conditional Transactions</xref> with an
error-info tag containing a txid-value-mismatch-error-info
structure.</t>
        <section anchor="candidate-datastore">
          <name>Candidate Datastore</name>
          <t>When servers return txid values in get-config and get-data operations
towards the candidate datastore, the txid values returned MUST adhere
to the following rules:</t>
          <ul spacing="normal">
            <li>If the versioned node holds the same data as in the running
datastore, the same txid value as the versioned node in running
MUST be used.</li>
            <li>If the versioned node is different in the candidate store
than in the running datastore, the server has a choice of what
to return. The server MAY return the special "txid-unknown" value "!".
If the txid-unknown value is not returned, the server MUST return
the txid value the versioned node will have if the client decides to
commit the candidate datastore without further updates.</li>
          </ul>
        </section>
        <section anchor="namespaces-and-attribute-placement">
          <name>Namespaces and Attribute Placement</name>
          <t>The txid attributes are valid on the following NETCONF tags,
where xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" <xref target="RFC4741"/> <xref target="RFC6241"/>,
xmlns:ncds="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda" <xref target="RFC8526"/>,
xmlns:sn="urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications" <xref target="RFC8639"/>,
xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push" <xref target="RFC8641"/> <xref target="RFC8072"/>:</t>
          <t>In client messages sent to a server:</t>
          <ul spacing="normal">
            <li>/nc:rpc/nc:get-config</li>
            <li>/nc:rpc/nc:get-config/nc:filter//*</li>
            <li>/nc:rpc/ncds:get-data</li>
            <li>/nc:rpc/ncds:get-data/ncds:subtree-filter//*</li>
            <li>/nc:rpc/ncds:get-data/ncds:xpath-filter//*</li>
            <li>/nc:rpc/nc:edit-config/nc:config</li>
            <li>/nc:rpc/nc:edit-config/nc:config//*</li>
            <li>/nc:rpc/ncds:edit-data/ncds:config</li>
            <li>/nc:rpc/ncds:edit-data/ncds:config//*</li>
          </ul>
          <t>In server messages sent to a client:</t>
          <ul spacing="normal">
            <li>/nc:rpc-reply/nc:data</li>
            <li>/nc:rpc-reply/nc:data//*</li>
            <li>/nc:rpc-reply/ncds:data</li>
            <li>/nc:rpc-reply/ncds:data//*</li>
            <li>/nc:rpc-reply/nc:ok</li>
            <li>/yp:push-update/yp:datastore-contents/yp:yang-patch/
yp:edit</li>
            <li>/yp:push-update/yp:datastore-contents/yp:yang-patch/
yp:edit/yp:value//*</li>
            <li>/yp:push-change-update/yp:datastore-contents/yp:yang-patch/
yp:edit</li>
            <li>/yp:push-change-update/yp:datastore-contents/yp:yang-patch/
yp:edit/yp:value//*</li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="txid-mechanism-examples">
      <name>Txid Mechanism Examples</name>
      <section anchor="initial-configuration-response">
        <name>Initial Configuration Response</name>
        <section anchor="with-etag">
          <name>With etag</name>
          <t>To retrieve etag attributes across the entire NETCONF server
configuration, a client might send:</t>
          <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config txid:etag="?">
    <source>
      <running/>
    </source>
  </get-config>
</rpc>
]]></sourcecode>
          <t>The server's reply might then be:</t>
          <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data txid:etag="fd6a52d9-5152-811c-a117-b99d3b723c93">
    <acls xmlns=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
          txid:etag="fd6a52d9-5152-811c-a117-b99d3b723c93">
      <acl txid:etag="2c4b50e4-4711-49f8-a2b2-2e20aebe120f">
        <name>A1</name>
        <aces txid:etag="2c4b50e4-4711-49f8-a2b2-2e20aebe120f">
          <ace txid:etag="2c4b50e4-4711-49f8-a2b2-2e20aebe120f">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
  ...
]]></sourcecode>
          <t>It is up to the server implementor to decide on the format of the
etag txid value.  In the example above, the server used "random"
UUID values.  This is one valid implementation choice.</t>
          <t>For the etag txid examples below, we have chosen to use an etag txid
value consisting of "nc" (or "cli" in some cases) followed by a
strictly increasing integer.  This is another valid implementation
choice.  This format is convenient for the reader trying to make
sense of the examples, but is not an implementation requirement.</t>
          <t>Clients have to be prepared to receive etag txid values in different
formats.</t>
          <t>Repeating the example above, but now with a server returning more
human readable etag txid values, the server's reply might be:</t>
          <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data txid:etag="nc5152">
    <acls xmlns=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
          txid:etag="nc5152">
      <acl txid:etag="nc4711">
        <name>A1</name>
        <aces txid:etag="nc4711">
          <ace txid:etag="nc4711">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc5152">
        <name>A2</name>
        <aces txid:etag="nc5152">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"
          txid:etag="nc3072">
      <groups txid:etag="nc3072">
        <group txid:etag="nc3072">
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></sourcecode>
          <t>To retrieve etag attributes for a specific ACL using an xpath
filter, a client might send:</t>
          <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter type="xpath"
      xmlns:acl=
        "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      select="/acl:acls/acl:acl[acl:name='A1']"
      txid:etag="?"/>
  </get-config>
</rpc>
]]></sourcecode>
          <t>To retrieve etag attributes for "acls", but not for "nacm",
a client might send:</t>
          <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="3"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:etag="?"/>
      <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
    </filter>
  </get-config>
</rpc>
]]></sourcecode>
          <t>If the server considers "acls", "acl", "aces" and "acl" to be
Versioned Nodes, the server's response to the request above
might look like:</t>
          <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="3"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls xmlns=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
          txid:etag="nc5152">
      <acl txid:etag="nc4711">
        <name>A1</name>
        <aces txid:etag="nc4711">
          <ace txid:etag="nc4711">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc5152">
        <name>A2</name>
        <aces txid:etag="nc5152">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
      <groups>
        <group>
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></sourcecode>
        </section>
        <section anchor="with-last-modified">
          <name>With last-modified</name>
          <t>To retrieve last-modified attributes for "acls", but not for "nacm",
a client might send:</t>
          <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="4"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:last-modified="?"/>
      <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
    </filter>
  </get-config>
</rpc>
]]></sourcecode>
          <t>If the server considers "acls", "acl", "aces" and "acl" to be
Versioned Nodes, the server's response to the request above
might look like:</t>
          <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="4"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:last-modified="2022-04-01T12:34:56.789012Z">
      <acl txid:last-modified="2022-03-20T16:20:11.333444Z">
        <name>A1</name>
        <aces txid:last-modified="2022-03-20T16:20:11.333444Z">
          <ace txid:last-modified="2022-03-20T16:20:11.333444Z">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:last-modified="2022-04-01T12:34:56.789012Z">
        <name>A2</name>
        <aces txid:last-modified="2022-04-01T12:34:56.789012Z">
          <ace txid:last-modified="2022-03-20T16:20:11.333444Z">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:last-modified="2022-04-01T12:34:56.789012Z">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:last-modified="2022-04-01T12:34:56.789012Z">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
      <groups>
        <group>
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></sourcecode>
        </section>
      </section>
      <section anchor="configuration-response-pruning">
        <name>Configuration Response Pruning</name>
        <t>A NETCONF client that already knows some txid values MAY request that
the configuration retrieval request is pruned with respect to the
client's prior knowledge.</t>
        <t>To retrieve only changes for "acls" that do not have the
last known etag txid value, a client might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:etag="nc5152">
        <acl txid:etag="nc4711">
          <name>A1</name>
          <aces txid:etag="nc4711"/>
        </acl>
        <acl txid:etag="nc5152">
          <name>A2</name>
          <aces txid:etag="nc5152"/>
        </acl>
    </filter>
  </get-config>
</rpc>
]]></sourcecode>
        <t>Assuming the NETCONF server configuration is the same as
in the previous rpc-reply example, the server's response to request
above might look like:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="6"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="="/>
  </data>
</rpc>
]]></sourcecode>
        <t>Or, if a configuration change has taken place under /acls since the
client was last updated, the server's response may look like:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="6"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc6614">
      <acl txid:etag="=">
        <name>A1</name>
      </acl>
      <acl txid:etag="nc6614">
        <name>A2</name>
        <aces txid:etag="nc6614">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <ipv4>
                <source-port>
                  <port>22</port>
                </source-port>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc6614">
            <name>R9</name>
            <matches>
              <ipv4>
                <source-port>
                  <port>830</port>
                </source-port>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></sourcecode>
        <t>In case the client provides a txid value for a non-versioned node,
the server needs to treat the node as having the same txid value as
the closest ancestor that does have a txid value.</t>
        <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="7"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
        <acl>
          <name>A2</name>
          <aces>
            <ace>
              <name>R7</name>
              <matches>
                <ipv4>
                  <dscp txid:etag="nc4711"/>
                </ipv4>
              </matches>
            </ace>
          </aces>
        </acl>
      </acls>
    </filter>
  </get-config>
</rpc>
]]></sourcecode>
        <t>If a txid value is specified for a leaf, and the txid value matches
(i.e. is identical to the server's txid value, or found earlier in
the server's Txid History), the leaf value is pruned.</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="7"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
      <acl>
        <name>A2</name>
        <aces>
          <ace>
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp txid:etag="="/>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc-reply>
]]></sourcecode>
      </section>
      <section anchor="configuration-change">
        <name>Configuration Change</name>
        <t>A client that wishes to update the ace R1 protocol to tcp might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8">
  <edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
               xmlns:ietf-netconf-txid=
                "urn:ietf:params:xml:ns:yang:ietf-netconf-txid">
    <target>
      <running/>
    </target>
    <test-option>test-then-set</test-option>
    <ietf-netconf-txid:with-etag>true</ietf-netconf-txid:with-etag>
    <config>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:etag="nc5152">
        <acl txid:etag="nc4711">
          <name>A1</name>
          <aces txid:etag="nc4711">
            <ace txid:etag="nc4711">
              <matches>
                <ipv4>
                  <protocol>6</protocol>
                </ipv4>
              </matches>
              <actions>
                <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                  acl:accept
                <forwarding>
              </actions>
            </ace>
          </aces>
        </acl>
      </acls>
    </config>
  </edit-config>
</rpc>
]]></sourcecode>
        <t>The server would update the protocol leaf in the running datastore,
and return an rpc-reply as follows:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="8"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="nc7688"/>
</rpc-reply>
]]></sourcecode>
        <t>A subsequent get-config request for "acls", with txid:etag="?" might
then return:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="9"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc7688">
      <acl txid:etag="nc7688">
        <name>A1</name>
        <aces txid:etag="nc7688">
          <ace txid:etag="nc7688">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>6</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc6614">
        <name>A2</name>
        <aces txid:etag="nc6614">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc6614">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>830</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></sourcecode>
        <t>In case the server at this point received a configuration change from
another source, such as a CLI operator, removing ace R8 and R9 in
acl A2, a subsequent get-config request for acls, with txid:etag="?"
might then return:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="9"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="cli2222">
      <acl txid:etag="nc7688">
        <name>A1</name>
        <aces txid:etag="nc7688">
          <ace txid:etag="nc7688">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>6</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="cli2222">
        <name>A2</name>
        <aces txid:etag="cli2222">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></sourcecode>
      </section>
      <section anchor="conditional-configuration-change">
        <name>Conditional Configuration Change</name>
        <t>If a client wishes to delete acl A1 if and only if its configuration
has not been altered since this client last synchronized its
configuration with the server, at which point it received the etag
"nc7688" for acl A1, regardless of any possible changes to other
acls, it might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="10"
     xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0"
     xmlns:ietf-netconf-txid=
       "urn:ietf:params:xml:ns:yang:ietf-netconf-txid">
  <edit-config>
    <target>
      <running/>
    </target>
    <test-option>test-then-set</test-option>
    <ietf-netconf-txid:with-etag>true</ietf-netconf-txid:with-etag>
    <config>
      <acls xmlns=
          "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
        <acl nc:operation="delete"
             txid:etag="nc7688">
          <name>A1</name>
        </acl>
      </acls>
    </config>
  </edit-config>
</rpc>
]]></sourcecode>
        <t>If acl A1 now has the etag txid value "nc7688", as expected by the
client, the transaction goes through, and the server responds
something like:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="10"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="nc8008"/>
</rpc-reply>
]]></sourcecode>
        <t>A subsequent get-config request for acls, with txid:etag="?" might
then return:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="11"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc8008">
      <acl txid:etag="cli2222">
        <name>A2</name>
        <aces txid:etag="cli2222">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></sourcecode>
        <t>In case acl A1 did not have the expected etag txid value "nc7688"
when the server processed this request, nor was the client's txid
value found later in the server's Txid History, then the server
rejects the transaction, and might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:acl=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
           xmlns:ietf-netconf-txid=
             "urn:ietf:params:xml:ns:yang:ietf-netconf-txid"
           message-id="11">
  <rpc-error>
    <error-type>protocol</error-type>
    <error-tag>operation-failed</error-tag>
    <error-severity>error</error-severity>
    <error-info>
      <ietf-netconf-txid:txid-value-mismatch-error-info>
        <ietf-netconf-txid:mismatch-path>
          /acl:acls/acl:acl[acl:name="A1"]
        </ietf-netconf-txid:mismatch-path>
        <ietf-netconf-txid:mismatch-etag-value>
          cli6912
        </ietf-netconf-txid:mismatch-etag-value>
      </ietf-netconf-txid:txid-value-mismatch-error-info>
    </error-info>
  </rpc-error>
</rpc-reply>
]]></sourcecode>
      </section>
      <section anchor="reading-from-the-candidate-datastore">
        <name>Reading from the Candidate Datastore</name>
        <t>Let's assume that a get-config towards the running datastore
currently contains the following data and txid values:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="12"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc4711">
      <acl txid:etag="nc4711">
        <name>A1</name>
        <aces txid:etag="nc4711">
          <ace txid:etag="nc4711">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc2219">
            <name>R2</name>
            <matches>
              <ipv4>
                <dscp>21</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc-reply>
]]></sourcecode>
        <t>A client issues discard-changes (to make the candidate datastore
equal to the running datastore), and issues an edit-config to
change the R1 protocol from udp (17) to tcp (6), and then executes a
get-config with the txid-request attribute "?" set on the acl A1,
the server might respond:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="13"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
      <acl txid:etag="!">
        <name>A1</name>
        <aces txid:etag="!">
          <ace txid:etag="!">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>6</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc2219">
            <name>R2</name>
            <matches>
              <ipv4>
                <dscp>21</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc-reply>
]]></sourcecode>
        <t>Here, the txid-unknown value "!" is sent by the server.  This
particular server implementation does not know beforehand which
txid value would be used for this versioned node after commit.
It will be a value different from the current corresponding
txid value in the running datastore.</t>
        <t>In case the server is able to predict the txid value that would
be used for the versioned node after commit, it could respond
with that value instead.  Let's say the server knows the txid
would be "7688" if the candidate datastore was committed without
further changes, then it would respond with that value in each
place where the example shows "!" above.</t>
      </section>
      <section anchor="commit">
        <name>Commit</name>
        <t>The client MAY request that the new etag txid value is returned as an
attribute on the ok response for a successful commit.  The client
requests this by adding with-etag to the commit operation.</t>
        <t>For example, a client might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc message-id="14"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    xmlns:ietf-netconf-txid=
      "urn:ietf:params:xml:ns:yang:ietf-netconf-txid"
  <commit>
    <ietf-netconf-txid:with-etag>true</ietf-netconf-txid:with-etag>
  </commit>
</rpc>
]]></sourcecode>
        <t>Assuming the server accepted the transaction, it might respond:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="14"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
    xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="nc8008"/>
</rpc-reply>
]]></sourcecode>
      </section>
      <section anchor="yang-push">
        <name>YANG-Push</name>
        <t>A client MAY request that the updates for one or more YANG-Push
subscriptions are annotated with the txid values.  The request might
look like this:</t>
        <sourcecode type="xml"><![CDATA[
<netconf:rpc message-id="16"
             xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
  <establish-subscription
      xmlns=
        "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"
      xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push"
      xmlns:ietf-netconf-txid-yp=
        "urn:ietf:params:xml:ns:yang:ietf-txid-yang-push">
    <yp:datastore
        xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
      ds:running
    </yp:datastore>
    <yp:datastore-xpath-filter
        xmlns:acl=
          "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
      /acl:acls
    </yp:datastore-xpath-filter>
    <yp:on-change/>
    <ietf-netconf-txid-yp:with-etag>
      true
    </ietf-netconf-txid-yp:with-etag>
  </establish-subscription>
</netconf:rpc>
]]></sourcecode>
        <t>A server might send a subscription update like this:</t>
        <sourcecode type="xml"><![CDATA[
<notification
  xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0"
  xmlns:ietf-netconf-txid-yp=
    "urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push">
  <eventTime>2022-04-04T06:00:24.16Z</eventTime>
  <push-change-update
      xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push">
    <id>89</id>
    <datastore-changes>
      <yang-patch>
        <patch-id>0</patch-id>
        <edit>
          <edit-id>edit1</edit-id>
          <operation>delete</operation>
          <target xmlns:acl=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
            /acl:acls
          </target>
          <value>
            <acl xmlns=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
              <name>A1</name>
            </acl>
          </value>
        </edit>
        <ietf-netconf-txid-yp:etag-value>
          nc8008
        </ietf-netconf-txid-yp:etag-value>
      </yang-patch>
    </datastore-changes>
  </push-change-update>
</notification>
]]></sourcecode>
        <t>In case a client wishes to modify a previous subscription request in
order to no longer receive YANG-Push subscription updates, the request
might look like this:</t>
        <sourcecode type="xml"><![CDATA[
<rpc message-id="17"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <modify-subscription
      xmlns=
        "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"
      xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push"
      xmlns:ietf-netconf-txid-yp=
        "urn:ietf:params:xml:ns:yang:ietf-txid-yang-push">
    <id>1011</id>
    <yp:datastore
        xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
      ds:running
    </yp:datastore>
    <ietf-netconf-txid-yp:with-etag>
      false
    </ietf-netconf-txid-yp:with-etag>
  </modify-subscription>
</rpc>
]]></sourcecode>
      </section>
      <section anchor="nmda-compare">
        <name>NMDA Compare</name>
        <t>The following example is taken from section 5 of <xref target="RFC9144"/>.
It compares the difference between the operational and intended
datastores for a subtree under "interfaces".</t>
        <t>In this version of the example, the client requests that txid
values, in this case etag-values, are annotated to the result.</t>
        <sourcecode type="xml"><![CDATA[
<rpc message-id="101"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <compare xmlns="urn:ietf:params:xml:ns:yang:ietf-nmda-compare"
      xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"
      xmlns:ietf-netconf-txid-nmda-compare=
        "urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare">
    <source>ds:operational</source>
    <target>ds:intended</target>
    <report-origin/>
    <ietf-netconf-txid-nmda-compare:with-etag>
      true
    </ietf-netconf-txid-nmda-compare:with-etag>
    <xpath-filter
        xmlns:if="urn:ietf:params:xml:ns:yang:ietf-interfaces">
      /if:interfaces
    </xpath-filter>
  </compare>
</rpc>
]]></sourcecode>
        <t>RPC reply when a difference is detected:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
    message-id="101">
  <differences
    xmlns="urn:ietf:params:xml:ns:yang:ietf-nmda-compare"
    xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin"
    xmlns:ietf-netconf-txid-nmda-compare=
      "urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare">
    <yang-patch>
      <patch-id>interface status</patch-id>
      <comment>
        diff between operational (source) and intended (target),
        with txid values taken from intended.
      </comment>
      <edit>
        <edit-id>1</edit-id>
        <operation>replace</operation>
        <target>/ietf-interfaces:interface=eth0/enabled</target>
        <value>
          <if:enabled>false</if:enabled>
        </value>
        <source-value>
          <if:enabled or:origin="or:learned">true</if:enabled>
        </source-value>
        <ietf-netconf-txid-nmda-compare:etag-value>
          4004
        </ietf-netconf-txid-nmda-compare:etag-value>
      </edit>
      <edit>
        <edit-id>2</edit-id>
        <operation>create</operation>
        <target>/ietf-interfaces:interface=eth0/description</target>
        <value>
          <if:description>ip interface</if:description>
        </value>
        <ietf-netconf-txid-nmda-compare:etag-value>
          8008
        </ietf-netconf-txid-nmda-compare:etag-value>
      </edit>
    </yang-patch>
  </differences>
</rpc-reply>
]]></sourcecode>
        <t>The same response in RESTCONF (using JSON format):</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 24 Jan 2019 20:56:30 GMT
Server: example-server
Content-Type: application/yang-data+json

{ "ietf-nmda-compare:output" : {
    "differences" : {
      "ietf-yang-patch:yang-patch" : {
        "patch-id" : "interface status",
        "comment" : "diff between intended (source) and operational",
        "edit" : [
          {
            "edit-id" : "1",
            "operation" : "replace",
            "target" : "/ietf-interfaces:interface=eth0/enabled",
            "value" : {
              "ietf-interfaces:interface/enabled" : "false"
            },
            "source-value" : {
              "ietf-interfaces:interface/enabled" : "true",
              "@ietf-interfaces:interface/enabled" : {
                "ietf-origin:origin" : "ietf-origin:learned"
              }
            },
            "ietf-netconf-txid-nmda-compare:etag-value": "4004"
          },
          {
            "edit-id" : "2",
            "operation" : "create",
            "target" : "/ietf-interfaces:interface=eth0/description",
            "value" : {
              "ietf-interface:interface/description" : "ip interface"
            },
            "ietf-netconf-txid-nmda-compare:etag-value": "8008"
          }
        ]
      }
    }
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="yang-modules">
      <name>YANG Modules</name>
      <section anchor="base-module-for-txid-in-netconf">
        <name>Base module for txid in NETCONF</name>
        <sourcecode type="yang" markers="true" name="ietf-netconf-txid@2023-03-01.yang"><![CDATA[
module ietf-netconf-txid {
  yang-version 1.1;
  namespace 
    'urn:ietf:params:xml:ns:yang:ietf-netconf-txid';
  prefix ietf-netconf-txid;

  import ietf-netconf {
    prefix nc;
  }

  import ietf-netconf-nmda {
    prefix ncds;
  }

  import ietf-yang-structure-ext {
    prefix sx;
  }

  import ietf-yang-types {
    prefix yang;
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";

  contact
    "WG Web:   <https://datatracker.ietf.org/wg/netconf/>
     WG List:  <netconf@ietf.org>

     Author:   Jan Lindblad
               <mailto:jlindbla@cisco.com>";

  description
    "NETCONF Transaction ID aware operations for NMDA.

     Copyright (c) 2022 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.
     ";

  revision 2023-03-01 {
    description
      "Initial revision";
    reference
      "RFC XXXX: Transaction ID Mechanism for NETCONF";
  }

  feature last-modified {
    description "Servers implementing this module MUST support the
      etag txid mechanism.  Servers MAY also support the 
      last-modified txid mechanism.  Support is shown by announcing
      this feature.";
  }

  extension versioned-node {
    description "This statement is used by servers to declare that a
      the server is maintaining a Txid for the YANG node with this
      statement.  Which YANG nodes are versioned nodes may be useful
      information for clients (especially during development).
      
      Servers are not required to use this statement to declare
      which nodes are versioned nodes.
      
      Example of use:

      container interfaces {
        ietf-netconf-txid:versioned-node;
        ...
      }
      ";
  }

  typedef etag-t {
    type string {
      pattern ".* .*" {
        modifier invert-match;
      }
      pattern '.*".*' {
        modifier invert-match;
      }
      pattern ".*\\.*" {
        modifier invert-match;
      }
    }
    description 
      "Unique Entity-tag txid value representing a specific 
      transaction.  Could be any string that does not contain 
      spaces, double quotes or backslash.
      
      The txid values '?', '!' and '=' have special meaning:

      '?' This txid value is used by clients and is 
          guaranteed not to match any txid on the server.

      '!' This txid value used by servers to indicate 
          the node in the candidate datastore has changed
          relative to the running datastore, but not yet received
          a new txid value on the server.

      '=' This txid value used by servers to indicate 
          that contents has been pruned due to txid match
          between client and server.
      ";
  }

  typedef last-modified-t {
    type union {
      type yang:date-and-time;
      type enumeration {
        enum ? {
          description "Txid value used by clients that is 
            guaranteed not to match any txid on the server.";
        }
        enum ! {
          description "Txid value used by servers to indicate 
            the node in the candidate datastore has changed
            relative to the running datastore, but not yet received
            a new txid value on the server.";
        }
        enum = {
          description "Txid value used by servers to indicate 
            that contents has been pruned due to txid match
            between client and server.";
        }
      }
    }
    description
      "Last-modified txid value representing a specific transaction.
       The txid values '?', '!' and '=' have special meaning.";
  }

  grouping txid-grouping {
    leaf with-etag {
      type boolean;
      description
        "Indicates whether the client requests the server to include
         a txid:etag txid attribute when the configuration has 
         changed.";
    }
    leaf with-last-modified {
      if-feature last-modified;
      type boolean;
      description 
        "Indicates whether the client requests the server to include
         a txid:last-modified attribute when the configuration has 
         changed.";
    }
    description
      "Grouping for txid mechanisms, to be augmented into 
       rpcs that modify configuration data stores.";
  }

  grouping txid-value-grouping {
    leaf etag-value {
      type etag-t;
      description
        "Indicates server's txid value for a YANG node.";
    }
    leaf last-modified-value {
      if-feature last-modified;
      type last-modified-t;
      description
        "Indicates server's txid value for a YANG node.";
    }
    description
      "Grouping for txid mechanisms, to be augmented into 
       output of rpcs that return txid metadata for configuration
       data stores.";
  }

  augment /nc:edit-config/nc:input {
    uses txid-grouping;
    description
      "Injects the txid mechanisms into the 
      edit-config operation";
  }

  augment /nc:commit/nc:input {
    uses txid-grouping;
    description
      "Injects the txid mechanisms into the 
      commit operation";
  }

  augment /ncds:edit-data/ncds:input {
    uses txid-grouping;
    description
      "Injects the txid mechanisms into the 
      edit-data operation";
  }

  sx:structure txid-value-mismatch-error-info {
    container txid-value-mismatch-error-info {
      description
         "This error is returned by a NETCONF server when a client
          sends a configuration change request, with the additonal
          condition that the server aborts the transaction if the
          server's configuration has changed from what the client
          expects, and the configuration is found not to actually
          not match the client's expectation.";
      leaf mismatch-path {
        type instance-identifier;
        description
          "Indicates the YANG path to the element with a mismatching
           etag txid value.";
      }
      leaf mismatch-etag-value {
        type etag-t;
        description
          "Indicates server's txid value of the etag 
          attribute for one mismatching element.";
      }
      leaf mismatch-last-modified-value {
        if-feature last-modified;
        type last-modified-t;
        description
          "Indicates server's txid value of the last-modified 
          attribute for one mismatching element.";
      }
    }
  }
}
]]></sourcecode>
      </section>
      <section anchor="additional-support-for-txid-in-yang-push">
        <name>Additional support for txid in YANG-Push</name>
        <sourcecode type="yang" markers="true" name="ietf-netconf-txid-yang-push@2022-04-01.yang"><![CDATA[
module ietf-netconf-txid-yang-push {
  yang-version 1.1;
  namespace 
    'urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push';
  prefix ietf-netconf-txid-yp;

  import ietf-subscribed-notifications {
    prefix sn;
    reference
      "RFC 8639: Subscription to YANG Notifications";
  }

  import ietf-yang-push {
    prefix yp;
    reference
      "RFC 8641: Subscriptions to YANG Datastores";
  }

  import ietf-netconf-txid {
    prefix ietf-netconf-txid;
    reference
      "RFC XXXX: Transaction ID Mechanism for NETCONF";
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";

  contact
    "WG Web:   <https://datatracker.ietf.org/wg/netconf/>
     WG List:  <netconf@ietf.org>

     Author:   Jan Lindblad
               <mailto:jlindbla@cisco.com>";

  description
    "NETCONF Transaction ID aware operations for YANG Push.

     Copyright (c) 2022 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.
     ";

  revision 2022-04-01 {
    description
      "Initial revision";
    reference
      "RFC XXXX: Transaction ID Mechanism for NETCONF";
  }

  augment "/sn:establish-subscription/sn:input" {
    description
      "This augmentation adds additional subscription parameters
       that apply specifically to datastore updates to RPC input.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/sn:modify-subscription/sn:input" {
    description
      "This augmentation adds additional subscription parameters
       specific to datastore updates.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/sn:subscriptions/sn:subscription" {
    description
      "This augmentation adds additional subscription parameters
       specific to datastore updates.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/yp:push-change-update/yp:datastore-changes/" +
          "yp:yang-patch" {
    description
      "This augmentation makes it possible for servers to return
      txid-values.";
    uses ietf-netconf-txid:txid-value-grouping;
  }
}
]]></sourcecode>
      </section>
      <section anchor="additional-support-for-txid-in-nmda-compare">
        <name>Additional support for txid in NMDA Compare</name>
        <sourcecode type="yang" markers="true" name="ietf-netconf-txid-nmda-compare@2023-05-01.yang"><![CDATA[
module ietf-netconf-txid-nmda-compare {
  yang-version 1.1;
  namespace 
    'urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare';
  prefix ietf-netconf-txid-nmda-compare;

  import ietf-nmda-compare {
    prefix cmp;
    reference
      "RFC 9144: Comparison of Network Management Datastore 
       Architecture (NMDA) Datastores";
  }

  import ietf-netconf-txid {
    prefix ietf-netconf-txid;
    reference
      "RFC XXXX: Transaction ID Mechanism for NETCONF";
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";

  contact
    "WG Web:   <https://datatracker.ietf.org/wg/netconf/>
     WG List:  <netconf@ietf.org>

     Author:   Jan Lindblad
               <mailto:jlindbla@cisco.com>";

  description
    "NETCONF Transaction ID aware operations for NMDA Compare.

     Copyright (c) 2022 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.
     ";

  revision 2023-05-01 {
    description
      "Initial revision";
    reference
      "RFC XXXX: Transaction ID Mechanism for NETCONF";
  }

  augment "/cmp:compare/cmp:input" {
    description
      "This augmentation makes it possible for clients to request
       txids to be returned.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/cmp:compare/cmp:output/cmp:compare-response/" +
          "cmp:differences/cmp:differences/cmp:yang-patch/cmp:edit" {
    description
      "This augmentation makes it possible for servers to return
      txid-values.";
    container most-recent {
      description "The txid value returned by the server MUST be the
        txid value pertaining to the target node in the source or 
        target datastores that is the most recent.";
      uses ietf-netconf-txid:txid-value-grouping;
    }
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The YANG modules specified in this document define YANG types, groupings, structures and additional RPC parameters for data that is designed to be accessed via network management protocols such as NETCONF <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/>. The lowest NETCONF layer is the secure transport layer, and the mandatory-to-implement secure transport is Secure Shell (SSH) <xref target="RFC6242"/>. The lowest RESTCONF layer is HTTPS, and the mandatory-to-implement secure transport is TLS <xref target="RFC8446"/>.</t>
      <t>The Network Configuration Access Control Model (NACM) <xref target="RFC8341"/> provides the means to restrict access for particular NETCONF or RESTCONF users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content.</t>
      <t>In the YANG modules published with this document, there is no configuration, state data, new RPCs or notifications.  This document defines additional XML attributes and headers, however, that merit consideration from a security perspective.</t>
      <section anchor="nacm-access-control">
        <name>NACM Access Control</name>
        <t>NACM, <xref target="RFC8341"/>, access control
processing happens as usual, independently of any txid handling, if
supported by the server and enabled by the NACM configuration.</t>
        <t>It should be pointed out however, that when txid information is added
to a reply, it may occasionally be possible for a client to deduce
that a configuration change has happened in some part of the
configuration to which it has no access rights.</t>
        <t>For example, a client may notice that the root node txid has changed
while none of the subtrees it has access to have changed, and thereby
conclude that someone else has made a change to some part of the
configuration that is not acessible by the client.</t>
        <section anchor="hash-based-txid-algorithms">
          <name>Hash-based Txid Algorithms</name>
          <t>Servers that implement NACM and choose to implement a hash-based txid
algorithm over the configuration may reveal to a client that the
configuration of a subtree that the client has no access to is the
same as it was at an earlier point in time.</t>
          <t>For example, a client with partial access to the configuration might
observe that the root node txid was 1234. After a few configuration
changes by other parties, the client may again observe that the root
node txid is 1234.  It may then deduce that the configuration is the
same as earlier, even in the parts of the configuration it has no
access to.</t>
          <t>In some use cases, this behavior may be considered a feature, since it
allows a security client to verify that the configuration is the same
as expected, without transmitting or storing the actual configuration.</t>
        </section>
      </section>
      <section anchor="unchanged-configuration">
        <name>Unchanged Configuration</name>
        <t>It will also be possible for clients to deduce that a configuration
change has not happened during some period, by simply observing that
the root node (or other subtree) txid remains unchanged.  This is
true regardless of NACM being deployed or choice of txid algorithm.</t>
        <t>Again, there may be use cases where this behavior may be considered a
feature, since it allows a security client to verify that the
configuration is the same as expected, without transmitting or storing
the actual configuration.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="netconf-capability-urn">
        <name>NETCONF Capability URN</name>
        <t>This document requets IANA to register the following capability identifier URN in
the 'Network Configuration Protocol (NETCONF) Capability URNs'
registry:</t>
        <artwork><![CDATA[
Capability: :txid
Capability Identifier: urn:ietf:params:netconf:capability:txid:1.0
Reference: RFC XXXX
]]></artwork>
      </section>
      <section anchor="ietf-xml-registry">
        <name>IETF XML Registry</name>
        <t>This document request IANA to register four XML namespace URIs in the "ns"
subregistry within the "IETF XML Registry" <xref target="RFC3688"/>:</t>
        <artwork><![CDATA[
  URI: urn:ietf:params:xml:ns:netconf:txid:1.0
  Registrant Contact: The IESG.
  XML: N/A, the requested URIs are XML namespaces.

  URI: urn:ietf:params:xml:ns:yang:ietf-netconf-txid
  Registrant Contact: The IESG.
  XML: N/A, the requested URIs are XML namespaces.

  URI: urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push
  Registrant Contact: The IESG.
  XML: N/A, the requested URIs are XML namespaces.

  URI: urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare
  Registrant Contact: The IESG.
  XML: N/A, the requested URIs are XML namespaces.
]]></artwork>
      </section>
      <section anchor="yang-module-names">
        <name>YANG Module Names</name>
        <t>This document requests IANA to register three module names in the "YANG
Module Names" subregistry <xref target="RFC6020"/> within the "YANG Parameters"
registry.</t>
        <artwork><![CDATA[
  name: ietf-netconf-txid
  prefix: ietf-netconf-txid
  namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-txid
  maintained by IANA? N
  RFC: XXXX

  name: ietf-netconf-txid-yp
  prefix: ietf-netconf-txid-yp
  namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push
  maintained by IANA? N
  RFC: XXXX

  name: ietf-netconf-txid-nmda-compare
  prefix: ietf-netconf-txid-nmda-compare
  namespace:
    urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare
  maintained by IANA? N
  RFC: XXXX
]]></artwork>
      </section>
    </section>
    <section anchor="changes">
      <name>Changes</name>
      <section anchor="major-changes-in-07-since-06">
        <name>Major changes in -07 since -06</name>
        <ul spacing="normal">
          <li>Changed "monotonically increasing" to "strictly increasing" in
multiple locations. Removed recommendation about timestamps in the
last-modified txid mechanism being similar to wall clock time.</li>
          <li>Removed two clumsily formulated sentences stating that clients MUST NOT infer temporal order from txid values.  The remaining wording states that some servers use sequences of txid values that may appear random to outside observers.</li>
          <li>Added brief explanation that entitlements are sometimes also
known as "licenses".</li>
          <li>Added introductory section on "How to Read this Document"</li>
          <li>Added an example to highlight that the etag txid values can have different formats, and do not need to consist of strictly increasing integers, as in most of the examples.</li>
          <li>Changed WG URLs in YANG modules to new datatracker format, e.g. https://datatracker.ietf.org/wg/netconf/</li>
        </ul>
      </section>
      <section anchor="major-changes-in-06-since-05">
        <name>Major changes in -06 since -05</name>
        <ul spacing="normal">
          <li>Many language, style, spelling and formatting improvements thanks
to reviews by Reshad Rahman and Med Boucadair</li>
          <li>Clarified Txid History Size Consideration example</li>
        </ul>
      </section>
      <section anchor="major-changes-in-05-since-04">
        <name>Major changes in -05 since -04</name>
        <ul spacing="normal">
          <li>Corrected namespace for reference to elements in ietf-yang-push</li>
        </ul>
      </section>
      <section anchor="major-changes-in-04-since-03">
        <name>Major changes in -04 since -03</name>
        <ul spacing="normal">
          <li>Updated security considerations.</li>
          <li>Added several normative RFC references.</li>
        </ul>
      </section>
      <section anchor="major-changes-in-03-since-02">
        <name>Major changes in -03 since -02</name>
        <ul spacing="normal">
          <li>Updated language slightly regarding format of etag values, and some
recommendations for implementors that support etags in multiple management
protocols (NETCONF, RESTCONF, ...) and encodings (XML, JSON, ...).</li>
          <li>Added missing normative RFC references.</li>
          <li>Corrected the YANG-push namespace reference.</li>
        </ul>
      </section>
      <section anchor="major-changes-in-02-since-01">
        <name>Major changes in -02 since -01</name>
        <ul spacing="normal">
          <li>Added optional to implement Txid History concept in order to make
the algorithm both more efficient and less verbose.  Servers may
still choose a Txid History size of zero, which makes the server
behavior the same as in earlier versions of this document.
Implementations that use txids consisting of a monotonically
increasing integer or timestamp will be able to determine the sequnce
of transactions in the history directly, making this trivially simple
to implement.</li>
          <li>Added extension statement versioned-node, which servers may use to
declare which YANG tree nodes are Versioned Nodes.  This is entirely
optional, however, but possibly useful to client developers.</li>
          <li>Renamed YANG feature ietf-netconf-txid:txid-last-modified to
ietf-netconf-txid:last-modified in order to reduce redundant mentions
of "txid".</li>
        </ul>
      </section>
      <section anchor="major-changes-in-01-since-00">
        <name>Major changes in -01 since -00</name>
        <ul spacing="normal">
          <li>Changed YANG-push txid mechanism to use a simple leaf rather than
an attribute to convey txid information.  This is preferable since
YANG-push content may be requested using other protocols than NETCONF
and other encodings than XML.  By removing the need for XML
attributes in this context, the mechanism becomes significantly
more portable.</li>
          <li>Added a section and YANG module augmenting the RFC9144 NMDA
datastore compare operation to allow request and reply with txid
information.  This too is done with augments of plain leafs for
maximum portability.</li>
          <li>Added note clarifying that the txid attributes used in the XML
encoding are never used in JSON (since RESTCONF uses HTTP headers
instead).</li>
          <li>Added note clarifying that pruning happens when client and server
txids <em>match</em>, since the server sending information to the client
only makes sense when the information on the client is out of date.</li>
          <li>Added note clarifying that this entire document is about config
true data only.</li>
          <li>Rephrased slightly when referring to the candidate datastore to
keep making sense in the event that private candidate datastores
become a reality in the future.</li>
          <li>Added a note early on to more clearly lay out the structure of this
document, with a first part about the generic mechanism part, and a
second part about the two specific txid mechanisms.</li>
          <li>Corrected acl data model examples to conform to their YANG module.</li>
        </ul>
      </section>
      <section anchor="major-changes-in-draft-ietf-netconf-transaction-id-00-since-02">
        <name>Major changes in draft-ietf-netconf-transaction-id-00 since -02</name>
        <ul spacing="normal">
          <li>Changed the logic around how txids are handled in the candidate
datastore, both when reading (get-config, get-data) and writing
(edit-config, edit-data). Introduced a special "txid-unknown"
value "!".</li>
          <li>Changed the logic of copy-config to be similar to edit-config.</li>
          <li>Clarified how txid values interact with when-dependencies
together with default values.</li>
          <li>Added content to security considerations.</li>
          <li>Added a high-level example for YANG-Push subscriptions with txid.</li>
          <li>Updated language about error-info sent at txid mismatch in an
edit-config: error-info with mismatch details MUST be sent when
mismatch detected, and that the server can choose one of the txid
mismatch occurrences if there is more than one.</li>
          <li>Some rewording and minor additions for clarification, based
on mailing list feedback.</li>
          <li>Divided RFC references into normative and informative.</li>
          <li>Corrected a logic error in the second figure (figure 6) in the
"Conditional Transactions" section</li>
        </ul>
      </section>
      <section anchor="major-changes-in-02-since-01-1">
        <name>Major changes in -02 since -01</name>
        <ul spacing="normal">
          <li>A last-modified txid mechanism has been added (back).  This
mechanism aligns well with the Last-Modified mechanism defined in
RESTCONF <xref target="RFC8040"/>,
but is not a carbon copy.</li>
          <li>YANG-Push functionality has been added.  This allows YANG-Push
users to receive txid updates as part of the configuration updates.
This functionality comes in a separate YANG module, to allow
implementors to cleanly keep all this functionality out.</li>
          <li>Changed name of "versioned elements". They are now called
"Versioned Nodes".</li>
          <li>Clarified txid behavior for transactions toward the Candidate
datastore, and some not so common situations, such
as when a client specifies a txid for a non-versioned node, and
when there are when-statement dependencies across subtrees.</li>
          <li>Examples provided for the abstract mechanism level with simple
message flow diagrams.</li>
          <li>More examples on protocol level, and with ietf-interfaces as
example target module replaced with ietf-access-control to reduce
confusion.</li>
          <li>Explicit list of XPaths to clearly state where etag or
last-modified attributes may be added by clients and servers.</li>
          <li>Document introduction restructured to remove duplication between
sections and to allow multiple (etag and last-modified) txid
mechanisms.</li>
          <li>Moved the actual YANG module code into proper module files that
are included in the source document.  These modules can be compiled
as proper modules without any extraction tools.</li>
        </ul>
      </section>
      <section anchor="major-changes-in-01-since-00-1">
        <name>Major changes in -01 since -00</name>
        <ul spacing="normal">
          <li>Updated the text on numerous points in order to answer questions
that appeared on the mailing list.</li>
          <li>Changed the document structure into a general transaction id part
and one etag specific part.</li>
          <li>Renamed entag attribute to etag, prefix to txid, namespace to
urn:ietf:params:xml:ns:yang:ietf-netconf-txid.</li>
          <li>Set capability string to
urn:ietf:params:netconf:capability:txid:1.0</li>
          <li>Changed YANG module name, namespace and prefix to match names above.</li>
          <li>Harmonized/slightly adjusted etag value space with RFC 7232 and
RFC 8040.</li>
          <li>Removed all text discussing etag values provided by the client
(although this is still an interesting idea, if you ask the author)</li>
          <li>Clarified the etag attribute mechanism, especially when it comes to
matching against non-versioned elements, its cascading upwards in the
tree and secondary effects from when- and choice-statements.</li>
          <li>Added a mechanism for returning the server assigned etag value in
get-config and get-data.</li>
          <li>Added section describing how the NETCONF discard-changes,
copy-config, delete-config and commit operations work with respect to
etags.</li>
          <li>Added IANA Considerations section.</li>
          <li>Removed all comments about open questions.</li>
        </ul>
      </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="RFC4741">
          <front>
            <title>NETCONF Configuration Protocol</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <date month="December" year="2006"/>
            <abstract>
              <t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices. It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages. The NETCONF protocol operations are realized on top of a simple Remote Procedure Call (RPC) layer. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4741"/>
          <seriesInfo name="DOI" value="10.17487/RFC4741"/>
        </reference>
        <reference anchor="RFC6241">
          <front>
            <title>Network Configuration Protocol (NETCONF)</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <author fullname="A. Bierman" initials="A." role="editor" surname="Bierman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices. It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages. The NETCONF protocol operations are realized as remote procedure calls (RPCs). This document obsoletes RFC 4741. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6241"/>
          <seriesInfo name="DOI" value="10.17487/RFC6241"/>
        </reference>
        <reference anchor="RFC6242">
          <front>
            <title>Using the NETCONF Protocol over Secure Shell (SSH)</title>
            <author fullname="M. Wasserman" initials="M." surname="Wasserman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document describes a method for invoking and running the Network Configuration Protocol (NETCONF) within a Secure Shell (SSH) session as an SSH subsystem. This document obsoletes RFC 4742. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6242"/>
          <seriesInfo name="DOI" value="10.17487/RFC6242"/>
        </reference>
        <reference anchor="RFC6991">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document introduces a collection of common data types to be used with the YANG data modeling language. This document obsoletes RFC 6021.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6991"/>
          <seriesInfo name="DOI" value="10.17487/RFC6991"/>
        </reference>
        <reference anchor="RFC7950">
          <front>
            <title>The YANG 1.1 Data Modeling Language</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7950"/>
          <seriesInfo name="DOI" value="10.17487/RFC7950"/>
        </reference>
        <reference anchor="RFC8040">
          <front>
            <title>RESTCONF Protocol</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes an HTTP-based protocol that provides a programmatic interface for accessing data defined in YANG, using the datastore concepts defined in the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8040"/>
          <seriesInfo name="DOI" value="10.17487/RFC8040"/>
        </reference>
        <reference anchor="RFC8072">
          <front>
            <title>YANG Patch Media Type</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>This document describes a method for applying patches to configuration datastores using data defined with the YANG data modeling language.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8072"/>
          <seriesInfo name="DOI" value="10.17487/RFC8072"/>
        </reference>
        <reference anchor="RFC8341">
          <front>
            <title>Network Configuration Access Control Model</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>The standardization of network configuration interfaces for use with the Network Configuration Protocol (NETCONF) or the RESTCONF protocol requires a structured and secure operating environment that promotes human usability and multi-vendor interoperability. There is a need for standard mechanisms to restrict NETCONF or RESTCONF protocol access for particular users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content. This document defines such an access control model.</t>
              <t>This document obsoletes RFC 6536.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="91"/>
          <seriesInfo name="RFC" value="8341"/>
          <seriesInfo name="DOI" value="10.17487/RFC8341"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8526">
          <front>
            <title>NETCONF Extensions to Support the Network Management Datastore Architecture</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <author fullname="P. Shafer" initials="P." surname="Shafer"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="R. Wilton" initials="R." surname="Wilton"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>This document extends the Network Configuration Protocol (NETCONF) defined in RFC 6241 in order to support the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
              <t>This document updates RFCs 6241 and 7950. The update to RFC 6241 adds new and operations and augments existing,, and operations. The update to RFC 7950 requires the usage of the YANG library (described in RFC 8525) by NETCONF servers implementing the NMDA.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8526"/>
          <seriesInfo name="DOI" value="10.17487/RFC8526"/>
        </reference>
        <reference anchor="RFC8639">
          <front>
            <title>Subscription to YANG Notifications</title>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="A. Gonzalez Prieto" initials="A." surname="Gonzalez Prieto"/>
            <author fullname="E. Nilsen-Nygaard" initials="E." surname="Nilsen-Nygaard"/>
            <author fullname="A. Tripathy" initials="A." surname="Tripathy"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document defines a YANG data model and associated mechanisms enabling subscriber-specific subscriptions to a publisher's event streams. Applying these elements allows a subscriber to request and receive a continuous, customized feed of publisher-generated information.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8639"/>
          <seriesInfo name="DOI" value="10.17487/RFC8639"/>
        </reference>
        <reference anchor="RFC8641">
          <front>
            <title>Subscription to YANG Notifications for Datastore Updates</title>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document describes a mechanism that allows subscriber applications to request a continuous and customized stream of updates from a YANG datastore. Providing such visibility into updates enables new capabilities based on the remote mirroring and monitoring of configuration and operational state.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8641"/>
          <seriesInfo name="DOI" value="10.17487/RFC8641"/>
        </reference>
        <reference anchor="RFC8791">
          <front>
            <title>YANG Data Structure Extensions</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Björklund" initials="M." surname="Björklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document describes YANG mechanisms for defining abstract data structures with YANG.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8791"/>
          <seriesInfo name="DOI" value="10.17487/RFC8791"/>
        </reference>
        <reference anchor="RFC9144">
          <front>
            <title>Comparison of Network Management Datastore Architecture (NMDA) Datastores</title>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="Y. Qu" initials="Y." surname="Qu"/>
            <author fullname="J. Tantsura" initials="J." surname="Tantsura"/>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <date month="December" year="2021"/>
            <abstract>
              <t>This document defines a Remote Procedure Call (RPC) operation to compare management datastores that comply with the Network Management Datastore Architecture (NMDA).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9144"/>
          <seriesInfo name="DOI" value="10.17487/RFC9144"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</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 describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC3688">
          <front>
            <title>The IETF XML Registry</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <date month="January" year="2004"/>
            <abstract>
              <t>This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="81"/>
          <seriesInfo name="RFC" value="3688"/>
          <seriesInfo name="DOI" value="10.17487/RFC3688"/>
        </reference>
        <reference anchor="RFC6020">
          <front>
            <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="October" year="2010"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6020"/>
          <seriesInfo name="DOI" value="10.17487/RFC6020"/>
        </reference>
        <reference anchor="RFC7232">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP/1.1 conditional requests, including metadata header fields for indicating state changes, request header fields for making preconditions on such state, and rules for constructing the responses to a conditional request when one or more preconditions evaluate to false.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7232"/>
          <seriesInfo name="DOI" value="10.17487/RFC7232"/>
        </reference>
        <reference anchor="RFC7952">
          <front>
            <title>Defining and Using Metadata with YANG</title>
            <author fullname="L. Lhotka" initials="L." surname="Lhotka"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document defines a YANG extension that allows for defining metadata annotations in YANG modules. The document also specifies XML and JSON encoding of annotations and other rules for annotating instances of YANG data nodes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7952"/>
          <seriesInfo name="DOI" value="10.17487/RFC7952"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author wishes to thank Benoit Claise for making this work happen,
and the following individuals, who all provided helpful comments
and reviews:
Per Andersson, James Cumming, Kent Watsen, Andy Bierman, Robert Wilton,
Qiufang Ma, Jason Sterne, Robert Varga, Reshad Rahman and Med Boucadair.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+296XrbVpYo+n8/BcL8sFRN0pKseFBsVymyU3EdT20rNXRO
vlsQAUqISYAFgJJZbvWz3Ce4D3HOi9017gEAKUqyE5dL/rorFAnsYe211zwM
BgNT1XGe/D/xpMjTvagu56nJZiV9quqdra0HWzumzuoJ/Ng7LOO8ikd1VuTR
syfRi3R0EudZNY3GRRm9fHp48Orl9z0THx2V6Sk8/vLg8NmTnhnFdXpclIu9
qKoTU82PpllVwRD1YgaDPnt6+L2JyzTei/6Y5mkZT8xZUb47Lov5bE8HNSYp
Rnk8heeTMh7Xgyytx4M8rUdFPh7UblmDLBls3TNmEufHe1Gam3fpAoZL9kwU
DaJneZ2W8NbgCQ5izCzj7+tiRP+tirIu03HFfyym9NnkRTmN6+w0xYfffH+w
s739QD7u3tvdlo93d/yPO/rxwQP99t6Db7bk4/2tXffxnj57/44d4f7u7l39
+M2O/Xj3zgP70T17z07xYHt3d8+YLB83lnzn7v37uqKtHZ373s6dHbc4+Gji
eX1SlAyULK/2oj8No+dZnhxN4gS+jCI+gz/Fefh1UR4DIvwzxiPYiw6yalRE
bxdVnU4r+j2dxtlkL/plwi/9YYRPDEfF1JjBYBDFRxWc4QhORM47Gk2yNK+r
CFAzqtLyNC2rqBjXaR7laZrAgUUn8WkaxXBK+eikLGBy+Po0S8/gMVOfpPLW
rSpCFMmO5yUtLkriGl6qizKthlF0CA+eFpP5NIXXwicNPZnlOAcNFU3jRXQE
z6flIprE5XHaj85OsknqjRnhhThOqwhwOxvFk8kCUTuqpvARHoblF0c0WhLF
tT4km41gSXYzvNgM8fU0nlRDY96kcEeSLD+OcHfwfFYGMyOk4jyeLP6pz8B4
syKvUrqdsjCTVTBqOh5nI5oTf2rMSmCBx+DGAVzy2lSzdJSNM9hVrPcxSt/D
WeAlhplgJ7C94qzqPLW6gDuYzsKDOsvqExhtOh+dMHAAvLSX9D0vlIbAp4o5
jJ4vDB07rdaOKxu32A6LiY/wedy8LGXICDbNkmSSGvM1koCySOZELIz5Cx6J
25UcxIcPX8mFPj+HRVQnKU2X5VmdAS2DF3LAsxCvPBpkZHc6Kq+4D9+My/Qf
c5hhsoiK0WhelnhUczihUQz/AzDHDcLqjSwEJh3DjYlwU9mY9xXMehJXcrIA
8Cwfpd7egQZWNTw/nc7zDGmwgJ0OjNcER/0Wj0CxdlTMJwkvrY9rMen7eDqb
AKLD7HFewOBlE1i4hGmcWNTvAzGwz1ZEAwx8U8yAtMN5Bc/CWoDMH59E/PQ0
BRji+nI7yUY6PB72o0lB98Tf+yYc7as8jc7gVsLdTdI6BegDPGMZnYAZ6zLP
aGtwfQEfy7Qus/Q09W9SCNdxWUwjR0X6+DlHWM7gOhu5XPNJrYg8A4aXFfMK
DpaQMoFnZwu64/Y84ICSVC6XiWezsogB9HDoAKtoVszmQFN4vGkBB6cQAPQo
AagnxVlKK+FjzmrDO2KiqGQpfT/Da3mKtyIC2jGtmK4pDsDe6HYa3Mq85s2O
YDoA5vfzEk9hCsvvRzBX3o1ysOAynQGjZDIMM89zQcG+Idw6y4DY4aaO5zHc
ijpNGefaY5XIF2BFdgRzxhdSIZbmCVIdkBkqvjl6tnSRqpouFdzFaTElwjMB
NC9hL8+A0JYJoBRSiQxQOBsvaP46rt4hSJDdvENssVjbvK8GyT2+muLQSKxS
oE8TAMzEv+ww4jFifJ1NYT1wWxjtcsEr0+Y+TLXgob/tv/wjbg1EDoA4Erxi
PIY1WypKuE34Gif0uyAg7AROoTkxoNazsWyysSRAOHdIdvwRrDI+LbIkgruJ
NBTh4TCIbyxijJAJA+Mybbcjw58lHgYsu2R8iHHdt3wAZcmtaKN+nyWbhJSI
/cpa4KReFnWqJOkUpT/lthb0BRB7YvZH8wxuHNybGdzeOgZ0x7VM5/WcGC3c
CwRPnR0BS56qaMo0tTiqAdGYOoRr46tuD98oYQxYIAiGk1MiVynzZILNUTbJ
asCRqpqnyKCfvqUh+sA/RMY7P++bJAUSTrxzGojLjmApMczyxvUQ3KjMEbAH
wI48egpIVS8Gh3gQG0/xP5sEhOeAVYMXRYJsOolOAF+AaAyjfUBDpuB4bZMU
xA28tjDR/gyOOcneR98Nd4Y7eCOY6fGq6QLBWn4BrKGVCOPI4J7oNg0cxClQ
NIenQNrfNW+44ywwG34DB0xCg5LWxgU5SoklwqkDwsFSjxbMGyqVShwQJ4Qv
KNP4gwthqBCnYU9vU97A9h3c41ckI2/DDuG8whPWYwJqkSEhnnbpNn3jiwZ9
Fqxo/aQ40fXGa4gCUVXANSGcIZGLhQK88oPX8+pEkeQuD4Rn2Dug251VsFxY
68u0Rj3IvACh7php0BNLPfbL0UmG+DOHPzZevniyv+l+rXq4TlEHYKtRdOuA
FzmGZaW3WNLasPcboIbfAGsBhiCUCD9mVZ2Nqk0UGSfpuCYpBBYGkvssVQ7p
gbAN0iJl5iY0Gw9dsQevMWhdxYQk7HyBKEQz42wjICrjOdzp6KzMauRvSFhQ
xHRUQXgZ0vcTpEEkShZjlp4KEDGOAH5p6iQJ3JXODiBxdAeXpQ8hmTLu6AG7
R2V2xFcm2Cyy5Sr664vnwONBmDia18hDjlj4tKTAw6IynSA2wNn+cHj4OvqB
rygqWTV8ZKCjJJiDGq4qTDj8itX04bUy+tPbVy9BJ69jPE2zUQHfJTRA3e78
HOWlr7+OfgAgAtDeIEuhMZ6omG/2GRZAPcqaQRlMkdFtngH1i346BDg59b/6
eeNrhNzAUd1NEplQLUF2dVZEoY4OBD1PJnjVPULNVzChN6PeU+A2Pb4YAXXr
RYfhUG4EwsCUxB3UBeDVY7YoALYBd8gAdZgdoDZWLxuFlixrYUinduNH6bgo
GW/60U+KNQSNp6oRATCsYQKBYlWlTeSjVkhHoCzdSTi/j3ei9k7gWhG/wK0y
9uCg4zlRhGl2fFJHR6RexImljRXeETdJn4eOyxKvJ42OmlolyuMsrTOWcApk
XsA+p/MpbOG7Bag/o7SqgBPJEAoeHC06ymqr0IuKDbwO9H+SRU8Q/+Ar70QQ
3iB2AOGqeMcg8LHKOVoKIThGVjnlgNbASF0lCh1wJlE8xiXT6cLWEUt0G8Lt
BAsypjRMW5oL6sBjxXwERq6K8mkajj6vgKgrc7bMzYMjGg8AGo19AZbxG639
DXQsvOeHxVlcJpXoN4m/IuRLcbiWn0gQhfs154EXgA6DKf+5ySdY8UXmc0fJ
S3SrAsS+Ud2gykwHPWvF1KkEIjQwuRZtF9g90kI0Q+ILTcojOLTO5cA1kmUG
Few8oOyW35AEzzeG9KwYcY2lYVzgUerRWZA+CDYCDKSgEbDSU5TtRZOKnjgc
YfLzLgW+VSD4ey9+fHvY6/N/o5ev6PObp//547M3T5/g57c/7D9/bj8YeeLt
D69+fP7EfXJvHrx68eLpyyf8MnwbBV+Z3ov9v/VEmHj1+vDZq5f7z3vdUGLN
jWRZuHgoFMYglvsM5ruD1//n/93eFbkQbZ7n5yokbt/bRcsI6Gqit+TIq+lP
gPkCtVtgInSV4dxH8SyrAfH6qBxUQADyCNERoNkQGIinEm1MURkpJsXxwjts
FmpE9jLK2rb8P3bsHyp+N8WsQDIiOVcJZL8BJpUIia4StSF0RqV6z5gDIu57
Zi86cNp9g6kAzxymQ1Qt8dnoNJ6AjIgaLyojKNCXeh8SA6jWtEPB8pAJ4hxo
6LAY7IggyS/IaQrU9OFMm0SLqaO5NKcC4VwUpKbGFkX7JNrCRGgLVrIYiCoq
V/niuqHDzcJLCUwijaeOfU2RuhynosAgPhAqWrHNmEAUQMjsi6XpBjoAnbcW
Kd+yEn01pKwQn4/gGjdMIshZQvZnGRMdhSfUBwyBdwwS/RjYQNVk/z7VIbF3
nAEziEAVuoqM1WfhOeQfb0EUJs6H96mtMOO+BG775LvKeNlweuF+8XybgiOz
+R8Pvx/cN3BiwsEALCj/qOKaOomGjdWojJNxS9iUQs5TPuh8yf7Jy4aDCVa9
KcuOfshQ7Vvg8g/T6awo0RzC9i8YYQK/Eh7a06546KOFp4YT5qJA5flO8Mqg
lQJpcUoW4Og4Q7sgDcUG7BS5KJmARmzXRuutUfMvPgir/DOAAaAFz+agmTGq
4CdFeFSC4pxs6wkzXNJQ0fZBMsLZSYbWJ7cwRdeqbc4RSxNtlPh1NwK11X9G
wm4fBy0ApQB2gyDROEpBEs/QtDSO/v73h8dpPWBLwOO//72v3+A29O8UuEzj
EfpKnzHwRZJVoPsmA7Ga6HNoS268mqQTOBn/S8RqenY6zWr4xrPfkeDPtllr
W0TVDA1lcMae+QQO0BrHSSOdJTFRrKYhM8tbBlM0IXv+GUsC8EZYu4dKEJYh
e1AWa8ppuiBGi6o4z1+h4DATrRRtwXBUM1qG/q6SrQgLdE/FkmPcBI2nAneS
v1zTNMW8eLLvm1dkE1aIeCuWSzRQsIHYE1ZH6njQWdGpw6SQ4IoGq6xM2X6N
K3LOOT6s23obEYGbvrolVixULju0vTS6lSIpwaFueZxy48MHYGkD/O38fNMo
w7mFHqTBVM2KS96aTNG4gIYFdlB4Cict2YOFeFAbyjUrrUN2RXlPk6qLymeC
4qIRBh5wDjsOL8X91mHhw88ZCVso96IWBFAySEoIt6pvo5D5RHgb55WVSYO9
sNnK6rl9owR8kKdzUibP4oWS/hRvGDM0s67phOTSKuANoNosAMB0PNb4CkOP
UIAHPW9UJGzBF6WS7D1v2fz7I2hwBzHsJTCRqOtRHI/v23aQI6AFY6AKCgun
dIkMRDI0+kUnLd8O0ZF4gvT+L4Fbhx2pSGzglZy0LzoPdbZltWIKKShpBXwB
jz8e0VXBgZD1wEji8I826ATh06bH05q+/2HgFjpyBNDeONwomeWt3ZocSnZF
SD1MsCznhvbdQwhI3y2NrlQ15qtM2Fiaeev5uNYFJDrFCXaOaB8jPq8Fjr7p
gjOOppZ1H+/ZqoiAOAFNUZycRwu1t2vMgZMcZuU8T8M4BJKMgQllbBs2qG+j
nSlubpnZ/0noPiXqjVYFOIczxM1iDGA7CF4UfsUGHFw4AGZe5h0oiE6bpvhQ
i9mkAxNNCCFiIxPQcZmCYThACCe7ePFyoJdcgGatHrRWpgtLseLAc210eVau
uzMWSxcmXL0uMZCtvLvDtvjgvA38h52srVObz0iStAeD5n7P50UkTmBg2j5i
xZiMaR3Gb3Egg+fvZKu9oqjvXmKqj25ViqfA0AJvcejsRI8YUVxx/QHK/MIk
qQEAcfVbQT4tSwxnYKVMLjDJkCJTdXjBLsbLSgeplo1iZR6JnTCeT2nZhW6g
q2JeCDc9dI0nsTK4cBKJzmNB+rXjwh++brBeY0CV6JYD4yYbJcuYivP4czFj
IqqnwRosvrRRDVi2tytm3ZVkJgylWOJqB8o7k3iFUOVh7clj6Q3f0ov9vzHk
7PpCgIkyhfOjNoPySIpeR0HAUJERWYAeNFap8THVKTU4DbNf4PoT5LOnKUnm
vpudrkrPqVYvceQeSaOh/9zbDfJ7uzQnF5Pfj3xAYVgl6sSnOsGANDYKg0LG
Fs2KGg/Vhq9VHHxleF80A0Nlmd7mrA8wHkrsojSC4ITMHiWOAl/aiIk8wExo
eCEdoLFrjZyyt4hiJogvMUaLtBAiiL2MqqLznUwT03yOJfVcBFJ4sjl/AhJe
6UdYpVlpPIWbwveOgQLD9SBSf3aS0l5tbCGMALqKQKs5PCFY3RcNuBsCPtED
Tk/wJwWabhgH2uDGSNPuY5xdOqsxQIlDtOAJtoyhAIn2bdAXSIFAvlWMa2K4
89lxGSP+4o3LKSiYJOuNePhuGA+j3iQbAUqlvU1W6ScTwb0Cqeq0kEjGQ4cQ
DHJV9/wb1QEHQ1uBCeal57r1X4xLR75SCojCSBXxfqDccpQyse2iqzBegR4+
ZW2E73FVFaPMHq0JZ3RBCTF5AxYqgBRjOwtHBtBgiElGAseI2lm5wVEyNJjH
wOaQdDUB0IfhSQ7OUbwcTeY2HNTFFZUFegbrKp2MVQNiGsZLVMATKJ1231oF
RlzK7Y2tA59ie2T93g5DOFp7JVwB3QisvLT4b1CJL+blqBlmJgfH85K7qSAW
DViVoWiOVMAU/sPw1WJSxKTvu1AXdSBxyEuaJ6QZIyEmRxMxzMhzH0Q9dF30
8PR7o5MCcLjnSCIi7H4ANfS7eBENHuQIJqeBscvMc7rzFqH4aCKmVifZhB/j
NQOk6Q+LqQISq0d2LgLRzr8EyZyCHFtRRRz9IaEefMbRO4ouHbflVmMp9sKx
v7EGrTnzHB0WyweqBoYS+RvVXlrBtpYEjNLslCTWph0NVxla0lTdQNuDhvbc
GW4PtzW6B6Pl0YQBY2jEl40IsjouA4oRFS74nALfcrhXFP2uwdfwNDyYJfwX
S3uAUqhnz0m6ArERJS48j74SYFBnJou+0DXTJGp4uZuU2xGcWZFRFDgtl6QV
42RVoZuA46CdWl3/NC7RIAlyjRVj2PtKEQ6hPi8Boxo3j2IsnFaPrA8yac/H
Zgm97f0eyDkz9awyNqSTpJAciSyFgFbkQUSShkrvJKSRByIgiAjC5nldgDdj
g9hGFApTsoE599iccfhH8khC4c3q4VGVRDB5QaTEk4ez8FwU/nEtByAUxklu
xvzP//wPOeQHY3iWEhrU63eJfyyXGfnrvy/zKr/hvzpY+9/j5qvuirGxfC/6
/eaas0ZRPJpUV1rw5f4Frz5cf7PNVznSjXf5zfY3Oys22l4w7XXNl1t7hZej
/W19fffe9vay1zvAFAPbvOKr9HL05sKZlxzONK5HmO6QzU53neFx+94ar7Ka
TIQOjQ2k7o1IylzxKoFpZx0oXwCmS74qYLr3McCUVKNZtL215qtXApNd8P2L
9nvBgufJTISvAerEEf3Pzs6nW/CDay64Hn3aBZ92LGn1v1NkB+bDXkQK0KPe
BXKPCG+imVKQUUz2bPjSI8Uq2Ih8aEPQxFrEPxLL6os/FKOtA+2ahQ7H+oXB
iWTiZYyRpiDJGqQcjCk9Daa0UozKIGK1jsbZpCYvMYViFVVt2OOrQmiVphxj
wZH6pGZZcyyZ7gl5MQDnzYNhL/oa9jzAsPZJlqfnxjxmIOE6kMdaJ0Zn4C2I
GbuDJDvOQCdGl/sItYMM/SBxhaeNzP4YtWs2paj4jAEZDjBGNSOSXVQ6C5UQ
UtLE5+0sgeh0w4i4kRcJJkKDXTYbb/B3OXZQSPMT0oconUOTBxrvsfCWFKT6
aLRdNlnAO2M0BKHdRJIGQ/uOxgJ4inAxi+EUI45JEEVunmfwHUILlSI0/Ipx
ZUTZR430A0TUoQouNk6TLKZ4pu9yOCjxzfv4xjlhc+ss0ugAmIkydkh7FZFS
TMoYNHZG4cJVlR2Ll7RTS/fOwYZNeq4WPFVcV06H71tE/FAJgBbGQU9RBTqh
rwik/i7qgnOEnAGbbIxizveSUzhKYgQAFYXC6mkg7fIPdJrWUYS69ZJJOZPS
3rIy7brIuqMg+IO9u/SK8x97lu5mZimbifutqD+2v5NCJA4+gLIiAL4ECFDQ
DQxPB5AIrheQCMMHV5cFGc0EvOhXm6HJntMN5fdGDAwn+Qn0RvGM70iG+uUb
NH0iCNnPS4MOquyfKWjvY1UR0LoF0NagB84F1fnxYTSOFlPnGvAzjHBvclp1
IUSmg7YYn7Y0tH9U6f1srCcFgbGIiiNNDiSajX43ztaLq4U1dnXF3PD36BQc
kYnAoY0Jw16qy24NU6UwgoRcu9Y9guZt3ozO2letinUjz60lqyK3KId7ujEN
LC7B/JACk0bIhC95z6W6pZ23c6m9wFcbfXOug5RwvI5Loj5HiqtMOK7Y0yb9
N8QAkfhJnDBKhzHCdBsjiA55A0r4nDNH2xw5a7sfDSQ06i+d+Y78s29VYuM7
Qt8KRtZIA8St8l9gjIJHQ1MDGX307dgP2zLB601TckBm/Cgs8vCCAM7xhDbb
hw9lk5dg5YeymBr/YIJcCIWTuHeRgHvXy+7HNwBa9bwvFw+fpKe6A9PQOYbM
wd1Fna3pnrRTLfHJvk05Th3THMjbblOLMRGuYusv2Z2Z66flMTKcDx/q+GhQ
zik4xYs3gwE4PcKmRnjpwtHGSJxeKDktd4l5bN9SjyBlNOHqA55lD5Q7FC/g
LWJszqRCJixGOMmN9MRUuAR6AxT9rcupYtOkDMzDBiB0pnCK6JIUjj1j/pvt
GdF/X2TXWOcJGI1CXeBZ6z1fIsr/d/SdhvEte+Ljr217GL18FR08f/b05WF0
+NdnT+DFZzkK/i6r2UODJEvoWomnvkkdrNdWfFw53fRc7LvWk6A2cfx5yBNy
5g4Aqu9TVXEXMV1tjItqVMEKlXAFsfZZk674xmMnngE+IcqLmU0kW2AYk4WO
4c9AhvyFZxgXnCJBHW4YMoa5MxAiMUGpmEeqZK7hpzi1naEe2f7Lg6dvD1+9
0bM7vOZZkcSPoX3LX/JZl/WprHGmweERILP8JC0zEQ0bXIaRDqQ7zIpRxPHj
dHmXtyqPG8cs7IdrhlN8zUTA5vM01oISYJYTyWqilIcun+Qg74AQ+vTNn5++
6TxI3i4zsrjFQJHT+ZfF8jwvgqGDFV/ujPoWT2bzEoVt1S4Vv+E9DvNGzTA4
0W55YNnRcmRN1dpntMFH6rMbf8BNzeprOB1Rnz6LF+0BP2t82B0GtPjH19Hh
q+jJ/uHT8GprEZxEMb3rMqsEVUU9J1X0BG+yQHbrPquGjBbiUliTpCGZ2dP0
pB4X77RKUFyCnauYAu21EfTQdCnRLtoOpaj3qLepZ0vPsPMNrxcKlGStAxYg
HiGUYBwz+CQI8E2IAK9+PIxefe9jQOvo8XxBr6EgKnYbz3MyOvRCH5Q7eI9Q
1EHUz8ojYT5O73oCQUC2eTwE2Noy/K+KKdcTH551kIoOgtVXNywHlzdjcYKt
fKYSxoe96GurH6hlGZGPTo6/HVMYjcTSyl0Z9s457YLSfFJW+it3lfx92vJK
uJ3ZgMPsMFvVAwOFDmJkiW+84ykl1ZPilrxhjY1H8N4FKH/P2RyUVYYBIC2I
wyvGfwXtAl9zOGSt6covi+iA7H7G/IBfadY3GjDmEuthba5edjkDLD4qTjlx
GQVOSvTCTLCfPIsrP/PzRmCP3rTEnTKE5Yp01ishG2nUFaosIcp9VzMgw5QG
rLuCKs+X6lK+7Kz/km7W385rud6/j+o+v9qs4bk+Wu14/yjuOLrCSveEgr5R
cvlayKW9ZWxq63DAUZgfuxD8CE69bGr1soT4jGiVp0+J+GbYVeJ42TKN+yRG
sugVIqP0nnkuPkI7kZCYNC6xkoyLVmG7ooQ2S7BQj0s4dU54i71iAy4qpQCr
YipKSQHonIw5MfEUI52QrvrJLFZt8Kx1eTi/5NegIVTjFdXc1FxpF9UHUeTV
vB68Gg++w1c3Xr36btPygWeSNGYz8pWSV8U0RUXZFiS0hQCZeTcod1CFSj1J
9kiwFgeoS1T8xBrTTRwKUlzJgwT9b9C/irFYoht947MO0NLQGxaYWcXrgQFl
un6emzyHLPBMFkyX+kQn4H+/+Warb+7e3d7tR/fu3duKNrxJRCtrWZNpDkHu
G77jLfi34jvXYh7r/vvsOABi7TUgvIqBXADhVTNfwJ4v+WozqGjZotcI77n8
qw8uWvRVAm3u39la8eqvFWhDnL0ojgZKz5m5v+J6dEdsJKBfOHuT9I8lfN74
fD5ayeclw1bzrbTIDRb1lNhqCnZhmZ7m3CD2QKTZavyuFg6HvUq9T6PJkL4j
dzoncj6RoBnkaDZ3LJ1UKc0+3LTc3akxfm3HDx9CeGGifStMiE0KdEOtlgY8
exRzgK6ze81ZdQrNDhtMtth1XHmmKe8hc5JOGilX0QYhJ8s4OEREtQWrSnWs
VSEObKPAAcKQKhQYZujjYkabq+ZFPB9BWWnmD0AJVN5ixrn2eiK+q0+DD9Rd
RdG/Xuy9CH+sbAPDXyiZyioFnsa/1BpyxDAxGuLsi4oWuKH0tEH8ZOgH/cuh
0ck0Z9+xUxNIN5y9Khh2U4FtfJsPwjPaaB/Vpi2mp8hBhJEyKHRaEiw4Zypc
Qniqxju4NiyFZOr7HnTU6GTU7sPbY6ckraCBSZ0GLTF7myVJNdGGS8pksAcH
TmYhu9IJUmh/pfoUUiCRfDGhzFCYPsV7oHmOb8sw+j6jEht9HulBJ/xQ2K7D
cwpuHkejNfCFxcMi2LC18xuBlWfj4wHp0AMxWO6nL5THXmgDLvgZuxtSLZyb
R/sKWARnizBxvS9LlU5zpUYNu3rVPHkv5sEPOljhcoG3tLgR5wsT+TXheX/B
0fyXnfWa0fz08v7OVV4VKetqr1op6yqvOnnnCq9GHO99tVcjjhNfoTF8EeL+
1V61MvtVXr3Bpi5t4SMI3l8zxVZ5u5G55kTlSVG8m8+oCwMuiogx8qnKsPUC
rSlN53NmOX/If/24MBff5hisWK8Y8H0XJGYZ1K1Ht7jQI4lKaTx2P7FVjYxj
6E0IpGLcA0f6Lo2CsIavJksR45EXSN1pR6I2KMqtjLoYAmkOAcIRIci7JBNX
ZQLyoICYS/PNg0pt2CUkyAVoOe3FJIcgtiIUzrbZl4x93zdtQd0MEaETasR7
oevHykOtpD6MVrDu4L7xsw3lF/Gd2nzDRz1KOiRXeO+r3iblFY6wyH8jpR5E
lAOsGUuhe642+kX5p7bbDpfMqdoxfk6f2cAT2MTasDyNcekTrJ11hQiquy1e
RCfFJHGaAFFXqdxApXPRspuo/9v62+Y5WWTtVGw8pmx8KtYUVCtpOlw9lcPz
3frZk127QRgvnR5kOhuC2hzCCwLBvfrFVjSfONeszdbIDTM4ufUo/5pLJJCf
0lZKoZ5UnmTOUcGc8RIiUpi+Chhk0/TjBYxyFGRmwNpsRyGcUSLUKLcB+7pk
RZnJWlCy5xz+yOa8kvzJBcz60ayoKuo+wUX4LHIosIa8Ca9qTWPNmR9Bq5XQ
2wcNozSVbReWQeUqOMmXClzzWvou0dldcBNxQDq6H8bc/cWaG5prD9FxbO+R
HaM5wHJM6bdNBREdpya0Y1RtO9jKAoeKgEnlrWz0zvr5YZQAJL+wNYVhSVQr
DVSTLDc/dREQr+YnlmezOxjYHfgd5yoprO9XavJHCGs4+S+SqR+waDyX3mBe
DadG5TPqrLGs3gL3zHBVMcp0AgQvr8OqSoFpw/WPOk29Fg3tJlIRlgA0WV5J
2k+GHpvvFmy5WCg6qZUl8G+Iba3wES7LhZP5TXyqaKOjPiaV9eGT2iSFDtvV
tNMADJGIXyhG46RVsYrCU5CFWpgEpjsNFTdxmFnQducjjBZp7Vcek9oaGo9g
HV/Y6SE+ouJ22GMplW5oFIvt95ezPbBc6Tvb8SzN6C5xwTsunHQ8KY6kUwej
6aQYvTOsKdtaPJMFl/XB8I0Z6OlFosHoxE7LrHrHu1PfmBEtXsI6NIy1Kuez
2vW7cZY5ims/A2kDyKN22Ii5QdFGuwyqf4bc0Q1NBxcetytdOnRZILzsUgr5
hvWtiFp7RMXPIiPOg/GJDbuPbGgKnzGZbgoLiikfRrmV+l25gCfW3QFKP4mP
9U3YRDkbYR6IhN3w4XcjqAudS890lTY+CUYq3nkDfWk2Cu+sow2FkK19k+XW
x73ZmjVSW+xajrpuG8XVXl3fx7dMq1wjtmSpY+XiFP6lqmF3Cv/ddV692KHz
GdgoincKmHt379+/ILDkYyZ6L+HjtrgiXuU3TRnXgNyOgQ/czyh9n47m7J/a
rzhT+yTMRmsa77UVJJ8qKhOYfhlYbfstzncWU81nO6+x8/airzHuY+BdSazX
Z1uhcMic92tgrOW+MrbCpGd7rAsjGX78PDEXboXF6VGoX4Ou+44D4W4CEbwF
+0RqVSmWjlcv8+/zsRGueX0vCAlY9foFfv1LvtokyMtev1RNlbvrvPoRaqr8
duEPNzVVPtGCv/RQD6lPOyD+6ELh2QDDhSi5gG2Rd5ZUI58hlZNwtetP0mmV
UhPPotQaaF79PW5ci5GD2hMErcRd2dlk8elO0G7ba7QkASULizc480MNmokW
qPlTaQ4qDeHrzqTANd+1L42LOSYbU2xoeWH6B/8smf6dMQjiAn5KVe9sFG3B
gZmFBGYeSE9x8yyInlhWQNm6uL1sRtuxMQiq9yCyUXWEmVj7tBdjG6Sm+1ZR
ONhJiq2wcV5W2gZUzQ81LquD2XhSDtQQCQUxmp4dYCMmxlWrnA7GcTZJE++Z
xSzlh2w7F/sbdbfN6sUe/02Dm/3ENd5g5OGHMdyWuvgqErGjGyDzfq+qyzn3
/eTWVvcebJ+fh/UOxdShXfe4EAb3lWSdN6ts5hVdqqFX4nL/b2ysmM4nNdZz
jiy8KrZS2R/YDyNjARpo9jkFYH1hAp6vwl5yVqvCXn7B+G99r+oXqsKSKLCz
tear/xIqrL1Sl5/Vo0fybZMeXfwqkCn+1gqj686qVEz+vsyCiaZddq+RpS+D
WQyU+jbeBvyfn/a3f177VexrM2Bud/fBdkeQwUeTXLDRCx1DdaHRgFqiMX1m
SgoYP3rHoY2q9J9l1QlbiG3Va6lkzSXWXNqILdNjfdAU9sV+ZRA+kH5VtjRz
ySlpmiBg466yWmqv2NC75XVQ/PotGlAWq2k/MRuFi87d7C8TDzpLfImFkPrc
lCkKp9xJlTCOGHbI2VwGjp44SnLGsiKU5FCYCaSgt9k/yVXsKkZJIwOvthQI
NrahAqbcUwuDoNB8ow4YMc4YnSjHk9R01n6gEivsscEzIVPQs5xLkVnvLoqv
ZDUZpSWy9Ql1FH3HHi3seWQrn2n3dZuN3lkA31VMOi6iGPsHOsHH1faeFEgs
K0YQ6ljCDVHTPGjZ4UdZqqApVX5sLWPdu7a3HEr+ZuhUqaSSjvVbu7Wgb873
1WmaZtN4tcnRElIuGKv6dEJf/GJUQ6/yXVZSNshblbHxw7BpRi1bFy3szfLF
CjhXtdFffsH47yMKOPfvbi0x8S8XcK4yq7yMAs5VXv13stE/2Np68CXY6EPf
9jIr/ZkSOSJnquR2Jzc0CqtJ29hVZny3NGRp7H+eAfZgoS3kD6CgpbDcLIzA
ZpN+O75eMhLwznDAgQZ2JxKxzdzBZu33Ixd5vy01Xau+4XugfaAJykGYvxQg
q1pQpJlNZ5EGnb3ZPacR7SatCrTvQeFV2JDoHxkUDbbMuPnSikMfqBxZWZRX
EPlghuJNoQCKw/wCZhwgl+DgWGYQPRxcfXbFMTckML65XMwvqDBr3d6gzS+4
euEKkw7LE8S/0xybQvWNeq3pxDMXlsPSF0ZyjIMINivCnaYGywED0xcJbvm0
AuTMxTMxMDQjCmtfslBxXNjjsrH59FPbWBXk/GDollfXUoLq2HoXLAXlNVzs
P9OyQGtGkF2w4AgKFgza1bVsnrC4p8hCZfjaKN3gXjg2TIOAK+3itYvgcdoK
QTF8vlLcojNaMQwVIoPjvFKhSMIPD5bFUOlGpEmFAJ7qyEoIGod+gMhywnEt
ZA7DjgkgliHy+2y/KI3tSOt1j/UaOMRJougkgRba1LrqTrKW/iyOJHJXzGca
mdPKAjEufjCkuLZMKo6iARdZrvQxC72W1KGoYy/9NhVypBxDnWwVFErYDpPX
Qqh+0QKghdheNE3L47TFwb+MIA2yhFwYhf95yFNXnfUaC/6Nselqe/0Y6sRV
Xv1s7KVfpjpx1VmvseBroP+14kG+APRfHsbyGWDTFwFhUmlQw/xqzTTCdghL
++3PisDQgm0Yy87Odocd4TIepO01X/31KOI1CIwIohdb6j7qgr/UqM0OBevj
2YRWRG5qTS+KqrdeFsrXMesbg4J8HBudaYLoTLfX5Qk5ruPj6KQosAxIELnu
5/Ytz7WKVE/zbUwcXaNl8jlxqplfhPvjvWvxTewm3Mwq2pAy9thaoBE3wwvC
OInkFBM39Ri0ngW7gaIn0hJ0hDUHpOdRqIRTi8tpkXApzhPuTk8RGLdw9lte
c1Bp6wCDUeDFtKhTE/Rz5/QCysnyqkbwymv13kkb1DxoBe83OSTwpdIR1cY0
JVmZYpUJ0ESfpxgNU8UL8RByETXuPTAQQ+BwAXPJvnhI6vhLuOKaYKOerQ2d
O/MZ8NtpGqs7MrJF4gxPF2maLMY+zad8HbSLUkz4axvAYJlO8Xj2wsX2dKHx
/Hgq+R9p83V9xG8lgDo5btTIj+Gw0QczHFIanqtrIsv+QCSHEoapkQ2c6CDN
0biTyG+iLx4VBTyVfyvfARBjbIhL3VX5y3OD/w//I4snt/Weuq7xg4xIyHw7
XOIe/9n8trmmb91y5UlsV4RoeIXFhgPxwc3YJyov+i1kv/UnmGd5fXdXv5rn
mN71Jx8M5xzq5PVJdiiqzafPKFsZLuPoZMkJZLlpnCRnLSdZhQ8wTZaTFOz0
qvykdiIAuMFUnrrgvahBlgmxLkug1gle8s4KBla2kXd76siWe1WvMTXEwMNH
tDfOCEc3WKs1yvb6cN/F0ImUgTvMhba1m2D69qyRHsRa4fRfQBz+2jJVN5ha
94w6tDSMEJ9NCH/jJnI/6/VevYn+X2vBTVqH2LDmqzeJA5de8E3iQGPWj9eM
tVHPQ5QSoXoqEEfRy6LmSjPL6CFJAKqlFTOvpZe9JPhIZbgwnrJ4Ujb2a2bp
VKi57zQ0LSjZJr4ilGh0F2kMXC4EBRcQfWYl+rq4enHzrhYRqWoi1qAycmrz
82GJJqUGsJOFHR3l9oq7tncXFhBfteorWJ0SK/Zr9gXFHsxKTpv+ot1hv2o8
1DJUbLO7z0AI8QJ9trd/TbOOp7IzvgY+fkR4xXO6wpmko8QlSJeGMnboSllV
vo+9I1LKppV6SKSrcF0EuuKuAisVkqHWFaqCO6WcjA5Z5TJgqeOpPmntGGQR
wEoGWGcANbLMpr3II0xCbGKubwqi0AQ22iBGdnWkkAqkpotWMW0gw9FT6kNK
wQ30JVBOIJWA75sZKjjJnMMYXAvKi4iGtgzk6M+0pLohoPr3YZ/HQP+pLChV
90klJMFGfVIBoHwBW6o7hzbpeIwgDOJFvjSyc6P7rEV2fN3nYsKzpu7DBDYc
dQWYLpr3At1n1es3CszORwDTjRay1oJvtJDGrB9BONHYvIbioXkSXqKMrbjF
+cfGSSnqQvAkUQmD5URo+Xn/4LlUsyJxol3Iq1MEiMmZcKaigPpK8Csmgw2F
A2b+rqhPlIZRo3u+pzQ1BwXSuoyoB332aqAb5/ikuQh09mj/GJ6Po3NxcHXU
vCIBQXvDvbIxfAbbcCdZNYKDlAr31eO//33P7BFwOn90IYAot6f1UleYF8ZY
k/1YoNxVlNGLSKaoQZej5ReqXFUyUUNGKajRe8esKMeojZyxl7Xb1DzHipiw
91ExW7i6Wh5Qwh+8d7Gumnrl0CUFz0V2+1Ljy1WKrFZuPChlw23PycuSGNek
IaH8Hq+LN0cvw7woP2M3JEo5qmzIfEkYFOcmCFb1SoThkafYeb698SXL9M47
8CHKCvvRPCdJNauNj6qYA7ZQOKOrUmba18jQvnYNPGZ/a9EESqtEgAGCoNXm
GjjXhTEMOhSTPfeqZlk1ysITotBttGUfA2+rvma4iDprTj6MfbdxZ1XScTNw
nUvaS4R5wlVnPQhrfl7fYC0/mwQLa9F+6AkX5GS146dlNRWxKqP7KazGaCN4
Ky1jEKFDd/B6Xp2AMnaE88yEkOz7TnNWIN2zoPCDXJhVJ4PKewujpEnZW4Rf
q4mgcCUWqUaSG89/3ChobUg5u7TnM0p3NFlajwegCOFQpBUO0Kc5mME47Mbl
6qdeF2aHVqbRuSSJGtTILanItaVKsDgxUGmNw/E8HzGkMfN3ximJ0g8FztcN
ou+J4v3m9QFpytpaM8tPi3dYtQP3++bpWybs2N6aKL2KlpKmSrWmjEuVwN6c
+aiQxpR/evvqJa7P81B7m+ROs5j2uxnUr4oTArlXxc+mSUoIA15fyhfeDOlc
jXfJ75xC109eoufDzBU+LkpF0Rh4eRiQ3eUjb35p+itc6qvOGi27ceu8Gvnd
qIVUrTmr9+rgPWaZD8bZBM0ut9uRfq1XHfJfcq+RQ7XlbpZlr67/7187Avca
C86L2rYSvvSCUXKtDzEoa2drZ2ewtQv/d7h1d29ra29nd7h997+Wv4okWlBC
6hitPWsUYQ7ag4tX2/Wqw2E1Ma79auRTq8vNiv/ovQEsvaXuXvgqChurZ1z6
qljoYVr877KI2iWvOuGX5cZLvCq62apCFJ94r8uaZFy4V8q9uMyr7b3u/Az/
TX96c+/nC16NhB2u+reCSlxkTFnx6kWqfvfhuAoh97e27l9+wRf9+4jGhX3X
wUDKZy+TMiW7kULvDNVPcb02VFqx/bq1BatttJROMkq5jE0HTfPJa6sLh4iI
rtG7+B6ZVHCyscwruv4BJQnjCxR8adMjO2X0PHr54sm+l0MpKcZOFGwI1yYQ
rqO2cJ1Pk3ggo3TL135xsYvka4nilSXN0Df6XVrRG2LN6LP+LgJytJ6AbLoE
5OjXFZCvIh9fRjxuS8eHIWq5fmmLpiZNVVqCp00LEZWk+b0s2JRIccv8o7N1
GI1l5VBe22uXdV+vopp7ha0ZRs4/sW3IGi6trkReAfiSB4PMVF5A3rkCo/YU
WQHVTF85fdAB09imLkceuLH2+mTin4cLDhf44GIIXlZDbMMcixgaaxDjdnfM
ghUNufFONS9Ps1O+7dKCR/YpHtz8C2zldi3dSQnOFV6N9Aok1d6ldSe9M9We
FTTiznpi/+IKkOalr9dprLHgdeXrjlfXla87X11P5ux8dT35esmr68jXS15d
R75etuC1hLhPCaZV/etWgmm5aL7k1XVE8yWvriOaL331t/BzXvlc1//3icXz
JfLqReK5JycvF89ZRptpAVmWJNybLvMAEZTlbS6d8kJzfiqx8ybFaE6ZC5oX
VJ+J9d6mB2GuAXfhIrpty380Hos2PnzAWnr40Pn5pr6DBTYGNlLqopcnU3pV
e83ZUnvszMhswp3YeEhsERmf/Z4wuVk6CUrQVOvWeyNY39JXqZMUezt+Uu8k
AfQpdt5BZ+nPG18H6kWqP2xaP4d0ci6OsxELTcco9OeSWxjCXO3p4hZpjDGN
ZzOKhtfiyMfoa4VhZfDCwqmxe1IW4E3t76bRqZXW+KNyMSTVBevpSzEcEHXR
I8yIkCcmPF3yKXkdEadpVcXHqd/tiCpaewUr1YVG7iaJiuOO04iOUkMH8ejp
IUy5Hx6PxWYp40iox+Iqixjh8Qf+ptqHLnoBU+ouhKIzltU2McYKxeys/OuL
5x7mouwJz/Vwip5oRI2bkWElStqAKhx5DMCYYShEDzvboTq6B2CI4Xa9n072
8mpPsGePwiS2h1u9oekcGfU19trisqQqjtVBFTlFw0K5uygTzuDDgMRRXDc1
JhuwQGo4aUlAW9BlntekdBHKuTZFOkXQQs9dKcpnEtznCxrnOYBU2nuO4ll8
lJFXqQUJBYF7hqGBMBCQdMHEcz0Xs/gfWN+nRruC7cM5LlONgU4X7IGlIu0V
xVvsvz149gy7/uU1lXUCdCmBa+HWNv588MP+G1CX0/fEsqzXjegMz+IaYmrG
KJ1zPzqKR+8quCAniPJJMcex/zEvyFmGu6AQcenUVhH2w3jCLTNSpKgDHBZy
jasF617Ua16JIodGsKkiTrggamFxemd4Z7jNTbjffH9wb+fOzvm5YOusLI4E
wObtD69+fP4E9b5pDCdPsaFc0BPVv5xh7WX02jq0VCyJCqeWWLh+suCcT9e4
j4ILqK8fK+6IJfJjVwH4zOsjOaQqrGgteXrw6sWLpy+fPH3iuTypHJS94N7x
85SjsqiIqJppnAP9kbJRcKJjDhWjLoPWLGONLhTggq1XbZSqmJKkBY7CfZPK
n2XeNw3iyT1wwuWbAHciWzuXUnaZKDuiXc3H4+w9oJ3kX2MtWJQFstpoGTtn
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

-->

</rfc>
