Please read the following Software License Agreement.
It is necessary that you understand it and agree to be bound by its terms
in order to use the accompanying software product(s) and associated files.

RESOUNDING TECHNOLOGY, INC.
SOFTWARE LICENSE AGREEMENT

IMPORTANT:  DO NOT RUN OR EXAMINE THE ACCOMPANYING SOFTWARE PRODUCT UNTIL
YOU HAVE READ THIS AGREEMENT.  BY RUNNING THE SOFTWARE PRODUCT, YOU AFFIRM
THAT YOU ACCEPT ALL OF THE TERMS OF THIS AGREEMENT.  IF YOU DO NOT ACCEPT
ALL OF THE TERMS OF THIS AGREEMENT (1) DO NOT RUN THE SOFTWARE
(2) DISCONTINUE THE INSTALLATION AND LICENSING PROCESS BY
DELETING ALL FILES THAT CAME WITH THIS DISTRIBUTION.

This software ("Software") is licensed, not sold, to you for use
only under the terms of this License Agreement ("Agreement").
Resounding Technology, Inc. ("Licensor") continues to own the
Software and reserves any rights not expressly granted to you.

1.  LICENSE GRANT.  Licensor grants to you, subject to the terms
and conditions of this Agreement, a nonexclusive, nontransferable
right to use the Software.  This Agreement grants to you the
right to install and use the Software on a hard disk or other
storage device on any computer.  You may copy the Software in
object code form only for archival and back-up purposes,
provided such back-up copy is not installed or used on any
computer.  Ownership of, and title to, the Software and any
manuals, guides or any other printed material that Licensor
provided to you for use with the Software ("Documentation")
is and will be held by Licensor and its licensors.

2.  PROTECTION OF SOFTWARE.  You agree to protect the Software
and the Documentation from unauthorized copying or use.  You
acknowledge that the source code for the Software and other
trade secrets embodied in the Software have not been, and are
not going to be, disclosed to you.  Modifications of, additions
to, or deletions from the Software (including any deletion or
addition of code) are strictly prohibited. Except as
specifically permitted in this Agreement, you agree not to,
directly or indirectly, (i) use any Confidential Information
to create any software or documentation that is similar to
any of the Software or Documentation; (ii) reverse engineer,
disassemble or decompile the Software; (iii) encumber,
transfer, sublicense, rent, lease, time-share or use the
Software in any service bureau arrangement; or (iv) copy
(except as provided herein), distribute, manufacture,
adapt, create derivative works of, translate, localize,
port or otherwise modify Software or permit any third party
to engage in any of the acts proscribed in clauses (i) through (iv).
You agree not to remove or alter any printed or on-screen
copyright, trade secret or other legal notices contained on or
in the Software or the Documentation.

3.  CONFIDENTIALITY.

3.1  Confidential Information.  "Confidential Information" means
all confidential, proprietary or trade secret information of
Licensor, including without limitation all Software, all
Documentation and all other information or material which is
provided or disclosed by Licensor to you for the purposes
specified in this Agreement, whether such information is
disclosed by Licensor (a) in writing or other tangible medium,
(b) visually, or (c) orally.  "Confidential Information" does
not include any portion of any such information to the extent that
you can clearly demonstrate that it: (i) is or becomes known in the
trade through no act or omission by you; (ii)  is disclosed to you
by a third party who has a right to make such disclosure without
any obligation of confidentiality to Licensor; or (iii) is
independently developed by you without reference to such information.

3.2  Confidentiality Obligations.  You agree to (a) use the highest
commercially reasonable degree of care to protect and maintain the
Confidential Information as confidential and to hold the
Confidential Information in trust for the exclusive benefit of
Licensor; (b) use the Confidential Information solely as expressly
permitted by this Agreement; (c) not disclose the Confidential
Information to any person or entity not a party to this Agreement;
and (d) return to Licensor at anytime upon Licensor's request,
any and all Confidential Information.

4.  OWNERSHIP.  Licensor retains all of its respective rights, title
and interest in the Software and the Documentation, including
without limitation any and all patents, patent applications,
copyrights, trade secrets, trademarks and other intellectual
property rights, and you agree not to take any action inconsistent
with such title and ownership. YOU ACKNOWLEDGE AND AGREE THAT THE
SOFTWARE MAY CONTAIN CODE OR REQUIRE DEVICES THAT DETECT OR PREVENT
UNAUTHORIZED USE OF THE SOFTWARE.



