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

<!DOCTYPE html>
<html>
<head>
    <title>NiFi Registry</title>
    <script type="text/javascript">
        var pathname = document.location.pathname;
        var appRootIndex = document.location.pathname.indexOf('/nifi-registry/');
        var base = document.createElement('base');
        base.setAttribute('href', document.location.pathname.substring(0, appRootIndex) + '/nifi-registry/');
        document.head.appendChild(base);
    </script>
    <meta charset='UTF-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
    <!-- Styles will be injected here by webpack -->
</head>
<body>
    <nf-registry-app></nf-registry-app>
    <!-- Scripts will be injected here by webpack -->
</body>
</html>
