This directory was constructed to reproduct the same environment in trunks for
the bigbang apacheds branch.  This is done to allow things like the proper 
generation of eclipse descriptors and to be able to build from top down.

The following versions and branches are associated with projects in this folder.
If there are any questions just take a look at the svn:externals set in this 
folder.

apacheds bigbang 1.5
daemon bigbangg 1.1 
shared bigbang 0.9.7 
installers bigbang 1.0
project bigbang 1.0


WARNING: 

   There are going to be massive changes to this branch as refactor a large 
   aspect of the server.  As a result the branch may not produce functioning
   or compliant versions of the server.  Heck it might not even build.  So 
   keep this in mind if you're brave enough to use this code.

========================================================================
This distribution includes cryptographic software.  The country in 
   which you currently reside may have restrictions on the import, 
   possession, use, and/or re-export to another country, of 
   encryption software.  BEFORE using any encryption software, please 
   check your country's laws, regulations and policies concerning the
   import, possession, or use, and re-export of encryption software, to 
   see if this is permitted.  See <http://www.wassenaar.org/> for more
   information.

   The U.S. Government Department of Commerce, Bureau of Industry and
   Security (BIS), has classified this software as Export Commodity 
   Control Number (ECCN) 5D002.C.1, which includes information security
   software using or performing cryptographic functions with asymmetric
   algorithms.  The form and manner of this Apache Software Foundation
   distribution makes it eligible for export under the License Exception
   ENC Technology Software Unrestricted (TSU) exception (see the BIS 
   Export Administration Regulations, Section 740.13) for both object 
   code and source code.

   The following provides more details on the included cryptographic
   software:

   http://www.bouncycastle.org/
