                                 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.
===
   AsterixDB Hyracks includes source code with separate copyright notices
   and license terms. Your use of this source code is subject to the terms
   and condition of the following licenses.
===
   Portions of the test data for the Hyracks textserver examples
       located at:
         hyracks/hyracks-examples/text-example/textserver/data/file1.txt,
       and
         hyracks/hyracks-examples/text-example/textserver/data/file2.txt

   are available under the following license:
---
   THE FULL PROJECT GUTENBERG LICENSE

   PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK

   To protect the Project Gutenberg-tm mission of promoting the free distribution
   of electronic works, by using or distributing this work (or any other work
   associated in any way with the phrase "Project Gutenberg"), you agree to comply
   with all the terms of the Full Project Gutenberg-tm License available with this
   file or online at www.gutenberg.org/license.

   Section 1.
   General Terms of Use and Redistributing Project Gutenberg-tm electronic works

   1.A. By reading or using any part of this Project Gutenberg-tm
   electronic work, you indicate that you have read, understand, agree to and
   accept all the terms of this license and intellectual property
   (trademark/copyright) agreement. If you do not agree to abide by all the terms
   of this agreement, you must cease using and return or destroy all copies of
   Project Gutenberg-tm electronic works in your possession. If you paid a fee for
   obtaining a copy of or access to a Project Gutenberg-tm electronic work and you
   do not agree to be bound by the terms of this agreement, you may obtain a
   refund from the person or entity to whom you paid the fee as set forth in
   paragraph 1.E.8.

   1.B. "Project Gutenberg" is a registered trademark. It may only be used on or
   associated in any way with an electronic work by people who agree to be bound
   by the terms of this agreement. There are a few things that you can do with
   most Project Gutenberg-tm electronic works even without complying with the full
   terms of this agreement. See paragraph 1.C below. There are a lot of things you
   can do with Project Gutenberg-tm electronic works if you follow the terms of
   this agreement and help preserve free future access to Project Gutenberg-tm
   electronic works. See paragraph 1.E below.

   1.C. The Project Gutenberg Literary Archive Foundation ("the Foundation" or
   PGLAF), owns a compilation copyright in the collection of Project Gutenberg-tm
   electronic works. Nearly all the individual works in the collection are in the
   public domain in the United States. If an individual work is unprotected by
   copyright law in the United States and you are located in the United States, we
   do not claim a right to prevent you from copying, distributing, performing,
   displaying or creating derivative works based on the work as long as all
   references to Project Gutenberg are removed. Of course, we hope that you will
   support the Project Gutenberg-tm mission of promoting free access to electronic
   works by freely sharing Project Gutenberg-tm works in compliance with the terms
   of this agreement for keeping the Project Gutenberg-tm name associated with the
   work. You can easily comply with the terms of this agreement by keeping this
   work in the same format with its attached full Project Gutenberg-tm License
   when you share it without charge with others.

   [*] This particular work is one of the few individual works protected by
   copyright law in the United States and most of the remainder of the world,
   included in the Project Gutenberg collection with the permission of the
   copyright holder. Information on the copyright owner for this particular work
   and the terms of use imposed by the copyright holder on this work are set forth
   at the beginning of this work.

   1.D. The copyright laws of the place where you are located also govern what you
   can do with this work. Copyright laws in most countries are in a constant state
   of change. If you are outside the United States, check the laws of your country
   in addition to the terms of this agreement before downloading, copying,
   displaying, performing, distributing or creating derivative works based on this
   work or any other Project Gutenberg-tm work. The Foundation makes no
   representations concerning the copyright status of any work in any country
   outside the United States.

   1.E. Unless you have removed all references to Project Gutenberg:

   1.E.1. The following sentence, with active links to, or other immediate access
   to, the full Project Gutenberg-tm License must appear prominently whenever any
   copy of a Project Gutenberg-tm work (any work on which the phrase "Project
   Gutenberg" appears, or with which the phrase "Project Gutenberg" is associated)
   is accessed, displayed, performed, viewed, copied or distributed:

   This eBook is for the use of anyone anywhere in the United States and most
   other parts of the world at no cost and with almost no restrictions whatsoever.
   You may copy it, give it away or re-use it under the terms of the Project
   Gutenberg License included with this eBook or online at www.gutenberg.org. If
   you are not located in the United States, you'll have to check the laws of the
   country where you are located before using this ebook.

   1.E.2. If an individual Project Gutenberg-tm electronic work is derived from
   texts not protected by U.S. copyright law (does not contain a notice indicating
   that it is posted with permission of the copyright holder), the work can be
   copied and distributed to anyone in the United States without paying any fees
   or charges. If you are redistributing or providing access to a work with the
   phrase "Project Gutenberg" associated with or appearing on the work, you must
   comply either with the requirements of paragraphs 1.E.1 through 1.E.7 or obtain
   permission for the use of the work and the Project Gutenberg-tm trademark as
   set forth in paragraphs 1.E.8 or 1.E.9.

   1.E.3. If an individual Project Gutenberg-tm electronic work is posted with the
   permission of the copyright holder, your use and distribution must comply with
   both paragraphs 1.E.1 through 1.E.7 and any additional terms imposed by the
   copyright holder. Additional terms will be linked to the Project Gutenberg-tm
   License for all works posted with the permission of the copyright holder found
   at the beginning of this work.

   1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm License
   terms from this work, or any files containing a part of this work or any other
   work associated with Project Gutenberg-tm.

   1.E.5. Do not copy, display, perform, distribute or redistribute this
   electronic work, or any part of this electronic work, without prominently
   displaying the sentence set forth in paragraph 1.E.1 with active links or
   immediate access to the full terms of the Project Gutenberg-tm License.

   1.E.6. You may convert to and distribute this work in any binary, compressed,
   marked up, nonproprietary or proprietary form, including any word processing or
   hypertext form. However, if you provide access to or distribute copies of a
   Project Gutenberg-tm work in a format other than "Plain Vanilla ASCII" or other
   format used in the official version posted on the official Project Gutenberg-tm
   web site (www.gutenberg.org), you must, at no additional cost, fee or expense
   to the user, provide a copy, a means of exporting a copy, or a means of
   obtaining a copy upon request, of the work in its original "Plain Vanilla
   ASCII" or other form. Any alternate format must include the full Project
   Gutenberg-tm License as specified in paragraph 1.E.1.

   1.E.7. Do not charge a fee for access to, viewing, displaying, performing,
   copying or distributing any Project Gutenberg-tm works unless you comply with
   paragraph 1.E.8 or 1.E.9.

   1.E.8. You may charge a reasonable fee for copies of or providing access to or
   distributing Project Gutenberg-tm electronic works provided that

   You pay a royalty fee of 20% of the gross profits you derive from the use of
   Project Gutenberg-tm works calculated using the method you already use to
   calculate your applicable taxes. The fee is owed to the owner of the Project
   Gutenberg-tm trademark, but he has agreed to donate royalties under this
   paragraph to the Project Gutenberg Literary Archive Foundation. Royalty
   payments must be paid within 60 days following each date on which you prepare
   (or are legally required to prepare) your periodic tax returns. Royalty
   payments should be clearly marked as such and sent to the Project Gutenberg
   Literary Archive Foundation at the address specified in Section 4, "Information
   about donations to the Project Gutenberg Literary Archive Foundation." You
   provide a full refund of any money paid by a user who notifies you in writing
   (or by e-mail) within 30 days of receipt that s/he does not agree to the terms
   of the full Project Gutenberg-tm License. You must require such a user to
   return or destroy all copies of the works possessed in a physical medium and
   discontinue all use of and all access to other copies of Project Gutenberg-tm
   works.  You provide, in accordance with paragraph 1.F.3, a full refund of any
   money paid for a work or a replacement copy, if a defect in the electronic work
   is discovered and reported to you within 90 days of receipt of the work.  You
   comply with all other terms of this agreement for free distribution of Project
   Gutenberg-tm works.  1.E.9. If you wish to charge a fee or distribute a Project
   Gutenberg-tm electronic work or group of works on different terms than are set
   forth in this agreement, you must obtain permission in writing from both the
   Project Gutenberg Literary Archive Foundation and The Project Gutenberg
   Trademark LLC, the owner of the Project Gutenberg-tm trademark. Contact the
   Foundation as set forth in Section 3 below.

   1.F.

   1.F.1. Project Gutenberg volunteers and employees expend considerable effort to
   identify, do copyright research on, transcribe and proofread works not
   protected by U.S. copyright law in creating the Project Gutenberg-tm
   collection. Despite these efforts, Project Gutenberg-tm electronic works, and
   the medium on which they may be stored, may contain "Defects," such as, but not
   limited to, incomplete, inaccurate or corrupt data, transcription errors, a
   copyright or other intellectual property infringement, a defective or damaged
   disk or other medium, a computer virus, or computer codes that damage or cannot
   be read by your equipment.

   1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right of
   Replacement or Refund" described in paragraph 1.F.3, the Project Gutenberg
   Literary Archive Foundation, the owner of the Project Gutenberg-tm trademark,
   and any other party distributing a Project Gutenberg-tm electronic work under
   this agreement, disclaim all liability to you for damages, costs and expenses,
   including legal fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE,
   STRICT LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE
   PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE FOUNDATION, THE TRADEMARK
   OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE LIABLE TO YOU FOR
   ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR INCIDENTAL DAMAGES EVEN IF
   YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH DAMAGE.

   1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a defect in
   this electronic work within 90 days of receiving it, you can receive a refund
   of the money (if any) you paid for it by sending a written explanation to the
   person you received the work from. If you received the work on a physical
   medium, you must return the medium with your written explanation. The person or
   entity that provided you with the defective work may elect to provide a
   replacement copy in lieu of a refund. If you received the work electronically,
   the person or entity providing it to you may choose to give you a second
   opportunity to receive the work electronically in lieu of a refund. If the
   second copy is also defective, you may demand a refund in writing without
   further opportunities to fix the problem.

   1.F.4. Except for the limited right of replacement or refund set forth in
   paragraph 1.F.3, this work is provided to you 'AS-IS', WITH NO OTHER WARRANTIES
   OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR ANY PURPOSE.

   1.F.5. Some states do not allow disclaimers of certain implied warranties or
   the exclusion or limitation of certain types of damages. If any disclaimer or
   limitation set forth in this agreement violates the law of the state applicable
   to this agreement, the agreement shall be interpreted to make the maximum
   disclaimer or limitation permitted by the applicable state law. The invalidity
   or unenforceability of any provision of this agreement shall not void the
   remaining provisions.

   1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the
   trademark owner, any agent or employee of the Foundation, anyone providing
   copies of Project Gutenberg-tm electronic works in accordance with this
   agreement, and any volunteers associated with the production, promotion and
   distribution of Project Gutenberg-tm electronic works, harmless from all
   liability, costs and expenses, including legal fees, that arise directly or
   indirectly from any of the following which you do or cause to occur: (a)
   distribution of this or any Project Gutenberg-tm work, (b) alteration,
   modification, or additions or deletions to any Project Gutenberg-tm work, and
   (c) any Defect you cause.

   Section 2.
   Information about the Mission of Project Gutenberg-tm Project

   Gutenberg-tm is synonymous with the free distribution of electronic works in
   formats readable by the widest variety of computers including obsolete, old,
   middle-aged and new computers. It exists because of the efforts of hundreds of
   volunteers and donations from people in all walks of life.

   Volunteers and financial support to provide volunteers with the assistance they
   need are critical to reaching Project Gutenberg-tm's goals and ensuring that
   the Project Gutenberg-tm collection will remain freely available for
   generations to come. In 2001, the Project Gutenberg Literary Archive Foundation
   was created to provide a secure and permanent future for Project Gutenberg-tm
   and future generations. To learn more about the Project Gutenberg Literary
   Archive Foundation and how your efforts and donations can help, see Sections 3
   and 4 and the Foundation information page at www.gutenberg.org

   Section 3.
   Information about the Project Gutenberg Literary Archive Foundation

   The Project Gutenberg Literary Archive Foundation is a non profit 501(c)(3)
   educational corporation organized under the laws of the state of Mississippi
   and granted tax exempt status by the Internal Revenue Service. The Foundation's
   EIN or federal tax identification number is 64-6221541. Contributions to the
   Project Gutenberg Literary Archive Foundation are tax deductible to the full
   extent permitted by U.S. federal laws and your state's laws.

   The Foundation's principal office is located at 4557 Melan Dr. S. Fairbanks,
   AK, 99712., but its volunteers and employees are scattered throughout numerous
   locations. Its business office is located at 809 North 1500 West, Salt Lake
   City, UT 84116, (801) 596-1887. Email contact links and up to date contact
   information can be found at the Foundation's web site and official page at
   www.gutenberg.org/contact

   For additional contact information:
       Dr. Gregory B. Newby Chief Executive and Director
       gbnewby@pglaf.org

   Section 4.
   Information about Donations to the Project Gutenberg Literary Archive

   Foundation Project Gutenberg-tm depends upon and cannot survive without
   wide spread public support and donations to carry out its mission of
   increasing the number of public domain and licensed works that can be
   freely distributed in machine readable form accessible by the widest array
   of equipment including outdated equipment. Many small donations ($1 to
   $5,000) are particularly important to maintaining tax exempt status with
   the IRS.

   The Foundation is committed to complying with the laws regulating charities and
   charitable donations in all 50 states of the United States. Compliance
   requirements are not uniform and it takes a considerable effort, much paperwork
   and many fees to meet and keep up with these requirements. We do not solicit
   donations in locations where we have not received written confirmation of
   compliance. To SEND DONATIONS or determine the status of compliance for any
   particular state visit www.gutenberg.org/donate

   While we cannot and do not solicit contributions from states where we have not
   met the solicitation requirements, we know of no prohibition against accepting
   unsolicited donations from donors in such states who approach us with offers to
   donate.

   International donations are gratefully accepted, but we cannot make any
   statements concerning tax treatment of donations received from outside the
   United States. U.S. laws alone swamp our small staff.

   Please check the Project Gutenberg Web pages for current donation methods and
   addresses. Donations are accepted in a number of other ways including checks,
   online payments and credit card donations. To donate, please visit:
   www.gutenberg.org/donate

   Section 5.
   General Information About Project Gutenberg-tm electronic works.

   Professor Michael S. Hart was the originator of the Project Gutenberg-tm
   concept of a library of electronic works that could be freely shared with
   anyone. For forty years, he produced and distributed Project Gutenberg-tm
   eBooks with only a loose network of volunteer support.

   Project Gutenberg-tm eBooks are often created from several printed editions,
   all of which are confirmed as not protected by copyright in the U.S. unless a
   copyright notice is included. Thus, we do not necessarily keep eBooks in
   compliance with any particular paper edition.

   Most people start at our Web site which has the main PG search facility:
   www.gutenberg.org

   This Web site includes information about Project Gutenberg-tm, including how to
   make donations to the Project Gutenberg Literary Archive Foundation, how to
   help produce our new eBooks, and how to subscribe to our email newsletter to
   hear about new eBooks.
---
