# file generated using the following command (open the link in browser for up-to-date version with html links)
# lynx -dump http://m.legal.yandex.ru/desktop_software_agreement/?lang=en

Yandex Desktop Software License Agreement

   We would like to draw your attention to the fact that this License
   Agreement shall replace the license agreements governing the use of
   respective computer programs listed in Section 1.1 of this License
   Agreement starting from the date indicated in the termination notices
   in the respective license agreements. Please do consider all references
   to those license agreements governing the use of respective computer
   programs as references to this License Agreement.

   This document is a translation of Yandex Desktop Software License
   Agreement in English. In case of conflict between the Russian version
   of Yandex Desktop Software License Agreement and this translation -
   only the Russian version of Yandex Desktop Software License Agreement
   is legally binding. The Russian version of Yandex Desktop Software
   License Agreement can be found here:
   http://legal.yandex.ru/desktop_software_agreement/?lang=ru.

   Before using any program, please read the following terms of license
   agreement. Any use of a program by you means full and unconditional
   acceptance of its terms.

   If you do not accept the terms of license agreement in full, you shall
   not use it for any purpose.

1. General Provisions

   1.1. This License Agreement (“License”) sets forth the terms and
   conditions for the use of the following computer programs:
   “Yandex.Disk”, “Yandex.Disk Command Line Interface”, “Yandex.Mail” for
   Chromium, “Yandex.Weather” for Chromium, “Yandex.Traffic” for Chromium,
   “Yandex.Search” for Chromium, “My VK page” for Chromium, “Visual
   Bookmarks” for Internet Explorer, “Visual Bookmarks” for Mozilla
   Firefox, “Visual Bookmarks” for Chromium, “Yandex.Translate” for
   Chromium, “Yandex Elements” for Internet Explorer, “Yandex Elements”
   for Mozilla Firefox, “Browsers manager” for Windows, “Yandex.Maps” for
   Opera, “Yandex.Fotki” for Opera, “Yandex.Mail” for Opera,
   “Yandex.Weather” for Opera, “VKontakte for express-panel” for Opera,
   which are distributed separately as well as a part of a “Yandex
   Elements” software package, (any of the above programs will hereinafter
   be referred to as “Program” and all of them together as “Programs”) and
   is concluded between any person using the Program (“User”) and YANDEX
   LLC, 16 Lva Tolstogo St., Moscow 119021, Russia, which is the owner of
   the exclusive rights in Programs (“Rights Holder”).

   1.2. By copying any Program or Programs, installing any of them on your
   PC or using any Program in any manner, the User expresses his/her full
   and unconditional agreement to all the License terms and conditions.

   1.3. The use of Programs is permitted only under the terms and
   conditions of this License. If the User does not accept the terms and
   conditions of the License in full, the User shall not use any Program
   for any purpose. The use of Programs with violation (non-performance)
   of any of the terms and conditions of this License shall be prohibited.

   1.4. The use of Programs under this License for personal non-commercial
   use is free of charge. The use of Programs on terms and in the manner
   not provided for by this License is only possible on the basis of a
   separate agreement with the Rights Holder.

   1.5. This License and all relations connected with the use of a Program
   or all Programs are subject to applicable law of the Russian Federation
   and any claims or lawsuits arising out of this License or the use of a
   Program or all Programs shall be filed and considered by the court at
   the location of the Rights Holder.

   1.6. The Rights Holder may provide the User with the translation of thi
   s License from Russian into other languages, but in case of a conflict
   between the terms of the License in Russian and its translation, only
   Russian-language version of this License is valid.

2. Rights in Programs

   2.1. The Rights Holder owns all exclusive rights in all Programs.

3. License

   3.1. The Rights Holder provides the User with non-transferable right to
   use Programs free of charge, under a simple (non-exclusive) license, in
   countries around the world in the following manner:

   3.1.1. To use Programs in accordance with their direct functional
   purpose, in order to which copy and to install (execute) them on the
   personal computer(s) of the User. The User is entitled to install
   Programs on an unlimited number of personal computers.

   3.1.2. To copy and to distribute Programs in an unmodified form and
   solely for non-commercial purposes (free of charge).

