////////////////////////////////////////////////////////////////////////////////
//
//  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.
//
////////////////////////////////////////////////////////////////////////////////
package
{
    public class AntClasses
    {
        public function AntClasses()
        {
            import org.apache.flex.ant.Ant; Ant;
            import org.apache.flex.ant.tags.Project; Project;
			import org.apache.flex.ant.tags.And; And;
			import org.apache.flex.ant.tags.AntTask; AntTask;
			import org.apache.flex.ant.tags.AntCall; AntCall;
            import org.apache.flex.ant.tags.Available; Available;
            import org.apache.flex.ant.tags.Checksum; Checksum;
            import org.apache.flex.ant.tags.Condition; Condition;
            import org.apache.flex.ant.tags.Contains; Contains;
            import org.apache.flex.ant.tags.Copy; Copy;
            import org.apache.flex.ant.tags.Delete; Delete;
            import org.apache.flex.ant.tags.Echo; Echo;
            import org.apache.flex.ant.tags.Equals; Equals;
			import org.apache.flex.ant.tags.Exec; Exec;
            import org.apache.flex.ant.tags.Fail; Fail;
            import org.apache.flex.ant.tags.FileSet; FileSet;
            import org.apache.flex.ant.tags.FileSetExclude; FileSetExclude;
            import org.apache.flex.ant.tags.FileSetInclude; FileSetInclude;
            import org.apache.flex.ant.tags.Get; Get;
			import org.apache.flex.ant.tags.HasFreeSpace; HasFreeSpace;
            import org.apache.flex.ant.tags.Input; Input;
			import org.apache.flex.ant.tags.IsFalse; IsFalse;
			import org.apache.flex.ant.tags.IsReference; IsReference;
            import org.apache.flex.ant.tags.IsSet; IsSet;
			import org.apache.flex.ant.tags.IsTrue; IsTrue;
            import org.apache.flex.ant.tags.LoadProperties; LoadProperties;
			import org.apache.flex.ant.tags.Matches; Matches;
            import org.apache.flex.ant.tags.Mkdir; Mkdir;
            import org.apache.flex.ant.tags.Move; Move;
            import org.apache.flex.ant.tags.Not; Not;
			import org.apache.flex.ant.tags.Or; Or;
            import org.apache.flex.ant.tags.OS; OS;
			import org.apache.flex.ant.tags.Param; Param;
            import org.apache.flex.ant.tags.Property; Property;
            import org.apache.flex.ant.tags.PropertyFile; PropertyFile;
            import org.apache.flex.ant.tags.Replace; Replace;
			import org.apache.flex.ant.tags.Touch; Touch;
            import org.apache.flex.ant.tags.TStamp; TStamp;
            import org.apache.flex.ant.tags.Untar; Untar;
            import org.apache.flex.ant.tags.Unzip; Unzip;
            import org.apache.flex.ant.tags.XmlProperty; XmlProperty;
        }
    }
}