------------------------ Apache License, v. 2.0 --------------------------------

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed 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.


For bsh-1.3.0.jar:

------------------------------- Sun Public License, v. 1.0 ---------------------------------

1. Definitions.

    1.0.1. "Commercial Use" means distribution or otherwise making the
    Covered Code available to a third party.

    1.1. "Contributor" means each entity that creates or contributes to
    the creation of Modifications.

    1.2. "Contributor Version" means the combination of the Original Code,
    prior Modifications used by a Contributor, and the Modifications made
    by that particular Contributor.

    1.3. "Covered Code" means the Original Code or Modifications or the
    combination of the Original Code and Modifications, in each case
    including portions thereof and corresponding documentation released
    with the source code.

    1.4. "Electronic Distribution Mechanism" means a mechanism generally
    accepted in the software development community for the electronic
    transfer of data.

    1.5. "Executable" means Covered Code in any form other than Source
    Code.

    1.6. "Initial Developer" means the individual or entity identified as
    the Initial Developer in the Source Code notice required by Exhibit
    A.

    1.7. "Larger Work" means a work which combines Covered Code or
    portions thereof with code not governed by the terms of this
    License.

    1.8. "License" means this document.

    1.8.1. "Licensable" means having the right to grant, to the maximum
    extent possible, whether at the time of the initial grant or
    subsequently acquired, any and all of the rights conveyed herein.

    1.9. "Modifications" means any addition to or deletion from the
    substance or structure of either the Original Code or any previous
    Modifications. When Covered Code is released as a series of files, a
    Modification is:

        A. Any addition to or deletion from the contents of a file containing
        Original Code or previous Modifications.

        B. Any new file that contains any part of the Original Code or
        previous Modifications.

    1.10. "Original Code"../ means Source Code of computer software code
    which is described in the Source Code notice required by Exhibit A as
    Original Code, and which, at the time of its release under this
    License is not already Covered Code governed by this License.

    1.10.1. "Patent Claims" means any patent claim(s), now owned or
    hereafter acquired, including without limitation, method, process, and
    apparatus claims, in any patent Licensable by grantor.

    1.11. "Source Code"../ means the preferred form of the Covered Code
    for
    making modifications to it, including all modules it contains, plus
    any associated documentation, interface definition files, scripts used
    to control compilation and installation of an Executable, or source
    code differential comparisons against either the Original Code or
    another well known, available Covered Code of the Contributor's
    choice. The Source Code can be in a compressed or archival form,
    provided the appropriate decompression or de-archiving software is
    widely available for no charge.

    1.12. "You" (or "Your") means an individual or a legal entity
    exercising rights under, and complying with all of the terms of, this
    License or a future version of this License issued under Section 6.1.
    For legal entities, "You" includes any entity which controls, is
    controlled by, or is under common control with You. For purposes of
    this definition, "control"../ means (a) the power, direct or indirect,
    to
    cause the direction or management of such entity, whether by contract
    or otherwise, or (b) ownership of more than fifty percent (50%) of the
    outstanding shares or beneficial ownership of such entity.

