---
layout: default
---

<!--

    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.

-->


<div class="docs-container container-fluid">
  <div class="row">

    <article class="content col-xs-12 col-sm-12 col-md-7 col-lg-7">
      <section class="docs-header">
        <h1 class="docs-title">{{ page.title }}</h1>
        {% if page.lead %}<span class="docs-lead">{{ page.lead }}</span><br />{% endif %}
        <section class="tags">
          {% for tag in page.tags %}
          <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#modal-{{ tag | replace: " ", "-" | downcase }}">{{ tag }}</button>
          {% include tags-modal.html %}
          {% endfor %}
        </section>

        <hr class="hr">
      </section>

      <section class="content">
        {{ content }}
      </section>
    </article>

  </div>
</div>
