// ------------------------------------------------------------------
// NOTICE file corresponding to the section 4d of The Apache License,
// Version 2.0, in this case for Apache CXF Buildtools
// ------------------------------------------------------------------

Apache CXF Buildtools
Copyright 2006-2007 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).


This product includes/uses software, Maven Profile Model (http://maven.apache.org/maven-profile),
developed by Apache Software Foundation  (http://www.apache.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)

This product includes/uses software, Unnamed - junit:junit:jar:3.8.1

This product includes/uses software, Default Plexus Container,
developed by Codehaus  (http://www.codehaus.org/)

This product includes/uses software, Maven Project Builder (http://maven.apache.org/maven-project),
developed by Apache Software Foundation  (http://www.apache.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)

This product includes/uses software, Maven Local Settings Model (http://maven.apache.org/maven-settings),
developed by Apache Software Foundation  (http://www.apache.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)

This product includes/uses software, classworlds (http://classworlds.codehaus.org/),
developed by The Codehaus  (http://codehaus.org/)

This product includes/uses software, Plexus Common Utilities,
developed by Codehaus  (http://www.codehaus.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)

This product includes/uses software, Maven Repository Metadata Model (http://maven.apache.org/maven-repository-metadata),
developed by Apache Software Foundation  (http://www.apache.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)

This product includes/uses software, Unnamed - jdom:jdom:jar:1.0

This product includes/uses software, Maven Model (http://maven.apache.org/maven-model),
developed by Apache Software Foundation  (http://www.apache.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)

This product includes/uses software, ASM All (http://asm.objectweb.org/asm-all),
developed by ObjectWeb  (http://www.objectweb.org/)

This product includes/uses software, Maven Artifact (http://maven.apache.org/maven-artifact),
developed by Apache Software Foundation  (http://www.apache.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)

This product includes/uses software, Maven Artifact Manager (http://maven.apache.org/maven-artifact-manager),
developed by Apache Software Foundation  (http://www.apache.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)

This product includes/uses software, Maven Plugin API (http://maven.apache.org/maven-plugin-api),
developed by Apache Software Foundation  (http://www.apache.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)

This product includes/uses software, shade-maven-plugin (http://mojo.codehaus.org/shade-maven-plugin),
developed by Codehaus  (http://codehaus.org)

This product includes/uses software, Maven Wagon API (http://maven.apache.org/wagon/wagon-provider-api),
developed by Apache Software Foundation  (http://www.apache.org/)
License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)



