<?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.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kaestle-monitoring-plugins-interface-01" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.0 -->
  <front>
    <title abbrev="MPI">The Monitoring Plugins Interface</title>
    <seriesInfo name="Internet-Draft" value="draft-kaestle-monitoring-plugins-interface-01"/>
    <author fullname="Lorenz Kästle">
      <organization>The Monitoring Plugins Project</organization>
      <address>
        <email>lorenz@vulgrim.de</email>
      </address>
    </author>
    <date year="2023" month="September" day="24"/>
    <keyword>monitoring</keyword>
    <abstract>
      <?line 33?>

<t>This document aims to document the Monitoring Plugin Interface, a standard more or less
strictly implemented by different network monitoring solutions.
Implementers and Users of network monitoring solutions, monitoring plugins and libraries can use
this as a reference point as to how these programs interface with each other.</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-kaestle-monitoring-plugins-interface/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/RincewindsHat/rfc-monitoring-plugins-interface"/>.</t>
    </note>
  </front>
  <middle>
    <?line 40?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>With the emergence of NetSaint/Nagios at the latest, these system and their successors/forks
have relied on a loose group of programs called "Monitoring Plugins" to do the lower level
task of actually determining the state of a particular entity or conduct measurements of certain
values.</t>
      <t>This document shall help users and especially developers of those programs as a basis
on how they should be implemented, how they should work and how they should behave.
It encourages the standardization of libraries, Monitoring Plugins and Monitoring Systems,
to reduce the cognitive load on users, administrators and developers, if they work with
different implementations.</t>
      <t>This document aims to be as general as possible and not to assume a special
implementation detail, e.g. the programming language, the install mechanism or the monitoring
system which executes the Monitoring Plugin.</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 anchor="def_range_expression">
        <name>Range expressions</name>
        <t>In many cases thresholds for metrics mark a certain range of values where the
values is considered to be good or bad if it is inside or outside. While for
significant number of metrics a upper (e.g. load on unixoid systems) or lower
(e.g. effective throughput, free space in memory or storage) border might
suffice, for some it does not, for example a temperature value from a
temperature sensor should be within certain range (e.g. between 10℃ and 45℃).</t>
        <t>Regarding input parameters this might be handled with options like
<tt>--critical-upper-temperature</tt> and <tt>--critical-lower-temperature</tt>, but this
creates a problem in the performance data output, if only scalar values could be
used. To resolve this situation the <em>Range expression</em> format was introduced,
with the following definition:</t>
        <t><tt>[@][start:][end]</tt></t>
        <t>where:</t>
        <ol spacing="normal" type="1"><li>At least <tt>start</tt> or <tt>end</tt> <bcp14>MUST</bcp14> be provided.</li>
          <li>
            <tt>start</tt> &lt;= <tt>end</tt></li>
          <li>If <tt>start</tt> == 0, then <tt>start</tt> can be omitted.</li>
          <li>If <tt>end</tt> is omitted, it has the "value" of positive infinity.</li>
          <li>Negative infinity can be specified with the tilde character <tt>~</tt>.</li>
          <li>If the prefix <tt>@</tt> IS given, the value exceeds the threshold if it is INSIDE the range between <tt>start</tt> and <tt>end</tt> (including the endpoints).</li>
          <li>If the prefix <tt>@</tt> is NOT given, the value exceeds the threshold if it is OUTSIDE of the range between <tt>start</tt> and <tt>end</tt> (including the endpoints).</li>
        </ol>
        <section anchor="examples">
          <name>Examples</name>
          <table>
            <thead>
              <tr>
                <th align="left">Range definition</th>
                <th align="left">Exceeds threshold if x...</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">10</td>
                <td align="left">&lt; 0 or &gt; 10, (outside the range of {0 .. 10})</td>
              </tr>
              <tr>
                <td align="left">10:</td>
                <td align="left">&lt; 10, (outside {10 .. ∞})</td>
              </tr>
              <tr>
                <td align="left">~:10</td>
                <td align="left">&gt; 10, (outside the range of {-∞ .. 10})</td>
              </tr>
              <tr>
                <td align="left">10:20</td>
                <td align="left">&lt; 10 or &gt; 20, (outside the range of {10 .. 20})</td>
              </tr>
              <tr>
                <td align="left">@10:20</td>
                <td align="left">≥ 10 and ≤ 20, (inside the range of {10 .. 20})</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section anchor="the-basic-monitoring-plugin-usage">
      <name>The basic Monitoring Plugin usage</name>
      <t>A Monitoring System executes a Monitoring Plugin. The Monitoring Plugin <bcp14>MAY</bcp14>
