<!--
  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.
-->
<authorgroup>
  <corpauthor>The Qi4j Community
  </corpauthor>
</authorgroup>

<copyright>
<year>2011</year>
<holder>Qi4j Community</holder>
</copyright>

<legalnotice>
<title>License: Apache License 2.0</title>
<simpara>This book is presented in open source and licensed through
  Apache License 2.0.
  You are free to copy, distribute, transmit, and/or adapt the work. This license is based upon the following
  conditions:
</simpara>
<formalpara>
  <title>Attribution</title>
  <para>You must attribute the work in the manner specified by the
    author or licensor (but not in any way that suggests that they
    endorse you or your use of the work).</para>
</formalpara>
<simpara>
  Any of the above conditions can be waived only if you get permission from the copyright holder.
</simpara>
<simpara>
  In no way are any of the following rights affected by the license:
</simpara>
<itemizedlist>
  <listitem>
    <simpara>
      Your fair dealing or fair use rights
    </simpara>
  </listitem>
  <listitem>
    <simpara>
      The author&#8217;s moral rights
    </simpara>
  </listitem>
  <listitem>
    <simpara>
      Rights other persons may have either in the work itself or in how the work is used, such as publicity or
      privacy rights
    </simpara>
  </listitem>
</itemizedlist>
<note>
  <simpara>
    For any reuse or distribution, you must make clear to the others the license terms of this work. The best way
    to do this is with a direct link to this page:
    <ulink url="http://apache.org/licenses/LICENSE-2.0">http://apache.org/licenses/LICENSE-2.0</ulink>
  </simpara>
</note>
</legalnotice>

