<!DOCTYPE html>
<html lang="en">
<!--
  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.
-->
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Welcome to the Apache Sling Starter</title>
        <meta name="Description" content="Apache Sling default homepage">
        <meta name="theme-color" content="#00678c">
        <link href="../content/starter/css/bundle.css" rel="stylesheet">
    </head>
    <body>
        <div class="Grid Fit-Medium Home-Grid">
            <div class="Gradient"></div>
            <header class="Cell Medium-35 Large-25 Align-Center Logos">
                <a href="http://sling.apache.org" target="_blank" rel="noopener" id="sling-logo" title="Visit the Apache Sling website">
                    <img src="../content/starter/img/sling-logo.svg" alt="Apache Sling Logo"/>
                </a>
                <a href="http://apache.org" target="_blank" rel="noopener" id="asf-logo" title="Visit the Apache Software Foundation website">
                    <img src="../content/starter/img/asf-logo.svg" alt="Apache Software Foundation Logo"/>
                </a>
            </header>
            <div class="Cell Align-Center Main-Content">
                <div class="Grid">
                    <section class="Cell Large-50">
                        <h1>Welcome</h1>
                        <p>Apache Sling is a web framework that uses a Java Content Repository, such as <a href="http://jackrabbit.apache.org/jcr/index.html" target="_blank" rel="noopener" title="Visit the Apache Jackrabbit website">Apache Jackrabbit</a>,
                           to store and manage content. Sling applications use either scripts or Java servlets, selected 
                           based on simple name conventions, to process HTTP requests in a RESTful way. The embedded 
                           <a href="http://felix.apache.org/" target="_blank" rel="noopener" title="Visit the Apache Felix website">Apache Felix</a> OSGi framework and console provide a dynamic runtime environment, where code and
                           content bundles can be loaded, unloaded and reconfigured at runtime.</p>
                        <p>The Sling Starter is a ready-to-run Sling configuration, providing an embedded JCR content 
                           repository and web server, a selection of Sling components, documentation and examples. 
                           The Starter makes it easy to get started with Sling and to develop script-based applications.</p>
                        <h1>Getting Started</h1>
                        <p>To get started with Sling, see our <a href="http://sling.apache.org/" target="_blank" rel="noopener" title="Visit the Apache Sling website">website</a>, the <a href="../content/slingshot.html" title="Try the Slingshot sample application">Slingshot sample application</a>
                           or the <a href="http://sling.apache.org/site/discover-sling-in-15-minutes.html" target="_blank" rel="noopener">Sling in 15 minutes</a> tutorial.</p>
                        <p>You can mount the repository via WebDAV to explore or modify content, simply use the root URL 
                           as the WebDAV server URL.</p>
                    </section>
                    <div class="Cell Large-15"><!--/* Give the columns a bit of space between them. */--></div>
                    <section class="Cell Large-35">
                        <h1>Session</h1>
                        <h2 id="login-unknown"><a href="../system/sling/login.html" title="Login to Apache Sling">Login</a></h2>
                        <h2 id="login-signedout"><a href="../system/sling/login.html" title="Login to Apache Sling">Login</a> (admin:admin)</h2>
                        <h2 id="login-signedin"><a href="../system/sling/logout" title="Logout of Apache Sling">Logout</a> <span id="user"></span></h2>
                        <h1>Resources</h1>
                        <h2>This Site</h2>
                        <ul>
                            <li><a href="../bin/browser.html" title="Browse the JCR content of this site">Browse Content</a></li>
                            <li><a href="../htl/repl.html" title="Edit HTL scripts using a Read-Eval-Print Loop">HTL scripts REPL</a></li>
                            <li><a href="../system/console/bundles" title="Edit the OSGi bundles of this site">System Console</a></li>
                            <li><a href="../system/console/configMgr" title="Edit the OSGi configurations of this site">System Configuration</a></li>
                        </ul>
                        <h2>Reference</h2>
                        <ul>
                            <li><a href="http://sling.apache.org/apidocs/sling12/index.html" target="_blank" rel="noopener" title="Visit the Apache Sling Javadocs">API Documentation</a></li>
                            <li><a href="http://sling.apache.org/project-information.html#mailing-lists" rel="noopener" target="_blank" title="View available Apache Sling mailing lists">Mailing Lists</a></li>
                            <li><a href="http://sling.apache.org/documentation/tutorials-how-tos.html" rel="noopener" target="_blank" title="View Apache Sling Developer Tutorials">Tutorials</a></li>
                            <li><a href="https://github.com/apache/sling-aggregator" target="_blank" rel="noopener" title="View the Sling Aggregator on Github">All Sling repos</a></li>
                            <li><a href="https://github.com/apache/sling-samples" target="_blank" rel="noopener" title="View Apache Sling sample applications on Github">Sample Applications</a></li>
                        </ul>
                        <% sling.include("/content/starter/sidebar-extensions"); %>
                    </section>
                </div>
            </div>
        </div>
        <script src="../system/sling.js" type="application/javascript"></script>
        <script type="application/javascript">
            Sling.getSessionInfoAsync( function(info) {
                var unknown = document.querySelector('#login-unknown');
                var login = document.querySelector('#login-signedout');
                var logout = document.querySelector('#login-signedin');
                if (info && info.userID !== 'anonymous') {
                    var user = document.querySelector('#user');
                    user.innerHTML = info.userID;
                    login.style.display = 'none';
                    logout.style.display = 'block';
                } else {
                    login.style.display = 'block';
                    logout.style.display = 'none';
                }
                unknown.style.display = 'none';
            });
        </script>
        <!-- Do not remove this comment, used for Starter integration tests -->
    </body>
</html>
