
                          Apache HTTP Server

  What is it?
  -----------

  The Apache HTTP Server is a powerful and flexible HTTP/1.1 compliant
  web server.  Originally designed as a replacement for the NCSA HTTP
  Server, it has grown to be the most popular web server on the
  Internet.  As a project of the Apache Software Foundation, the
  developers aim to collaboratively develop and maintain a robust,
  commercial-grade, standards-based server with freely available
  source code.

  The Latest Version
  ------------------

  Details of the latest version can be found on the Apache HTTP
  server project page under http://httpd.apache.org/.

  Documentation
  -------------

  The documentation available as of the date of this release is
  included in HTML format in the docs/manual/ directory.  The most
  up-to-date documentation can be found at
  http://httpd.apache.org/docs-2.0/.

  Installation
  ------------

  Please see the file called INSTALL.

  Licensing
  ---------

  Please see the file called LICENSE.

  Contacts
  --------

     o If you want to be informed about new code releases, bug fixes,
       security fixes, general news and information about the Apache server
       subscribe to the apache-announce mailing list as described under
       http://httpd.apache.org/lists.html#http-announce

     o If you want freely available support for running Apache please join the
       Apache user community by subscribing to Users Mailing List at
       http://httpd.apache.org/userslist.html or one of the following USENET
       newsgroups:
       comp.infosystems.www.servers.unix
       comp.infosystems.www.servers.ms-windows
       Also available at: 
       http://groups.google.com/groups?group=comp.infosystems.www.servers

     o If you want commercial support for running Apache please contact
       one of the companies and contractors which are listed at
       http://www.apache.org/info/support.cgi

     o If you have a concrete bug report for Apache please go to the
       Apache Group Bug Database and submit your report:
       http://httpd.apache.org/bug_report.html

     o If you want to participate in actively developing Apache please
       subscribe to the `dev@httpd.apache.org' mailing list as described at
       http://www.apache.org/lists.html#http-dev

  Acknowledgments
  ----------------

  We wish to acknowledge the following copyrighted works that
  make up portions of the Apache software:

  Portions of this software were developed at the National Center
  for Supercomputing Applications (NCSA) at the University of
  Illinois at Urbana-Champaign.

  This software contains code derived from the RSA Data Security
  Inc. MD5 Message-Digest Algorithm, including various
  modifications by Spyglass Inc., Carnegie Mellon University, and
  Bell Communications Research, Inc (Bellcore).

  Regular expression support is provided by the PCRE library package,
  which is open source software, copyright by the University of Cambridge
  and authored by Philip Hazel.  The original software is available from
     ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/

  Apache 2.0 relies heavily on the use of autoconf and libtool to provide
  a build environment.
