/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \page licensing.html
    \title Qt Licensing
    \brief Information about licenses and licensing issues.

    Qt is available under different licensing options designed to accommodate
    the needs of our various users:

    \list
      \li Qt licensed under \e commercial licenses is appropriate for
          development of proprietary/commercial software where you do not want
          to share any source code with third parties or otherwise cannot
          comply with the terms of the GNU LGPL version 3.

      \li Qt licensed under the \l{GNU Lesser General Public License (LGPL)}
          version 3 is appropriate for the development of Qt applications
          provided you can comply with the terms and conditions of the GNU LGPL
          version 3 (or GNU GPL version 3).
    \endlist

    Qt contains also \l {Licenses Used in Qt}{third-party code} that is licensed
    under specific open-source licenses from the original authors.

    \note For open-source licensed Qt, some specific parts (modules) are not
    available under the GNU LGPL version 3, but under the
    \l {GNU General Public License (GPL)} instead. See
    the list of \l {gpl-licensed-addons}{Qt modules} for details. For commercial
    licensees, all modules are available under a single, commercial Qt
    license.

    \e {Qt documentation} is available under commercial licenses from
    The Qt Company, and under the terms of the \l{GNU Free
    Documentation License (FDL)} version 1.3, as published by the Free Software
    Foundation.

    \e {Qt examples} are available under commercial licenses from The Qt Company,
    and under a \l{License of Qt examples}{BSD-3-clause} license.

    See \l{http://qt.io/licensing/} for an overview of Qt licensing.

    \section1 Purchasing and Sales Information

    To purchase a Qt license, visit \l{http://www.qt.io/download/}.

    For further information and assistance about Qt licensing, contact our
    sales; see \l{http://www.qt.io/locations/} for contact details.

    \section1 Licensed Code in Qt

    The following page documents the open-source licenses used in different
    parts of Qt:

    \list
        \li \l {Licenses Used in Qt}
    \endlist
*/

/*!
    \page licenses-used-in-qt.html
    \keyword Third-Party Licenses Used in Qt
    \title Licenses Used in Qt
    \brief Information about other licenses and third-party code used in Qt.

    Qt contains some code that is not provided under the
    \l{GNU Lesser General Public License (LGPL)} or the
    \l{Qt Commercial License}, but rather under specific licenses from the
    original authors.

    The Qt Company gratefully acknowledges these and other contributions to Qt.
    We recommend that programs that use Qt also acknowledge these contributions,
    and quote these license statements in an appendix to the documentation.

    \note You only need to comply with (and acknowledge) the licenses of the
          third-party components that you are using with your application.
          Click the name of the component to see the licensing details.

    \b {Third-party Licenses}

    The following table lists parts (modules) of Qt that incorporate code licensed
    under third-party open-source licenses:

    \div {class="fixed"}
    \generatelist annotatedattributions

    \raw HTML
    <h2 id="additional-information">Additional Information</h2>
    \endraw

    The following table lists related documents, such as information about Trademarks
    and other licenses used in parts of Qt.

    \annotatedlist licensing
    \enddiv
*/

/*!
    \page qt-attribution-cmake-macros.html
    \title Macros for Building with CMake
    \ingroup licensing
    \brief BSD 3-clause "New" or "Revised" License

    The following files contain macros that enable users to build Qt-based
    projects using CMake.

    \list
        \li \c qtbase/src/corelib/Qt5CoreMacros.cmake
        \li \c qtbase/src/dbus/Qt5DBusMacros.cmake
        \li \c qtbase/src/widgets/Qt5WidgetsMacros.cmake
        \li \c qttools/src/linguist/Qt5LinguistToolsMacros.cmake
    \endlist

    \badcode
    Copyright 2005-2011 Kitware, Inc.
    All rights reserved.
    \endcode

    \l {https://spdx.org/licenses/BSD-3-Clause.html}
       {BSD 3-clause "New" or "Revised" License}

    \badcode
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

    * Neither the name of Kitware, Inc. nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    \endcode
*/

/*!
    \page qt-attribution-llvmpipe.html
    \title Mesa llvmpipe
    \ingroup licensing
    \brief MIT License

    Mesa is a 3-D graphics library with an API which is very similar to that of OpenGL.
    The llvmpipe software renderer allows running of OpenGL applications without any
    hardware / driver support.

    Shipped as part of the binary packages for Windows (opengl32sw.dll).

    \badcode
    Copyright (C) 1999-2007  Brian Paul.
    \endcode

    \l {https://spdx.org/licenses/MIT.html}
       {MIT License}

    \badcode
    Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.

    Permission is hereby granted, free of charge, to any person obtaining a
    copy of this software and associated documentation files (the "Software"),
    to deal in the Software without restriction, including without limitation
    the rights to use, copy, modify, merge, publish, distribute, sublicense,
    and/or sell copies of the Software, and to permit persons to whom the
    Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included
    in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
    BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    \endcode
*/

/*!
    \page qt-attribution-llvm.html
    \title LLVM Attribution
    \ingroup licensing
    \brief University of Illinois/NCSA Open Source License, BSD licenses

    The provided binaries of Qt include a static copy of LLVM inside the \c qdoc binary.

    Most of LLVM is under the \e{University of Illinois/NCSA Open Source License}:

    \badcode
    University of Illinois/NCSA
    Open Source License

    Copyright (c) 2003-2017 University of Illinois at Urbana-Champaign.
    All rights reserved.

    Developed by:

        LLVM Team

        University of Illinois at Urbana-Champaign

        http://llvm.org

    Permission is hereby granted, free of charge, to any person obtaining a copy of
    this software and associated documentation files (the "Software"), to deal with
    the Software without restriction, including without limitation the rights to
    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
    of the Software, and to permit persons to whom the Software is furnished to do
    so, subject to the following conditions:

        * Redistributions of source code must retain the above copyright notice,
          this list of conditions and the following disclaimers.

        * Redistributions in binary form must reproduce the above copyright notice,
          this list of conditions and the following disclaimers in the
          documentation and/or other materials provided with the distribution.

        * Neither the names of the LLVM Team, University of Illinois at
          Urbana-Champaign, nor the names of its contributors may be used to
          endorse or promote products derived from this Software without specific
          prior written permission.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
    SOFTWARE.
    \endcode

    Furthermore, LLVM contains code from OpenBSD regex :

    \badcode
    $OpenBSD: COPYRIGHT,v 1.3 2003/06/02 20:18:36 millert Exp $

    Copyright 1992, 1993, 1994 Henry Spencer.  All rights reserved.
    This software is not subject to any license of the American Telephone
    and Telegraph Company or of the Regents of the University of California.

    Permission is granted to anyone to use this software for any purpose on
    any computer system, and to alter it and redistribute it, subject
    to the following restrictions:

    1. The author is not responsible for the consequences of use of this
       software, no matter how awful, even if they arise from flaws in it.

    2. The origin of this software must not be misrepresented, either by
       explicit claim or by omission.  Since few users ever read sources,
       credits must appear in the documentation.

    3. Altered versions must be plainly marked as such, and must not be
       misrepresented as being the original software.  Since few users
       ever read sources, credits must appear in the documentation.

    4. This notice may not be removed or altered.
    \endcode

    \badcode
    Copyright (c) 1994
    The Regents of the University of California.  All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the University nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

    @(#)COPYRIGHT    8.1 (Berkeley) 3/16/94
    \endcode

    Furthermore, LLVM contains code from md5:

    \badcode
    This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
    MD5 Message-Digest Algorithm (RFC 1321).

    Homepage:
    http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5

    Author:
    Alexander Peslyak, better known as Solar Designer <solar at openwall.com>

    This software was written by Alexander Peslyak in 2001.  No copyright is
    claimed, and the software is hereby placed in the public domain.
    In case this attempt to disclaim copyright and place the software in the
    public domain is deemed null and void, then the software is
    Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
    general public under the following terms:

    Redistribution and use in source and binary forms, with or without
    modification, are permitted.

    There's ABSOLUTELY NO WARRANTY, express or implied.

    (This is a heavily cut-down "BSD license".)

    This differs from Colin Plumb's older public domain implementation in that
    no exactly 32-bit integer data type is required (any 32-bit or wider
    unsigned integer data type will do), there's no compile-time endianness
    configuration, and the function prototypes match OpenSSL's.  No code from
    Colin Plumb's implementation has been reused; this comment merely compares
    the properties of the two independent implementations.

    The primary goals of this implementation are portability and ease of use.
    It is meant to be fast, but not as fast as possible.  Some known
    optimizations are not included to reduce source code size and avoid
    compile-time configuration.
    \endcode
*/