2. Source Code License.

    2.1 The Initial Developer Grant.

        The Initial Developer hereby grants You a world-wide, royalty-free,
        non-exclusive license, subject to third party intellectual property
        claims:

        (a) under intellectual property rights (other than patent or
        trademark) Licensable by Initial Developer to use, reproduce, modify,
        display, perform, sublicense and distribute the Original Code (or
        portions thereof) with or without Modifications, and/or as part of a
        Larger Work; and

        (b) under Patent Claims infringed by the making, using or selling of
        Original Code, to make, have made, use, practice, sell, and offer for
        sale, and/or otherwise dispose of the Original Code (or portions
        thereof).

        (c) the licenses granted in this Section 2.1(a) and (b) are effective
        on the date Initial Developer first distributes Original Code under
        the terms of this License.

        (d) Notwithstanding Section 2.1(b) above, no patent license is
        granted: 1) for code that You delete from the Original Code; 2)
        separate from the Original Code; or 3) for infringements caused
        by:

        i) the modification of the Original Code or ii) the combination of the
        Original Code with other software or devices.

    2.2. Contributor Grant.

        Subject to third party intellectual property claims, each Contributor
        hereby grants You a world-wide, royalty-free, non-exclusive license

            (a) under intellectual property rights (other than patent
            or
            trademark) Licensable by Contributor, to use, reproduce, modify,
            display, perform, sublicense and distribute the Modifications created
            by such Contributor (or portions thereof) either on an unmodified
            basis, with other Modifications, as Covered Code and/or as part of a
            Larger Work; and

            b) under Patent Claims infringed by the making, using, or selling of
            Modifications made by that Contributor either alone and/or in
            combination with its Contributor Version (or portions of such
            combination), to make, use, sell, offer for sale, have made, and/or
            otherwise dispose of: 1) Modifications made by that Contributor (or
            portions thereof); and 2) the combination of Modifications made by
            that Contributor with its Contributor Version (or portions of such
            combination).

            (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective
            on the date Contributor first makes Commercial Use of the Covered
            Code.

            (d) notwithstanding Section 2.2(b) above, no patent license is
            granted: 1) for any code that Contributor has deleted from the
            Contributor Version; 2) separate from the Contributor Version; 3) for
            infringements caused by: i) third party modifications of Contributor
            Version or ii) the combination of Modifications made by that
            Contributor with other software (except as part of the Contributor
            Version) or other devices; or 4) under Patent Claims infringed by
            Covered Code in the absence of Modifications made by that
            Contributor.

    3. Distribution Obligations.

        3.1. Application of License.

        The Modifications which You create or to which You contribute are
        governed by the terms of this License, including without limitation
        Section 2.2. The Source Code version of Covered Code may be
        distributed only under the terms of this License or a future version
        of this License released under Section 6.1, and You must include a
        copy of this License with every copy of the Source Code You
        distribute. You may not offer or impose any terms on any Source Code
        version that alters or restricts the applicable version of this
        License or the recipients' rights hereunder. However, You may include
        an additional document offering the additional rights described in
        Section 3.5.

        3.2. Availability of Source Code.

        Any Modification which You create or to which You contribute must be
        made available in Source Code form under the terms of this License
        either on the same media as an Executable version or via an accepted
        Electronic Distribution Mechanism to anyone to whom you made an
        Executable version available; and if made available via Electronic
        Distribution Mechanism, must remain available for at least twelve (12)
        months after the date it initially became available, or at least six
        (6) months after a subsequent version of that particular Modification
        has been made available to such recipients. You are responsible for
        ensuring that the Source Code version remains available even if the
        Electronic Distribution Mechanism is maintained by a third party.

        3.3. Description of Modifications.

        You must cause all Covered Code to which You contribute to contain a
        file documenting the changes You made to create that Covered Code and
        the date of any change. You must include a prominent statement that
        the Modification is derived, directly or indirectly, from Original
        Code provided by the Initial Developer and including the name of the
        Initial Developer in (a) the Source Code, and (b) in any notice in an
        Executable version or related documentation in which You describe the
        origin or ownership of the Covered Code.

        3.4. Intellectual Property Matters.

            (a) Third Party Claims.

            If Contributor has knowledge that a license under a third party's
            intellectual property rights is required to exercise the rights
            granted by such Contributor under Sections 2.1 or 2.2, Contributor
            must include a text file with the Source Code distribution titled
            "../LEGAL'' which describes the claim and the party making the claim in
            sufficient detail that a recipient will know whom to contact. If
            Contributor obtains such knowledge after the Modification is made
            available as described in Section 3.2, Contributor shall promptly
            modify the LEGAL file in all copies Contributor makes available
            thereafter and shall take other steps (such as notifying appropriate
            mailing lists or newsgroups) reasonably calculated to inform those who
            received the Covered Code that new knowledge has been obtained.

            (b) Contributor APIs.

            If Contributor's Modifications include an application programming
            interface ("API"../) and Contributor has knowledge of patent licenses
            which are reasonably necessary to implement that API, Contributor must
            also include this information in the LEGAL file.

            (c) Representations.

            Contributor represents that, except as disclosed pursuant to Section
            3.4(a) above, Contributor believes that Contributor's Modifications
            are Contributor's original creation(s) and/or Contributor has
            sufficient rights to grant the rights conveyed by this
            License

            .

        3.5. Required Notices.

        You must duplicate the notice in Exhibit A in each file of the Source
        Code. If it is not possible to put such notice in a particular Source
        Code file due to its structure, then You must include such notice in a
        location (such as a relevant directory) where a user would be likely
        to look for such a notice. If You created one or more Modification(s)
        You may add your name as a Contributor to the notice described in
        Exhibit A. You must also duplicate this License in any documentation
        for the Source Code where You describe recipients' rights or ownership
        rights relating to Covered Code. You may choose to offer, and to
        charge a fee for, warranty, support, indemnity or liability
        obligations to one or more recipients of Covered Code. However, You
        may do so only on Your own behalf, and not on behalf of the Initial
        Developer or any Contributor. You must make it absolutely clear than
        any such warranty, support, indemnity or liability obligation is
        offered by You alone, and You hereby agree to indemnify the Initial
        Developer and every Contributor for any liability incurred by the
        Initial Developer or such Contributor as a result of warranty,
        support, indemnity or liability terms You offer.

        3.6. Distribution of Executable Versions.

        You may distribute Covered Code in Executable form only if the
        requirements of Section 3.1-3.5 have been met for that Covered Code,
        and if You include a notice stating that the Source Code version of
        the Covered Code is available under the terms of this License,
        including a description of how and where You have fulfilled the
        obligations of Section 3.2. The notice must be conspicuously included
        in any notice in an Executable version, related documentation or
        collateral in which You describe recipients' rights relating to the
        Covered Code. You may distribute the Executable version of Covered
        Code or ownership rights under a license of Your choice, which may
        contain terms different from this License, provided that You are in
        compliance with the terms of this License and that the license for the
        Executable version does not attempt to limit or alter the recipient's
        rights in the Source Code version from the rights set forth in this
        License. If You distribute the Executable version under a different
        license You must make it absolutely clear that any terms which differ
        from this License are offered by You alone, not by the Initial
        Developer or any Contributor. You hereby agree to indemnify the
        Initial Developer and every Contributor for any liability incurred by
        the Initial Developer or such Contributor as a result of any such
        terms You offer.

        3.7. Larger Works.

        You may create a Larger Work by combining Covered Code with other
        code
        not governed by the terms of this License and distribute the Larger
        Work as a single product. In such a case, You must make sure the
        requirements of this License are fulfilled for the Covered Code.

    4. Inability to Comply Due to Statute or Regulation.

    If it is impossible for You to comply with any of the terms of this
    License with respect to some or all of the Covered Code due to
    statute, judicial order, or regulation then You must: (a) comply with
    the terms of this License to the maximum extent possible; and (b)
    describe the limitations and the code they affect. Such description
    must be included in the LEGAL file described in Section 3.4 and must
    be included with all distributions of the Source Code. Except to the
    extent prohibited by statute or regulation, such description must be
    sufficiently detailed for a recipient of ordinary skill to be able to
    understand it.

    5. Application of this License.

    This License applies to code to which the Initial Developer has
    attached the notice in Exhibit A and to related Covered Code.

    6. Versions of the License.

        6.1. New Versions.

        Sun Microsystems, Inc. ("Sun") may publish revised and/or new versions
        of the License from time to time. Each version will be given a
        distinguishing version number.

        6.2. Effect of New Versions.

        Once Covered Code has been published under a particular version of
        the
        License, You may always continue to use it under the terms of that
        version. You may also choose to use such Covered Code under the terms
        of any subsequent version of the License published by Sun. No one
        other than Sun has the right to modify the terms applicable to Covered
        Code created under this License.

        6.3. Derivative Works.

        If You create or use a modified version of this License (which you
        may
        only do in order to apply it to code which is not already Covered Code
        governed by this License), You must: (a) rename Your license so that
        the phrases "Sun," "Sun Public License," or "SPL"../ or any confusingly
        similar phrase do not appear in your license (except to note that your
        license differs from this License) and (b) otherwise make it clear
        that Your version of the license contains terms which differ from the
        Sun Public License. (Filling in the name of the Initial Developer,
        Original Code or Contributor in the notice described in Exhibit A
        shall not of themselves be deemed to be modifications of this
        License.)

    7. DISCLAIMER OF WARRANTY.

    COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS'' BASIS,
    WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
    WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
    DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
    THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
    IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
    YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
    COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
    OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
    ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
    DISCLAIMER.

    8. TERMINATION.

        8.1. This License and the rights granted hereunder will terminate
        automatically if You fail to comply with terms herein and fail to cure
        such breach within 30 days of becoming aware of the breach. All
        sublicenses to the Covered Code which are properly granted shall
        survive any termination of this License. Provisions which, by their
        nature, must remain in effect beyond the termination of this License
        shall survive.

        8.2. If You initiate litigation by asserting a patent infringement
        claim (excluding declaratory judgment actions) against Initial Developer
        or a Contributor (the Initial Developer or Contributor against whom
        You file such action is referred to as "Participant") alleging
        that:

            (a) such Participant's Contributor Version directly or indirectly
            infringes any patent, then any and all rights granted by such
            Participant to You under Sections 2.1 and/or 2.2 of this License
            shall, upon 60 days notice from Participant terminate prospectively,
            unless if within 60 days after receipt of notice You either: (i)
            agree in writing to pay Participant a mutually agreeable reasonable
            royalty for Your past and future use of Modifications made by such
            Participant, or (ii) withdraw Your litigation claim with respect to
            the Contributor Version against such Participant. If within 60 days
            of notice, a reasonable royalty and payment arrangement are not
            mutually agreed upon in writing by the parties or the litigation claim
            is not withdrawn, the rights granted by Participant to You under
            Sections 2.1 and/or 2.2 automatically terminate at the expiration of
            the 60 day notice period specified above.

            (b) any software, hardware, or device, other than such Participant's
            Contributor Version, directly or indirectly infringes any patent, then
            any rights granted to You by such Participant under Sections 2.1(b)
            and 2.2(b) are revoked effective as of the date You first made, used,
            sold, distributed, or had made, Modifications made by that
            Participant.

        8.3. If You assert a patent infringement claim against Participant
        alleging that such Participant's Contributor Version directly or
        indirectly infringes any patent where such claim is resolved (such as
        by license or settlement) prior to the initiation of patent
        infringement litigation, then the reasonable value of the licenses
        granted by such Participant under Sections 2.1 or 2.2 shall be taken
        into account in determining the amount or value of any payment or
        license.

        8.4. In the event of termination under Sections 8.1 or 8.2 above,
        all
        end user license agreements (excluding distributors and resellers)
        which have been validly granted by You or any distributor hereunder
        prior to termination shall survive termination.

    9. LIMITATION OF LIABILITY.

    UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
    (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
    DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
    OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
    ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
    CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
    WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
    COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
    INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
    LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
    RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
    PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
    EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
    THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.

    10. U.S. GOVERNMENT END USERS.

    The Covered Code is a "commercial item," as that term is defined in
    48
    C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software"
    and "commercial computer software documentation,"../ as such terms are
    used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R.
    12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all
    U.S. Government End Users acquire Covered Code with only those rights
    set forth herein.

    11. MISCELLANEOUS.

    This License represents the complete agreement concerning subject
    matter hereof. If any provision of this License is held to be
    unenforceable, such provision shall be reformed only to the extent
    necessary to make it enforceable. This License shall be governed by
    California law provisions (except to the extent applicable law, if
    any, provides otherwise), excluding its conflict-of-law provisions.
    With respect to disputes in which at least one party is a citizen of,
    or an entity chartered or registered to do business in the United
    States of America, any litigation relating to this License shall be
    subject to the jurisdiction of the Federal Courts of the Northern
    District of California, with venue lying in Santa Clara County,
    California, with the losing party responsible for costs, including
    without limitation, court costs and reasonable attorneys' fees and
    expenses. The application of the United Nations Convention on
    Contracts for the International Sale of Goods is expressly excluded.
    Any law or regulation which provides that the language of a contract
    shall be construed against the drafter shall not apply to this
    License.

    12. RESPONSIBILITY FOR CLAIMS.

    As between Initial Developer and the Contributors, each party is
    responsible for claims and damages arising, directly or indirectly,
    out of its utilization of rights under this License and You agree to
    work with Initial Developer and Contributors to distribute such
    responsibility on an equitable basis. Nothing herein is intended or
    shall be deemed to constitute any admission of liability.

    13. MULTIPLE-LICENSED CODE.

    Initial Developer may designate portions of the Covered Code as
    ?Multiple-Licensed?. ?Multiple-Licensed? means that the Initial
    Developer permits you to utilize portions of the Covered Code under
    Your choice of the alternative licenses, if any, specified by the
    Initial Developer in the file described in Exhibit A.

    Exhibit A -Sun Public License Notice.

        The contents of this file are subject to the Sun Public License

        Version 1.0 (the License); you may not use this file except in

        compliance with the License. A copy of the License is available at

        http://www.sun.com/

        The Original Code is _________________. The Initial Developer of the

        Original Code is ___________. Portions created by ______ are Copyright

        (C)_________. All Rights Reserved.

        Contributor(s): ______________________________________.

        Alternatively, the contents of this file may be used under the terms

        of the _____ license (the ?[___] License?), in which case the

        provisions of [______] License are applicable instead of those above.

        If you wish to allow use of your version of this file only under the

        terms of the [____] License and not to allow others to use your

        version of this file under the SPL, indicate your decision by deleting

        the provisions above and replace them with the notice and other

        provisions required by the [___] License. If you do not delete the

        provisions above, a recipient may use your version of this file under

        either the SPL or the [___] License.

        [NOTE: The text of this Exhibit A may differ slightly from the text of

        the notices in the Source Code files of the Original Code. You should

        use the text of this Exhibit A rather than the text found in the

        Original Code Source Code for Your Modifications.]
        
========================================================================================        
        
For bsf.jar:

------------------------------ MPL 1.1 -------------------------------------------------

                          MOZILLA PUBLIC LICENSE
                                Version 1.1

                              ---------------

1. Definitions.

     1.0.1. "Commercial Use" means distribution or otherwise making the
     Covered Code available to a third party.

     1.1. "Contributor" means each entity that creates or contributes to
     the creation of Modifications.

     1.2. "Contributor Version" means the combination of the Original
     Code, prior Modifications used by a Contributor, and the Modifications
     made by that particular Contributor.

     1.3. "Covered Code" means the Original Code or Modifications or the
     combination of the Original Code and Modifications, in each case
     including portions thereof.

     1.4. "Electronic Distribution Mechanism" means a mechanism generally
     accepted in the software development community for the electronic
     transfer of data.

     1.5. "Executable" means Covered Code in any form other than Source
     Code.

     1.6. "Initial Developer" means the individual or entity identified
     as the Initial Developer in the Source Code notice required by Exhibit
     A.

     1.7. "Larger Work" means a work which combines Covered Code or
     portions thereof with code not governed by the terms of this License.

     1.8. "License" means this document.

     1.8.1. "Licensable" means having the right to grant, to the maximum
     extent possible, whether at the time of the initial grant or
     subsequently acquired, any and all of the rights conveyed herein.

     1.9. "Modifications" means any addition to or deletion from the
     substance or structure of either the Original Code or any previous
     Modifications. When Covered Code is released as a series of files, a
     Modification is:
          A. Any addition to or deletion from the contents of a file
          containing Original Code or previous Modifications.

          B. Any new file that contains any part of the Original Code or
          previous Modifications.

     1.10. "Original Code" means Source Code of computer software code
     which is described in the Source Code notice required by Exhibit A as
     Original Code, and which, at the time of its release under this
     License is not already Covered Code governed by this License.

     1.10.1. "Patent Claims" means any patent claim(s), now owned or
     hereafter acquired, including without limitation,  method, process,
     and apparatus claims, in any patent Licensable by grantor.

     1.11. "Source Code" means the preferred form of the Covered Code for
     making modifications to it, including all modules it contains, plus
     any associated interface definition files, scripts used to control
     compilation and installation of an Executable, or source code
     differential comparisons against either the Original Code or another
     well known, available Covered Code of the Contributor's choice. The
     Source Code can be in a compressed or archival form, provided the
     appropriate decompression or de-archiving software is widely available
     for no charge.

     1.12. "You" (or "Your")  means an individual or a legal entity
     exercising rights under, and complying with all of the terms of, this
     License or a future version of this License issued under Section 6.1.
     For legal entities, "You" includes any entity which controls, is
     controlled by, or is under common control with You. For purposes of
     this definition, "control" means (a) the power, direct or indirect,
     to cause the direction or management of such entity, whether by
     contract or otherwise, or (b) ownership of more than fifty percent
     (50%) of the outstanding shares or beneficial ownership of such
     entity.

2. Source Code License.

     2.1. The Initial Developer Grant.
     The Initial Developer hereby grants You a world-wide, royalty-free,
     non-exclusive license, subject to third party intellectual property
     claims:
          (a)  under intellectual property rights (other than patent or
          trademark) Licensable by Initial Developer to use, reproduce,
          modify, display, perform, sublicense and distribute the Original
          Code (or portions thereof) with or without Modifications, and/or
          as part of a Larger Work; and

          (b) under Patents Claims infringed by the making, using or
          selling of Original Code, to make, have made, use, practice,
          sell, and offer for sale, and/or otherwise dispose of the
          Original Code (or portions thereof).

          (c) the licenses granted in this Section 2.1(a) and (b) are
          effective on the date Initial Developer first distributes
          Original Code under the terms of this License.

          (d) Notwithstanding Section 2.1(b) above, no patent license is
          granted: 1) for code that You delete from the Original Code; 2)
          separate from the Original Code;  or 3) for infringements caused
          by: i) the modification of the Original Code or ii) the
          combination of the Original Code with other software or devices.

     2.2. Contributor Grant.
     Subject to third party intellectual property claims, each Contributor
     hereby grants You a world-wide, royalty-free, non-exclusive license

          (a)  under intellectual property rights (other than patent or
          trademark) Licensable by Contributor, to use, reproduce, modify,
          display, perform, sublicense and distribute the Modifications
          created by such Contributor (or portions thereof) either on an
          unmodified basis, with other Modifications, as Covered Code
          and/or as part of a Larger Work; and

          (b) under Patent Claims infringed by the making, using, or
          selling of  Modifications made by that Contributor either alone
          and/or in combination with its Contributor Version (or portions
          of such combination), to make, use, sell, offer for sale, have
          made, and/or otherwise dispose of: 1) Modifications made by that
          Contributor (or portions thereof); and 2) the combination of
          Modifications made by that Contributor with its Contributor
          Version (or portions of such combination).

          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
          effective on the date Contributor first makes Commercial Use of
          the Covered Code.

          (d)    Notwithstanding Section 2.2(b) above, no patent license is
          granted: 1) for any code that Contributor has deleted from the
          Contributor Version; 2)  separate from the Contributor Version;
          3)  for infringements caused by: i) third party modifications of
          Contributor Version or ii)  the combination of Modifications made
          by that Contributor with other software  (except as part of the
          Contributor Version) or other devices; or 4) under Patent Claims
          infringed by Covered Code in the absence of Modifications made by
          that Contributor.

