<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ 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.
  -->
<assembly>
<!-- We deliberately don't specify an ID here, because during the assembly process we don't want the
		bin assembly to have any suffix on its name. Other assemblies need their Id suffixed, but this one
		doesn't
		<id>bin</id> -->
	<id>bin</id>
    <formats>
		<format>zip</format>
		<format>tar.gz</format>
	</formats>
	<includeSiteDirectory>true</includeSiteDirectory>
	<dependencySets>
	   <dependencySet/>
	</dependencySets>
	<fileSets>
		<fileSet>
			<includes>
				<include>LICENSE</include>
				<include>NOTICE</include>
				<include>build.xml</include>
				<include>pom.xml</include>
				<include>src/**</include>
			</includes>
		</fileSet>
		<fileSet>
			<directory>target</directory>
			<outputDirectory>.</outputDirectory>
			<includes>
				<include>apache-chainsaw-${project.version}.jar</include>
			</includes>
		</fileSet>
	</fileSets>

</assembly>
