ChakraCore uses third party material from the projects listed below.
The original copyright notice and the license under which Microsoft
received such third party material are set forth below. Microsoft
reserves all other rights not expressly granted, whether by
implication, estoppel or otherwise.

In the event that we accidentally failed to list a required notice, please
bring it to our attention. Post an issue or email us: chakracore@microsoft.com

THIRD-PARTY SOFTWARE NOTICES AND INFORMATION
Do Not Translate or Localize

ChakraCore incorporates third party material from the projects listed below.
The original copyright notice and the license under which Microsoft received
such third party material are set forth below. Microsoft reserves all other
rights not expressly granted, whether by implication, estoppel or otherwise.

1.   backbone.suggestions (https://github.com/qloo/backbone.suggestions)
2.   BeatDetektor.js
3.   Catch
4.   CRC.h
5.   deltablue.js
6.   Dojo Toolkit (https://dojotoolkit.org)
7.   DSP.js (https://github.com/corbanbrook/dsp.js/)
8.   ecma-proposal-object.getownpropertydescriptors (https://github.com/tc39/proposal-object-getownpropertydescriptors/)
9.   File copyright Microsoft and Geoff Norton
10.  File with code copyright Baron Schwartz (Sunspider/xparb.js)
11.  Files copyright .NET Foundation
12.  Files with code copyright Paul Johnston (http://pajhome.org.uk/)
13.  Intel VTune Amplifier XE (https://software.intel.com/en-us/intel-vtune-amplifier-xe)
14.  JavaScript GameBoy Color Emulator
15.  JetStream
16.  jQuery (https://github.com/jquery/jquery)
17.  Kraken (http://krakenbenchmark.mozilla.org)
18.  MakeNewWorld() function
19.  MochiKit (https://github.com/mochi/mochikit)
20.  Mozilla XML-RPC Client code
21.  Octane (https://github.com/chromium/octane)
22.  pdfjs.js (https://github.com/mozilla/pdf.js)
23.  Pixastic Lib (https://github.com/jseidelin/pixastic)
24.  Prototype (https://github.com/sstephenson/prototype)
25.  Sputnik  (https://github.com/fholm/IronJS/tree/master/Src/Tests/Sputnik/sputnik-v1)
26.  SunSpider
27.  test262 (https://github.com/tc39/test262)
28.  The Computer Language Shootout
29.  WebAssembly/testsuite (https://github.com/WebAssembly/testsuite)
30.  zlib-data.js
31.  yargs-parser.js (https://github.com/yargs/yargs-parser)
32.  camelcase.js (https://github.com/sindresorhus/camelcase)
33.  ARES-6 (https://github.com/WebKit/webkit/tree/master/PerformanceTests/ARES-6)

%% backbone.suggestions NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (c) 2011-2012 Michael Diolosa (@mbrio)

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, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

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. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
=========================================
END OF backbone.suggestions NOTICES, INFORMATION, AND LICENSE

%% BeatDetektor.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE
[PART OF KRAKEN TEST SUITE]
=========================================
 *  BeatDetektor.js
 *
 *  BeatDetektor - CubicFX Visualizer Beat Detection & Analysis Algorithm
 *  Javascript port by Charles J. Cliffe and Corban Brook
 *
 *  Created by Charles J. Cliffe on 09-11-30.
 *  Copyright 2009 Charles J. Cliffe. All rights reserved.
 *
 *  BeatDetektor is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Please note that only the Javascript version of BeatDetektor is licensed
 *  under the terms of LGPL version 3; ports of BeatDetektor or derivatives
 *  in other languages are licensed under the terms of GPL version 3.
 *
 *  BeatDetektor is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  Please contact cj@cubicproductions.com if you seek alternate
 *  licensing terms for your project.
 *
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies of this license
document, but changing it is not allowed. This version of the GNU Lesser General
Public License incorporates the terms and conditions of version 3 of the GNU
General Public License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, 'this License' refers to version 3 of the GNU Lesser General
Public License, and the 'GNU GPL' refers to version 3 of the GNU General Public License.
'The Library' refers to a covered work governed by this License, other than an
Application or a Combined Work as defined below.
An 'Application' is any work that makes use of an interface provided by the Library,
but which is not otherwise based on the Library. Defining a subclass of a class
defined by the Library is deemed a mode of using an interface provided by the Library.
A 'Combined Work' is a work produced by combining or linking an Application with
the Library. The particular version of the Library with which the Combined Work
was made is also called the 'Linked Version'.
The 'Minimal Corresponding Source' for a Combined Work means the Corresponding
Source for the Combined Work, excluding any source code for portions of the
Combined Work that, considered in isolation, are based on the Application,
and not on the Linked Version.
The 'Corresponding Application Code' for a Combined Work means the object code
and/or source code for the Application, including any data and utility programs
needed for reproducing the Combined Work from the Application, but excluding the
System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License without being
bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a facility refers
to a function or data to be supplied by an Application that uses the facility
(other than as an argument passed when the facility is invoked), then you may
convey a copy of the modified version:
a) under this License, provided that you make a good faith effort to ensure that,
in the event an Application does not supply the function or data, the facility
still operates, and performs whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of this License
applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from a header file
that is part of the Library. You may convey such object code under terms of your
choice, provided that, if the incorporated material is not limited to numerical
parameters, data structure layouts and accessors, or small macros, inline functions
and templates (ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the Library is used
in it and that the Library and its use are covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that, taken together,
effectively do not restrict modification of the portions of the Library contained
in the Combined Work and reverse engineering for debugging such modifications, if
you also do each of the following:
a) Give prominent notice with each copy of the Combined Work that the Library is
used in it and that the Library and its use are covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license document.
c) For a Combined Work that displays copyright notices during execution, include
the copyright notice for the Library among these notices, as well as a reference
directing the user to the copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this License, and
the Corresponding Application Code in a form suitable for, and under terms that
permit, the user to recombine or relink the Application with a modified version
of the Linked Version to produce a modified Combined Work, in the manner specified
by section 6 of the GNU GPL for conveying Corresponding Source.
1) Use a suitable shared library mechanism for linking with the Library. A suitable
mechanism is one that (a) uses at run time a copy of the Library already present
on the user's computer system, and (b) will operate properly with a modified
version of the Library that is interface-compatible with the Linked Version.
e) Provide Installation Information, but only if you would otherwise be required
to provide such information under section 6 of the GNU GPL, and only to the extent
that such information is necessary to install and execute a modified version of
the Combined Work produced by recombining or relinking the Application with a
modified version of the Linked Version. (If you use option 4d0, the Installation
Information must accompany the Minimal Corresponding Source and Corresponding
Application Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the Library side by
side in a single library together with other library facilities that are not
Applications and are not covered by this License, and convey such a combined
library under terms of your choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based on the
Library, uncombined with any other library facilities, conveyed under the terms
of this License.
b) Give prominent notice with the combined library that part of it is a work
based on the Library, and explaining where to find the accompanying uncombined
form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions of the GNU
Lesser General Public License from time to time. Such new versions will be similar
in spirit to the present version, but may differ in detail to address new problems
or concerns. Each version is given a distinguishing version number. If the Library
as you received it specifies that a certain numbered version of the GNU Lesser
General Public License 'or any later version' applies to it, you have the option
of following the terms and conditions either of that published version or of any
later version published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser General Public
License, you may choose any version of the GNU Lesser General Public License
ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide whether
future versions of the GNU Lesser General Public License shall apply, that
proxy's public statement of acceptance of any version is permanent authorization
for you to choose that version for the Library.
=========================================
END OF BeatDetektor.js NOTICES, INFORMATION, AND LICENSE

%% Catch  NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
For Catch:

Catch

Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.

Boost Software License - Version 1.0 - August 17th, 2003

Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:

The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.

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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

For code from cocoawithlove.com:

Copyright © 2008-2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved.

Permission to use, copy, modify, and/or distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright notice
and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED 'AS IS' AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 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.

For code from developer.apple.com:

Ownership of Site; Agreement to Terms of Use
These Terms and Conditions of Use (the 'Terms of Use') apply to the Apple web
site located at www.apple.com, and all associated sites linked to www.apple.com
by Apple, its subsidiaries and affiliates, including Apple sites around the world
(collectively, the 'Site'). The Site is the property of Apple Inc. ('Apple') and
its licensors. BY USING THE SITE, YOU AGREE TO THESE TERMS OF USE; IF YOU DO NOT
AGREE, DO NOT USE THE SITE.

Apple reserves the right, at its sole discretion, to change, modify, add or remove
portions of these Terms of Use, at any time. It is your responsibility to check
these Terms of Use periodically for changes. Your continued use of the Site following
the posting of changes will mean that you accept and agree to the changes. As long
as you comply with these Terms of Use, Apple grants you a personal, non-exclusive,
non-transferable, limited privilege to enter and use the Site.

Content
All text, graphics, user interfaces, visual interfaces, photographs, trademarks,
logos, sounds, music, artwork and computer code (collectively, 'Content'),
including but not limited to the design, structure, selection, coordination,
expression, 'look and feel' and arrangement of such Content, contained on the
Site is owned, controlled or licensed by or to Apple, and is protected by trade
dress, copyright, patent and trademark laws, and various other intellectual
property rights and unfair competition laws.

Except as expressly provided in these Terms of Use, no part of the Site and no
Content may be copied, reproduced, republished, uploaded, posted, publicly displayed,
encoded, translated, transmitted or distributed in any way (including 'mirroring')
to any other computer, server, Web site or other medium for publication or
distribution or for any commercial enterprise, without Appleís express prior written
consent.

You may use information on Apple products and services (such as data sheets,
knowledge base articles, and similar materials) purposely made available by Apple
for downloading from the Site, provided that you (1) not remove any proprietary
notice language in all copies of such documents, (2) use such information only
for your personal, non-commercial informational purpose and do not copy or post
such information on any networked computer or broadcast it in any media, (3)
make no modifications to any such information, and (4) not make any additional
representations or warranties relating to such documents.

Your Use of the Site
You may not use any 'deep-link', 'page-scrape', 'robot', 'spider' or other
automatic device, program, algorithm or methodology, or any similar or equivalent
manual process, to access, acquire, copy or monitor any portion of the Site or
any Content, or in any way reproduce or circumvent the navigational structure or
presentation of the Site or any Content, to obtain or attempt to obtain any
materials, documents or information through any means not purposely made available
through the Site. Apple reserves the right to bar any such activity.

You may not attempt to gain unauthorized access to any portion or feature of the
Site, or any other systems or networks connected to the Site or to any Apple
server, or to any of the services offered on or through the Site, by hacking,
password 'mining' or any other illegitimate means.

You may not probe, scan or test the vulnerability of the Site or any network
connected to the Site, nor breach the security or authentication measures on
the Site or any network connected to the Site. You may not reverse look-up,
trace or seek to trace any information on any other user of or visitor to the
Site, or any other customer of Apple, including any Apple account not owned by
you, to its source, or exploit the Site or any service or information made
available or offered by or through the Site, in any way where the purpose is
to reveal any information, including but not limited to personal identification
or information, other than your own information, as provided for by the Site.

You agree that you will not take any action that imposes an unreasonable or
disproportionately large load on the infrastructure of the Site or Apple's
systems or networks, or any systems or networks connected to the Site or to Apple.

You agree not to use any device, software or routine to interfere or attempt
to interfere with the proper working of the Site or any transaction being
conducted on the Site, or with any other personís use of the Site.

You may not forge headers or otherwise manipulate identifiers in order to disguise
the origin of any message or transmittal you send to Apple on or through the Site
or any service offered on or through the Site. You may not pretend that you are,
or that you represent, someone else, or impersonate any other individual or entity.

You may not use the Site or any Content for any purpose that is unlawful or
prohibited by these Terms of Use, or to solicit the performance of any illegal
activity or other activity which infringes the rights of Apple or others.

Purchases; Other Terms and Conditions
Additional terms and conditions may apply to purchases of goods or services and
to specific portions or features of the Site, including contests, promotions or
other similar features, all of which terms are made a part of these Terms of Use
by this reference. You agree to abide by such other terms and conditions,
including where applicable representing that you are of sufficient legal age to
use or participate in such service or feature. If there is a conflict between
these Terms of Use and the terms posted for or applicable to a specific portion
of the Site or for any service offered on or through the Site, the latter terms
shall control with respect to your use of that portion of the Site or the specific service.

Apple's obligations, if any, with regard to its products and services are governed
solely by the agreements pursuant to which they are provided, and nothing on this
Site should be construed to alter such agreements.

Apple may make changes to any products or services offered on the Site, or to the
applicable prices for any such products or services, at any time, without notice.
The materials on the Site with respect to products and services may be out of date,
and Apple makes no commitment to update the materials on the Site with respect to
such products and services.

The following terms also govern and apply to your use of the Site, and they are
incorporated herein by this reference:

Guidelines for Using Apple Trademarks & Copyrights
Rights & Permissions
Trademarks
Claims of Copyright Infringement
Piracy
Counterfeit Products
Apple's Unsolicited Idea Submission Policy
Software License Information
Legal Contacts
Each of these policies may be changed from time to time and are effective
immediately upon posting such changes on the Site.

Accounts, Passwords and Security
Certain features or services offered on or through the Site may require you to
open an account (including setting up an Apple ID and password). You are entirely
responsible for maintaining the confidentiality of the information you hold for
your account, including your password, and for any and all activity that occurs
under your account as a result of your failing to keep this information secure
and confidential. You agree to notify Apple immediately of any unauthorized use
of your account or password, or any other breach of security. You may be held
liable for losses incurred by Apple or any other user of or visitor to the Site
due to someone else using your Apple ID, password or account as a result of your
failing to keep your account information secure and confidential.

You may not use anyone elseís Apple ID, password or account at any time without
the express permission and consent of the holder of that Apple ID, password or
account. Apple cannot and will not be liable for any loss or damage arising
from your failure to comply with these obligations.

Privacy
Appleís Privacy Policy applies to use of this Site, and its terms are made a part
of these Terms of Use by this reference. To view Appleís Privacy Policy, click
here. Additionally, by using the Site, you acknowledge and agree that Internet
transmissions are never completely private or secure. You understand that any
message or information you send to the Site may be read or intercepted by others,
even if there is a special notice that a particular transmission (for example,
credit card information) is encrypted.

Links to Other Sites and to the Apple Site
This Site may contain links to other independent third-party Web sites ('Linked
Sites'). These Linked Sites are provided solely as a convenience to our visitors.
Such Linked Sites are not under Appleís control, and Apple is not responsible
for and does not endorse the content of such Linked Sites, including any information
or materials contained on such Linked Sites. You will need to make your own
independent judgment regarding your interaction with these Linked Sites.

Disclaimers
APPLE DOES NOT PROMISE THAT THE SITE OR ANY CONTENT, SERVICE OR FEATURE OF THE
SITE WILL BE ERROR-FREE OR UNINTERRUPTED, OR THAT ANY DEFECTS WILL BE CORRECTED,
OR THAT YOUR USE OF THE SITE WILL PROVIDE SPECIFIC RESULTS. THE SITE AND ITS CONTENT
ARE DELIVERED ON AN 'AS-IS' AND 'AS-AVAILABLE' BASIS. ALL INFORMATION PROVIDED ON
THE SITE IS SUBJECT TO CHANGE WITHOUT NOTICE. APPLE CANNOT ENSURE THAT ANY FILES
OR OTHER DATA YOU DOWNLOAD FROM THE SITE WILL BE FREE OF VIRUSES OR CONTAMINATION
OR DESTRUCTIVE FEATURES. APPLE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
INCLUDING ANY WARRANTIES OF ACCURACY, NON-INFRINGEMENT, MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE. APPLE DISCLAIMS ANY AND ALL LIABILITY FOR THE
ACTS, OMISSIONS AND CONDUCT OF ANY THIRD PARTIES IN CONNECTION WITH OR RELATED
TO YOUR USE OF THE SITE AND/OR ANY APPLE SERVICES. YOU ASSUME TOTAL RESPONSIBILITY
FOR YOUR USE OF THE SITE AND ANY LINKED SITES. YOUR SOLE REMEDY AGAINST APPLE FOR
DISSATISFACTION WITH THE SITE OR ANY CONTENT IS TO STOP USING THE SITE OR ANY SUCH
CONTENT. THIS LIMITATION OF RELIEF IS A PART OF THE BARGAIN BETWEEN THE PARTIES.

The above disclaimer applies to any damages, liability or injuries caused by any
failure of performance, error, omission, interruption, deletion, defect, delay in
operation or transmission, computer virus, communication line failure, theft or
destruction of or unauthorized access to, alteration of, or use, whether for breach
of contract, tort, negligence or any other cause of action.

Apple reserves the right to do any of the following, at any time, without notice:
(1) to modify, suspend or terminate operation of or access to the Site, or any
portion of the Site, for any reason; (2) to modify or change the Site, or any
portion of the Site, and any applicable policies or terms; and (3) to interrupt
the operation of the Site, or any portion of the Site, as necessary to perform
routine or non-routine maintenance, error correction, or other changes.

Limitation of Liability
Except where prohibited by law, in no event will Apple be liable to you for any
indirect, consequential, exemplary, incidental or punitive damages, including
lost profits, even if Apple has been advised of the possibility of such damages.

If, notwithstanding the other provisions of these Terms of Use, Apple is found
to be liable to you for any damage or loss which arises out of or is in any way
connected with your use of the Site or any Content, Appleís liability shall in
no event exceed the greater of (1) the total of any subscription or similar fees
with respect to any service or feature of or on the Site paid in the six months
prior to the date of the initial claim made against Apple (but not including the
purchase price for any Apple hardware or software products or any AppleCare or
similar support program), or (2) US$100.00. Some jurisdictions do not allow
limitations of liability, so the foregoing limitation may not apply to you.

Indemnity
You agree to indemnify and hold Apple, its officers, directors, shareholders,
predecessors, successors in interest, employees, agents, subsidiaries and affiliates,
harmless from any demands, loss, liability, claims or expenses (including attorneys'
fees), made against Apple by any third party due to or arising out of or in
connection with your use of the Site.

Violation of These Terms of Use
Apple may disclose any information we have about you (including your identity)
if we determine that such disclosure is necessary in connection with any
investigation or complaint regarding your use of the Site, or to identify, contact
or bring legal action against someone who may be causing injury to or interference
with (either intentionally or unintentionally) Appleís rights or property, or the
rights or property of visitors to or users of the Site, including Apple's
customers. Apple reserves the right at all times to disclose any information that
Apple deems necessary to comply with any applicable law, regulation, legal process
or governmental request. Apple also may disclose your information when Apple
determines that applicable law requires or permits such disclosure, including
exchanging information with other companies and organizations for fraud protection
purposes.

You acknowledge and agree that Apple may preserve any transmittal or communication
by you with Apple through the Site or any service offered on or through the Site,
and may also disclose such data if required to do so by law or Apple determines
that such preservation or disclosure is reasonably necessary to (1) comply with
legal process, (2) enforce these Terms of Use, (3) respond to claims that any
such data violates the rights of others, or (4) protect the rights, property or
personal safety of Apple, its employees, users of or visitors to the Site, and
the public.

You agree that Apple may, in its sole discretion and without prior notice,
terminate your access to the Site and/or block your future access to the Site
if we determine that you have violated these Terms of Use or other agreements
or guidelines which may be associated with your use of the Site. You also agree
that any violation by you of these Terms of Use will constitute an unlawful and
unfair business practice, and will cause irreparable harm to Apple, for which
monetary damages would be inadequate, and you consent to Apple obtaining any
injunctive or equitable relief that Apple deems necessary or appropriate in
such circumstances. These remedies are in addition to any other remedies Apple
may have at law or in equity.

You agree that Apple may, in its sole discretion and without prior notice,
terminate your access to the Site, for cause, which includes (but is not limited
to) (1) requests by law enforcement or other government agencies, (2) a request
by you (self-initiated account deletions), (3) discontinuance or material
modification of the Site or any service offered on or through the Site, or (4)
unexpected technical issues or problems.

If Apple does take any legal action against you as a result of your violation of
these Terms of Use, Apple will be entitled to recover from you, and you agree to
pay, all reasonable attorneysí fees and costs of such action, in addition to any
other relief granted to Apple. You agree that Apple will not be liable to you or
to any third party for termination of your access to the Site as a result of any
violation of these Terms of Use.

Governing Law; Dispute Resolution
You agree that all matters relating to your access to or use of the Site,
including all disputes, will be governed by the laws of the United States and by
the laws of the State of California without regard to its conflicts of laws
provisions. You agree to the personal jurisdiction by and venue in the state and
federal courts in Santa Clara County, California, and waive any objection to such
jurisdiction or venue. The preceding provision regarding venue does not apply if
you are a consumer based in the European Union. If you are a consumer based in
the European Union, you may make a claim in the courts of the country where you
reside. Any claim under these Terms of Use must be brought within one (1) year
after the cause of action arises, or such claim or cause of action is barred.
Claims made under the separate terms and conditions of purchase for goods and
services are not subject to this limitation. No recovery may be sought or
received for damages other than out-of-pocket expenses, except that the
prevailing party will be entitled to costs and attorneysí fees. In the event of
any controversy or dispute between Apple and you arising out of or in connection
with your use of the Site, the parties shall attempt, promptly and in good faith,
to resolve any such dispute. If we are unable to resolve any such dispute within
a reasonable time (not to exceed thirty (30) days), then either party may submit
such controversy or dispute to mediation. If the dispute cannot be resolved
through mediation, then the parties shall be free to pursue any right or remedy
available to them under applicable law.

Void Where Prohibited
Apple administers and operates the www.apple.com Site from its location in Cupertino,
California USA; other Apple sites may be administered and operated from various
locations outside the United States. Although the Site is accessible worldwide,
not all features, products or services discussed, referenced, provided or offered
through or on the Site are available to all persons or in all geographic locations,
or appropriate or available for use outside the United States. Apple reserves the
right to limit, in its sole discretion, the provision and quantity of any feature,
product or service to any person or geographic area. Any offer for any feature,
product or service made on the Site is void where prohibited. If you choose to
access the Site from outside the United States, you do so on your own initiative
and you are solely responsible for complying with applicable local laws.

Miscellaneous
You may not use or export or re-export any Content or any copy or adaptation of
such Content, or any product or service offered on the Site, in violation of any
applicable laws or regulations, including without limitation United States export
laws and regulations.

If any of the provisions of these Terms of Use are held by a court or other
tribunal of competent jurisdiction to be void or unenforceable, such provisions
shall be limited or eliminated to the minimum extent necessary and replaced with
a valid provision that best embodies the intent of these Terms of Use, so that
these Terms of Use shall remain in full force and effect. These Terms of Use
constitute the entire agreement between you and Apple with regard to your use of
the Site, and any and all other written or oral agreements or understandings
previously existing between you and Apple with respect to such use are hereby
superseded and cancelled. Other than as provided in a purchase agreement you
enter into with Apple, Apple will not accept any counter-offers to these Terms
of Use, and all such offers are hereby categorically rejected. Appleís failure
to insist on or enforce strict performance of these Terms of Use shall not be
construed as a waiver by Apple of any provision or any right it has to enforce
these Terms of Use, nor shall any course of conduct between Apple and you or
any other party be deemed to modify any provision of these Terms of Use. These
Terms of Use shall not be interpreted or construed to confer any rights or
remedies on any third parties.

Apple provides access to Apple international data and, therefore, may contain
references or cross references to Apple products, programs and services that
are not announced in your country. Such reference does not imply that Apple in
your country intends to announce such products, programs or services.

Feedback and Information
Any feedback you provide at this site shall be deemed to be non-confidential.
Apple shall be free to use such information on an unrestricted basis.

The information contained in this web site is subject to change without notice.
Copyright © 1997-2009 Apple Inc. All rights reserved.
Apple Inc., 1 Infinite Loop, Cupertino, CA 95014, USA.

Updated by The Apple Legal Team on Nov. 20, 2009

=========================================
END OF Catch  NOTICES, INFORMATION, AND LICENSE

%% CRC.h NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or code or tables
extracted from it, as desired without restriction.
=========================================
END OF CRC.h NOTICES, INFORMATION, AND LICENSE

%% deltablue.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE
[PART OF OCTANE BENCHMARK]
=========================================
/////////////////////////////////////////////////////////////
// deltablue.js
/////////////////////////////////////////////////////////////

// Copyright 2008 the V8 project authors. All rights reserved.
// Copyright 1996 John Maloney and Mario Wolczko.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

// This implementation of the DeltaBlue benchmark is derived
// from the Smalltalk implementation by John Maloney and Mario
// Wolczko. Some parts have been translated directly, whereas
// others have been modified more aggresively to make it feel
// more like a JavaScript program.

GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your freedom to share
and change it. By contrast, the GNU General Public License is intended to guarantee
your freedom to share and change free software--to make sure the software is free
for all its users. This General Public License applies to most of the Free
Software Foundation's software and to any other program whose authors commit
to using it. (Some other Free Software Foundation software is covered by the GNU
Lesser General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General
Public Licenses are designed to make sure that you have the freedom to distribute
copies of free software (and charge for this service if you wish), that you receive
source code or can get it if you want it, that you can change the software or
use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny
you these rights or to ask you to surrender the rights. These restrictions
translate to certain responsibilities for you if you distribute copies of the
software, or if you modify it. For example, if you distribute copies of such a
program, whether gratis or for a fee, you must give the recipients all the rights
that you have. You must make sure that they, too, receive or can get the source
code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer
you this license which gives you legal permission to copy, distribute and/or
modify the software.
Also, for each author's protection and ours, we want to make certain that
everyone understands that there is no warranty for this free software. If the
software is modified by someone else and passed on, we want its recipients to
know that what they have is not the original, so that any problems introduced
by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish
to avoid the danger that redistributors of a free program will individually
obtain patent licenses, in effect making the program proprietary. To prevent
this, we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains a notice
placed by the copyright holder saying it may be distributed under the terms
of this General Public License. The "Program", below, refers to any such program
or work, and a "work based on the Program" means either the Program or any
derivative work under copyright law: that is to say, a work containing the
Program or a portion of it, either verbatim or with modifications and/or translated
into another language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not covered by
this License; they are outside its scope. The act of running the Program is not
restricted, and the output from the Program is covered only if its contents
constitute a work based on the Program (independent of having been made by running
the Program). Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's source code as
you receive it, in any medium, provided that you conspicuously and appropriately
publish on each copy an appropriate copyright notice and disclaimer of warranty;
keep intact all the notices that refer to this License and to the absence of any
warranty; and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at
your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of it, thus
forming a work based on the Program, and copy and distribute such modifications
or work under the terms of Section 1 above, provided that you also meet all of
these conditions:

a) You must cause the modified files to carry prominent notices stating that
you changed the files and the date of any change.

b) You must cause any work that you distribute or publish, that in whole or in
part contains or is derived from the Program or any part thereof, to be licensed
as a whole at no charge to all third parties under the terms of this License.

c) If the modified program normally reads commands interactively when run, you
must cause it, when started running for such interactive use in the most ordinary
way, to print or display an announcement including an appropriate copyright notice
and a notice that there is no warranty (or else, saying that you provide a
warranty) and that users may redistribute the program under these conditions,
and telling the user how to view a copy of this License. (Exception: if the
Program itself is interactive but does not normally print such an announcement,
your work based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If identifiable sections
of that work are not derived from the Program, and can be reasonably considered
independent and separate works in themselves, then this License, and its terms,
do not apply to those sections when you distribute them as separate works. But
when you distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of this
License, whose permissions for other licensees extend to the entire whole, and
thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights
to work written entirely by you; rather, the intent is to exercise the right to
control the distribution of derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the Program with the
Program (or with a work based on the Program) on a volume of a storage or
distribution medium does not bring the other work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it, under
Section 2) in object code or executable form under the terms of Sections 1 and 2
above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code,
which must be distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,

b) Accompany it with a written offer, valid for at least three years, to give
any third party, for a charge no more than your cost of physically performing
source distribution, a complete machine-readable copy of the corresponding
source code, to be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange; or,

c) Accompany it with the information you received as to the offer to distribute
corresponding source code. (This alternative is allowed only for noncommercial
distribution and only if you received the program in object code or executable
form with such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for making
modifications to it. For an executable work, complete source code means all
the source code for all modules it contains, plus any associated interface
definition files, plus the scripts used to control compilation and installation
of the executable. However, as a special exception, the source code distributed
need not include anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the operating
system on which the executable runs, unless that component itself accompanies the
executable. If distribution of executable or object code is made by offering access
to copy from a designated place, then offering equivalent access to copy the source
code from the same place counts as distribution of the source code, even though
third parties are not compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program except as
expressly provided under this License. Any attempt otherwise to copy, modify,
sublicense or distribute the Program is void, and will automatically terminate
your rights under this License. However, parties who have received copies, or
rights, from you under this License will not have their licenses terminated so
long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not signed it.
However, nothing else grants you permission to modify or distribute the Program
or its derivative works. These actions are prohibited by law if you do not
accept this License. Therefore, by modifying or distributing the Program (or any
work based on the Program), you indicate your acceptance of this License to do so,
and all its terms and conditions for copying, distributing or modifying the Program
or works based on it.
6. Each time you redistribute the Program (or any work based on the Program), the
recipient automatically receives a license from the original licensor to copy,
distribute or modify the Program subject to these terms and conditions. You may
not impose any further restrictions on the recipients' exercise of the rights
granted herein. You are not responsible for enforcing compliance by third parties
to this License.
7. If, as a consequence of a court judgment or allegation of patent infringement
or for any other reason (not limited to patent issues), conditions are imposed
on you (whether by court order, agreement or otherwise) that contradict the
conditions of this License, they do not excuse you from the conditions of this
License. If you cannot distribute so as to satisfy simultaneously your obligations
under this License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent license would not
permit royalty-free redistribution of the Program by all those who receive copies
directly or indirectly through you, then the only way you could satisfy both it
and this License would be to refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular
circumstance, the balance of the section is intended to apply and the section as
a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or
other property right claims or to contest validity of any such claims; this
section has the sole purpose of protecting the integrity of the free software
distribution system, which is implemented by public license practices. Many
people have made generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that system; it is
up to the author/donor to decide if he or she is willing to distribute software
through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a
consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in certain countries
either by patents or by copyrighted interfaces, the original copyright holder who
places the Program under this License may add an explicit geographical distribution
limitation excluding those countries, so that distribution is permitted only in or
among countries not thus excluded. In such case, this License incorporates the
limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions of the
General Public License from time to time. Such new versions will be similar in
spirit to the present version, but may differ in detail to address new problems
or concerns.
Each version is given a distinguishing version number. If the Program specifies
a version number of this License which applies to it and "any later version",
you have the option of following the terms and conditions either of that version
or of any later version published by the Free Software Foundation. If the Program
does not specify a version number of this License, you may choose any version ever
published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free programs whose
distribution conditions are different, write to the author to ask for permission.
For software which is copyrighted by the Free Software Foundation, write to the
Free Software Foundation; we sometimes make exceptions for this. Our decision
will be guided by the two goals of preserving the free status of all derivatives
of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE
PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED
IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
SERVICING, REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY
TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE
OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
=========================================
END OF deltablue.js NOTICES, INFORMATION, AND LICENSE

%% Dojo Toolkit NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (c) 2005-2015, The Dojo Foundation 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 Dojo Foundation 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 OWNER 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.
=========================================
END OF Dojo Toolkit NOTICES, INFORMATION, AND LICENSE

%% DSP.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
For DSP.js:

Copyright (c) 2010 Corban Brook

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, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

For Locutus:

Copyright (c) 2007-2016 Kevin van Zonneveld (http://kvz.io)
and Contributors (http://locutus.io/authors)

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, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

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. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
=========================================
END OF DSP.js NOTICES, INFORMATION, AND LICENSE

%% ecma-proposal-object.getownpropertydescriptors NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (c) 2016, Andrea Giammarchi
All rights reserved.

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, 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 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 OWNER 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.

The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
=========================================
END OF ecma-proposal-object.getownpropertydescriptors NOTICES, INFORMATION, AND LICENSE

%% File copyright Microsoft and Geoff Norton NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (c) Microsoft
Copyright (c) Geoff Norton

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, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

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. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE."
=========================================
END OF File copyright Microsoft and Geoff Norton NOTICES, INFORMATION, AND LICENSE

%% File with code copyright Baron Schwartz NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Includes code prefaced by the following notice:

/*
 * Copyright (C) 2004 Baron Schwartz <baron at sequent dot org>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by the
 * Free Software Foundation, version 2.1.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
 * details.
 */
=========================================
END OF File with code copyright Baron Schwartz NOTICES, INFORMATION, AND LICENSE

%% Files copyright .NET Foundation NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (c) .NET Foundation

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, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

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. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE."
=========================================
END OF Files copyright .NET Foundation NOTICES, INFORMATION, AND LICENSE

%% Files with code copyright Paul Johnston NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
For overall Paul Johnson material:

Copyright (c) 1998 - 2009, Paul Johnston & Contributors
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 author 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 OWNER 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.

For RSA MD5 implementation:

License to copy and use this software is granted provided that it is identified
as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing this software or this function.

License is also granted to make and use derivative works provided that such works
are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing the derived work.

RSA Data Security, Inc. makes no representations concerning either the merchantability
of this software or the suitability of this software for any particular purpose.
It is provided "as is" without express or implied warranty of any kind.

These notices must be retained in any copies of any part of this documentation and/or software.

This copyright does not prohibit distribution of the JavaScript MD5 code under the BSD license.
=========================================
END OF Files with code copyright Paul Johnston NOTICES, INFORMATION, AND LICENSE

%% Intel VTune Amplifier XE NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
/*
  BSD LICENSE
  Copyright (c) 2005-2013 Intel Corporation. All rights reserved.
  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 Intel Corporation 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
  OWNER 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.
*/
=========================================
END OF Intel VTune Amplifier XE NOTICES, INFORMATION, AND LICENSE

%% JavaScript GameBoy Color Emulator NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
// Copyright (C) 2010 - 2012 Grant Galitz
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
// The full license is available at http://www.gnu.org/licenses/gpl.html
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.

// The code has been adapted for use as a benchmark by Google.

and

/*
 * JavaScript GameBoy Color Emulator
 * Copyright (C) 2010 - 2012 Grant Galitz
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 * The full license is available at http://www.gnu.org/licenses/gpl.html
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 */
=========================================
END OF JavaScript GameBoy Color Emulator NOTICES, INFORMATION, AND LICENSE

%% JetStream NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
JetStream - LLVM Release License
==============================================================================
University of Illinois/NCSA
Open Source License

Copyright (c) 2003, 2004, 2005 University of Illinois at Urbana-Champaign.
All rights reserved.

Developed by:

    LLVM Team

    University of Illinois at Urbana-Champaign

    http://llvm.org/

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal with
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimers.

    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimers in the
      documentation and/or other materials provided with the distribution.

    * Neither the names of the LLVM Team, University of Illinois at
      Urbana-Champaign, nor the names of its contributors may be used to
      endorse or promote products derived from this Software without specific
      prior written permission.

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.  IN NO EVENT SHALL THE
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.

===

Anything not in the tests/ directory:

        Copyright (C) 2014 Apple Inc. All rights reserved.

        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, 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 APPLE INC. ``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 APPLE INC. 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.
=========================================
END OF JetStream NOTICES, INFORMATION, AND LICENSE

%% jQuery NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright jQuery Foundation and other contributors, https://jquery.org/

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery

The following license applies to all parts of this software except as
documented below:

====

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, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
=========================================
END OF jQuery NOTICES, INFORMATION, AND LICENSE

%% Kraken NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (C) 2007 Apple Inc. All rights reserved.
Copyright (C) 2010 Mozilla Foundation

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, 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
=========================================
END OF Kraken NOTICES, INFORMATION, AND LICENSE

%% MakeNewWorld() function NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
// Copyright 2013 the V8 project authors. All rights reserved.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
=========================================
END OF MakeNewWorld() function NOTICES, INFORMATION, AND LICENSE

%% MochiKit NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (c) 2005 Bob Ippolito.  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, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is furnished to do so, subject
to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
=========================================
END OF MochiKit NOTICES, INFORMATION, AND LICENSE

%% Mozilla XML-RPC Client code NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * 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 Mozilla XML-RPC Client component.
 *
 * The Initial Developer of the Original Code is
 * Digital Creations 2, Inc.
 * Portions created by the Initial Developer are Copyright (C) 2000
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   Martijn Pieters <mj@digicool.com> (original author)
 *   Samuel Sieb <samuel@sieb.net>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */
=========================================
END OF Mozilla XML-RPC Client code NOTICES, INFORMATION, AND LICENSE

%% Octane NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (c) 2013, the V8 project authors (http://code.google.com/p/v8/)
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 Google, Inc. 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.
=========================================
END OF Octane NOTICES, INFORMATION, AND LICENSE

%% pdfjs.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
////////////////////////////////////////////////////////////////////////////////
// pdfjs.js
////////////////////////////////////////////////////////////////////////////////

// Portions copyright 2012 Google, Inc.
// Portions copyright 2011 Mozilla Foundation. All rights reserved.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

// The PDF-JS code in this file has been written by Mozilla.
// It is available in its latest version from:
//
//   https://github.com/mozilla/pdf.js

=========================================
END OF pdfjs.js NOTICES, INFORMATION, AND LICENSE

%% Pixastic Lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
 * Pixastic Lib - Desaturation filter - v0.1.1
 * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/
 * License: [http://www.pixastic.com/lib/license.txt] (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:
Any addition to or deletion from the contents of a file containing Original Code
or previous Modifications. 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:
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
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).
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.
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 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
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).
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.
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
Sections 3.1, 3.2, 3.3, 3.4 and 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:
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. 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 MPL or the alternative licenses, if
any, specified by the Initial Developer in the file described in Exhibit A.
=========================================
END OF Pixastic Lib NOTICES, INFORMATION, AND LICENSE

%% Prototype NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (c) 2005-2010 Sam Stephenson

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, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

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. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
=========================================
END OF Prototype NOTICES, INFORMATION, AND LICENSE

%% Sputnik  NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright 2009, Google Inc. 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 Google Inc. 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
OWNER 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.
=========================================
END OF Sputnik  NOTICES, INFORMATION, AND LICENSE

%% SunSpider NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
SunSpider

Copyright (C) 2007 Apple Inc. All rights reserved.

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, 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 APPLE INC. ``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 APPLE COMPUTER, INC. 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.
=========================================
END OF SunSpider NOTICES, INFORMATION, AND LICENSE

%% test262 NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
The << Software identified by reference to the Ecma Standard* ("Software)">>  is
protected by copyright and is being made available under the  "BSD License",
included below. This Software may be subject to third party rights (rights from
parties other than Ecma International), including patent rights, and no licenses
under such third party rights are granted under this license even if the third
party concerned is a member of Ecma International.  SEE THE ECMA CODE OF CONDUCT
IN PATENT MATTERS AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR
INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO
IMPLEMENT ECMA INTERNATIONAL STANDARDS*.

Copyright (C) 2012-2013 Ecma International
All rights reserved.

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, 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.
3.   Neither the name of the authors nor Ecma International may be used to endorse
     or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "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 ECMA INTERNATIONAL 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.

* Ecma International Standards hereafter means Ecma International Standards as
  well as Ecma Technical Reports
=========================================
END OF test262 NOTICES, INFORMATION, AND LICENSE

%% The Computer Language Shootout NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright © 2004-2012 Brent Fulgham
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 Computer Language Benchmarks Game" nor the name of "The
Computer Language Shootout Benchmarks" 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 OWNER 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.
=========================================
END OF The Computer Language Shootout NOTICES, INFORMATION, AND LICENSE

%% WebAssembly/testsuite NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
 * Copyright 2016 WebAssembly Community Group participants
 *
 * 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.
=========================================
END OF WebAssembly/testsuite NOTICES, INFORMATION, AND LICENSE

%% zlib-data.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
For material from https://github.com/dvander/arewefastyet/blob/master/benchmarks/asmjs-apps/zlib.js:

This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.

Third party benchmarks included with AreWeFastYet uses different licenses.

For material from zlib and https://github.com/kripken/emscripten/blob/master/tests/zlib/benchmark.c:

/* zlib.h -- interface of the 'zlib' general purpose compression library
  version 1.2.8, April 28th, 2013

  Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler

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

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

  Jean-loup Gailly        Mark Adler
  jloup@gzip.org          madler@alumni.caltech.edu

*/
=========================================
END OF zlib-data.js NOTICES, INFORMATION, AND LICENSE

%% yargs-parser.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
Copyright (c) 2016, Contributors

Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice
appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
LIABLE FOR ANY SPECIAL, DIRECT, 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.
=========================================
END OF yargs-parser.js NOTICES, INFORMATION, AND LICENSE

%% camelcase.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

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, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

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. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
=========================================
END OF camelcase.js NOTICES, INFORMATION, AND LICENSE

---------------------------------------------------------------------------
Wabt

URL of the license https://github.com/WebAssembly/wabt/blob/master/LICENSE

The files in lib/wabt are licensed as specified in lib/wabt/LICENSE
unless otherwise stated in the file

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

%% ARES-6 NOTICES, INFORMATION, AND LICENSE BEGIN HERE
=========================================
ARES-6

Copyright (C) 2017 Apple Inc. All rights reserved.

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, 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 APPLE INC. ``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 APPLE INC. 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.
=========================================
END OF ARES-6 NOTICES, INFORMATION, AND LICENSE

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

