1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
|
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Virtual Domains — Cyrus IMAP 3.10.2 documentation</title>
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/graphviz.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/cyrus.css" type="text/css" />
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/sphinx_highlight.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="next" title="Mailbox Annotations (METADATA)" href="mailbox-annotations.html" />
<link rel="prev" title="Mailbox Namespaces" href="namespaces.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../index.html" class="icon icon-home">
Cyrus IMAP
</a>
<div class="version">
3.10.2
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Cyrus IMAP</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../download.html">Download</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../quickstart.html">Quickstart Guide</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../../overview.html">Overview</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="../features.html">Features</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../features.html#security-and-authentication">Security and Authentication</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="../features.html#mailbox-management">Mailbox Management</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="automatic-creation-of-mailboxes.html">Automatic Creation of Mailboxes</a></li>
<li class="toctree-l4"><a class="reference internal" href="namespaces.html">Mailbox Namespaces</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">Virtual Domains</a></li>
<li class="toctree-l4"><a class="reference internal" href="mailbox-annotations.html">Mailbox Annotations (METADATA)</a></li>
<li class="toctree-l4"><a class="reference internal" href="mailbox-distribution.html">Mailbox Distribution</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../features.html#message-management">Message Management</a></li>
<li class="toctree-l3"><a class="reference internal" href="../features.html#calendar-and-contact-dav-collection-management">Calendar and Contact (DAV) Collection Management</a></li>
<li class="toctree-l3"><a class="reference internal" href="../features.html#storage">Storage</a></li>
<li class="toctree-l3"><a class="reference internal" href="../features.html#load-management">Load Management</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../overview_and_concepts.html">Concepts</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../setup.html">Setup</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../operations.html">Operations</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../developers.html">Developers</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../support.html">Support/Community</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Cyrus SASL</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org/sasl">Cyrus SASL</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">Cyrus IMAP</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../../../overview.html">Overview</a></li>
<li class="breadcrumb-item"><a href="../features.html">Features</a></li>
<li class="breadcrumb-item active">Virtual Domains</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/cyrusimap/cyrus-imapd/blob/master/docsrc/imap/concepts/features/virtual-domains.rst" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="virtual-domains">
<h1>Virtual Domains<a class="headerlink" href="#virtual-domains" title="Permalink to this heading"></a></h1>
<section id="what-are-virtual-domains">
<h2>What are virtual domains?<a class="headerlink" href="#what-are-virtual-domains" title="Permalink to this heading"></a></h2>
<p>Virtual domains means hosting a service for more than one
domain on a single server. Cyrus IMAP has the ability to host IMAP/POP
mailboxes for multiple domains (for example: <code class="docutils literal notranslate"><span class="pre">test@cyrusisgreat.org</span></code> and
<code class="docutils literal notranslate"><span class="pre">test@ilovecyrus.com</span></code>) on a single server or Murder.</p>
<p>Cyrus needs to know which domain to use when a mailbox is accessed.
There are two ways in which Cyrus can determine the domain:</p>
<dl class="simple">
<dt>Fully qualified userid</dt><dd><p>The client logs in with a userid
containing the domain in which the user belongs (for example:
<code class="docutils literal notranslate"><span class="pre">test@cyrusisgreat.org</span></code> or <code class="docutils literal notranslate"><span class="pre">test@ilovecyrus.com</span></code>)</p>
</dd>
<dt>IP address</dt><dd><p>The server looks up the domain based on the IP
address of the receiving interface (useful for servers with multiple
NICs or those using IP aliasing)</p>
</dd>
</dl>
<p>If the <code class="docutils literal notranslate"><span class="pre">virtdomains</span></code> option is set to <code class="docutils literal notranslate"><span class="pre">off</span></code> (or <code class="docutils literal notranslate"><span class="pre">no</span></code>, <code class="docutils literal notranslate"><span class="pre">0</span></code>, <code class="docutils literal notranslate"><span class="pre">false</span></code>),
Cyrus does not know or care about domains, and only ever considers the local
part of email addresses. This configuration is never recommended, but is
currently the default.</p>
<p>If the <code class="docutils literal notranslate"><span class="pre">virtdomains</span></code> option is set to <code class="docutils literal notranslate"><span class="pre">userid</span></code>, then only the
fully qualified userid is used. This is the only recommended configuration
for new deployments, and in the future may become the default or only option.
Existing deployments should strongly consider migrating towards this
configuration.</p>
<p>If the <code class="docutils literal notranslate"><span class="pre">virtdomains</span></code> option is set to <code class="docutils literal notranslate"><span class="pre">on</span></code> (or <code class="docutils literal notranslate"><span class="pre">yes</span></code>, <code class="docutils literal notranslate"><span class="pre">1</span></code>, <code class="docutils literal notranslate"><span class="pre">true</span></code>),
Cyrus uses both mechanisms to work out the domain (with the fully qualified
userid taking precedence). This configuration is not recommended.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>If you are providing calendaring services, you MUST use the
<code class="docutils literal notranslate"><span class="pre">virtdomains:</span> <span class="pre">userid</span></code> configuration. Calendaring services require
a consistent single authoritative fully-qualified email address for
each user in order to function, and this is the only configuration
that provides it.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">virtdomains:</span> <span class="pre">off</span></code> and <code class="docutils literal notranslate"><span class="pre">virtdomains:</span> <span class="pre">on</span></code> configurations both
allow users' domains to be changed from outside of Cyrus without Cyrus
knowing about it, which fundamentally breaks calendaring. These
configurations are only suitable for IMAP-only deployments.</p>
</div>
</section>
<section id="concepts">
<h2>Concepts<a class="headerlink" href="#concepts" title="Permalink to this heading"></a></h2>
<dl>
<dt>Everyone is in a domain</dt><dd><p>It's best to think of every user as existing inside a domain. Unqualified users are technically inside the <code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code>.</p>
</dd>
<dt>Names can be qualified</dt><dd><p>Global admins can reference mailboxes and IDs by qualified names. That is, for any given mailbox command, you can add <code class="docutils literal notranslate"><span class="pre">@domain</span></code> to the end of the mailbox name.</p>
<p>Here are some examples:</p>
<blockquote>
<div><ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">cyradm></span> <span class="pre">create</span> <span class="pre">user/lukecage@example.net</span></code> - create a user</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">cyradm></span> <span class="pre">create</span> <span class="pre">user/mercedesknight@example.net</span></code> - create another user</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">cyradm></span> <span class="pre">setquota</span> <span class="pre">user/lukecage@example.net</span> <span class="pre">50000</span></code> - define a quota</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">cyradm></span> <span class="pre">setaclmailbox</span> <span class="pre">user/lukecage@example.net</span> <span class="pre">mercedesknight@example.net</span> <span class="pre">read</span></code> - give Mercedes Knight read access to Luke Cage's mailbox</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">cyradm></span> <span class="pre">listmailbox</span> <span class="pre">*@example.net</span></code> - list all mailboxes in the example.net domain</p></li>
</ul>
</div></blockquote>
</dd>
</dl>
<p>Each mailbox exists in only one domain</p>
<dl>
<dt>Domains are mutually exclusive</dt><dd><p>Users only have access to mailboxes within their own domain (intra-domain). The following
example will not work: <code class="docutils literal notranslate"><span class="pre">setacl</span> <span class="pre">user/mercedesknight@herdomain.com</span>
<span class="pre">lukecage@hisdomain.com</span> <span class="pre">read</span></code>.</p>
</dd>
<dt>Global and Domain admins</dt><dd><p>The Cyrus virtual domains
implementation supports per-domain administrators as well as
global (inter-domain) administrators.</p>
<p>Domain-specific administrators are specified with a fully qualified userid in the
<code class="docutils literal notranslate"><span class="pre">admins</span></code> option (e.g., <code class="docutils literal notranslate"><span class="pre">admin@example.net</span></code>) and only
have access to mailboxes in the associated domain.</p>
<p>Global administrators are specified with unqualified userids.</p>
</dd>
</dl>
<p>MOST OF THIS SHOULD BE IN DEPLOYMENT GUIDE?</p>
</section>
<section id="quick-start">
<h2>Quick Start<a class="headerlink" href="#quick-start" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p>Add <code class="docutils literal notranslate"><span class="pre">virtdomains:</span> <span class="pre">userid</span></code> to <a class="reference internal" href="../../reference/manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a></p></li>
<li><p>Add a <code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code> entry to <a class="reference internal" href="../../reference/manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a></p></li>
<li><p>Use cyradm (as a global or domain admin) to create mailboxes for each domain.</p></li>
</ul>
</section>
<section id="configuration">
<h2>Configuration<a class="headerlink" href="#configuration" title="Permalink to this heading"></a></h2>
<p>Support for virtual domains is enabled by turning on the <code class="docutils literal notranslate"><span class="pre">virtdomains</span></code> option in <a class="reference internal" href="../../reference/manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a>.</p>
<p>When upgrading from a single domain installation to a virtual
domain installation, the name of the existing domain (domain of the
server hostname) should be specified using the <code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code>
option in <a class="reference internal" href="../../reference/manpages/configs/imapd.conf.html#std-cyrusman-imapd.conf-5">imapd.conf(5)</a>. This allows users to continue to
access their mailboxes using unqualified userids. For example, if the
primary IP address on your server resolves to 'www.xxx.yyy.zzz',
then set <code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code> to 'xxx.yyy.zzz'.</p>
<p>Even for new installations, set the <code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code> to the "real"
domain of the server (domain of its primary hostname).
See <a class="reference internal" href="#administrators">Administrators</a> for further discussion.</p>
<p>Here is a sample <code class="docutils literal notranslate"><span class="pre">imapd.conf</span></code> with a minimal set of configuration
options:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">configdirectory</span><span class="p">:</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">imap</span>
<span class="n">partition</span><span class="o">-</span><span class="n">default</span><span class="p">:</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">spool</span><span class="o">/</span><span class="n">cyrus</span>
<span class="n">admins</span><span class="p">:</span> <span class="n">admin</span> <span class="n">lukecage</span><span class="o">.</span><span class="n">admin</span><span class="nd">@hisdomain</span><span class="o">.</span><span class="n">com</span> <span class="n">mercedesknight</span><span class="o">.</span><span class="n">admin</span><span class="nd">@herdomain</span><span class="o">.</span><span class="n">net</span>
<span class="n">virtdomains</span><span class="p">:</span> <span class="n">yes</span>
<span class="n">defaultdomain</span><span class="p">:</span> <span class="n">exampleisp</span><span class="o">.</span><span class="n">net</span>
</pre></div>
</div>
<p>This example has three domains: exampleisp.net, hisdomain.com, and
herdomain.net. <code class="docutils literal notranslate"><span class="pre">admin</span></code> can administer all three domains, while
<code class="docutils literal notranslate"><span class="pre">lukecage.admin@hisdomain.com</span></code> and
<code class="docutils literal notranslate"><span class="pre">mercedesknight.admin@herdomain.net</span></code> can only administer their respective
domains.</p>
<p>Everyday users should not be administrators. In the
above example, Mercedes Knight and Luke Cage have separate administrative accounts for
their domains.</p>
<section id="multiple-ip-addresses">
<h3>Multiple IP Addresses<a class="headerlink" href="#multiple-ip-addresses" title="Permalink to this heading"></a></h3>
<p>In order to use a multiple IP address configuration, the server must
be able to do a reverse lookup on the IP address to determine the
hostname of the receiving interface. For example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">192.168.0.1</span> <span class="o">-></span> <span class="n">mail</span><span class="o">.</span><span class="n">example</span><span class="o">.</span><span class="n">com</span>
<span class="mf">192.168.0.2</span> <span class="o">-></span> <span class="n">mail</span><span class="o">.</span><span class="n">example</span><span class="o">.</span><span class="n">net</span>
<span class="mf">192.168.0.3</span> <span class="o">-></span> <span class="n">mail</span><span class="o">.</span><span class="n">foo</span><span class="o">.</span><span class="n">bar</span>
</pre></div>
</div>
<p>Once the server obtains the fully qualified hostname of the
interface, it removes the localpart (i.e., 'mail') and uses the
remainder as the domain for any user that logs in.</p>
<p>This address to hostname mapping would usually be done via DNS,
<code class="docutils literal notranslate"><span class="pre">/etc/hosts</span></code>, NIS, etc. Configuration of the various naming
services is beyond the scope of this document.</p>
</section>
<section id="delivering-mail">
<h3>Delivering mail<a class="headerlink" href="#delivering-mail" title="Permalink to this heading"></a></h3>
<p>To deliver mail to your virtual domains, configure your MTA so that
the envelope recipient (RCPT TO) passed to <code class="docutils literal notranslate"><span class="pre">lmtpd</span></code> is fully
qualified with the correct domain.</p>
<section id="configuring-sendmail">
<h4>Configuring Sendmail<a class="headerlink" href="#configuring-sendmail" title="Permalink to this heading"></a></h4>
<p>Follow the basic <a class="reference internal" href="../../installing.html#installing"><span class="std std-ref">configuration instructions</span></a>.</p>
<p>Some items to be aware of:</p>
<ul>
<li><p>It is easiest to use the mailertable to route mail to Cyrus,
rather than adding the domain to the local-host-names file ($w).
This prevents Sendmail from changing the domain name to the local host name.</p>
<blockquote>
<div><p><code class="docutils literal notranslate"><span class="pre">example.com</span>              <span class="pre">cyrusv2:/var/imap/socket/lmtp</span></code></p>
</div></blockquote>
</li>
<li><p>You'll have to use the Cyrus mailer in LMTP mode, and you'll have
to change the mailer flags so that it provides the full domain while
communicating via LMTP. Specifically these changes:</p>
<blockquote>
<div><p><code class="docutils literal notranslate"><span class="pre">S=EnvFromSMTP/HdrFromSMTP,</span> <span class="pre">R=EnvToSMTP</span></code></p>
</div></blockquote>
</li>
</ul>
</section>
</section>
<section id="mail-clients">
<h3>Mail Clients<a class="headerlink" href="#mail-clients" title="Permalink to this heading"></a></h3>
<p>The only changes you'll need to make to mail clients is to change
usernames to the fully qualified domain names, i.e., <code class="docutils literal notranslate"><span class="pre">user@example.com</span></code>.
The <code class="docutils literal notranslate"><span class="pre">user%example.com</span></code> form of userid is also supported.</p>
<p>Users in the default domain will not
need to reconfigure their clients (as unqualified userids are assumed to
be in the default domain).</p>
</section>
<section id="administrators">
<h3>Administrators<a class="headerlink" href="#administrators" title="Permalink to this heading"></a></h3>
<p>The Cyrus virtual domains implementation supports per-domain
administrators as well as "global" (inter-domain) administrators.
Domain-specific administrators are specified with a
fully qualified userid in the <code class="docutils literal notranslate"><span class="pre">admins</span></code> option
(e.g., <code class="docutils literal notranslate"><span class="pre">admin@example.net</span></code>) and only have access to mailboxes in
the associated domain. Mailbox names should be specified in the same
fashion as on a single domain configuration.</p>
<p>Global administrators are specified with an unqualified userid in the
<code class="docutils literal notranslate"><span class="pre">admins</span></code> option and have access to <em>any</em> mailbox on the
server. Because global admins use unqualified userids, they belong
to the <code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code>. As a result, you CANNOT have a global
admin without specifying a <code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code>. Note that when
trying to login as a global admin to a multi-homed server from a remote
machine, it might be necessary to fully qualify the userid with the
<code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code>.</p>
<p>Global admins must use <code class="docutils literal notranslate"><span class="pre">mailbox@domain</span></code> syntax when
specifying mailboxes outside of the <code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code>. Examples
(using <code class="docutils literal notranslate"><span class="pre">cyradm</span></code>):</p>
<p>To create a new INBOX for user 'test' in <code class="docutils literal notranslate"><span class="pre">defaultdomain</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cm</span> <span class="n">user</span><span class="o">/</span><span class="n">test</span>
</pre></div>
</div>
<p>To create a new INBOX for user 'test' in domain 'example.com':</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cm</span> <span class="n">user</span><span class="o">/</span><span class="n">test</span><span class="nd">@example</span><span class="o">.</span><span class="n">com</span>
</pre></div>
</div>
<p>To list all mailboxes in domain 'example.com':</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">lm</span> <span class="o">*</span><span class="nd">@example</span><span class="o">.</span><span class="n">com</span>
</pre></div>
</div>
</section>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="namespaces.html" class="btn btn-neutral float-left" title="Mailbox Namespaces" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="mailbox-annotations.html" class="btn btn-neutral float-right" title="Mailbox Annotations (METADATA)" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>© Copyright 1993–2025, The Cyrus Team.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
|