~~ 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.
 ------
 Privacy policy
 ------
 ------
 ------

Privacy policy

	Information about your use of this website is collected using server access logs and a tracking cookie. The 
	collected information consists of the following:

	* The IP address from which you access the website;
	
	* The type of browser and operating system you use to access our site;
	
	* The date and time you access our site;
	
	* The pages you visit; and
	
	* The addresses of pages from where you followed a link to our site.
	
	[]

	Part of this information is gathered using a tracking cookie set by the 
	{{{http://www.google.com/analytics/}Google Analytics}} service and handled by Google as described in their 
	{{{http://www.google.com/privacy.html}privacy policy}}. See your browser documentation for instructions on how to 
	disable the cookie if you prefer not to share this data with Google.

	We use the gathered information to help us make our site more useful to visitors and to better understand how 
	and when our site is used. We do not track or collect personally identifiable information or associate gathered 
	data with any personally identifying information from other sources.

	By using this website, you consent to the collection of this data in the manner and for the purpose described 
	above.
	