Apache Flex
Copyright 2014 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

The Initial Developer of the Original Code, known as Adobe Flex, 
is Adobe Systems Incorporated (http://www.adobe.com/).
    Copyright 2003 - 2012 Adobe Systems Incorporated. All Rights Reserved.

The asc compiler contains code written by Jeff Dyer at: 
    Copyright Mountain View Compiler Company (1998-2003).

The easing equations in the mx tween class are based on code written by Robert Penner.
    Copyright 2001 Robert Penner
    All rights reserved.

The Batik SVG toolkit source contains code from the World Wide Web Consortium (W3C) for
     the Document Object Model API (DOM API) and SVG Document Type Definition (DTD).

The Batik SVG toolkit source contains code from the International Organisation for
     Standardization for the definition of character entities used in the software's 
     documentation.

The Open Source Media Framework used by the video components is licensed under the 
    Mozilla Public License Version 1.1.  The source code can be found here:
    http://sourceforge.net/projects/osmf.adobe/files/OSMF%201.0%20%28final%20source%2C%20ASDocs%2C%20PDF%20guides%2C%20and%20release%20notes%29/OSMF_1.0.zip
