 ~~ 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.
 
 ------
Download Apache MyFaces Test
 ------

Download Apache MyFaces Test


  Use the links below to download a distribution of Apache MyFaces Test from
  one of our mirrors. It is good practice to verify the integrity of the
  distribution files.

  You will be prompted for a mirror - if the file is not found on yours, please be patient, as it may take 24
  hours to reach all mirrors.

  Apache MyFaces Test is distributed as a <<<zip>>> archive (for Windows) and
  as a <<<tar.gz>>> archive (for UNIX). The content is the same. Please note
  that the <<<tar.gz>>> archives contain file names longer than 100 characters and have been
  created using GNU tar extensions. Thus they must be untarred with a GNU compatible
  version of tar.

  << Apache MyFaces Test 1.0.4 Distribution >>

*-------------------------+---------+----------+-----------+
|                         | Mirrors | Checksum | Signature |
*-------------------------+---------+----------+-----------+
| MyFaces Test 1.0.4 (tar.gz)     | {{{http://www.apache.org/dyn/closer.cgi/myfaces/binaries/myfaces-test-assembly-1.0.4-bin.tar.gz} myfaces-test-assembly-1.0.4-bin.tar.gz}} | {{{http://www.apache.org/dist/myfaces/binaries/myfaces-test-assembly-1.0.4-bin.tar.gz.md5} myfaces-test-assembly-1.0.4-bin.tar.gz.md5}} | {{{http://www.apache.org/dist/myfaces/binaries/myfaces-test-assembly-1.0.4-bin.tar.gz.asc} myfaces-test-assembly-1.0.4-bin.tar.gz.asc}} |
*-------------------------+---------+----------+-----------+
| MyFaces Test 1.0.4 (zip)      | {{{http://www.apache.org/dyn/closer.cgi/myfaces/binaries/myfaces-test-assembly-1.0.4-bin.zip} myfaces-test-assembly-1.0.4-bin.zip}} | {{{http://www.apache.org/dist/myfaces/binaries/myfaces-test-assembly-1.0.4-bin.zip.md5} myfaces-test-assembly-1.0.4-bin.zip.md5}} | {{{http://www.apache.org/dist/myfaces/binaries/myfaces-test-assembly-1.0.4-bin.zip.asc} myfaces-test-assembly-1.0.4-bin.zip.asc}} |
*-------------------------+---------+----------+-----------+
| MyFaces Test 1.0.4 Source (tar.gz)     | {{{http://www.apache.org/dyn/closer.cgi/myfaces/source/myfaces-test-assembly-1.0.4-src.tar.gz} myfaces-test-assembly-1.0.4-src.tar.gz}} | {{{http://www.apache.org/dist/myfaces/source/myfaces-test-assembly-1.0.4-src.tar.gz.md5} myfaces-test-assembly-1.0.4-src.tar.gz.md5}} | {{{http://www.apache.org/dist/myfaces/source/myfaces-test-assembly-1.0.4-src.tar.gz.asc} myfaces-test-assembly-1.0.4-src.tar.gz.asc}} |
*-------------------------+---------+----------+-----------+
| MyFaces Test 1.0.4 Source (zip)      | {{{http://www.apache.org/dyn/closer.cgi/myfaces/source/myfaces-test-assembly-1.0.4-src.zip} myfaces-test-assembly-1.0.4-src.zip}} | {{{http://www.apache.org/dist/myfaces/source/myfaces-test-assembly-1.0.4-src.zip.md5} myfaces-test-assembly-1.0.4-src.zip.md5}} | {{{http://www.apache.org/dist/myfaces/source/myfaces-test-assembly-1.0.4-src.zip.asc} myfaces-test-assembly-1.0.4-src.zip.asc}} |
*-------------------------+---------+----------+-----------+

Latest source code from SVN repository

    If you want to use the latest Apache MyFaces Test features, the source code is under
    version control with SVN.  Click {{{source-repository.html} here }}
    for information on how to use the ASF Test SVN Repository.

Verifying checksums

    It is essential that you verify the integrity of the downloaded
    files using the PGP and MD5 signatures. MD5 verification ensures the
    file was not corrupted during the download process. PGP verification
    ensures that the file came from a certain person.

    To verify the MD5 signature on the files, you need to use a program
    called <<<md5>>> or <<<md5sum>>>, which is
    included in many UNIX distributions.  It is also available as part of
    {{{http://www.gnu.org/software/textutils/textutils.html}GNU Textutils}}.
    Windows users can get binary md5 programs from {{{http://www.fourmilab.ch/md5/}here}},
    {{{http://www.pc-tools.net/win32/freeware/console/}here}}, or
    {{{http://www.slavasoft.com/fsum/}here}}.

Verifying signatures

  	PGP verification ensures that the file came from a certain person.  We strongly recommend
	  you verify your downloads with both PGP and MD5.

	The PGP signatures can be verified using {{{http://www.pgpi.org/}PGP}} or 
	{{{http://www.gnupg.org/}GPG}}.  First download the Apache MyFaces 
	{{{http://www.apache.org/dist/myfaces/KEYS}KEYS}}	as well as the <<<asc>>> signature file 
	for the particular distribution. It is important that you get these files from the ultimate
	trusted source - the main ASF distribution site, rather than from a mirror.
	Then verify the signatures using ...

	  <<<
	  % pgpk -a KEYS
	  % pgpv myfaces-test-assembly-1.0.4-bin.tar.gz.asc myfaces-test-assembly-1.0.4-bin.tar.gz
	  >>>

	  <or>

	  <<<
	  % pgp -ka KEYS
	  % pgp myfaces-test-assembly-1.0.4-bin.tar.gz.asc myfaces-test-assembly-1.0.4-bin.tar.gz
	  >>>

	  <or>

	  <<<
  	% gpg --import KEYS
	  % gpg --verify myfaces-test-assembly-1.0.4-bin.tar.gz.asc myfaces-test-assembly-1.0.4-bin.tar.gz
	  >>>