accept parameters in the form of command line arguments, environment variables
or a configuration file (the location of which <bcp14>MAY</bcp14> in turn be given on the
command line or via environment variable). The Monitoring Plugin then proceeds
to execute its duty and returns the result to the Monitoring System. Part of
the process of returning the result is the termination of the execution of the
Monitoring Plugin itself.</t>
    </section>
    <section anchor="input-parameters-for-a-monitoring-plugin">
      <name>Input Parameters for a Monitoring Plugin</name>
      <t>A Monitoring Plugin <bcp14>MUST</bcp14> expect input parameters as arguments during
execution, if any are needed/expected at all. It <bcp14>MAY</bcp14> accept these parameters
given as <em>environment variables</em> and it <bcp14>MAY</bcp14> accept them in a configuration file
(with a default path or a path given via arguments or <em>environment variables</em>).</t>
      <t>In general positional arguments are strongly discouraged.</t>
      <t>Some arguments <bcp14>MUST</bcp14> have this predetermined meaning, if they are used:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Argument (long)</th>
            <th align="left">Argument (short version, optional)</th>
            <th align="left">Argument</th>
            <th align="left">Meaning</th>
            <th align="left">optional</th>
            <th align="left">can be given multiple times</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">--help</td>
            <td align="left">-h</td>
            <td align="left">None</td>
            <td align="left">Triggers the help functionality of the Monitoring Plugin, showing the individual parameters and their meaning, examples for usage of the Monitoring Plugin and general remarks about the how and why of the Monitoring Plugin. <bcp14>SHOULD</bcp14> overwrite all other options, meaning, they are ignored if <tt>--help</tt> is given. The Monitoring Plugin <bcp14>SHOULD</bcp14> exit with state UNKNOWN (3).</td>
            <td align="left">no</td>
            <td align="left">-- (makes no difference)</td>
          </tr>
          <tr>
            <td align="left">--version</td>
            <td align="left">-V</td>
            <td align="left">None</td>
            <td align="left">Shows the version of the Monitoring Plugin to allow users to report errors better and therefore help them and the developers. The Monitoring Plugin <bcp14>SHOULD</bcp14> exit with state UNKNOWN (3).</td>
            <td align="left">no</td>
            <td align="left">-- (makes no difference)</td>
          </tr>
          <tr>
            <td align="left">--timeout</td>
            <td align="left">-t</td>
            <td align="left">Integer (meaning seconds) or a time duration string</td>
            <td align="left">Sets a limit for the time which a Monitoring Plugin is given to execute. This is there to enforce the abortion of the test and improve the reaction time of the Monitoring System (e.g. in bad network conditions it might be helpful to abort the test prematurely and inform the user about that, than trying forever to do something which won't succeed. Or if soft real time constraints are present, a result might be worthless altogether after some time). A sane default is probably 30 seconds, although this depends heavily on the scenario and should be given a thought during development. If the execution is terminated by this timeout, it should exit with state UNKNOWN (3) and (if possible) give some helpful output in which stage of the execution the timeout occurred.</td>
            <td align="left">no</td>
            <td align="left">no</td>
          </tr>
          <tr>
            <td align="left">--hostname</td>
            <td align="left">-H</td>
            <td align="left">String, meaning either a DNS nameor an IP address of the targeted system</td>
            <td align="left">If the Monitoring Plugin targets exactly one other system on the network, this option should be used to tell it which one. If the Monitoring Plugin does its test just locally or the logic does not apply to it, this option is, of course, optional.</td>
            <td align="left">yes</td>
            <td align="left">no</td>
          </tr>
          <tr>
            <td align="left">--verbose</td>
            <td align="left">-v</td>
            <td align="left">None</td>
            <td align="left">Increases the verbosity of the output, thereby breaking the suggested rules about a short and concise output. The intention is to provide more information to a user.</td>
            <td align="left">yes</td>
            <td align="left">yes</td>
          </tr>
          <tr>
            <td align="left">--exit-ok</td>
            <td align="left"> </td>
            <td align="left">The Monitoring Plugin exits unconditionally with OK (0). Mostly useful for the purpose of packaging and testing plugins, but might be used to always ignore errors (e.g. to just collect data).</td>
            <td align="left">yes</td>
            <td align="left">no</td>
            <td align="left"> </td>
          </tr>
        </tbody>
      </table>
      <section anchor="examples-1">
        <name>Examples</name>
        <t>For the execution with <tt>--help</tt>:</t>
        <artwork><![CDATA[
$ my_check_plugin --help
]]></artwork>
        <t>the output might look like this:</t>
        <artwork><![CDATA[
my_check_plugin version 3.1.4
Licensed under the AGPLv1.
Repository: git.example.com/jdoe/my_check_plugin

This plugin just says hello. It fails if you don't give it a name.

Usage:
 my_check_plugin --name NAME [--greeting GREETING]

Options:
 --help
   this help
 --version
   Shows the version of the plugin
 --name NAME
   if given, uses NAME as a name to greet.
 --greeting GREETING
   if given, uses GREETING instead of Hello.

Examples:
$ my_check_plugin --name Jane
Hello Jane

$ my_check_plugin --greeting Ciao --name Alice
Ciao Alice
]]></artwork>
        <t>This imaginary Monitoring Plugin tries to be really helpful here, displays
the version, the license and the upstream repository with the help (although
not necessary), has a short description about the purpose, lists the options in
an easily readable way and even gives some examples.</t>
        <t>For the execution with <tt>--version</tt></t>
        <artwork><![CDATA[
$ my_check_plugin --version
]]></artwork>
        <t>the output might be a bit shorter:</t>
        <artwork><![CDATA[
my_check_plugin version 3.1.4
]]></artwork>
        <t>or even:</t>
        <artwork><![CDATA[
3.1.4
]]></artwork>
        <t>where both show the necessary information.</t>
      </section>
    </section>
    <section anchor="output-of-a-monitoring-plugin">
      <name>Output of a Monitoring Plugin</name>
      <t>The output of a Monitoring Plugin consists of two parts on the first level, the
<em>Exit Code</em> and output in textual form on <em>stdout</em>.</t>
      <section anchor="exit-code">
        <name>Exit Code</name>
        <t>The Monitoring Plugin <bcp14>MUST</bcp14> make use of the <em>Exit Code</em> as a
method to communicate a result to the Monitoring System. Since the <em>Exit
Code</em> is more or less standardized over different systems as an integer number
with a width of or greater than 8bit, the following mapping is used:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Exit Code (numerical)</th>
              <th align="left">Meaning (short)</th>
              <th align="left">Meaning (extended)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">OK</td>
              <td align="left">The execution of the Monitoring Plugin proceeded as planned and the tests appeared to function properly and the measured values are within their respective thresholds</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">WARNING</td>
              <td align="left">The execution of the Monitoring Plugin proceeded as planned and the tests appeared to <em>not</em> function properly or the measured values are <em>not</em> with their respective thresholds. The problem(s) do(es) <em>not</em> seem exceptionally grave though and do(es) <em>not</em> require immediate attention</td>
            </tr>
            <tr>
              <td align="left">2</td>
              <td align="left">CRITICAL</td>
              <td align="left">The execution of the Monitoring Plugin proceeded as planned and the tests appeared to <em>not</em> function properly or the measured values are <em>not</em> with their respective thresholds. The problem(s) <em>do(es)</em> seem exceptionally grave though and <em>do(es)</em> require immediate attention</td>
            </tr>
            <tr>
              <td align="left">3</td>
              <td align="left">UNKNOWN</td>
              <td align="left">The execution of the Monitoring Plugin <em>did not</em> proceed as planned. The reasons might be manifold, e.g. missing permissions, missing libraries, no available network connection to the destination, etc.. In summary: The Monitoring Plugin could <em>not</em> determine the state of whatever it should have been checking and can therefore make no reliable statement about it.</td>
            </tr>
            <tr>
              <td align="left">4-125</td>
              <td align="left">reserved for future use</td>
              <td align="left"> </td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="textual-output">
        <name>Textual Output</name>
        <t>The original purpose of the output on <em>stdout</em> was to provide human readable
information for the user of the Monitoring System, a way for the Monitoring
Plugin to communicate further details on what happened. This purpose still
exists, but was expanded with the, so called, performance data to
allow the machine readable communication of measured values for further
processing in the Monitoring System, e.g. for the creation of diagrams.</t>
        <t>Therefore the further explanation is split into <em>human readable output</em> and
<em>performance data</em>.</t>
        <section anchor="human-readable-output">
          <name>Human readable output</name>
          <t>This part of the output should give an user information about the state of the
test and, in the case of problems, ideally hint what the origin of the problem
might be or what the symptoms are. If the test relies on numeric values, this
might be displayed to give an user more information about the specific problem.
It might consist of one or more lines of printable symbols.</t>
          <t>Although no strict guidelines for creating this part of the output can really
be given, a developer should keep a potential user in mind. It might, for
example, be OK to put the output in a single line if there are only one or two
items of a similar type (think: multiple file systems, multiple sensors, etc.)
are present, but not if there 10 or 100, although this might present a valid
use case. If there are several different items exists in the output of the
Monitoring Plugin they probably <bcp14>SHOULD</bcp14> be given their own line in the output.</t>
          <section anchor="examples-2">
            <name>Examples</name>
            <artwork><![CDATA[
Remaining space on filesystem "/" is OK

Sensor temperature is within thresholds

Available Memory is too low

Sensore temperature exceeds thresholds
]]></artwork>
            <t>are OK, but</t>
            <artwork><![CDATA[
Remaining space on filesystem "/" is OK ( 62GiB / 128GiB )

Sensor temperature is within thresholds ( 42°C )

Available Memory is too low ( 126MiB / 32GiB )

Sensor temperature exceeds thresholds ( 78°C > 70°C )
]]></artwork>
            <t>are better.</t>
          </section>
        </section>
        <section anchor="performance-data">
          <name>Performance data</name>
          <t>In addition to the human readable part the output can
contain machine readable measurement values. These data points are separated
from the human readable part by the "|" symbol which is in effect until the end
of the output. The performance data then <bcp14>MUST</bcp14> consist of space (ASCII 0x20)
separated single values, these <bcp14>MUST</bcp14> have the following format:</t>
          <t><tt>[']label[']=value[UOM][;warn[;crit[;min[;max]]]]</tt></t>
          <t>with the following definitions:</t>
          <ol spacing="normal" type="1"><li>
              <tt>label</tt> <bcp14>MUST</bcp14> consist of at least on non-space character, but can otherwise
    contain any printable characters except for the equals sign (<tt>=</tt>) or single
    quotes (<tt>'</tt>). If it contains spaces, it must be surrounded by single quotes</li>
            <li>
              <tt>value</tt> is a numerical value, might be either an integer or a floating
    point number. Using floating point numbers if the value is really discreet
    <bcp14>SHOULD</bcp14> be avoided. The representation of a floating point number
    <bcp14>SHOULD NOT</bcp14> use the "scientific notation" (e.g. <tt>6.02e23</tt> or <tt>-3e-45</tt>),
    since some systems might not be able to parse them correctly. Values
    with a base other then 10 <bcp14>SHOULD</bcp14> be avoided (see below for more information
    on <tt>Byte</tt> values).</li>
            <li>
              <t><tt>UOM</tt> is the <em>Unit of measurement</em> (e.g. "B" for <em>Bytes</em>, "s" for seconds)
 which gives more context to the Monitoring System.  </t>
              <ul spacing="normal">
                <li>
                  <t>The following constraints <bcp14>MUST</bcp14> be applied:      </t>
                  <ol spacing="normal" type="1"><li>An <tt>UOM</tt> of <tt>%</tt> <bcp14>MUST</bcp14> be used for percentage values</li>
                    <li>An <tt>UOM</tt> of <tt>c</tt> <bcp14>MUST</bcp14> be used for continuous counters (commonly used
for the sum of bytes transmitted on an interface)</li>
                  </ol>
                </li>
                <li>
                  <t>The following recommendations <bcp14>SHOULD</bcp14> be applied:      </t>
                  <ol spacing="normal" type="1"><li>The <tt>UOM</tt> for <tt>Byte</tt> values is <tt>B</tt> and although many systems do
understand units like <tt>KB</tt>,<tt>KiB</tt>, <tt>MB</tt>, <tt>GB</tt>, <tt>TB</tt> they <bcp14>SHOULD</bcp14> be
avoided, at the least to avoid the ugly hassle about people
misinterpreting the <em>base10</em> values as <em>base2</em> values and the other way
round. This is also a prime example where floating point number <bcp14>SHOULD
NOT</bcp14> be used, since there are obviously only integer numbers included.</li>
                    <li>The <tt>UOM</tt> for time is <tt>s</tt>, meaning seconds, SI-Prefixes (e.g. <tt>ms</tt> for
milli seconds) are allowed if necessary or useful.</li>
                    <li>In general, SI units and SI prefixes <bcp14>MAY</bcp14> be used as <tt>UOM</tt> if
applicable, but the Monitoring System may not understand them correctly
(mostly in uncommon cases), in that cases appropriate workarounds <bcp14>MAY</bcp14> be
applied on the side of the Monitoring Plugin. Since the
values are not intented to be human readable normalized units are
recommended (e.g. <tt>overall_power=14000000000W</tt> instead of
<tt>overall_power=14GW</tt>)</li>
                    <li>
                      <tt>warn</tt> and <tt>crit</tt> are the threshold values for this measurement, which may
have been given by the user as input, may be hardcoded in the Monitoring
Plugin or may be retrieved from a file or a device or somewhere else
during the execution of the Monitoring Plugin. The unit used <bcp14>MUST</bcp14> be
the same as for <em>value</em>. These values are not simple numbers, but
range expressions (<xref target="def_range_expression"/>).</li>
                    <li>
                      <tt>min</tt> and <tt>max</tt> are the minimal respectively the maximal value the
<tt>value</tt> could possibly be. The unit <bcp14>MUST</bcp14> be the same as for <tt>value</tt>.
These values can be omitted, if the <tt>value</tt> is a percentage value,
since <tt>min</tt> and <tt>max</tt> are always <tt>0</tt> and <tt>100</tt> in this case.</li>
                  </ol>
                </li>
              </ul>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>The interface metioned here is implemented by several network monitoring systems. A non-exhaustive
list of these systems includes:</t>
      <ul spacing="normal">
        <li>Icinga 2</li>
        <li>Naemon</li>
        <li>Nagios</li>
      </ul>
      <t>The other side of the interface is implemented by several different projects, again in an non-exhaustive
list:</t>
      <ul spacing="normal">
        <li>The Monitoring Plugins Project</li>
        <li>The Nagios Plugins Project</li>
        <li>The Linuxfabrik Monitoring Plugins</li>
        <li>Madrisan Nagios Plugins</li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Special security considerations are hard to define regarding this topic. Regarding the implementation
of this interface, the usual programming security considerations should apply (e.g. sanitize inputs),
but the risks and problems regarding security are dependent on the specific implementation and usage.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <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 372?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks for previous have to be said to the original inventors of this interface, although
it is not easy to determine who these persons are, so they are mentioned here in general.</t>
      <t>Thanks are going also to the many different implementors on either side of this interface for
their hard work which allows the use of different components and systems with each other in the
best spirit of free software.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
QbJ7NfxmqE6vkG7cBhsdZN3cp8ZkglhjW1r1Pz2/Ov32Gf8qIh6FOxKA5Y1v
u4sEJq+zGMHhGQe9fm8bOgBPdvVvRenizWvGyY3/r2jBEH+mnokhgOv+GKxy
K2PqI36OyHQQuR8MBh+xnkLz8BffDg/w5St1QGL2Nb711G6wmR1EgfWHAzUY
4Pcf9sK2Y963tOHDIS/66d//I6z68ZjBfxJuH8tXQR8dBOCC1dH23XLiUdz7
Tdz805/+i7YTRX/6058FQvAKnwBAgRLFQhQvpxsSvdrDbCcn6+FqG4HpDfHX
5txVwQcnGunLfMmkBmNG1oVzAzebScYGX6zLCcdCiElMcWtLV3BkdIvgWo9I
HEAuTT5ybCcIyVkaxuT3diWXSZuQXOJGYMDn1SUrKgu1EouXLB0MuLdWbzx0
b9v12OTAVrEoUjQfaASNQFRXwz4QeERxOF30BsJa5xxMr8SxQuSBegU1AfZJ
CJ8p86PLCIyoLAGKDbrIGVpzb9YmxqN9kKzjDhRNPh5I7ko+71XLoDETeW3P
slhEFpPJhtNAcLDuPCk1iwwFQTisb3Bjr0URFIW9BUhosgcCiILeiiJUmKeK
WRiEKKTnzQGJ8BPHXG+UlmtmgF2Fwf50kxQlu2y/NdkaTSSea/LzJae7+CTH
kZy018KvWw4nU4YoMWZV4lRcQQlWs5vujszOFRNKc60PiSZcVnJFAVK7kgnN
uT87bxjsmJyDXMi3STraZJDgktc/Jvt5EoCo3RwHwQx0nsB4QuJuQUxmicQ0
Ol9a9FGdCXx8igvwMTg/IcoM5LIUuVV2BiOxYoa3/eVVnPfjwxR/zh108aN6
XdrJRMIvI3WBcV2kcjKXGsabE8EepzFRT2yRWcQRNRG/I5RNaaWhWog6RfLZ
BG49gbdHlpaGAnyAHLlaijlURaAVd9PtSA5USHMcyH6HiNBwNsaFpRhU9lrk
Gn4iqneUFoDHQ6EaO2um/zYTFU4y91AClm2p4Lw5f3F+8fZc7T6EcfuI8JsZ
onZn+oaj8aZql5q9wKUgIrTwdy2jrnBh4VL8fSvhqIJA8WIo8XDxY07CZ8qS
6hqIFShQCuxBPELVReY9q2x43il9/P3vTLJMnMVn+kNV0AllToE3SD+o4CXJ
kmbJJysn9oTqoawxV4b0HF4GMScLmISHWCsuaoOlbdiqWqdCt7U+GH0pFBiq
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
c1tKniVvFrpxdUcV7OR/AY/n9bstQwAA

-->

</rfc>
