// 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.

Apache Accumulo® User Manual Version ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}
=======================================
:author: Apache Accumulo Project
:email: dev@accumulo.apache.org
:toc2:
:toclevels: 4
:toc-title: Apache Accumulo ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}
:numbered:
:website: https://accumulo.apache.org/

image::accumulo-logo.png[]

Copyright © 2011-2017 The Apache Software Foundation, Licensed under the Apache
License, Version 2.0.  Apache Accumulo, Accumulo, Apache, and the Apache
Accumulo project logo are trademarks of the Apache Software Foundation.

include::chapters/introduction.txt[]

include::chapters/design.txt[]

include::chapters/shell.txt[]

include::chapters/clients.txt[]

include::chapters/development_clients.txt[]

include::chapters/table_configuration.txt[]

include::chapters/iterator_design.txt[]

include::chapters/iterator_test_harness.txt[]

include::chapters/table_design.txt[]

include::chapters/high_speed_ingest.txt[]

include::chapters/analytics.txt[]

include::chapters/security.txt[]

include::chapters/replication.txt[]

include::chapters/implementation.txt[]

include::chapters/ssl.txt[]

include::chapters/kerberos.txt[]

include::chapters/sampling.txt[]

include::chapters/administration.txt[]

include::chapters/multivolume.txt[]

include::chapters/troubleshooting.txt[]

[appendix]
include::appendices/config.txt[]

