##############################################################################
#
# Copyright 2019 highstreet technologies GmbH and others...
#
# Licensed 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
#
#     https://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.
#

pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
*.pyc
append_to_etc_hosts.txt

*/**/bin/

# Maven
target/
*.tar.gz

# Opendaylight yang-tools
yang-gen-sal/

# IDE (Eclipse, vsCode) related
.project
.classpath
.settings/
target-ide/
release.properties
.vscode
archive

# python
__pycache__
.pylintrc
output

# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored)
!/.mvn/wrapper/maven-wrapper.jar

# VES related
*/**/json/examples
*/**/__pycache__
*.log

# avoid copyright issues with 3GPP
*/**/3gpp/**/*.yaml

# node js
node_modules
package-lock.json

# wireshark
.cache

# ODLUX cache
*/**/O D L UX*

# nodered
*.backup

# container-analyis
*.sbom.spdx.json
*.vulnerabilities.vex.json

# jenkins
*/**/apps/jenkins/*

# wireshark
*/**/apps/wireshark/*

# documentation
.tox
docs/_build/
ci-management/