5.   DISCLAIMER OF WARRANTIES AND LIMITATION OF LIABILITY.

5.1  Disclaimer of Warranty.  YOU ACKNOWLEDGE THAT THE SOFTWARE WILL
CEASE TO TRANSMIT AFTER EACH FIFTEEN (15) MINUTE PERIOD OF USE UNTIL
IT HAS BEEN MADE FULLY FUNCTIONAL BY SUBMITTING REGISTRATION
INFORMATION TO LICENSOR IN RETURN FOR A SOFTWARE LICENSE KEY
(SECTION 6.1).  YOU FURTHER ACKNOWLEDGE THAT THE SOFTWARE AND THE
DOCUMENTATION ARE BEING SUPPLIED TO YOU ON AN "AS IS" BASIS.
LICENSOR HEREBY EXPRESSLY DISCLAIMS ALL WARRANTIES REGARDING THE
SOFTWARE AND THE DOCUMENTATION, WHETHER EXPRESS OR IMPLIED, ORAL OR
WRITTEN, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR ANY
PARTICULAR PURPOSE, TITLE OR NON-INFRINGEMENT,  AS WELL AS ALL
WARRANTIES ARISING BY USAGE OF TRADE AND COURSE OF DEALING.
LICENSOR DOES NOT WARRANT THAT (A) THE SOFTWARE WILL MEET YOUR
REQUIREMENTS, (B) OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED
OR ERROR FREE, OR (C) DEFECTS WILL BE CORRECTED.  SOME JURISDICTIONS
DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE
LIMITATIONS MAY NOT APPLY TO YOU.  To the extent permissible, any
implied warranties are limited to thirty (30) days.

5.2  Limitation of Liability.  LICENSOR'S LIABILITY FOR DAMAGES TO
LICENSEE FOR ANY CAUSE WHATSOEVER, REGARDLESS OF THE FORM OF ANY
CLAIM OR ACTION, SHALL NOT EXCEED FIVE (5) DOLLARS.  LICENSOR SHALL
IN NO EVENT BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF DATA,
INTERRUPTION OF BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL,
INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES OF ANY KIND, WHETHER
UNDER THIS AGREEMENT OR OTHERWISE ARISING IN ANY WAY IN CONNECTION
WITH THE SOFTWARE, THE DOCUMENTATION OR THIS AGREEMENT, EVEN IF
LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  SOME
JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL
OR CONSEQUENTIAL DAMAGES, SO THE ABOVE EXCLUSION OR LIMITATION MAY
NOT APPLY TO YOU.

6.  USER INFORMATION.

6.1   Registration.  Upon registering the Software with Licensor, you
will be issued an alphanumeric user identification and a license
key that will allow full operation of the Software ("Registration").
You are responsible for maintaining the confidentiality of your
user identification number and license key and are liable for any
harm or loss resulting from disclosing or allowing disclosure of
any license key or from use by any person of your license key to
gain access to the Software.

6.2   Former Users.  Users whose accounts have been terminated by
Licensor may not access the Software in any manner or for any reason
without the express written permission of Licensor.  Active Users
may not knowingly allow former Users who have been terminated to
use the active User's accounts.

7.  Support & UPGRADES.  As long as Licensor generally offers to
third parties licenses to use the Software, Licensor will (i)
maintain an e-mail address for responding to maintenance issues and
users questions and (ii) provide generally offered updates or
enhancements of the Software and the Documentation that Licensor
periodically makes available to Users.  Any updates or enhancements
to the Software delivered by way of support services shall be
treated for all purposes under this Agreement as Software and all
intellectual property rights therein shall be retained by Licensor.