4. Limitations

   4.1. Except for use within the scope and by means directly stipulated
   for by this License or the law of the Russian Federation, the User
   shall not modify, decompile, disassemble, decrypt and perform other
   actions with the object code of any Program, aimed at obtaining source
   codes of any Program and/or information on the implementation of the
   algorithms used in the Program, to create derivative works with the use
   of the Program, as well as to fulfill (to allow to conduct) other use
   of Programs, without the written consent from the Rights Holder.

   4.2. The User shall not, without the written consent from the Rights
   Holder, reproduce, distribute and make available to the public, any
   Program and/or all Programs in any form and by any means, not directly
   stipulated for by this License, including within the collections of
   software products, with the offering of other programs, settings and
   other products, regardless of purposes of such use.

   4.3. Programs shall be used under the names given to them by the Rights
   Holder. The User shall not change the name of Programs, to modify
   and/or to remove the copyright notice or other references to the Rights
   Holder.

5. Terms of Use of Specific Functions of Programs

   5.1. The User is hereby notified and agrees that if automatic sending
   of anonymous statistics of browser usage is enabled in Programs, the
   Rights Holder will be anonymously (without reference to the User) and
   automatically receiving the information, including the visited site,
   viewed pages and downloaded files for the purposes of improving the
   quality of the products and services provided to the User, until the
   function is switched off.

   5.2. The User is hereby notified and agrees that if using the function
   “To the exact address” for the provision of the User with the hints of
   corrected input errors, the Rights Holder is anonymously (without
   reference to the User) reported in the automatic mode on the characters
   entered in the address bar of the browser, until the function is
   switched off.

   5.3. Automatic translation of texts and web pages using the function
   “Translation of pages” is conducted using own technologies of the
   Rights Holder, and also the technologies of the partners of the Rights
   Holder. In case of presence of the logo of PROMT LLC on the translation
   result page of the Program, the translation is done using technologies
   developed by PROMT ® (http://www.promt.ru). The logs of
   translations will be anonymously (without reference to the User) sent
   to the Rights Holder.

   5.4. The User is hereby notified and agrees that, when using the
   translation of words function, the translation is performed using the
   technologies developed by PROMT ® (http://www.promt.ru). The logs
   of translations will be anonymously (without reference to the User)
   sent to the Rights Holder.

   5.5. The User is hereby notified and agrees that when using the
   “Location identification” function in the Program, IP address of the
   User’s computer and the data on available Wi-Fi networks will be
   anonymously (without reference to the User) sent to the automated
   service of location identification of the Rights Holder.

   5.6. The User is hereby notified and agrees that when enabling the
   “Smart Line” function to offer the User search tips, the Rights Holder
   is anonymously (without reference to the User) reported in the
   automatic mode on the characters entered in the address bar of the
   browser, text of the tip selected by the User and identifier of the
   system, until the function is switched off.

   5.7. The User is hereby notified and agrees that if the function
   “Quotation Index” is enabled in the Program “Yandex Elements” for
   Internet Explorer and/or in the Program “Yandex Elements” for Mozilla
   Firefox, the Rights Holder will be anonymously (without reference to
   the User) and automatically receiving the information on the visited
   site and downloaded files for the purposes of determining the quotation
   index of the site that is being viewed by the User, until the function
   is switched off.

   5.8. The User is hereby notified and agrees that if the function
   “Feedback” is enabled in the Program “Yandex Elements” for Internet
   Explorer and/or in the Program “Yandex Elements” for Mozilla Firefox,
   the Rights Holder will be anonymously (without reference to the User)
   and automatically receiving the information on the visited site and
   downloaded files for the purposes of determining the number of comments
   to the site that is being viewed by the User, until the function is
   switched off.

   5.9. The User at any time can refuse to transfer the data specified in
   clauses 5.1 – 5.8 by switching off the corresponding features.

   5.10. All data on the use of Programs transferred in accordance with
   this License, shall be stored and processed in accordance with the
   Privacy Policy (http://legal.yandex.ru/confidential/).

   5.11. By using the widget of the service "Yandex.Music" User accepts
   Terms and Conditions service Yandex.Music
   (http://legal.yandex.ru/music_termsofuse/).

   5.12. The “Text Only” function is based on the “Readability” program,
   the exclusive right to which owned by the company “Arc90”, which
   distributes the “Readability” program under the Apache 2.0
   (http://www.apache.org/licenses/LICENSE-2.0) license.

   5.13. The Program “Yandex Elements” for Internet Explorer uses the
   Compact Language Detection library included in Chromium source code
   (http://src.chromium.org/viewvc/chrome/trunk/src/third_party/cld/).
   The specified software can be used on the terms available at:
   http://src.chromium.org/viewvc/chrome/trunk/src/third_party/cld/LIC
   ENSE.

   5.14. The User is hereby notified and agrees that when installing the
   Program “Yandex Elements” for Internet Explorer and/or the Program
   “Yandex Elements” for Mozilla Firefox, additional components (buttons)
   that are integrated with the popular social networks, e-mail services
   and other instruments, will be automatically selected and installed,
   while the selection is conducted completely automatically and no data
   is transferred beyond the User’s computer.

6. Limitation of Liability under the License

   6.1. Programs are provided on “as is” basis. The Rights Holder shall
   provide no warranties regarding error-free and uninterrupted operation
   of Programs, meeting the specific goals and expectations of the User,
   and also shall provide no other warranties not directly stated in this
   License.

   6.2. To the maximum extent permitted by the current law, the Rights
   Holder shall not be responsible for any direct or indirect consequences
   of any use of or inability to use Programs and/or damage inflicted on
   the User and/or third parties as a result of any use or non-use of
   Programs, including possible errors or failures of Programs.

   6.3. The User is hereby notified and agrees that while using Programs,
   the Rights Holder obtains anonymously (without reference to the User)
   in automatic mode the following information: the type of operating
   system on the User’s computer, version and identifier of the Program,
   usage statistics of Program’s features, as well as other technical
   information.

   6.4. The User is able to add components (buttons) to the Program
   “Yandex Elements” for Internet Explorer and/or the Program “Yandex
   Elements” for Mozilla Firefox, which are developed and offered by third
   parties, providing access to information or services of third parties,
   or redirecting to the resources of third parties (“Custom Components”).
   The User understands and agrees that the installation of Custom
   Components to the Program is conducted at the user’s own risk. The
   Rights Holder has no control over the performance, information,
   services or resources accessed through such Custom Components, as well
   as their compliance with the law, and is not responsible for the
   results of installation or use of Custom Components. The Rights Holder
   does not cover any damage caused to the User by the use of or inability
   to use any Custom Components or information, services and resources
   accessed through Custom Components.

7. Updates/New Versions of Programs

   7.1. Programs may automatically download and install updates from time
   to time, which are directed to enhance Programs and which can be in the
   form of patches, additional modules and new versions of Programs. The
   User is hereby notified and agrees that Programs will update
   automatically, including request, download and installation of updates
   for Programs onto the User’s computer without further notice.

   7.2. This License shall be applied to all future updates/new versions
   of any Program or all Programs. The installation of an update/new
   version of the respective Program shall be deemed as an acceptance of
   the terms and conditions of this License by the User for relevant
   updates/new versions of the Program, unless the update/installation of
   a new version of the Program is accompanied by any other license
   agreement.

8. Changes to the Terms and Conditions of this License

   8.1. This license agreement may be changed unilaterally by the Rights
   Holder. The notification of the User on the changes in the terms and
   conditions of this License is published on the page:
   http://legal.yandex.ru/desktop_software_agreement/. These changes
   in the terms and conditions of the license agreement shall be effective
   from the date of their publication, unless otherwise is specified in
   the relevant publication.
