<!--
  ~ 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.
  -->

<verifications>
  <!-- These checks verify that the tarfile is in place.
  However, they don't check that the tarfile has made it through to the -all tarball, as the name of
  that file is not known & the verifier plugin doesn't do property expansion
  -->
  <files>
    <file>
      <location>target/lib/slider-agent.tar.gz</location>
      <exists>true</exists>
    </file>
  </files>
</verifications>