8.   TERM AND TERMINATION.  This Agreement shall remain in force
until terminated as provided herein.  You may terminate this
Agreement at any time and for any reason upon deletion of the
Software from any computer or storage device.  This Agreement will
also terminate if you breach any of the terms or conditions of
this Agreement.  You agree that in the event of the termination of
this Agreement for any reason, your license rights to the Software
and the Documentation are immediately terminated.  Licensor reserves
the right without notice to disable (including remotely) the
Software in the event of a breach of this Agreement by you.  The
rights and obligation of the parties under Sections 3 (Confidential
Information), 4 (Ownership), 5.1 (Warranty), 5.2 (Limitation of
Liability), 10 (Compliance with Laws), 11 (General Provisions and
this Section 8 will survive the termination of this Agreement.

9.  U.S. GOVERNMENT RESTRICTED RIGHTS.  If the Software or
Documentation is acquired by or on behalf of a unit or agency of the
United States Government (the "Government"), the Government agrees
that such Software and Documentation is "commercial computer
software" and "commercial computer software documentation",
respectively, and that absent a written agreement to the contrary,
the Government's rights with respect to such Software and
Documentation are, in the case of civilian agency use, RESTRICTED
RIGHTS, as defined in FAR §52.227.19, and if for the Department of
Defense use, limited by the terms of this Agreement, pursuant to
DFAR §227.7202.  The use of the Software or Documentation by the
Government constitutes acknowledgment of Licensor's proprietary
rights in the Software and Documentation.  Contractor/manufacturer
is Licensor.  Licensor's address is set forth at the end of this
Agreement.

10.  COMPLIANCE WITH LAWS.  You agree that you shall not export or
re-export, directly or indirectly (including via remote access),
Software, Documentation or other information or materials provided
by Licensor hereunder, to any country for which the United States
or any other relevant jurisdiction requires any export license or
other governmental approval at the time of export without first
obtaining such license or approval.  It shall be your responsibility
to comply with the latest United States export regulations, and you
shall defend and indemnify Licensor from and against any damages,
fines, penalties, assessments, liabilities, costs and expenses
(including reasonable attorneys' fees and court costs) arising out
of any claim that the Software, Documentation, or other information
or materials provided by Licensor hereunder were exported or
otherwise accessed, shipped or transported in violation of
applicable laws and regulations.  You shall comply with all laws,
legislation, rules, regulations, and governmental requirements with
respect to the Software, and the performance by Licensee of its
obligations hereunder, of any jurisdiction in or from which Licensee
directly or indirectly causes the Software to be used or accessed.

11.   GENERAL.

11.1  Severability.  In the event that any provision of this Agreement
shall, in whole or in part, be determined to be invalid, unenforceable
or void for any reason, such determination shall affect only the
portion of such provision determined to be invalid, unenforceable or
void, and shall not affect in any way the remainder of such provision
or any other provision of this Agreement.
11.2 Waiver.  The waiver by either party of a breach or a default of
any provision of this Agreement by the other party shall not be
construed as a waiver of any succeeding breach of the same or any
other provision, nor shall any delay or omission on the part of
either party to exercise or avail itself of any right, power or
privilege that it has, or may have hereunder, operate as a waiver of
any right, power or privilege by such party.
11.3  Governing Law; Jurisdiction & Venue  This Agreement shall be
governed by and construed in accordance with the laws of the
Commonwealth of Massachusetts, without regard to its choice of law
provisions.  In the event of any conflict between foreign laws, rules
and regulations and those of the United States, the laws, rules and
regulations of the United States shall govern.  The United Nations
Convention on Contracts for the International Sale of Goods shall
not apply to this Agreement.  Exclusive jurisdiction and venue for
any litigation arising under this Agreement is in the federal and
state courts located in Suffolk County, Massachusetts and you agree
to take any and all necessary or appropriate action to submit to the
jurisdiction and venue of such court.
11.4  Entire Agreement; Amendment.  This Agreement constitutes the
entire agreement between the parties with regard to the subject
matter hereof and supersedes all prior understandings and
agreements, whether written or oral, as to such subject matter.  No
waiver, consent, modification or change of terms of this Agreement
shall bind either party unless in writing signed by both parties,
and then such waiver, consent, modification or change shall be
effective only in the specific instance and for the specific purpose
given.
11.5  Assignment.  This Agreement and the rights and obligations
hereunder, may not be assigned, in whole or in part by Licensee,
without the prior written consent of Licensor.  In the case of any
permitted assignment or transfer of or under this Agreement, this
Agreement or the relevant provisions shall be binding upon, and
inure to the benefit of, the successors, executors, heirs,
representatives, administrators and assigns of the parties hereto.
11.6  Acknowledgment.  You acknowledge that (a) you have read and
understand this Agreement; and (b) that this Agreement has the same
force and effect as a signed agreement.

Licensor:

      Resounding Technology, Inc.
      87 Marshall Street
      Building 10
      North Adams, MA  01247
      www.resounding.com



IF YOU DO NOT AGREE TO ALL OF THE FOREGOING, or are not authorized to agree,
delete all copies of the accompanying software and associated files from your
computer systems and backup media.  If authorized, you may accept at
another time.
