
<!DOCTYPE HTML>
<!--
/***************************************************************************************************************************
 * 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.
 ***************************************************************************************************************************/
 -->
<html>
<head>
	<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
	<link rel='icon' type='image/png' href='http://www.apache.org/favicons/favicon-32x32.png' sizes='32x32'>
	<link rel='icon' type='image/png' href='http://www.apache.org/favicons/favicon-194x194.png' sizes='194x194'>
	<link rel='icon' type='image/png' href='http://www.apache.org/favicons/favicon-96x96.png' sizes='96x96'>
	<link rel='icon' type='image/png' href='http://www.apache.org/favicons/android-chrome-192x192.png' sizes='192x192'>
	<link rel='icon' type='image/png' href='http://www.apache.org/favicons/favicon-16x16.png' sizes='16x16'>
	<link rel='shortcut icon' href='http://www.apache.org/favicons/favicon.ico'>
	<style type='text/css'>
		/* For viewing in file system and page designer */
		@IMPORT url('../../../../juneau-core/java/src/main/javadoc/javadoc.css');
		@IMPORT url('../../../../juneau-core/java/src/main/javadoc/resources/juneau-doc.css');
		@IMPORT url('../../../../juneau-core/java/src/main/javadoc/resources/juneau-code.css');
		body { 
			margin: 20px; 
		}	
		.spaced-list li { padding:5px; }
		.footer .spaced-list ul { margin:0 }
	</style>
	<script type='text/javascript'>
		/* Replace all @code and @link tags. */	
		window.onload = function() {
			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1<\/code>');
			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3<\/code>');
		}
	</script>
</head>
<body>
<h1 class='title'>Apache Juneau {@property juneauVersion} Documentation</h1>
<h1 class='preview-title'>Apache Juneau {@property juneauVersion} Documentation Preview</h1>
<h2 class='preview-section todo'>Documentation in progress</h2>
<h2 class='preview-section new'>New documentation in {@property juneauVersion}</h2>
<h2 class='preview-section updated'>Updated documentation in {@property juneauVersion}</h2>

<script type='text/javascript'>
	function toggle(x) {
		var div = x.nextSibling;
		while (div != null && div.nodeType != 1)
			div = div.nextSibling;
		if (div != null) {
			var d = div.style.display;
			if (d == 'block' || d == '') {
				div.style.display = 'none';
				x.className += " closed";
			} else {
				div.style.display = 'block';
				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
			}
		}
	}
</script>
{@fragment about.html}

<a href='#TOC' id='TOC'></a><h5 class='toc'>Table of Contents</h5>
{TOC-CONTENTS}
{CONTENTS}

<h2 class='topic' onclick='toggle(this)'><a href='#ReleaseNotes' id='ReleaseNotes'>Release Notes</a></h2>
<div class='topic'>
	
	<h5 class='toc'>Release Notes</h5>
	{TOC-RELEASE-NOTES}
	{RELEASE-NOTES}
</div>
</body>								