3. Distribution Obligations.

     3.1. Application of License.
     The Modifications which You create or to which You contribute are
     governed by the terms of this License, including without limitation
     Section 2.2. The Source Code version of Covered Code may be
     distributed only under the terms of this License or a future version
     of this License released under Section 6.1, and You must include a
     copy of this License with every copy of the Source Code You
     distribute. You may not offer or impose any terms on any Source Code
     version that alters or restricts the applicable version of this
     License or the recipients' rights hereunder. However, You may include
     an additional document offering the additional rights described in
     Section 3.5.

     3.2. Availability of Source Code.
     Any Modification which You create or to which You contribute must be
     made available in Source Code form under the terms of this License
     either on the same media as an Executable version or via an accepted
     Electronic Distribution Mechanism to anyone to whom you made an
     Executable version available; and if made available via Electronic
     Distribution Mechanism, must remain available for at least twelve (12)
     months after the date it initially became available, or at least six
     (6) months after a subsequent version of that particular Modification
     has been made available to such recipients. You are responsible for
     ensuring that the Source Code version remains available even if the
     Electronic Distribution Mechanism is maintained by a third party.

     3.3. Description of Modifications.
     You must cause all Covered Code to which You contribute to contain a
     file documenting the changes You made to create that Covered Code and
     the date of any change. You must include a prominent statement that
     the Modification is derived, directly or indirectly, from Original
     Code provided by the Initial Developer and including the name of the
     Initial Developer in (a) the Source Code, and (b) in any notice in an
     Executable version or related documentation in which You describe the
     origin or ownership of the Covered Code.

     3.4. Intellectual Property Matters
          (a) Third Party Claims.
          If Contributor has knowledge that a license under a third party's
          intellectual property rights is required to exercise the rights
          granted by such Contributor under Sections 2.1 or 2.2,
          Contributor must include a text file with the Source Code
          distribution titled "LEGAL" which describes the claim and the
          party making the claim in sufficient detail that a recipient will
          know whom to contact. If Contributor obtains such knowledge after
          the Modification is made available as described in Section 3.2,
          Contributor shall promptly modify the LEGAL file in all copies
          Contributor makes available thereafter and shall take other steps
          (such as notifying appropriate mailing lists or newsgroups)
          reasonably calculated to inform those who received the Covered
          Code that new knowledge has been obtained.

          (b) Contributor APIs.
          If Contributor's Modifications include an application programming
          interface and Contributor has knowledge of patent licenses which
          are reasonably necessary to implement that API, Contributor must
          also include this information in the LEGAL file.

               (c)    Representations.
          Contributor represents that, except as disclosed pursuant to
          Section 3.4(a) above, Contributor believes that Contributor's
          Modifications are Contributor's original creation(s) and/or
          Contributor has sufficient rights to grant the rights conveyed by
          this License.

     3.5. Required Notices.
     You must duplicate the notice in Exhibit A in each file of the Source
     Code.  If it is not possible to put such notice in a particular Source
     Code file due to its structure, then You must include such notice in a
     location (such as a relevant directory) where a user would be likely
     to look for such a notice.  If You created one or more Modification(s)
     You may add your name as a Contributor to the notice described in
     Exhibit A.  You must also duplicate this License in any documentation
     for the Source Code where You describe recipients' rights or ownership
     rights relating to Covered Code.  You may choose to offer, and to
     charge a fee for, warranty, support, indemnity or liability
     obligations to one or more recipients of Covered Code. However, You
     may do so only on Your own behalf, and not on behalf of the Initial
     Developer or any Contributor. You must make it absolutely clear than
     any such warranty, support, indemnity or liability obligation is
     offered by You alone, and You hereby agree to indemnify the Initial
     Developer and every Contributor for any liability incurred by the
     Initial Developer or such Contributor as a result of warranty,
     support, indemnity or liability terms You offer.

     3.6. Distribution of Executable Versions.
     You may distribute Covered Code in Executable form only if the
     requirements of Section 3.1-3.5 have been met for that Covered Code,
     and if You include a notice stating that the Source Code version of
     the Covered Code is available under the terms of this License,
     including a description of how and where You have fulfilled the
     obligations of Section 3.2. The notice must be conspicuously included
     in any notice in an Executable version, related documentation or
     collateral in which You describe recipients' rights relating to the
     Covered Code. You may distribute the Executable version of Covered
     Code or ownership rights under a license of Your choice, which may
     contain terms different from this License, provided that You are in
     compliance with the terms of this License and that the license for the
     Executable version does not attempt to limit or alter the recipient's
     rights in the Source Code version from the rights set forth in this
     License. If You distribute the Executable version under a different
     license You must make it absolutely clear that any terms which differ
     from this License are offered by You alone, not by the Initial
     Developer or any Contributor. You hereby agree to indemnify the
     Initial Developer and every Contributor for any liability incurred by
     the Initial Developer or such Contributor as a result of any such
     terms You offer.

     3.7. Larger Works.
     You may create a Larger Work by combining Covered Code with other code
     not governed by the terms of this License and distribute the Larger
     Work as a single product. In such a case, You must make sure the
     requirements of this License are fulfilled for the Covered Code.

