<!--
 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.

-->
<project name="Apache log4net">
  <bannerLeft>
    <name>Apache Logging Services Project</name>
    <src>images/ls-logo.jpg</src>
    <href>http://logging.apache.org/</href>
  </bannerLeft>
  <body>
    <breadcrumbs>
      <item name="Apache" href="http://www.apache.org/"/>
      <item name="Logging Services" href="http://logging.apache.org/"/>
      <item name="log4net"  href="http://logging.apache.org/log4net/"/>
    </breadcrumbs>
  
	<menu name="Apache log4net">
           <item name="About" href="/index.html"/>
	   <item name="Download" href="/download.html"/>
	   <item name="Release Notes" href="/release/release-notes.html"/>
	   <item name="License" href="/license.html"/>
	</menu>

	<menu name="Documentation">
		<item name="Features" href="/release/features.html"/>
		<item name="Supported Frameworks" href="/release/framework-support.html"/>
		<item name="Example Apps" href="/release/example-apps.html"/>
		<item name="Config Examples" href="/release/config-examples.html"/>
		<item name="Building" href="/release/building.html"/>
		<item name="FAQ" href="/release/faq.html"/>
		<item name="How Tos" href="/release/howto/index.html"/>
		<item name="SDK Reference" href="/release/sdk/index.html"/>
	</menu>

	<menu name="Manual">
	    <item name="Introduction" href="/release/manual/introduction.html"/>
		<item name="Configuration" href="/release/manual/configuration.html"/>
		<item name="Contexts" href="/release/manual/contexts.html"/>
		<item name="Plugins" href="/release/manual/plugins.html"/>
		<item name="Repositories" href="/release/manual/repositories.html"/>
		<item name="Internals" href="/release/manual/internals.html"/>
	</menu>

	<menu name="Community">
		<item name="Mailing Lists" href="/mail-lists.html"/>
		<item name="Issue Tracking" href="/issue-tracking.html"/>
	</menu>
	
	<menu name="Development">
		<item name="Repository" href="/source-repository.html"/>
		<item name="Continuous Integration" href="/integration.html"/>
	</menu>
	
        <menu ref="reports"/>

	<menu name="Apache">
		<item name="Home" href="http://www.apache.org/"/>	
		<item name="License" href="http://www.apache.org/licenses/"/>	
		<item name="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html"/>
		<item name="Thanks" href="http://www.apache.org/foundation/thanks.html"/>
		<item name="Security" href="http://www.apache.org/security/"/>
		<item name="Conferences" href="http://www.apachecon.com"/>
	</menu>
	
  </body>
</project>
