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

# Compiled class files
*.class

# Log files
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package files
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# Virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

# Build output directories
.dist
/target
*/target
/build
*/build

# IntelliJ files and directories
out
.idea
*.ipr
*.iws
*.iml
atlassian-ide-plugin.xml

# Gradle
.gradle/
.out/

# Docker tests
nohup.out
dockertests/libs
test_results/

# generted certs
sbr_keystore
sbr_keystore_pass
sbr_truststore
sbr_truststore_pass
truststore.jks

*.hprof

__pycache__/

.vscode/

cdc/bin

# Miscellaneous
/env/**
build.log
.gradle
.packager
.shelf
logs
generated
**/build/**
metastore_db/
*.pyc
.cache/
ttr.log
buildcache/
.testdata*/
dev-lo.properties
pytests/.env/**/*
pytests/.pytest_cache
cassandra-analytics-build.properties

# MacOS
.DS_Store
cassandra-analytics-core/dtest-jars