4. Inability to Comply Due to Statute or Regulation.

     If it is impossible for You to comply with any of the terms of this
     License with respect to some or all of the Covered Code due to
     statute, judicial order, or regulation then You must: (a) comply with
     the terms of this License to the maximum extent possible; and (b)
     describe the limitations and the code they affect. Such description
     must be included in the LEGAL file described in Section 3.4 and must
     be included with all distributions of the Source Code. Except to the
     extent prohibited by statute or regulation, such description must be
     sufficiently detailed for a recipient of ordinary skill to be able to
     understand it.

5. Application of this License.

     This License applies to code to which the Initial Developer has
     attached the notice in Exhibit A and to related Covered Code.

6. Versions of the License.

     6.1. New Versions.
     Netscape Communications Corporation ("Netscape") may publish revised
     and/or new versions of the License from time to time. Each version
     will be given a distinguishing version number.

     6.2. Effect of New Versions.
     Once Covered Code has been published under a particular version of the
     License, You may always continue to use it under the terms of that
     version. You may also choose to use such Covered Code under the terms
     of any subsequent version of the License published by Netscape. No one
     other than Netscape has the right to modify the terms applicable to
     Covered Code created under this License.

     6.3. Derivative Works.
     If You create or use a modified version of this License (which you may
     only do in order to apply it to code which is not already Covered Code
     governed by this License), You must (a) rename Your license so that
     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
     "MPL", "NPL" or any confusingly similar phrase do not appear in your
     license (except to note that your license differs from this License)
     and (b) otherwise make it clear that Your version of the license
     contains terms which differ from the Mozilla Public License and
     Netscape Public License. (Filling in the name of the Initial
     Developer, Original Code or Contributor in the notice described in
     Exhibit A shall not of themselves be deemed to be modifications of
     this License.)

