<?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.7.19 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-rajaram-yang-config-template-framework-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="yang-template-framework">Populating a list of YANG data nodes using templates.</title>
    <seriesInfo name="Internet-Draft" value="draft-rajaram-yang-config-template-framework-00"/>
    <author fullname="Robert Peschi">
      <organization>Nokia</organization>
      <address>
        <postal>
          <city>Antwerp</city>
        </postal>
        <email>robert.peschi@nokia.com</email>
      </address>
    </author>
    <author fullname="Shiya Ashraf">
      <organization>Nokia</organization>
      <address>
        <postal>
          <city>Antwerp</city>
        </postal>
        <email>shiya.ashraf@nokia.com</email>
      </address>
    </author>
    <author fullname="Deepak Rajaram">
      <organization>Nokia</organization>
      <address>
        <postal>
          <city>Chennai</city>
        </postal>
        <email>deepak.rajaram@nokia.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="18"/>
    <area>ops</area>
    <workgroup>netmod</workgroup>
    <keyword>templates</keyword>
    <keyword>profiles</keyword>
    <keyword>yang scalability</keyword>
    <abstract>
      <?line 67?>

<t>This document presents a modeling technique for configuring large size devices in a compact way, when the device contains many similar data node patterns. A device here refers to any such entity that acts as a netconf server. This is realized by instructing the device to locally generate repetitive patterns of data nodes from a master copy called 'template' that is configured in the device. This approach is both convenient and efficient, as it minimizes the size of the running data store and reduces network provisioning time. It leverages existing YANG specification features and can be implemented with standard, off-the-shelf tools.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-rajaram-yang-config-template-framework/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        netmod Working Group mailing list (<eref target="mailto:netmod@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/netmod/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/netmod/"/>.
      </t>
    </note>
  </front>
  <middle>
    <?line 71?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This draft considers the case of a device that contains a functional entity, characterized by a well-defined data nodes pattern, that is massively replicated and where each replication instance needs individual configuration with only limited variation.</t>
      <t>Having a device manager that repetitively configures each data node for every functional instance can become complex and prone to errors. This approach may lead to issues, such as extended configuration times, increased memory usage on the device, and inefficient YANG validation processes due to the large size of the running data store. These challenges only intensify as the system scales.</t>
      <t>This draft proposes a technique to improve this, that is based on 'YANG templates' which results in a smaller running data store even when the device is very large.</t>
      <t>We will call a 'YANG template' the configuration of a functional entity that the device is instructed to replicate multiple times to generate copies of the entity. The technique that we address in this draft allows to generate copies with the same data node values as in the template with the possibility, though, to overrule some of these values on an individual copy basis.</t>
      <t>The general template technique detailed in this draft does not suffer from the drawbacks mentioned earlier where the device manager is explicitly configuring all device data nodes.</t>
      <t>This method is not aimed at becoming a standard itself. It is a YANG modeling technique that can be considered, where appropriate, by any implementor or standardization organization, when designing a YANG module for a specific purpose. For the sake of completeness, note that other IETF documents do mention already the use of YANG template concept for specific applications, for instance <eref target="https://datatracker.ietf.org/doc/draft-ietf-ccamp-optical-impairment-topology-yang/">draft-ietf-ccamp-optical-impairment-topology-yang</eref> and <eref target="https://datatracker.ietf.org/doc/html/rfc8795#section-5.9">RFC8795</eref>. However, they don't provide full context about the method. This draft can help clarifying and formalizing in a generic framework how to define and use YANG templates.</t>
      <t>In the next sections we will elaborate on some of the constructs to apply the template technique and highlight how to mitigate some potential issues. More specifically,</t>
      <ul spacing="normal">
        <li>
          <t>How to define the template of a functional entity, how to instruct the device to replicate it (including per instance variations) and</t>
        </li>
        <li>
          <t>How the replication process takes place when expanding the template into functional entity instances configuration data nodes.</t>
        </li>
      </ul>
    </section>
    <section anchor="template-technique-framework">
      <name>Template technique framework</name>
      <section anchor="provisioning-the-running-data-store">
        <name>Provisioning the running data store</name>
        <t>This section outlines how the device's running data store is utilized to implement the template technique.</t>
        <t>In the YANG model of the device, many functional instances can be organized in a list. Since a template represents the typical configuration pattern of a functional instance, it is often necessary to choose between multiple templates for replication. 
For Example: 
the device <bcp14>MAY</bcp14> host various types of functional instances, each with its own specific data structure. Say, one template might define data nodes for a 'function-1' type, while another template could define data nodes for a 'function-2' type.
For a given type of functional instance, different sets of values for the data nodes <bcp14>MAY</bcp14> be required. Say, a 'function-1' type might have templates for 'function-1-bronze-grade', 'function-1-silver-grade', and 'function-1-gold-grade' variants. As a result, multiple templates can also be organized into a list within the device's YANG model.</t>
        <t>Assume for example, that list-a and list-b data nodes need to be configured in the device. Traditionally, the tree structure will be as below:</t>
        <t>root</t>
        <artwork><![CDATA[
 +--(...)                     // out of scope
 +--rw data-nodes-pattern     // container for functional instances
    +--rw instance* [name]    // the list of functional instances 
       +--rw name             string-ascii64
       +--rw description?     string-ascii128
       +--rw data
          +--rw list-a [name] //e.g. a list of interfaces
          |  +--rw name
          |  +--rw parm-x
          |  +--rw parm-y
          +--rw list-b [name] //e.g. a list of hardware components
             +--rw name
             +--rw parm-t
             +--rw parm-u
]]></artwork>
        <t>In contrast, the YANG tree of a device using the template technique would appear as below:</t>
        <t>root</t>
        <artwork><![CDATA[
 +--(...)                     // out of scope
 +--rw data-nodes-pattern     // container for functional instances
    +--rw template* [name]    // the list of templates
    |  +--rw name             string-ascii64
    |  +--rw description?     string-ascii128
    |  +--rw data
    |     +--rw list-a [name] //e.g. a list of interfaces
    |     |  +--rw name
    |     |  +--rw parm-x 
    |     |  +--rw parm-y
    |     +--rw list-b [name] //e.g. a list of hardware components
    |        +--rw name
    |        +--rw parm-t
    |        +--rw parm-u
    +--rw instance* [name]    // the list of functional instances 
       +--rw name             string-ascii64
       +--rw description?     string-ascii128
       +--rw template?        -> /data-nodes-pattern/template/name
       +--rw data
       +--rw list-a [name] //e.g. a list of interfaces
       |  +--rw name
       |  +--rw parm-x  //overrule if present,or take it from template
       |  +--rw parm-y  //overrule if present,or take it from template
       +--rw list-b [name] //e.g. a list of hardware components
          +--rw name
          +--rw parm-t  //overrule if present,or take it from template
          +--rw parm-u  //overrule if present,or take it from template
]]></artwork>
        <t>Each entry in the template list encompasses the generic configuration data nodes that are needed for all the functional entities to be addressed by this template, as contained in the data container, in this example, data nodes of list-a and list-b. In practice, naturally, the more data nodes that can be replicated the more efficient the template technique will be.</t>
        <t>Each entry in the instance list represents a copy to be made of the data nodes pattern defined by the leaf-ref template, to create a functional entity instance. The data container contains all the data nodes needed to customize each copy of the template, by overruling one or the other data node value originating from the template (eg: parm-x, parm-y, parm-t, parm-u), or possibly to add to the copy one or the other data nodes not provided by the template.</t>
        <t>Although it is recommended that the same data nodes are defined in the data container of template and the data container of instance, only a limited number of such data nodes should be configured in the instance. This reflects the assumption that functional instances should have only limited variations from their template model.</t>
        <t>It should be noted that in a good application of the template technique, only few templates would suffice to generate a very large number of functional instances; in other words, the instance list would be much larger, typically by order of magnitudes, than the template list.</t>
        <t>A simple configuration example in the running data store of the device can be found at <xref target="a1device-running-data-store-using-the-template-mechanism">Appendix A.1</xref></t>
      </section>
      <section anchor="device-expanding-the-running-data-store">
        <name>Device expanding the running data store</name>
        <t>Once the configuration is applied to the device, the device will dynamically create each instance as specified.
The process for generating data nodes for a particular instance follows these steps:</t>
        <t>-A copy of the template's data nodes is made, serving as the foundation for the instance's configuration.</t>
        <t>-If any of these data nodes are also configured in the running data store for this instance, they will override the template values.</t>
        <t>If an instance data node is configured in the running data store but not provided by the template, it will be added to the generated instance configuration.</t>
        <t>The resulting instance expansion corresponding to the example in appendix A.1 is provided in <xref target="a2data-generated-by-the-template-mechanism">Appendix A.2</xref></t>
      </section>
      <section anchor="mandatories-and-defaults">
        <name>Mandatories and Defaults</name>
        <t>While conceptually, the idea of templates improves the re-usability and consistency factor, there are certain nuances, which need to be addressed while handling data nodes with defaults and mandatories.</t>
        <t>If certain replicable data patterns contain default or mandatory values, and are used as-is both in the template and in the instance,</t>
        <t>-There is a possibility of silent and unintentional overwriting the configured value of the node in the template with the default value in the instance due to the merge operation.</t>
        <t>-Mandatory data nodes must be unconditionally configured in the instance although they are already configured in the template, reducing the efficiency of the template mechanism.</t>
        <t>Hence, while the same data nodes are used in the templates and instances, it is imperative that instance data nodes are without default and mandatory statements.</t>
        <t>there <bcp14>MAY</bcp14> be different implementation to solve this, one such way which uses the existing yang constructs is provided in <xref target="b-using-existing-yang-constructs-in-template-and-instance-yang-definition">Appendix B</xref>.</t>
      </section>
    </section>
    <section anchor="benefits-of-templates-in-yang-design">
      <name>Benefits of Templates in YANG Design</name>
      <ol spacing="normal" type="1"><li>
          <t>Reusability:
Templates encourage reusability by allowing common structures to be defined once and reused multiple times. This reduces duplication and simplifies model management.</t>
        </li>
        <li>
          <t>Consistency:
By using templates, similar configurations are defined and applied uniformly, leading to more consistent data modeling and network configuration management.</t>
        </li>
        <li>
          <t>Simplified Maintenance:
When a template is modified, all places where it is used will automatically reflect those changes, reducing the effort required to maintain and update the model.</t>
        </li>
        <li>
          <t>Modularity:
Templates promote a modular approach to YANG model design. By splitting the model into reusable parts, it becomes easier to scale and extend.</t>
        </li>
      </ol>
    </section>
    <section anchor="appendix">
      <name>Appendix</name>
      <section anchor="a-example-of-applying-the-template-method">
        <name>A. Example of applying the template method.</name>
        <section anchor="a1device-running-data-store-using-the-template-mechanism">
          <name>A.1.Device running data store using the template mechanism</name>
          <t>In this example, one template template-1 is configured, and three instances are configured, to be derived from template-1 and with limited overruling of the template values.</t>
          <artwork><![CDATA[
 <config>
 <data-nodes-pattern>
 <template>
  <name>template-1</name>
  <description>A typical configuration</description>
  <data>
    <list-a>
      <name>templ-1-list-a-entry-1</name>
      <parm-x>1</parm-x>
      <parm-y>30</parm-y>
    </list-a>
    <list-a>
      <name>templ-1-list-a-entry-2</name>
      <parm-x>3</parm-x>
      <parm-y>30</parm-y>
    </list-a>
     <list-a>
      <name>templ-1-list-a-entry-3</name>
      <parm-x>3</parm-x>
      <parm-y>50</parm-y>
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-1</name>
      <parm-t>2</parm-t>
      <parm-u>40</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-2</name>
      <parm-t>4</parm-t>
      <parm-u>60</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-3</name>
      <parm-t>4</parm-t>
      <parm-u>80</parm-u>
    </list-b>
  </data>
</template>

<instance>                         // a first instance
  <name>instance-1</name>
  <template>template-1</template>  //config is derived from template-1
  <data>
    <list-a>
      <name>templ-1-list-a-entry-2</name> // inherited from template
      <parm-y>33</parm-y>      //overrule template value 30 with 33
    </list-a>
  </data>
</instance>

<instance>                         // a second instance
  <name>instance-2</name>
  <template>template-1</template> //config is derived from template-1
  <data>                   // nothing from template to be overruled
  </data>
</instance>

<instance>                        // a third instance
  <name>instance-3</name>
  <template>template-1</template> //config is derived from template-1
  <data>
    <list-a>
      <name>templ-1-list-a-entry-3</name> //inherited from template
      <parm-y>55</parm-y>      //overrule template value 50 with 55
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-3</name> //inherited from template
      <parm-u>88</parm-u>       //overrule template value 80 with 88
    </list-b>
  </data>
</instance>
 </data-nodes-pattern>
 </config>
]]></artwork>
        </section>
        <section anchor="a2data-generated-by-the-template-mechanism">
          <name>A2:Data generated by the template mechanism</name>
          <t>The running data store example in section A.1 leads the device to generate the following data used to control the instances (without the aid of the template mechanism, this data would need to explicitly come from the running data store, instead of being locally expanded):</t>
          <t>generated through instance-1 merged with template-1 expansion</t>
          <artwork><![CDATA[
  <data>
    <list-a>
      <name>templ-1-list-a-entry-1</name>
      <parm-x>1</parm-x>
      <parm-y>30</parm-y>
    </list-a>
    <list-a>
      <name>templ-1-list-a-entry-2</name>
      <parm-x>3</parm-x>       
      <parm-y>33</parm-y>     //deviate from template value
    </list-a>
     <list-a>
      <name>templ-1-list-a-entry-3</name>
      <parm-x>3</parm-x>
      <parm-y>50</parm-y>
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-1</name>
      <parm-t>2</parm-t>
      <parm-u>40</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-2</name>
      <parm-t>4</parm-t>
      <parm-u>60</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-3</name>
      <parm-t>4</parm-t>
      <parm-u>80</parm-u>
    </list-b>
  </data>
]]></artwork>
          <t>(generated through instance-2 merged with template-1 expansion)</t>
          <artwork><![CDATA[
  <data>
    <list-a>
      <name>templ-1-list-a-entry-1</name>
      <parm-x>1</parm-x>
      <parm-y>30</parm-y>
    </list-a>
    <list-a>
      <name>templ-1-list-a-entry-2</name>
      <parm-x>3</parm-x>       
      <parm-y>30</parm-y>
    </list-a>
     <list-a>
      <name>templ-1-list-a-entry-3</name>
      <parm-x>3</parm-x>
      <parm-y>50</parm-y>
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-1</name>
      <parm-t>2</parm-t>
      <parm-u>40</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-2</name>
      <parm-t>4</parm-t>
      <parm-u>60</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-3</name>
      <parm-t>4</parm-t>
      <parm-u>80</parm-u>
    </list-b>
  </data>
]]></artwork>
          <t>(generated through instance-3 merged with template-1 expansion)</t>
          <artwork><![CDATA[
  <data>
    <list-a>
      <name>templ-1-list-a-entry-1</name>
      <parm-x>1</parm-x>
      <parm-y>30</parm-y>
    </list-a>
    <list-a>
      <name>templ-1-list-a-entry-2</name>
      <parm-x>3</parm-x>       
      <parm-y>30</parm-y>
    </list-a>
     <list-a>
      <name>templ-1-list-a-entry-3</name>
      <parm-x>3</parm-x>
      <parm-y>55</parm-y>     //deviate from template value
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-1</name>
      <parm-t>2</parm-t>
      <parm-u>40</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-2</name>
      <parm-t>4</parm-t>
      <parm-u>60</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-3</name>
      <parm-t>4</parm-t>
      <parm-u>88</parm-u>     //deviate from template value
    </list-b>
  </data>
]]></artwork>
        </section>
      </section>
      <section anchor="b-using-existing-yang-constructs-in-template-and-instance-yang-definition">
        <name>B: Using existing yang constructs in template and instance YANG definition</name>
        <t>This appendix illustrates the use of groupings in the YANG definition of template and instances and more specifically it shows how easily mandatory and default statements can be introduced in the template definition by refining the grouping uses statement.</t>
        <section anchor="the-grouping-construct">
          <name>The grouping construct</name>
          <t>By defining common structures using grouping, one avoids repeating code, ensures consistency and makes future changes easier since modifications only need to happen in one place.</t>
          <t>Example:</t>
          <artwork><![CDATA[
 grouping interface-config {
          leaf parm-a {
             type string;
          }
          leaf parm-b {
             type boolean;
          }
          leaf parm-c {
             type unint32;
          }
        }
]]></artwork>
          <t>This 'interface-config' grouping defines a common structure that can be reused across different YANG modules or different parts of the same module.</t>
        </section>
        <section anchor="the-uses-construct">
          <name>The uses construct</name>
          <t>The 'uses' statement applies a previously defined grouping where needed in the model (e.g. it copies the data nodes of the grouping at the place of the 'uses' statement.</t>
          <t>As an example, the data nodes defined in the grouping above can be used in the template and in the instance definition:</t>
          <artwork><![CDATA[
 container data-nodes-pattern {
 list template {
  key "name";
  leaf name {
    type string;
  }
  container data {
    list interface {
      key "interface-name";
      leaf name {
        type string;
      }
      uses interface-config;
    } 
   } 
  }
list instance {
  key "name";
  leaf name {
    type string;
  }
  container data {
    list interface {
      key "interface-name";
      leaf name {
        type string;
      }
      uses interface-config;
    }
   }
  }
 }
]]></artwork>
        </section>
        <section anchor="the-refine-construct-to-control-default-and-mandatory-statements">
          <name>The refine construct to control default and mandatory statements</name>
          <t>As explained in section 2.3, with the template method, some data nodes may need a default or mandatory statement when used for the template definition but should have no mandatory neither default statements when used for the instance definition.</t>
          <t>The refine statement available in existing YANG version easily allows to control mandatory and default statements when used along with the uses statement.</t>
          <t>Assume in our example that it is desired that parm-b has a default statement and parm-c has a mandatory statement when they are used for the template definition.</t>
          <t>Then the YANG becomes:</t>
          <artwork><![CDATA[
 container data-nodes-pattern {
 list template {
  key "name";
  leaf name {
    type string;
  }
  container data {
    list interface {
      key "interface-name";
      uses interface-config {
        refine parm-b {
          default "true"
        }
        refine parm-c {
          mandatory true
        }
      }
    }
  }
}
list instance {
  key "name";
  leaf name {
    type string;
  }
  container data {
    list interface {
      key "interface-name";
      uses interface-config;
    }
   }
  }
 }
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="conclusion">
      <name>Conclusion</name>
      <t>Using templates in YANG allows to efficiently configure large amounts of similar data nodes while keeping the running data store size small. This is beneficial in term of device memory footprint, ease of configuration, configuration time and potentially YANG validation processing in the device. This draft explains some practicalities of the template method, including how to ensure that mandatory and default statements do not jeopardize the effectiveness of the method.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-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="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>
    <?line 548?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
    </section>
  </back>
  <!-- ##markdown-source:
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
xybEEeh/MC/2tmcTXyqkPDVW2rcy1K51gF+ANw4nLpwdCF8GEtwB/UJhNs5J
dEqGwZQPu/HS2O33MJ3e7qw42dQ+4+2rAijMunkdIEidheh1/P4r3nH3ADsK
6Cil9IiHOfW/bqcQwy1Pw18Q/J1Dy8gjSjK2t6O05unZcAX50TR+qH0TuDht
s1+POKFzGufDosGTw4QfSCjPssUIPc5pg1O4537avrs5Pf7K3d7Eo0+3hr8l
Q0fXMHT8WRi6LUfHn8zRg1uJaHYTQ7Mb16w+PXIj1gN3m9P7nqFmm6HZpzO0
e83q0/vXMvTH/xuGdi/ZTQw9/CiGHk0jq3s0jazdXfLwdCp2/ZlOMddIX5n5
h7tYEWKYLawIw8VwEi4iacYNRM8dOPiZ0MMvPM5Gl+B2CVJ35uWDpR4Hu/DC
COn5LvqK468Yro+Pr7Gg3nIE4d92OazCrcJN69HX9pvW49bLMcweNsS0qd7g
K7mVw0kv+3wSIYHAiNWN8ugb22eXxyer53GrnrfQzgcPPlo7HzjtfPDgc+L7
p7ANyPUwIFdYwl18P3R8P3z48SAX6VB0e0f8Mw2hEkeLRyfnGB22yalePqsb
Hr4ZTopF+SffQojpJ9yF2F7HZUhfcxbR78aIGG0JasOdGibvpACsuOs3yJTa
19nubfzYtZkjTU5rh6+I4xbxQrXVme1JjWlo/NwDxpkp+gTMfS7FaWKV3aM8
aiQ7iIC5rBI8BKdFXGQbRbttQg8I/P+OGN2Nj3FH0ykqEq51F2vJdr6Ell9C
y79LaHln7+41Jn90o8nfC/vWLxb/qXx9secv9vz3sefjL/b8r2XPDz5XTPHF
4v9xLL63xbrdog5iAm6PHp+IHylhvrs6Vvart664x0e7hPpW+7lpKNDrPG/w
aIraVeDcx5R0WAkMFT7j7VPqt1lFCXesGPY/ncP6g11iAwh+zIUVCLjW1hXx
HV9xbGuM4XwDf5zRVrEz5mhGVRsdvjDzU+DqYqDqS3z7+9SuF54K4sS7jzeO
8mCJjssX/k2uTsgrozNLBwNwV0xqsGEFT5qp+Bu60ErAJVX8OG/e0Ccrrrzk
CzOWvh/j0pX7WLV7CtWSVo+6qWBkqmpxp1P4oKvdzoX5hT5jd/aO+C1WYfyD
jY/c+ie3bwo+r8a1U3/Tv/1hN7HZbmIzY+C58jbU0t3UqPHg+Ogmah+CERz0
ZXLQiotLm9xI2l3/Xk8rd1OklbE2KoFH30Jb7MZo71A9zmcNqKjPj01ozbxa
ks52VBKvHuDlg1aXXdGV+jEqgBrT2HwTqrJhLlzwdN2mzoK4VHiX2rN17b/q
7zWoOi4DIdeUyd+Uupt9nvwnYNjhFH391aHb6+Bs6c/wCAcn2qHmhqHelAgD
TkIM1DZ7DnzP4jWIOg4D6aBXl2ojRnRQWFAl0j/6GCHSviF7CLrWZSB+jUYN
mtdVZxq61couEzsZ2cXMlvKTVvWVPnr8Qxs9tT86Co5tJ/Mvwooe/tCf0Ieu
j6n4q9RgznF28aY+G2dMmDIMbfw+u3k0OR63PVK9SvyYP2uPO56kcyFyuE+s
hRX6XJzsz7dVDjrcpu70LZcmIlYqzR3h2159m/qAKbdnejjpRaB3hUefzTjT
2z0ryZ335wOM9vgSL+4bQ46WOZkbxE4v3l4UEX/oio64Cd+6uv6qmusXlltD
8JLzhks6MmtraD77h10cP7JzZUL72U1LFIQYxXCuC+RfHyoH7bePBE65dgUq
fpVGeFTgaCuO2EVpIEhpF5NPHdxJ6cMAwrgf/nmR+Pdi6T62qqWwU3HHk/3Y
bVILjXmtwYcPi+KWTveZgixMU3IQtnUYnnUtl5dKrXa34PNRV3RgVHva3Yx6
BlM6QgQ3ZFVBp9a5E4L4yK25MfUKRF/jsQnWHYETNfGMB47uYmTwx5PAfHYc
yeVOYul8Lt+e4+I8iHWnnfAHXECjjo6I2nIh7Vkk7gQT3s8wnt2IpZmhJvW/
KrOiU4SUb5tD/3VFZ/74kf3BM77/8gmdwec6Dbm922Ga9X4BlY6+IxGj5z++
foOHf+Lf4sVL+vnV0//88eLV03P8+fX3Z8+ehR/23BOvv3/547Pz9qf2zScv
nz9/+uKcX4aronNpb/T87O2Iu81GL394c/HyxdmzUXuulD/ZERGa6++k+RCh
09l1do/7tGbszB8/+eF//vvwvvjtt3979d2To8PDrz98cL88PPzTffgFMZ9H
o10g/4o+YM99BY79hnTo2ErXMrf03R9utks6xnGyt/eHn1Eyv5yIR7N0dXj/
1F3ACXcuepl1LpLMtq9svcxCHLg0MEyQZud6T9Jdfs/edn73co8uPvoWj4sR
yeHDb0/9hwLitUobbLbkXtfM9YWzEr08fxnu++cvzl6cDT3bWVn0zxDt0LOS
jyuatGd94qlhTOwsvSzNOlfZwsVyv53wJ1Iq+4/RHJZKjT74bxrwn/8FzwLS
S0RbAAA=

-->

</rfc>
