<!DOCTYPE html>
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
  -->
<html lang="en">
  <head>
    <title>{% block title %}{{ headers.title }}{% endblock %}</title>

    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <meta property="og:image" content="http://www.apache.org/images/asf_logo.gif" />

    <link rel="stylesheet" type="text/css" href="/css/site.css">

    {% if headers.atom %}
      <link rel="alternate" href="{{ headers.atom.url }}"
            type="application/atom+xml" title="{{ headers.atom.title }}" />
    {% endif %}

    {% if headers.base %}<base href="{{ headers.base }}" />{% endif %}
    {% if headers.notice %}<!-- {{ headers.notice }} -->{% endif %}
  </head>

  <body>
    <div id="page">
      <div id="header">
        {% if extralogo %}
        <div id="logo2"><img src="{{ extralogo }}"/></div>
        {% endif %}
        {% include "content/images/logo.svg" %}
      </div>
      <div id="breadcrumb">
        {{ breadcrumbs|safe }}
      </div>
      <div id="middle">
        <div id="leftnav">
          {% block navigation %}
          {% filter markdown %}{% include leftnav %}{% endfilter %}
          {% endblock %}
          <div id="bottom-nav">
            <img src="/images/pbv90x30.png"/>
            <div id="rss">
              <a class="poweredBy" href="/rss/news.rss" title="Velocity News Feed"><img class="poweredBy" alt="Velocity News Feed" src="/images/feed-icon-24x24.jpg"></a>
            </div>
            <iframe src="http://www.apache.org/ads/buttonbar.html" style="border-width:0; float: left" frameborder="0" scrolling="no" width="135" height="265"></iframe>
          </div>
        </div>
        {% block content %}<div id="content"><div class="section-content">{{ content|markdown }}</div></div>{% endblock %}
        <hr/>
        <div id="copyright">
          Copyright &#169; 2020 The Apache Software Foundation, Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.<br/>Apache and the Apache feather logo are trademarks of The Apache Software Foundation.
        </div>
      </div>
    </div>
  </body>
</html>
