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

ant:ant:1.5
biz.aQute.bnd:biz.aQute.bnd.gradle:5.2.0
biz.aQute.bnd:biz.aQute.bndlib:5.2.0
org.apache.felix:org.apache.felix.framework:5.6.10
org.apache.felix:org.apache.felix.eventadmin:1.4.4
org.apache.felix:org.apache.felix.gogo.command:1.0.2
org.apache.felix:org.apache.felix.gogo.shell:1.0.0
org.apache.felix:org.apache.felix.gogo.runtime:1.0.10
org.jline:jline:3.0.4
org.apache.felix:org.apache.felix.http.api:3.0.0
org.apache.felix:org.apache.felix.http.servlet-api:1.1.2
org.apache.felix:org.apache.felix.configadmin:1.8.8
org.apache.felix:org.apache.felix.log:1.0.1
org.apache.felix:org.apache.felix.metatype:1.1.2
org.apache.felix:org.apache.felix.http.jetty:3.4.8
org.apache.felix:org.apache.felix.webconsole:4.3.4
org.apache.felix:org.apache.felix.dependencymanager:4.6.1
org.apache.felix:org.apache.felix.dependencymanager.annotation:5.0.2
org.apache.felix:org.apache.felix.dependencymanager.lambda:1.2.2
org.apache.felix:org.apache.felix.dependencymanager.runtime:4.0.8
org.apache.felix:org.apache.felix.dependencymanager.shell:4.0.9
org.jline:jline-builtins:3.3.0
org.apache.servicemix.bundles:org.apache.servicemix.bundles.junit:4.12_1
org.mockito:mockito-core:1.10.19
org.objenesis:objenesis:2.2
org.osgi:osgi.annotation:6.0.1
org.osgi:osgi.cmpn:6.0.0
org.osgi:osgi.core:6.0.0
biz.aQute.bnd:biz.aQute.bnd.annotation:3.5.0
org.slf4j:slf4j-simple:1.7.7
org.slf4j:slf4j-api:1.7.7
commons-fileupload:commons-fileupload:1.2.1
org.fusesource.jansi:jansi:1.16
commons-io:commons-io:2.4


