(Note: This has been changed, and hopefully clarified, from the 3.00
version of this info.  Please read it.)

Thank you for acquiring a copy of XV, a pretty nifty X program.
I hope you enjoy using it, as I've enjoyed writing it.

The latest version of XV (or at least a pointer to it) is available
via anonymous ftp on ftp.cis.upenn.edu, in the directory pub/xv.  If
you're not sure if you have the latest version, or you are missing the
source or documentation for XV, PLEASE pick up the latest version of
the xv distribution.  Do *not* send mail unless absolutely necessary
(ie, you don't have ftp capability).

Note:  The documentation ('xvdocs.ps') may be installed in '/usr/local'.

If you're viewing this information via the 'About XV' command, and
you'd like to print it out, a copy of this info can be found in the
README file in the top-level XV source directory.  Print that.  If you
don't have it, see the previous paragraph.


XV Licensing Information
------------------------
XV IS SHAREWARE FOR PERSONAL USE ONLY.  

You may use XV for your own amusement, and if you find it nifty,
useful, generally cool, or of some value to you, your registration fee
would be greatly appreciated.  $25 is the standard registration fee,
though of course, larger amounts are quite welcome.  Folks who donate
$40 or more can receive a printed, bound copy of the XV manual for no
extra charge.  If you want one, just ask.  BE SURE TO SPECIFY THE
VERSION OF XV THAT YOU ARE USING!

COMMERCIAL, GOVERNMENT, AND INSTITUTIONAL USERS MUST REGISTER THEIR
COPIES OF XV.

This does *not* mean that you are required to register XV just because
you play with it on the workstation in your office.  This falls under
the heading of 'personal use'.  If you are a sysadmin, you can put XV
up in a public directory for your users amusement.  Again, 'personal
use', albeit plural.

On the other hand, if you use XV in the course of doing your work,
whatever your 'work' may happen to be, you *must* register your
copy of XV.  (Note:  If you are a student, and you use XV to do 
classwork or research, you should get your professor/teacher/advisor
to purchase an appropriate number of copies.)

XV licenses are $25 each.  You should purchase one license per
workstation, or one per XV user, whichever is the smaller number.  XV
is *not* sold on a 'number of concurrent users' basis.  If XV was some
$1000 program, yes, that would be a reasonable request, but at $25,
it's not.  Also, given that XV is completely unlocked, there is no way
to enforce any 'number of concurrent users' limits, so it isn't sold
that way.

Printed and bound copies of the 100-odd page XV manual are available
for $15 each.  Note that manuals are *only* sold with, at minimum, an
equal number of licenses.  (e.g.  if you purchase 5 licenses, you can
also purchase *up to* 5 copies of the manual)

The source code to the program can be had (as a compressed 'tar' file
split over a couple 3.5" MS-DOS formatted floppies) for $15, for those
who don't have ftp capabilities.

Orders outside the US and Canada must add an additional $5 per manual
ordered to cover the additional shipping charges.

Checks, money orders, and purchase orders are accepted.  Credit cards
are not.  All forms of payment must be payable in US Funds.  Checks
must be payable through a US bank (or a US branch of a non-US bank).
Purchase orders for less than $50, while still accepted, are not
encouraged. 

All payments should be payable to 'John Bradley', and mailed to:
        John Bradley
        1053 Floyd Terrace
        Bryn Mawr, PA  19010
        USA


Site Licenses
-------------
If you are planning to purchase 10 or more licenses, site licenses are
available, at a substantial discount.  Site licenses let you run XV on
any and all computing equipment at the site, for any purpose
whatsoever.  The site license covers the current version of XV, and
any versions released within one year of the licensing date.  You are
also allowed to duplicate and distribute an unlimited number of copies
of the XV manual, but only for use within the site.  Covered versions
of the software may be run in perpetuity.

Also, it should be noted that a 'site' can be defined as anything
you'd like.  It can be a physical location (a room, building,
location, etc.), an organizational grouping (a workgroup, department,
division, etc.) or any other logical grouping ("the seventeen
technical writers scattered about our company", etc.).

The site license cost will be based on your estimate of the number of
XV users or workstations at your site, whichever is the smaller
number.

If you are interested in obtaining a site license, please contact the
author via electronic mail or FAX (see below for details).  Send
information regarding your site (the name or definition of the 'site',
a physical address, a fax number, and an estimate of the number of
users or workstations), and we'll get a site license out to you for
your examination.


Copyright Notice
----------------
XV is Copyright 1989, 1994 by John Bradley

Permission to copy and distribute XV in its entirety, for
non-commercial purposes, is hereby granted without fee, provided that
this license information and copyright notice appear in all copies.

If you redistribute XV, the *entire* contents of this distribution
must be distributed, including the README, and INSTALL files, the
sources, and the complete contents of the 'docs' directory.

Note that distributing XV 'bundled' in with any product is considered
to be a 'commercial purpose'.

Also note that any copies of XV that are distributed MUST be built
and/or configured to be in their 'unregistered copy' mode, so that it
is made obvious to the user that XV is shareware, and that they should
consider registering, or at least reading this information.

The software may be modified for your own purposes, but modified
versions may not be distributed without prior consent of the author.

This software is provided 'as-is', without any express or implied
warranty.  In no event will the author be held liable for any damages
arising from the use of this software.

If you would like to do something with XV that this copyright
prohibits (such as distributing it with a commercial product, using
portions of the source in some other program, distributing registered
copies, etc.), please contact the author (preferably via email).
Arrangements can probably be worked out.


The author may be contacted via:
    US Mail:  John Bradley
              1053 Floyd Terrace
              Bryn Mawr, PA  19010

    FAX:     (610) 520-2042

Electronic Mail regarding XV should be sent to one of these three addresses:
     xv@devo.dccs.upenn.edu               - general XV questions
     xvbiz@devo.dccs.upenn.edu            - all XV licensing questions
     xvtech@devo.dccs.upenn.edu           - bug reports, technical questions

Please do *not* send electronic mail directly to the author, as he
gets more than enough as it is.