7. DISCLAIMER OF WARRANTY.

     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.

8. TERMINATION.

     8.1.  This License and the rights granted hereunder will terminate
     automatically if You fail to comply with terms herein and fail to cure
     such breach within 30 days of becoming aware of the breach. All
     sublicenses to the Covered Code which are properly granted shall
     survive any termination of this License. Provisions which, by their
     nature, must remain in effect beyond the termination of this License
     shall survive.

     8.2.  If You initiate litigation by asserting a patent infringement
     claim (excluding declatory judgment actions) against Initial Developer
     or a Contributor (the Initial Developer or Contributor against whom
     You file such action is referred to as "Participant")  alleging that:

     (a)  such Participant's Contributor Version directly or indirectly
     infringes any patent, then any and all rights granted by such
     Participant to You under Sections 2.1 and/or 2.2 of this License
     shall, upon 60 days notice from Participant terminate prospectively,
     unless if within 60 days after receipt of notice You either: (i)
     agree in writing to pay Participant a mutually agreeable reasonable
     royalty for Your past and future use of Modifications made by such
     Participant, or (ii) withdraw Your litigation claim with respect to
     the Contributor Version against such Participant.  If within 60 days
     of notice, a reasonable royalty and payment arrangement are not
     mutually agreed upon in writing by the parties or the litigation claim
     is not withdrawn, the rights granted by Participant to You under
     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
     the 60 day notice period specified above.

     (b)  any software, hardware, or device, other than such Participant's
     Contributor Version, directly or indirectly infringes any patent, then
     any rights granted to You by such Participant under Sections 2.1(b)
     and 2.2(b) are revoked effective as of the date You first made, used,
     sold, distributed, or had made, Modifications made by that
     Participant.

     8.3.  If You assert a patent infringement claim against Participant
     alleging that such Participant's Contributor Version directly or
     indirectly infringes any patent where such claim is resolved (such as
     by license or settlement) prior to the initiation of patent
     infringement litigation, then the reasonable value of the licenses
     granted by such Participant under Sections 2.1 or 2.2 shall be taken
     into account in determining the amount or value of any payment or
     license.

     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
     all end user license agreements (excluding distributors and resellers)
     which have been validly granted by You or any distributor hereunder
     prior to termination shall survive termination.

