THIS DEVELOPER SOFTWARE LICENSE AGREEMENT (THE "AGREEMENT") IS A LEGALLY
BINDING AGREEMENT BETWEEN Samsung Electronics ("LICENSOR") AND
YOU OR THE LEGAL ENTITY YOU REPRESENT ("You" or its possessive, "Your"). BY
TYPING "I ACCEPT" WHERE INDICATED YOU ACKNOWLEDGE THAT YOU HAVE READ THIS
AGREEMENT, UNDERSTAND IT AND AGREE TO BE BOUND BY ITS TERMS AND CONDITIONS. IF
YOU DO NOT AGREE TO THESE TERMS YOU MUST DISCONTINUE THE INSTALLATION PROCESS
AND YOU SHALL NOT USE THE SOFTWARE OR RETAIN ANY COPIES OF THE SOFTWARE OR
DOCUMENTATION. ANY USE OR POSSESSION OF THE SOFTWARE BY YOU IS SUBJECT TO THE
TERMS AND CONDITIONS SET FORTH IN THIS AGREEMENT. IF THE SOFTWARE IS INSTALLED
ON A COMPUTER OWNED BY A CORPORATION OR OTHER LEGAL ENTITY, THEN YOU REPRESENT
AND WARRANT THAT YOU HAVE THE AUTHORITY TO BIND SUCH ENTITY TO THE TERMS AND
CONDITIONS OF THIS AGREEMENT.

   1.  Special Definitions

      a.  The term "Android" means the open source mobile platform, software
          stack, operating system, middleware, application programming
          interfaces and mobile applications under the trade-name "Android"
          distributed at Android.com.

      b.  The term "Android Applications" means a software application or
          open-source contribution developed by You, designed to operate with
          Android that does not contain or incorporate any of the Software.

      c.  The term "Authorized Android Enabled Device" means only the device
          identified on the site from which You downloaded the Software.
          The term "Software" means the Licensor's proprietary software and
          libraries in object code form, designed for use on the Authorized
          Android Enabled Device.

      d.  The term "Authorized Android Enabled Device Software" means a
          packaged build for Authorized Android Enabled Devices, consisting of
          files suitable for installation on an Authorized Android Enabled
          Device using a mechanism such as fastboot mode or recovery mode.

   2.  License Grant

      a.  Subject to the terms of this Agreement, Licensor hereby grants to
          You, free of charge, a non-exclusive, non-sublicensable,
          non-transferable, limited license, during the term of this Agreement,
          to download, install and use the Software internally in
          machine-readable (i.e., object code) form and the Documentation for
          non-commercial use on an Authorized Android Enabled Device and
          non-commercial redistribution of the Authorized Android Enabled
          Device Software (the "Limited Purpose"). You may grant your end users
          the right to use the Software for the Limited Purpose. The license to
          the Software granted to You hereunder is solely for the Limited
          Purpose set forth in this section, and the Software shall not be used
          for any other purpose.

   3.  Restrictions

      a.  Retention of Rights. The entire right, title and interest in the
          Software shall remain with Licensor and, unless specified in writing
          hereunder, no rights are granted to any of the Software. Except for
          the right to use the Software for the Limited Purpose, the delivery
          of the Software to You does not convey to You any intellectual
          property rights in the Software, including, but not limited to any
          rights under any patent, trademark, copyright, or trade secret.
          Neither the delivery of the Software to You nor any terms set forth
          herein shall be construed to grant to You, either expressly, by
          implication or by way of estoppel, any license under any patents or
          other intellectual property rights covering or relating to any other
          product or invention or any combination of the Software with any
          other product. Any rights not expressly granted to You herein are
          reserved by Licensor.

      b.  No Commercialization or Distribution of the Software and
          Documentation. Except as expressly provided in Section 2 of this
          Agreement, You shall have no right to (i) copy, disclose, distribute,
          publically perform, publically display, transfer, alter, modify,
          translate, disassemble, decompile, reverse engineer, or adapt the
          Software and Documentation, or any portion thereof, or create any
          derivative works based thereon; (ii) rent, lease, assign, sublicense,
          resell, disclose or otherwise transfer the Software and Documentation
          in whole or in part to any third party (iii) use the Software and
          Documentation except for the Limited Purpose, (iv) remove or alter
          any of the copyright or proprietary notices contained in any of the
          Software and Documentation. For the purposes of clarity, nothing in
          this Agreement prohibits You from making and distributing Android
          Applications under commercial or non-commercial terms, provided that
          You shall not contain, incorporate, and/or compile the Software or
          any of its derivative works, in whole or in part, into Your Android
          Applications and/or any software/devices created by You or by third
          parties acting on Your behalf. You and any such third party shall
          comply with all of the terms and conditions of this Agreement.

      c.  No Reverse Engineering. You will not reverse engineer, disassemble,
          decompile, or translate the Software, or otherwise attempt to derive
          the source code version of the Software, except if and to the extent
          expressly permitted under any applicable law.

      d.  Third Party Software. You agree that Android may contain third party
          software. You agree that you may not distribute such third party
          software for any purpose without appropriate licenses from the
          applicable third party or parties.

      e.  No Transfer or Assignment. You shall not assign any of its rights or
          obligations under this Agreement. Any attempted assignment in
          contravention of this Section shall be void.

   4.  Onwership of Intellectual Property

      a.  You acknowledge that all intellectual property rights in or relating
          to the Software and all parts of the Software are and shall remain
          the exclusive property of Licensor and its licensors. You agree that
          you will not remove or alter any copyright notices or similar
          proprietary devices, including without limitation any electronic
          watermarks or other identifiers, that may be incorporated in the
          Software.

   5.  Indemnity

      a.  You agree to indemnify and hold harmless Licensor and its officers,
          directors, customers, employees and successors and assigns (each an
          "Indemnified Party") against any and all claims, demands, causes of
          action, losses, liabilities, damages, costs and expenses, incurred by
          the Indemnified Party (including but not limited to costs of defense,
          investigation and reasonable attorney's fees) arising out of,
          resulting from or related to (i) any software, products,
          documentation, content, materials or derivative works created or
          developed by You using the Software which causes an infringement of
          any patent, copyright, trademark, trade secret, or other property,
          publicity or privacy rights of any third parties arising in any
          jurisdiction anywhere in the world, (ii) the download, distribution,
          installation, storage, execution, use or transfer of such software,
          products, documentation, content, materials or derivative works by
          any person or entity, and/or (iii) any breach of this Agreement by
          You. If requested by an Indemnified Party, You agree to defend such
          Indemnified Party in connection with any third party claims, demands,
          or causes of action resulting from, arising out of or in connection
          with any of the foregoing.

   6.  Limitation of Liability

      a.  TO THE MAXIMUM EXTENT PERMITTED UNDER APPLICABLE LAWS, UNDER NO
          CIRCUMSTANCES, INCLUDING WITHOUT LIMITATION NEGLIGENCE, SHALL
          LICENSOR, ITS AFFILIATES AND/OR ITS DIRECTORS, OFFICERS, EMPLOYEES OR
          AGENTS BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE OR
          CONSEQUENTIAL DAMAGES (INCLUDING BUT NOT LIMITED TO DAMAGES FOR LOSS
          OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS
          INFORMATION AND THE LIKE) ARISING OUT OF OR IN CONNECTION WITH THE
          SOFTWARE OR ANY DOWNLOAD, INSTALLATION OR USE OF, OR INABILITY TO
          USE, THE SOFTWARE, EVEN IF LICENSOR HAS BEEN ADVISED OF THE
          POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS DO NOT ALLOW THE
          LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL
          DAMAGES SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT APPLY OR MAY BE
          LIMITED. IN NO EVENT SHALL LICENSOR'S TOTAL AGGREGATE LIABILITY TO
          YOU FOR ANY AND ALL DAMAGES, LOSSES, CLAIMS AND CAUSES OF ACTIONS
          (WHETHER IN CONTRACT, TORT, INCLUDING NEGLIGENCE, INDEMNIFICATION OR
          OTHERWISE) EXCEED ONE HUNDRED U.S. DOLLARS (US$100). THE LIMITATIONS
          SET FORTH IN THIS PARAGRAPH SHALL BE DEEMED TO APPLY TO THE MAXIMUM
          EXTENT PERMITTED BY APPLICABLE LAW. THE PARTIES HAVE FULLY CONSIDERED
          THE FOREGOING ALLOCATION OF RISK AND FIND IT REASONABLE, AND THAT THE
          FOREGOING LIMITATIONS IN THIS PARAGRAPH ARE AN ESSENTIAL BASIS OF
          THE BARGAIN BETWEEN THE PARTIES.

   7.  No Warranty

      a.  LICENSOR MAKES NO WARRANTIES, EXPRESS OR IMPLIED, WITH RESPECT TO THE
          SOFTWARE AND DOCUMENTATION PROVIDED UNDER THIS AGREEMENT, INCLUDING
          BUT NOT LIMITED TO ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A
          PARTICULAR PURPOSE OR AGAINST INFRINGEMENT, OR ANY EXPRESS OR IMPLIED
          WARRANTY ARISING OUT OF TRADE USAGE OR OUT OF A COURSE OF DEALING OR
          COURSE OF PERFORMANCE. NOTHING CONTAINED IN THIS AGREEMENT SHALL BE
          CONSTRUED AS A WARRANTY OR REPRESENTATION BY LICENSOR (I) AS TO THE
          VALIDITY OR SCOPE OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL
          PROPERTY RIGHT AND (II) THAT ANY MANUFACTURE OR USE WILL BE FREE FROM
          INFRINGEMENT OF PATENTS, COPYRIGHTS OR OTHER INTELLECTUAL PROPERTY
          RIGHTS OF OTHERS, AND IT SHALL BE THE SOLE RESPONSIBILITY OF YOU TO
          MAKE SUCH DETERMINATION AS IS NECESSARY WITH RESPECT TO THE
          ACQUISITION OF LICENSES UNDER PATENTS AND OTHER INTELLECTUAL PROPERTY
          OF THIRD PARTIES. LICENSOR SHALL NOT HAVE ANY OBLIGATION TO PROVIDE
          ANY TECHNICAL SUPPORT OF THE SOFTWARE UNDER THIS AGREEMENT.

   8.  Term and Termination

      a.  This Agreement shall be effective on the date You accept this
          Agreement and shall remain in effect until terminated as provided
          herein. You may terminate the Agreement at any time by deleting and
          destroying all copies of the Software and all related information in
          Your possession or control. This Agreement terminates immediately and
          automatically, with or without notice, if You fail to comply with any
          provision hereof.  Additionally, Licensor may at any time terminate
          this Agreement, without cause, upon notice to You. Upon termination
          You must delete or destroy all copies of the Software in Your
          possession, and the license granted to You in this Agreement shall
          terminate. Sections 3, 4, 5, 6 and 8 shall survive the termination of
          this Agreement.

   9.  Miscellaneous

      a.  Governing Law. This Agreement is governed and interpreted in
          accordance with the laws of the State of California without giving
          effect to its conflict of laws provisions. The United Nations
          Convention on Contracts for the International Sale of Goods is
          expressly disclaimed and shall not apply. Any claim arising out of or
          related to this Agreement must be brought exclusively in a federal or
          state court located in Santa Clara County, California and You consent
          to the jurisdiction and venue of such courts.

      b.  Waiver and Severability. The failure of either party to require
          performance by the other party of any provision of this Agreement
          shall not affect the full right to require such performance at any
          time thereafter; nor shall the waiver by either party of a breach of
          any provision of this Agreement be taken or held to be a waiver of
          the provision itself. Severability. If any provision of this
          Agreement is unenforceable or invalid under any applicable law or is
          so held by applicable court decision, such unenforceability or
          invalidity shall not render this Agreement unenforceable or invalid
          as a whole, and such provision shall be changed and interpreted so as
          to best accomplish the objectives of such unenforceable or invalid
          provision within the limits of applicable law or applicable court
          decisions.

      c.  Amendment and Modification. This Agreement and any of its terms and
          provisions may only be amended, modified, supplemented or waived in a
          writing signed by both parties hereto.

      d.  Compliance with Laws. You shall comply with all applicable laws,
          rules, and regulations in connection with its activities under this
          Agreement.

      e.  Entire Agreement. This Agreement completely and exclusively states
          the agreement between You and Licensor regarding this subject matter.
