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

### Scala ###
*.class
*.log
$*/

# sbt specific
.cache/
.history/
.lib/
dist/*
target/
repo/
lib_managed/
src_managed/
project/boot/
project/plugins/project/

#idea
*.iml
*.ipr
*.iws
.idea
out

#Gradle
.gradletasknamecache
.gradle/
build/
bin/

#General
.DS_Store
amaterasu-executor/
project/project/
executor/spark-warehouse/
repo
repo/**

#python
.zip