9. LIMITATION OF LIABILITY.

     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.

10. U.S. GOVERNMENT END USERS.

     The Covered Code is a "commercial item," as that term is defined in
     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
     software" and "commercial computer software documentation," as such
     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
     all U.S. Government End Users acquire Covered Code with only those
     rights set forth herein.

11. MISCELLANEOUS.

     This License represents the complete agreement concerning subject
     matter hereof. If any provision of this License is held to be
     unenforceable, such provision shall be reformed only to the extent
     necessary to make it enforceable. This License shall be governed by
     California law provisions (except to the extent applicable law, if
     any, provides otherwise), excluding its conflict-of-law provisions.
     With respect to disputes in which at least one party is a citizen of,
     or an entity chartered or registered to do business in the United
     States of America, any litigation relating to this License shall be
     subject to the jurisdiction of the Federal Courts of the Northern
     District of California, with venue lying in Santa Clara County,
     California, with the losing party responsible for costs, including
     without limitation, court costs and reasonable attorneys' fees and
     expenses. The application of the United Nations Convention on
     Contracts for the International Sale of Goods is expressly excluded.
     Any law or regulation which provides that the language of a contract
     shall be construed against the drafter shall not apply to this
     License.

12. RESPONSIBILITY FOR CLAIMS.

     As between Initial Developer and the Contributors, each party is
     responsible for claims and damages arising, directly or indirectly,
     out of its utilization of rights under this License and You agree to
     work with Initial Developer and Contributors to distribute such
     responsibility on an equitable basis. Nothing herein is intended or
     shall be deemed to constitute any admission of liability.

13. MULTIPLE-LICENSED CODE.

     Initial Developer may designate portions of the Covered Code as
     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
     Developer permits you to utilize portions of the Covered Code under
     Your choice of the NPL or the alternative licenses, if any, specified
     by the Initial Developer in the file described in Exhibit A.

EXHIBIT A -Mozilla Public License.

     ``The contents of this file are subject to the Mozilla Public License
     Version 1.1 (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.mozilla.org/MPL/

     Software distributed under the License is distributed on an "AS IS"
     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
     License for the specific language governing rights and limitations
     under the License.

     The Original Code is ______________________________________.

     The Initial Developer of the Original Code is ________________________.
     Portions created by ______________________ are Copyright (C) ______
     _______________________. All Rights Reserved.

     Contributor(s): ______________________________________.

     Alternatively, the contents of this file may be used under the terms
     of the _____ license (the  "[___] License"), in which case the
     provisions of [______] License are applicable instead of those
     above.  If you wish to allow use of your version of this file only
     under the terms of the [____] License and not to allow others to use
     your version of this file under the MPL, indicate your decision by
     deleting  the provisions above and replace  them with the notice and
     other provisions required by the [___] License.  If you do not delete
     the provisions above, a recipient may use your version of this file
     under either the MPL or the [___] License."

     [NOTE: The text of this Exhibit A may differ slightly from the text of
     the notices in the Source Code files of the Original Code. You should
     use the text of this Exhibit A rather than the text found in the
     Original Code Source Code for Your Modifications.]
 
==========================================================================================

For org.tartarus.snowball package:

   Snowball license (from http://snowball.tartarus.org/license.php):
   
     All the software given out on this Snowball site is covered by the BSD License 
     (see http://www.opensource.org/licenses/bsd-license.html ), 
     with Copyright (c) 2001, Dr Martin Porter, 
     and (for the Java developments) Copyright (c) 2002, Richard Boulton. 
     
Copyright (c) <YEAR>, <OWNER>
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted 
provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this list of conditions 
      and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice, this list of 
      conditions and the following disclaimer in the documentation and/or other materials provided 
      with the distribution.
    * Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to 
      endorse or promote products derived from this software without specific prior written 
      permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

==========================================================================================

APACHE TIKA SUBCOMPONENTS

Apache Tika includes a number of subcomponents with separate copyright notices
and license terms. Your use of these subcomponents is subject to the terms and
conditions of the following licenses.

MIME type information from file-4.26.tar.gz (http://www.darwinsys.com/file/)

    Copyright (c) Ian F. Darwin 1986, 1987, 1989, 1990, 1991, 1992, 1994, 1995.
    Software written by Ian F. Darwin and others;
    maintained 1994- Christos Zoulas.

    This software is not subject to any export provision of the United States
    Department of Commerce, and may be exported to any country or planet.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice immediately at the beginning of the file, without modification,
       this list of conditions, and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

Charset detection code from ICU4J (http://site.icu-project.org/)

    Copyright (c) 1995-2009 International Business Machines Corporation
    and others

    All rights reserved.

    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
    "Software"), to deal in the Software without restriction, including
    without limitation the rights to use, copy, modify, merge, publish,
    distribute, and/or sell copies of the Software, and to permit persons
    to whom the Software is furnished to do so, provided that the above
    copyright notice(s) and this permission notice appear in all copies
    of the Software and that both the above copyright notice(s) and this
    permission notice appear in supporting documentation.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
    BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
    OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
    WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
    ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
    SOFTWARE.

    Except as contained in this notice, the name of a copyright holder shall
    not be used in advertising or otherwise to promote the sale, use or other
    dealings in this Software without prior written authorization of the
    copyright holder. 

==============================================================================================


