diff --git a/hmailserver/installation/License.rtf b/hmailserver/installation/License.rtf index 8d8e600ab..d7fc570ee 100644 --- a/hmailserver/installation/License.rtf +++ b/hmailserver/installation/License.rtf @@ -1,784 +1,1883 @@ -{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}{\f1\fswiss\fprq2\fcharset128 Tahoma;}{\f2\fnil\fcharset128 OpenSymbol;}{\f3\fmodern\fprq1\fcharset0 Courier New;}{\f4\fnil\fcharset2 Wingdings;}{\f5\fnil\fcharset2 Symbol;}} -{\colortbl ;\red0\green0\blue0;\red0\green0\blue255;} -{\stylesheet{ Normal;}{\s1 heading 1;}{\s2 heading 2;}{\s3 heading 3;}} -{\*\generator Msftedit 5.41.21.2509;}\viewkind4\uc1\pard\sb120\sa120\lang1033\b\f0\fs28 hMailServer License Terms\par -\fs24 Preamble\par -\b0\f1\fs20 This is a legal agreement between you and the author of this software, Martin Knafve. By installing this software, hMailServer, you agree to be bound by the terms of this agreement to the maximum extent permitted by applicable law.\par -\pard hMailServer is provided "as is" without any warranties of merchantability and fitness for a particular purpose. You agree to hold the author harmless for any result that may occur related to the use of this software.\line\f0\fs24\par -\f1\fs20 The hMailServer source code is licensed under AGPLv3, with exception for 3'rd party libraries licensed otherwise. By agreeing to this license you agree to be bound both by the AGPLv3 terms and the 3'rd party component licenses. \f0\fs24\par -\pard\sb120\sa120\lang29\f1\fs20 The main points subject to the terms of the License are:\line\par -\pard\fi-360\li360\sa200\sl276\slmult1\f2\'81\'45\tab\f1 hMailServer may be used, free of charge, both in commercial and non-commercial environments. \lang1033\par -\f2\'81\'45\tab\lang29\f1 The hMailServer source code may be modified to create derivate works. You may not redistribute or give users access to functionality of your derivate works over a network without also providing them with the source code, according to AGPLv3 and licenses for 3'rd party libraries. In other words, you may not create closed-source software based on hMailServer.\lang1033\f0\fs24\par -\pard\sa200\sl276\slmult1\lang29\f1\fs20 For details, see the full licensing terms below.\par -\pard\sb120\sa120\lang1033\b\fs24 License\b0\par -\cf1\f3\fs20 GNU AFFERO GENERAL PUBLIC LICENSE\cf0\par -\pard\cf1\f1 Version 3, 19 November 2007\par -\cf0\f3\par -\cf1\f1 Copyright (C) 2007 Free Software Foundation, Inc. <\cf0{\field{\*\fldinst{HYPERLINK "http://fsf.org/"}}{\fldrslt{\ul\cf2 http://fsf.org/}}}\cf1\f1\fs20 >\cf0\par -\cf1 Everyone is permitted to copy and distribute verbatim copies\par -\cf0\f3 \f1 of this license document, but changing it is not allowed.\f3\par -\f1\par -\cf1 Preamble\par -\cf0\par -\cf1 The GNU Affero General Public License is a free, copyleft license for\par -software and other kinds of works, specifically designed to ensure\par -\cf0 cooperation with the community in the case of network server software.\f3\par -\f1\par -\cf1 The licenses for most software and other practical works are designed\par -to take away your freedom to share and change the works. By contrast,\par -\cf0 our General Public Licenses are intended to guarantee your freedom to\f3\par -\f1 share and change all versions of a program--to make sure it remains free\f3\par -\f1 software for all its users.\f3\par -\f1\par -\cf1 When we speak of free software, we are referring to freedom, not\par -price. Our General Public Licenses are designed to make sure that you\par -\cf0 have the freedom to distribute copies of free software (and charge for\f3\par -\f1 them if you wish), that you receive source code or can get it if you\f3\par -\f1 want it, that you can change the software or use pieces of it in new\f3\par -\f1 free programs, and that you know you can do these things.\f3\par -\f1\par -\cf1 Developers that use our General Public Licenses protect your rights\par -with two steps: (1) assert copyright on the software, and (2) offer\par -\cf0 you this License which gives you legal permission to copy, distribute\f3\par -\f1 and/or modify the software.\f3\par -\f1\par -\cf1 A secondary benefit of defending all users' freedom is that\par -improvements made in alternate versions of the program, if they\par -\cf0 receive widespread use, become available for other developers to\f3\par -\f1 incorporate. Many developers of free software are heartened and\f3\par -\f1 encouraged by the resulting cooperation. However, in the case of\f3\par -\f1 software used on network servers, this result may fail to come about.\f3\par -\f1 The GNU General Public License permits making a modified version and\f3\par -\f1 letting the public access it on a server without ever releasing its\f3\par -\f1 source code to the public.\f3\par -\f1\par -\cf1 The GNU Affero General Public License is designed specifically to\par -ensure that, in such cases, the modified source code becomes available\par -\cf0 to the community. It requires the operator of a network server to\f3\par -\f1 provide the source code of the modified version running there to the\f3\par -\f1 users of that server. Therefore, public use of a modified version, on\f3\par -\f1 a publicly accessible server, gives the public access to the source\f3\par -\f1 code of the modified version.\f3\par -\f1\par -\cf1 An older license, called the Affero General Public License and\par -published by Affero, was designed to accomplish similar goals. This is\par -\cf0 a different license, not a version of the Affero GPL, but Affero has\f3\par -\f1 released a new version of the Affero GPL which permits relicensing under\f3\par -\f1 this license.\f3\par -\f1\par -\cf1 The precise terms and conditions for copying, distribution and\par -modification follow.\par -\cf0\par -\cf1 TERMS AND CONDITIONS\par -\cf0\par -\cf1 0. Definitions.\par -\cf0\par -\cf1 "This License" refers to version 3 of the GNU Affero General Public License.\par -\cf0\par -\cf1 "Copyright" also means copyright-like laws that apply to other kinds of\par -works, such as semiconductor masks.\par -\cf0\par -\cf1 "The Program" refers to any copyrightable work licensed under this\par -License. Each licensee is addressed as "you". "Licensees" and\par -\cf0 "recipients" may be individuals or organizations.\f3\par -\f1\par -\cf1 To "modify" a work means to copy from or adapt all or part of the work\par -in a fashion requiring copyright permission, other than the making of an\par -\cf0 exact copy. The resulting work is called a "modified version" of the\f3\par -\f1 earlier work or a work "based on" the earlier work.\f3\par -\f1\par -\cf1 A "covered work" means either the unmodified Program or a work based\par -on the Program.\par -\cf0\par -\cf1 To "propagate" a work means to do anything with it that, without\par -permission, would make you directly or secondarily liable for\par -\cf0 infringement under applicable copyright law, except executing it on a\f3\par -\f1 computer or modifying a private copy. Propagation includes copying,\f3\par -\f1 distribution (with or without modification), making available to the\f3\par -\f1 public, and in some countries other activities as well.\f3\par -\f1\par -\cf1 To "convey" a work means any kind of propagation that enables other\par -parties to make or receive copies. Mere interaction with a user through\par -\cf0 a computer network, with no transfer of a copy, is not conveying.\f3\par -\f1\par -\cf1 An interactive user interface displays "Appropriate Legal Notices"\par -to the extent that it includes a convenient and prominently visible\par -\cf0 feature that (1) displays an appropriate copyright notice, and (2)\f3\par -\f1 tells the user that there is no warranty for the work (except to the\f3\par -\f1 extent that warranties are provided), that licensees may convey the\f3\par -\f1 work under this License, and how to view a copy of this License. If\f3\par -\f1 the interface presents a list of user commands or options, such as a\f3\par -\f1 menu, a prominent item in the list meets this criterion.\f3\par -\f1\par -\cf1 1. Source Code.\par -\cf0\par -\cf1 The "source code" for a work means the preferred form of the work\par -for making modifications to it. "Object code" means any non-source\par -\cf0 form of a work.\f3\par -\f1\par -\cf1 A "Standard Interface" means an interface that either is an official\par -standard defined by a recognized standards body, or, in the case of\par -\cf0 interfaces specified for a particular programming language, one that\f3\par -\f1 is widely used among developers working in that language.\f3\par -\f1\par -\cf1 The "System Libraries" of an executable work include anything, other\par -than the work as a whole, that (a) is included in the normal form of\par -\cf0 packaging a Major Component, but which is not part of that Major\f3\par -\f1 Component, and (b) serves only to enable use of the work with that\f3\par -\f1 Major Component, or to implement a Standard Interface for which an\f3\par -\f1 implementation is available to the public in source code form. A\f3\par -\f1 "Major Component", in this context, means a major essential component\f3\par -\f1 (kernel, window system, and so on) of the specific operating system\f3\par -\f1 (if any) on which the executable work runs, or a compiler used to\f3\par -\f1 produce the work, or an object code interpreter used to run it.\f3\par -\f1\par -\cf1 The "Corresponding Source" for a work in object code form means all\par -the source code needed to generate, install, and (for an executable\par -\cf0 work) run the object code and to modify the work, including scripts to\f3\par -\f1 control those activities. However, it does not include the work's\f3\par -\f1 System Libraries, or general-purpose tools or generally available free\f3\par -\f1 programs which are used unmodified in performing those activities but\f3\par -\f1 which are not part of the work. For example, Corresponding Source\f3\par -\f1 includes interface definition files associated with source files for\f3\par -\f1 the work, and the source code for shared libraries and dynamically\f3\par -\f1 linked subprograms that the work is specifically designed to require,\f3\par -\f1 such as by intimate data communication or control flow between those\f3\par -\f1 subprograms and other parts of the work.\f3\par -\f1\par -\cf1 The Corresponding Source need not include anything that users\par -can regenerate automatically from other parts of the Corresponding\par -\cf0 Source.\f3\par -\f1\par -\cf1 The Corresponding Source for a work in source code form is that\par -same work.\par -\cf0\par -\cf1 2. Basic Permissions.\par -\cf0\par -\cf1 All rights granted under this License are granted for the term of\par -copyright on the Program, and are irrevocable provided the stated\par -\cf0 conditions are met. This License explicitly affirms your unlimited\f3\par -\f1 permission to run the unmodified Program. The output from running a\f3\par -\f1 covered work is covered by this License only if the output, given its\f3\par -\f1 content, constitutes a covered work. This License acknowledges your\f3\par -\f1 rights of fair use or other equivalent, as provided by copyright law.\f3\par -\f1\par -\cf1 You may make, run and propagate covered works that you do not\par -convey, without conditions so long as your license otherwise remains\par -\cf0 in force. You may convey covered works to others for the sole purpose\f3\par -\f1 of having them make modifications exclusively for you, or provide you\f3\par -\f1 with facilities for running those works, provided that you comply with\f3\par -\f1 the terms of this License in conveying all material for which you do\f3\par -\f1 not control copyright. Those thus making or running the covered works\f3\par -\f1 for you must do so exclusively on your behalf, under your direction\f3\par -\f1 and control, on terms that prohibit them from making any copies of\f3\par -\f1 your copyrighted material outside their relationship with you.\f3\par -\f1\par -\cf1 Conveying under any other circumstances is permitted solely under\par -the conditions stated below. Sublicensing is not allowed; section 10\par -\cf0 makes it unnecessary.\f3\par -\f1\par -\cf1 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\par -\cf0\par -\cf1 No covered work shall be deemed part of an effective technological\par -measure under any applicable law fulfilling obligations under article\par -\cf0 11 of the WIPO copyright treaty adopted on 20 December 1996, or\f3\par -\f1 similar laws prohibiting or restricting circumvention of such\f3\par -\f1 measures.\f3\par -\f1\par -\cf1 When you convey a covered work, you waive any legal power to forbid\par -circumvention of technological measures to the extent such circumvention\par -\cf0 is effected by exercising rights under this License with respect to\f3\par -\f1 the covered work, and you disclaim any intention to limit operation or\f3\par -\f1 modification of the work as a means of enforcing, against the work's\f3\par -\f1 users, your or third parties' legal rights to forbid circumvention of\f3\par -\f1 technological measures.\f3\par -\f1\par -\cf1 4. Conveying Verbatim Copies.\par -\cf0\par -\cf1 You may convey verbatim copies of the Program's source code as you\par -receive it, in any medium, provided that you conspicuously and\par -\cf0 appropriately publish on each copy an appropriate copyright notice;\f3\par -\f1 keep intact all notices stating that this License and any\f3\par -\f1 non-permissive terms added in accord with section 7 apply to the code;\f3\par -\f1 keep intact all notices of the absence of any warranty; and give all\f3\par -\f1 recipients a copy of this License along with the Program.\f3\par -\f1\par -\cf1 You may charge any price or no price for each copy that you convey,\par -and you may offer support or warranty protection for a fee.\par -\cf0\par -\cf1 5. Conveying Modified Source Versions.\par -\cf0\par -\cf1 You may convey a work based on the Program, or the modifications to\par -produce it from the Program, in the form of source code under the\par -\cf0 terms of section 4, provided that you also meet all of these conditions:\f3\par -\f1\par -\cf1 a) The work must carry prominent notices stating that you modified\par -\cf0\f3 \f1 it, and giving a relevant date.\f3\par -\f1\par -\cf1 b) The work must carry prominent notices stating that it is\par -\cf0\f3 \f1 released under this License and any conditions added under section\f3\par - \f1 7. This requirement modifies the requirement in section 4 to\f3\par - \f1 "keep intact all notices".\f3\par -\f1\par -\cf1 c) You must license the entire work, as a whole, under this\par -\cf0\f3 \f1 License to anyone who comes into possession of a copy. This\f3\par - \f1 License will therefore apply, along with any applicable section 7\f3\par - \f1 additional terms, to the whole of the work, and all its parts,\f3\par - \f1 regardless of how they are packaged. This License gives no\f3\par - \f1 permission to license the work in any other way, but it does not\f3\par - \f1 invalidate such permission if you have separately received it.\f3\par -\f1\par -\cf1 d) If the work has interactive user interfaces, each must display\par -\cf0\f3 \f1 Appropriate Legal Notices; however, if the Program has interactive\f3\par - \f1 interfaces that do not display Appropriate Legal Notices, your\f3\par - \f1 work need not make them do so.\f3\par -\f1\par -\cf1 A compilation of a covered work with other separate and independent\par -works, which are not by their nature extensions of the covered work,\par -\cf0 and which are not combined with it such as to form a larger program,\f3\par -\f1 in or on a volume of a storage or distribution medium, is called an\f3\par -\f1 "aggregate" if the compilation and its resulting copyright are not\f3\par -\f1 used to limit the access or legal rights of the compilation's users\f3\par -\f1 beyond what the individual works permit. Inclusion of a covered work\f3\par -\f1 in an aggregate does not cause this License to apply to the other\f3\par -\f1 parts of the aggregate.\f3\par -\f1\par -\cf1 6. Conveying Non-Source Forms.\par -\cf0\par -\cf1 You may convey a covered work in object code form under the terms\par -of sections 4 and 5, provided that you also convey the\par -\cf0 machine-readable Corresponding Source under the terms of this License,\f3\par -\f1 in one of these ways:\f3\par -\f1\par -\cf1 a) Convey the object code in, or embodied in, a physical product\par -\cf0\f3 \f1 (including a physical distribution medium), accompanied by the\f3\par - \f1 Corresponding Source fixed on a durable physical medium\f3\par - \f1 customarily used for software interchange.\f3\par -\f1\par -\cf1 b) Convey the object code in, or embodied in, a physical product\par -\cf0\f3 \f1 (including a physical distribution medium), accompanied by a\f3\par - \f1 written offer, valid for at least three years and valid for as\f3\par - \f1 long as you offer spare parts or customer support for that product\f3\par - \f1 model, to give anyone who possesses the object code either (1) a\f3\par - \f1 copy of the Corresponding Source for all the software in the\f3\par - \f1 product that is covered by this License, on a durable physical\f3\par - \f1 medium customarily used for software interchange, for a price no\f3\par - \f1 more than your reasonable cost of physically performing this\f3\par - \f1 conveying of source, or (2) access to copy the\f3\par - \f1 Corresponding Source from a network server at no charge.\f3\par -\f1\par -\cf1 c) Convey individual copies of the object code with a copy of the\par -\cf0\f3 \f1 written offer to provide the Corresponding Source. This\f3\par - \f1 alternative is allowed only occasionally and noncommercially, and\f3\par - \f1 only if you received the object code with such an offer, in accord\f3\par - \f1 with subsection 6b.\f3\par -\f1\par -\cf1 d) Convey the object code by offering access from a designated\par -\cf0\f3 \f1 place (gratis or for a charge), and offer equivalent access to the\f3\par - \f1 Corresponding Source in the same way through the same place at no\f3\par - \f1 further charge. You need not require recipients to copy the\f3\par - \f1 Corresponding Source along with the object code. If the place to\f3\par - \f1 copy the object code is a network server, the Corresponding Source\f3\par - \f1 may be on a different server (operated by you or a third party)\f3\par - \f1 that supports equivalent copying facilities, provided you maintain\f3\par - \f1 clear directions next to the object code saying where to find the\f3\par - \f1 Corresponding Source. Regardless of what server hosts the\f3\par - \f1 Corresponding Source, you remain obligated to ensure that it is\f3\par - \f1 available for as long as needed to satisfy these requirements.\f3\par -\f1\par -\cf1 e) Convey the object code using peer-to-peer transmission, provided\par -\cf0\f3 \f1 you inform other peers where the object code and Corresponding\f3\par - \f1 Source of the work are being offered to the general public at no\f3\par - \f1 charge under subsection 6d.\f3\par -\f1\par -\cf1 A separable portion of the object code, whose source code is excluded\par -from the Corresponding Source as a System Library, need not be\par -\cf0 included in conveying the object code work.\f3\par -\f1\par -\cf1 A "User Product" is either (1) a "consumer product", which means any\par -tangible personal property which is normally used for personal, family,\par -\cf0 or household purposes, or (2) anything designed or sold for incorporation\f3\par -\f1 into a dwelling. In determining whether a product is a consumer product,\f3\par -\f1 doubtful cases shall be resolved in favor of coverage. For a particular\f3\par -\f1 product received by a particular user, "normally used" refers to a\f3\par -\f1 typical or common use of that class of product, regardless of the status\f3\par -\f1 of the particular user or of the way in which the particular user\f3\par -\f1 actually uses, or expects or is expected to use, the product. A product\f3\par -\f1 is a consumer product regardless of whether the product has substantial\f3\par -\f1 commercial, industrial or non-consumer uses, unless such uses represent\f3\par -\f1 the only significant mode of use of the product.\f3\par -\f1\par -\cf1 "Installation Information" for a User Product means any methods,\par -procedures, authorization keys, or other information required to install\par -\cf0 and execute modified versions of a covered work in that User Product from\f3\par -\f1 a modified version of its Corresponding Source. The information must\f3\par -\f1 suffice to ensure that the continued functioning of the modified object\f3\par -\f1 code is in no case prevented or interfered with solely because\f3\par -\f1 modification has been made.\f3\par -\f1\par -\cf1 If you convey an object code work under this section in, or with, or\par -specifically for use in, a User Product, and the conveying occurs as\par -\cf0 part of a transaction in which the right of possession and use of the\f3\par -\f1 User Product is transferred to the recipient in perpetuity or for a\f3\par -\f1 fixed term (regardless of how the transaction is characterized), the\f3\par -\f1 Corresponding Source conveyed under this section must be accompanied\f3\par -\f1 by the Installation Information. But this requirement does not apply\f3\par -\f1 if neither you nor any third party retains the ability to install\f3\par -\f1 modified object code on the User Product (for example, the work has\f3\par -\f1 been installed in ROM).\f3\par -\f1\par -\cf1 The requirement to provide Installation Information does not include a\par -requirement to continue to provide support service, warranty, or updates\par -\cf0 for a work that has been modified or installed by the recipient, or for\f3\par -\f1 the User Product in which it has been modified or installed. Access to a\f3\par -\f1 network may be denied when the modification itself materially and\f3\par -\f1 adversely affects the operation of the network or violates the rules and\f3\par -\f1 protocols for communication across the network.\f3\par -\f1\par -\cf1 Corresponding Source conveyed, and Installation Information provided,\par -in accord with this section must be in a format that is publicly\par -\cf0 documented (and with an implementation available to the public in\f3\par -\f1 source code form), and must require no special password or key for\f3\par -\f1 unpacking, reading or copying.\f3\par -\f1\par -\cf1 7. Additional Terms.\par -\cf0\par -\cf1 "Additional permissions" are terms that supplement the terms of this\par -License by making exceptions from one or more of its conditions.\par -\cf0 Additional permissions that are applicable to the entire Program shall\f3\par -\f1 be treated as though they were included in this License, to the extent\f3\par -\f1 that they are valid under applicable law. If additional permissions\f3\par -\f1 apply only to part of the Program, that part may be used separately\f3\par -\f1 under those permissions, but the entire Program remains governed by\f3\par -\f1 this License without regard to the additional permissions.\f3\par -\f1\par -\cf1 When you convey a copy of a covered work, you may at your option\par -remove any additional permissions from that copy, or from any part of\par -\cf0 it. (Additional permissions may be written to require their own\f3\par -\f1 removal in certain cases when you modify the work.) You may place\f3\par -\f1 additional permissions on material, added by you to a covered work,\f3\par -\f1 for which you have or can give appropriate copyright permission.\f3\par -\f1\par -\cf1 Notwithstanding any other provision of this License, for material you\par -add to a covered work, you may (if authorized by the copyright holders of\par -\cf0 that material) supplement the terms of this License with terms:\f3\par -\f1\par -\cf1 a) Disclaiming warranty or limiting liability differently from the\par -\cf0\f3 \f1 terms of sections 15 and 16 of this License; or\f3\par -\f1\par -\cf1 b) Requiring preservation of specified reasonable legal notices or\par -\cf0\f3 \f1 author attributions in that material or in the Appropriate Legal\f3\par - \f1 Notices displayed by works containing it; or\f3\par -\f1\par -\cf1 c) Prohibiting misrepresentation of the origin of that material, or\par -\cf0\f3 \f1 requiring that modified versions of such material be marked in\f3\par - \f1 reasonable ways as different from the original version; or\f3\par -\f1\par -\cf1 d) Limiting the use for publicity purposes of names of licensors or\par -\cf0\f3 \f1 authors of the material; or\f3\par -\f1\par -\cf1 e) Declining to grant rights under trademark law for use of some\par -\cf0\f3 \f1 trade names, trademarks, or service marks; or\f3\par -\f1\par -\cf1 f) Requiring indemnification of licensors and authors of that\par -\cf0\f3 \f1 material by anyone who conveys the material (or modified versions of\f3\par - \f1 it) with contractual assumptions of liability to the recipient, for\f3\par - \f1 any liability that these contractual assumptions directly impose on\f3\par - \f1 those licensors and authors.\f3\par -\f1\par -\cf1 All other non-permissive additional terms are considered "further\par -restrictions" within the meaning of section 10. If the Program as you\par -\cf0 received it, or any part of it, contains a notice stating that it is\f3\par -\f1 governed by this License along with a term that is a further\f3\par -\f1 restriction, you may remove that term. If a license document contains\f3\par -\f1 a further restriction but permits relicensing or conveying under this\f3\par -\f1 License, you may add to a covered work material governed by the terms\f3\par -\f1 of that license document, provided that the further restriction does\f3\par -\f1 not survive such relicensing or conveying.\f3\par -\f1\par -\cf1 If you add terms to a covered work in accord with this section, you\par -must place, in the relevant source files, a statement of the\par -\cf0 additional terms that apply to those files, or a notice indicating\f3\par -\f1 where to find the applicable terms.\f3\par -\f1\par -\cf1 Additional terms, permissive or non-permissive, may be stated in the\par -form of a separately written license, or stated as exceptions;\par -\cf0 the above requirements apply either way.\f3\par -\f1\par -\cf1 8. Termination.\par -\cf0\par -\cf1 You may not propagate or modify a covered work except as expressly\par -provided under this License. Any attempt otherwise to propagate or\par -\cf0 modify it is void, and will automatically terminate your rights under\f3\par -\f1 this License (including any patent licenses granted under the third\f3\par -\f1 paragraph of section 11).\f3\par -\f1\par -\cf1 However, if you cease all violation of this License, then your\par -license from a particular copyright holder is reinstated (a)\par -\cf0 provisionally, unless and until the copyright holder explicitly and\f3\par -\f1 finally terminates your license, and (b) permanently, if the copyright\f3\par -\f1 holder fails to notify you of the violation by some reasonable means\f3\par -\f1 prior to 60 days after the cessation.\f3\par -\f1\par -\cf1 Moreover, your license from a particular copyright holder is\par -reinstated permanently if the copyright holder notifies you of the\par -\cf0 violation by some reasonable means, this is the first time you have\f3\par -\f1 received notice of violation of this License (for any work) from that\f3\par -\f1 copyright holder, and you cure the violation prior to 30 days after\f3\par -\f1 your receipt of the notice.\f3\par -\f1\par -\cf1 Termination of your rights under this section does not terminate the\par -licenses of parties who have received copies or rights from you under\par -\cf0 this License. If your rights have been terminated and not permanently\f3\par -\f1 reinstated, you do not qualify to receive new licenses for the same\f3\par -\f1 material under section 10.\f3\par -\f1\par -\cf1 9. Acceptance Not Required for Having Copies.\par -\cf0\par -\cf1 You are not required to accept this License in order to receive or\par -run a copy of the Program. Ancillary propagation of a covered work\par -\cf0 occurring solely as a consequence of using peer-to-peer transmission\f3\par -\f1 to receive a copy likewise does not require acceptance. However,\f3\par -\f1 nothing other than this License grants you permission to propagate or\f3\par -\f1 modify any covered work. These actions infringe copyright if you do\f3\par -\f1 not accept this License. Therefore, by modifying or propagating a\f3\par -\f1 covered work, you indicate your acceptance of this License to do so.\f3\par -\f1\par -\cf1 10. Automatic Licensing of Downstream Recipients.\par -\cf0\par -\cf1 Each time you convey a covered work, the recipient automatically\par -receives a license from the original licensors, to run, modify and\par -\cf0 propagate that work, subject to this License. You are not responsible\f3\par -\f1 for enforcing compliance by third parties with this License.\f3\par -\f1\par -\cf1 An "entity transaction" is a transaction transferring control of an\par -organization, or substantially all assets of one, or subdividing an\par -\cf0 organization, or merging organizations. If propagation of a covered\f3\par -\f1 work results from an entity transaction, each party to that\f3\par -\f1 transaction who receives a copy of the work also receives whatever\f3\par -\f1 licenses to the work the party's predecessor in interest had or could\f3\par -\f1 give under the previous paragraph, plus a right to possession of the\f3\par -\f1 Corresponding Source of the work from the predecessor in interest, if\f3\par -\f1 the predecessor has it or can get it with reasonable efforts.\f3\par -\f1\par -\cf1 You may not impose any further restrictions on the exercise of the\par -rights granted or affirmed under this License. For example, you may\par -\cf0 not impose a license fee, royalty, or other charge for exercise of\f3\par -\f1 rights granted under this License, and you may not initiate litigation\f3\par -\f1 (including a cross-claim or counterclaim in a lawsuit) alleging that\f3\par -\f1 any patent claim is infringed by making, using, selling, offering for\f3\par -\f1 sale, or importing the Program or any portion of it.\f3\par -\f1\par -\cf1 11. Patents.\par -\cf0\par -\cf1 A "contributor" is a copyright holder who authorizes use under this\par -License of the Program or a work on which the Program is based. The\par -\cf0 work thus licensed is called the contributor's "contributor version".\f3\par -\f1\par -\cf1 A contributor's "essential patent claims" are all patent claims\par -owned or controlled by the contributor, whether already acquired or\par -\cf0 hereafter acquired, that would be infringed by some manner, permitted\f3\par -\f1 by this License, of making, using, or selling its contributor version,\f3\par -\f1 but do not include claims that would be infringed only as a\f3\par -\f1 consequence of further modification of the contributor version. For\f3\par -\f1 purposes of this definition, "control" includes the right to grant\f3\par -\f1 patent sublicenses in a manner consistent with the requirements of\f3\par -\f1 this License.\f3\par -\f1\par -\cf1 Each contributor grants you a non-exclusive, worldwide, royalty-free\par -patent license under the contributor's essential patent claims, to\par -\cf0 make, use, sell, offer for sale, import and otherwise run, modify and\f3\par -\f1 propagate the contents of its contributor version.\f3\par -\f1\par -\cf1 In the following three paragraphs, a "patent license" is any express\par -agreement or commitment, however denominated, not to enforce a patent\par -\cf0 (such as an express permission to practice a patent or covenant not to\f3\par -\f1 sue for patent infringement). To "grant" such a patent license to a\f3\par -\f1 party means to make such an agreement or commitment not to enforce a\f3\par -\f1 patent against the party.\f3\par -\f1\par -\cf1 If you convey a covered work, knowingly relying on a patent license,\par -and the Corresponding Source of the work is not available for anyone\par -\cf0 to copy, free of charge and under the terms of this License, through a\f3\par -\f1 publicly available network server or other readily accessible means,\f3\par -\f1 then you must either (1) cause the Corresponding Source to be so\f3\par -\f1 available, or (2) arrange to deprive yourself of the benefit of the\f3\par -\f1 patent license for this particular work, or (3) arrange, in a manner\f3\par -\f1 consistent with the requirements of this License, to extend the patent\f3\par -\f1 license to downstream recipients. "Knowingly relying" means you have\f3\par -\f1 actual knowledge that, but for the patent license, your conveying the\f3\par -\f1 covered work in a country, or your recipient's use of the covered work\f3\par -\f1 in a country, would infringe one or more identifiable patents in that\f3\par -\f1 country that you have reason to believe are valid.\f3\par -\f1\par -\cf1 If, pursuant to or in connection with a single transaction or\par -arrangement, you convey, or propagate by procuring conveyance of, a\par -\cf0 covered work, and grant a patent license to some of the parties\f3\par -\f1 receiving the covered work authorizing them to use, propagate, modify\f3\par -\f1 or convey a specific copy of the covered work, then the patent license\f3\par -\f1 you grant is automatically extended to all recipients of the covered\f3\par -\f1 work and works based on it.\f3\par -\f1\par -\cf1 A patent license is "discriminatory" if it does not include within\par -the scope of its coverage, prohibits the exercise of, or is\par -\cf0 conditioned on the non-exercise of one or more of the rights that are\f3\par -\f1 specifically granted under this License. You may not convey a covered\f3\par -\f1 work if you are a party to an arrangement with a third party that is\f3\par -\f1 in the business of distributing software, under which you make payment\f3\par -\f1 to the third party based on the extent of your activity of conveying\f3\par -\f1 the work, and under which the third party grants, to any of the\f3\par -\f1 parties who would receive the covered work from you, a discriminatory\f3\par -\f1 patent license (a) in connection with copies of the covered work\f3\par -\f1 conveyed by you (or copies made from those copies), or (b) primarily\f3\par -\f1 for and in connection with specific products or compilations that\f3\par -\f1 contain the covered work, unless you entered into that arrangement,\f3\par -\f1 or that patent license was granted, prior to 28 March 2007.\f3\par -\f1\par -\cf1 Nothing in this License shall be construed as excluding or limiting\par -any implied license or other defenses to infringement that may\par -\cf0 otherwise be available to you under applicable patent law.\f3\par -\f1\par -\cf1 12. No Surrender of Others' Freedom.\par -\cf0\par -\cf1 If conditions are imposed on you (whether by court order, agreement or\par -otherwise) that contradict the conditions of this License, they do not\par -\cf0 excuse you from the conditions of this License. If you cannot convey a\f3\par -\f1 covered work so as to satisfy simultaneously your obligations under this\f3\par -\f1 License and any other pertinent obligations, then as a consequence you may\f3\par -\f1 not convey it at all. For example, if you agree to terms that obligate you\f3\par -\f1 to collect a royalty for further conveying from those to whom you convey\f3\par -\f1 the Program, the only way you could satisfy both those terms and this\f3\par -\f1 License would be to refrain entirely from conveying the Program.\f3\par -\f1\par -\cf1 13. Remote Network Interaction; Use with the GNU General Public License.\par -\cf0\par -\cf1 Notwithstanding any other provision of this License, if you modify the\par -Program, your modified version must prominently offer all users\par -\cf0 interacting with it remotely through a computer network (if your version\f3\par -\f1 supports such interaction) an opportunity to receive the Corresponding\f3\par -\f1 Source of your version by providing access to the Corresponding Source\f3\par -\f1 from a network server at no charge, through some standard or customary\f3\par -\f1 means of facilitating copying of software. This Corresponding Source\f3\par -\f1 shall include the Corresponding Source for any work covered by version 3\f3\par -\f1 of the GNU General Public License that is incorporated pursuant to the\f3\par -\f1 following paragraph.\f3\par -\f1\par -\cf1 Notwithstanding any other provision of this License, you have\par -permission to link or combine any covered work with a work licensed\par -\cf0 under version 3 of the GNU General Public License into a single\f3\par -\f1 combined work, and to convey the resulting work. The terms of this\f3\par -\f1 License will continue to apply to the part which is the covered work,\f3\par -\f1 but the work with which it is combined will remain governed by version\f3\par -\f1 3 of the GNU General Public License.\f3\par -\f1\par -\cf1 14. Revised Versions of this License.\par -\cf0\par -\cf1 The Free Software Foundation may publish revised and/or new versions of\par -the GNU Affero General Public License from time to time. Such new versions\par -\cf0 will be similar in spirit to the present version, but may differ in detail to\f3\par -\f1 address new problems or concerns.\f3\par -\f1\par -\cf1 Each version is given a distinguishing version number. If the\par -Program specifies that a certain numbered version of the GNU Affero General\par -\cf0 Public License "or any later version" applies to it, you have the\f3\par -\f1 option of following the terms and conditions either of that numbered\f3\par -\f1 version or of any later version published by the Free Software\f3\par -\f1 Foundation. If the Program does not specify a version number of the\f3\par -\f1 GNU Affero General Public License, you may choose any version ever published\f3\par -\f1 by the Free Software Foundation.\f3\par -\f1\par -\cf1 If the Program specifies that a proxy can decide which future\par -versions of the GNU Affero General Public License can be used, that proxy's\par -\cf0 public statement of acceptance of a version permanently authorizes you\f3\par -\f1 to choose that version for the Program.\f3\par -\f1\par -\cf1 Later license versions may give you additional or different\par -permissions. However, no additional obligations are imposed on any\par -\cf0 author or copyright holder as a result of your choosing to follow a\f3\par -\f1 later version.\f3\par -\f1\par -\cf1 15. Disclaimer of Warranty.\par -\cf0\par -\cf1 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\par -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\par -\cf0 HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY\f3\par -\f1 OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\f3\par -\f1 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\f3\par -\f1 PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\f3\par -\f1 IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\f3\par -\f1 ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\f3\par -\f1\par -\cf1 16. Limitation of Liability.\par -\cf0\par -\cf1 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\par -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\par -\cf0 THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\f3\par -\f1 GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\f3\par -\f1 USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\f3\par -\f1 DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\f3\par -\f1 PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\f3\par -\f1 EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\f3\par -\f1 SUCH DAMAGES.\f3\par -\f1\par -\cf1 17. Interpretation of Sections 15 and 16.\par -\cf0\par -\cf1 If the disclaimer of warranty and limitation of liability provided\par -above cannot be given local legal effect according to their terms,\par -\cf0 reviewing courts shall apply local law that most closely approximates\f3\par -\f1 an absolute waiver of all civil liability in connection with the\f3\par -\f1 Program, unless a warranty or assumption of liability accompanies a\f3\par -\f1 copy of the Program in return for a fee.\f3\par -\b\f1\par ----------------------------------------\b0\f3\par -\pard\sb120\sa120\f1 In addition to AGPLv3, as a special exception, the copyright holders give permission to link the code of portions of this program with the the following party libraries listed under section \ldblquote 3'rd party libraries\rdblquote according to conditions as described in each individual license. You must obey the AGPLv3 in all respects for all of the code used other than the items listed below. \par -\pard\sb120\sa120\sl276\slmult1\lang29\i\fs28 Fat Cow Icons\lang1033\par -\pard\sa200\sl276\slmult1\i0\f0\fs20 Creative Commons Attribution License 3.0 License\f1\par -\pard\f0 CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.\fs24\par -\fs20 License\fs24\par -\fs20 THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.\fs24\par -\fs20 BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.\fs24\par -\fs20 1. Definitions\fs24\par -\fs20 "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with one or more other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.\fs24\par -\fs20 "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.\fs24\par -\fs20 "Licensor" means the individual, individuals, entity or entities that offers the Work under the terms of this License.\fs24\par -\fs20 "Original Author" means the individual, individuals, entity or entities who created the Work.\fs24\par -\fs20 "Work" means the copyrightable work of authorship offered under the terms of this License.\fs24\par -\fs20 "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.\fs24\par -\fs20 2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.\fs24\par -\par -\fs20 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:\fs24\par -\fs20 to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;\fs24\par -\fs20 to create and reproduce Derivative Works provided that any such Derivative Work, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";;\fs24\par -\fs20 to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;\fs24\par -\fs20 to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works.\fs24\par -\fs20 For the avoidance of doubt, where the Work is a musical composition:\fs24\par -\fs20 Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or, in the event that Licensor is a member of a performance rights society (e.g. ASCAP, BMI, SESAC), via that society, royalties for the public performance or public digital performance (e.g. webcast) of the Work.\fs24\par -\fs20 Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions).\fs24\par -\fs20 Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions).\fs24\par -\fs20 The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.\fs24\par -\fs20 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:\fs24\par -\par -\fs20 You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of a recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. When You distribute, publicly display, publicly perform, or publicly digitally perform the Work, You may not impose any technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by Section 4(b), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by Section 4(b), as requested.\fs24\par -\fs20 If You distribute, publicly display, publicly perform, or publicly digitally perform the Work (as defined in Section 1 above) or any Derivative Works (as defined in Section 1 above) or Collective Works (as defined in Section 1 above), You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, consistent with Section 3(b) in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(b) may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear, if a credit for all contributing authors of the Derivative Work or Collective Work appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.\fs24\par -\fs20 5. Representations, Warranties and Disclaimer\fs24\par -\fs20 UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND ONLY TO THE EXTENT OF ANY RIGHTS HELD IN THE LICENSED WORK BY THE LICENSOR. THE LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MARKETABILITY, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.\fs24\par -\fs20 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\fs24\par -\fs20 7. Termination\fs24\par -\fs20 This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works (as defined in Section 1 above) or Collective Works (as defined in Section 1 above) from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.\fs24\par -\fs20 Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.\fs24\par -\fs20 8. Miscellaneous\fs24\par -\fs20 Each time You distribute or publicly digitally perform the Work (as defined in Section 1 above) or a Collective Work (as defined in Section 1 above), the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.\fs24\par -\fs20 Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.\fs24\par -\fs20 If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.\fs24\par -\fs20 No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.\fs24\par -\fs20 This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.\fs24\par -\fs20 Creative Commons Notice\fs24\par -\fs20 Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.\fs24\par -\fs20 Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of the License.\fs24\par -\pard\sa200\sl276\slmult1\fs20 Creative Commons may be contacted at \lang255{\field{\*\fldinst{HYPERLINK "http://creativecommons.org/"}}{\fldrslt{\ul\cf2 http://creativecommons.org/}}}\lang1033\f0\fs20 .\fs24\par -\pard\sb120\sa120\i\f1\fs28 Microsoft SQL Server Compact 3.5\par -\b\i0\fs20 MICROSOFT SOFTWARE LICENSE TERMS\line MICROSOFT SQL SERVER COMPACT 3.5\par -\b0 These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft\par -\pard\fi-363\li720\sb120\sa120\tx720\f4\fs24\'b7\f1\tab\fs20 updates,\fs24\par -\pard\fi-363\li720\sb120\sa120\f4\'b7\f1\tab\fs20 supplements,\fs24\par -\pard\f4\'b7\f1\tab\fs20 Internet-based services, and \f0\fs24\par -\f4\'b7\f1\tab\fs20 support services\f0\fs24\par -\pard\sb120\sa120\f1\fs20 for this software, unless other terms accompany those items. If so, those terms apply.\par -\b BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.\par -If you comply with these license terms, you have the rights below.\par -\pard\fi-357\li357\sb120\sa120\tx357\tx360 1.\tab INSTALLATION AND USE RIGHTS. \b0 You may install and use any number of copies of the software on your devices.\fs24\par -\pard\b\fs20 2.\tab ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.\b0\f0\fs24\par -\pard\fi-363\li720\sb120\sa120\b\f1\fs20 a.\tab Distributable Code.\b0 The software contains code that you are permitted to distribute in programs you develop if you comply with the terms below.\fs24\par -\pard\s3\fi-357\li1077\sb120\sa120\tx1077\tx1440\b\fs20 i.\tab Right to Use and Distribute.\b0 The code and text files listed below are \ldblquote Distributable Code.\rdblquote\fs24\par -\pard\fi-358\li1435\sb120\sa120\tx1435\tx1437\ul\f4\'b7\f1\tab\fs20 REDIST.TXT Files\ulnone . You may copy and distribute the object code form of code listed in REDIST.TXT files.\fs24\par -\pard\fi-358\li1435\sb120\sa120\ul\f4\'b7\f1\tab\fs20 Third Party Distribution\ulnone . You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs.\fs24\par -\pard\s3\fi-357\li1077\sb120\sa120\tx1077\tx1440\b\fs20 ii.\tab Distribution Requirements\b0 . For any Distributable Code you distribute, you must\fs24\par -\pard\fi-358\li1435\sb120\sa120\tx1435\tx1437\f4\'b7\f1\tab\fs20 add significant primary functionality to it in your programs;\fs24\par -\pard\fi-358\li1435\sb120\sa120\f4\'b7\f1\tab\fs20 require distributors and external end users to agree to terms that protect it at least as much as this agreement; \fs24\par -\pard\f4\'b7\f1\tab\fs20 display your valid copyright notice on your programs; and\f0\fs24\par -\f4\'b7\f1\tab\fs20 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\rquote fees, related to the distribution or use of your programs.\f0\fs24\par -\pard\s3\fi-357\li1077\sb120\sa120\tx1077\tx1440\b\f1\fs20 iii.\tab Distribution Restrictions. \b0 You may not\fs24\par -\pard\fi-358\li1435\sb120\sa120\tx1435\tx1437\f4\'b7\f1\tab\fs20 alter any copyright, trademark or patent notice in the Distributable Code; \fs24\par -\pard\fi-358\li1435\sb120\sa120\f4\'b7\f1\tab\fs20 use Microsoft\rquote s trademarks in your programs\rquote names or in a way that suggests your programs come from or are endorsed by Microsoft; \fs24\par -\pard\f4\'b7\f1\tab\fs20 distribute Distributable Code to run on a platform other than the Windows platform;\f0\fs24\par -\f4\'b7\f1\tab\fs20 include Distributable Code in malicious, deceptive or unlawful programs; or\f0\fs24\par -\f4\'b7\f1\tab\fs20 modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that\f0\fs24\par -\pard\fi-357\li1792\sb120\sa120\tx1792\tx1795\f4\'b7\f1\tab\fs20 the code be disclosed or distributed in source code form; or \fs24\par -\pard\fi-357\li1792\sb120\sa120\f4\'b7\f1\tab\fs20 others have the right to modify it.\fs24\par -\pard\fi-357\li357\sb120\sa120\b\fs20 3.\tab\caps Scope of License\caps0 .\b0 The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not\fs24\par -\pard\fi-363\li720\sb120\sa120\f4\'b7\f1\tab\fs20 work around any technical limitations in the software;\fs24\par -\pard\f4\'b7\f1\tab\fs20 reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;\f0\fs24\par -\f4\'b7\f1\tab\fs20 make more copies of the software than specified in this agreement or allowed by applicable law, despite this limitation;\f0\fs24\par -\f4\'b7\f1\tab\fs20 publish the software for others to copy;\f0\fs24\par -\f4\'b7\f1\tab\fs20 rent, lease or lend the software; or\f0\fs24\par -\f4\'b7\f1\tab\fs20 use the software for commercial software hosting services.\f0\fs24\par -\pard\fi-357\li357\sb120\sa120\tx357\tx360\b\f1\fs20 4.\tab BACKUP COPY.\b0 You may make one backup copy of the software. You may use it only to reinstall the software.\fs24\par -\pard\fi-357\li357\sb120\sa120\b\fs20 5.\tab DOCUMENTATION.\b0 Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.\fs24\par -\pard\b\fs20 6.\tab TRANSFER TO A THIRD PARTY.\b0 The first user of the software may transfer it and this agreement directly to a third party. Before the transfer, that party must agree that this agreement applies to the transfer and use of the software. The first user must uninstall the software before transferring it separately from the device. The first user may not retain any copies.\f0\fs24\par -\pard\fi-357\li357\b\f1\fs20 7.\tab\caps Export Restrictions\caps0 .\b0 The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see \f0\fs24{\field{\*\fldinst{HYPERLINK "http://www.microsoft.com/exporting" }}{\fldrslt{\cf2\lang255\ul\f1\fs20 www.microsoft.com/exporting\f1 }}}\cf0\lang1033\ulnone\f1\fs20 .\f0\fs24\par -\pard\fi-357\li357\sb120\sa120\b\f1\fs20 8.\tab\caps SUPPORT SERVICES.\caps0 \b0 Because this software is \ldblquote as is,\rdblquote we may not provide support services for it.\fs24\par -\pard\b\fs20 9.\tab\caps Entire Agreement.\b0\caps0 This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.\f0\fs24\par -\pard\keepn\fi-360\li360\sb120\sa120\b\f1\fs20 10.\tab\cf1\caps Applicable Law\caps0 .\cf0\b0\fs24\par -\pard\fi-363\li720\sb120\sa120\tx720\b\fs20 a.\tab United States.\b0 If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.\fs24\par -\pard\fi-363\li720\sb120\sa120\b\fs20 b.\tab Outside the United States.\b0 If you acquired the software in any other country, the laws of that country apply.\fs24\par -\pard\fi-357\li357\sb120\sa120\tx357\tx360\b\fs20 11.\tab\caps Legal Effect.\b0\caps0 This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.\fs24\par -\pard\fi-357\li357\sb120\sa120\b\fs20 12.\tab\caps Disclaimer of Warranty.\caps0 \caps The software is licensed \ldblquote as-is.\rdblquote You bear the risk of using it. Microsoft gives no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this agreement cannot change. To the extent permitted under your local laws, Microsoft excludes the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\b0\caps0\fs24\par -\pard\fi-360\li360\sb120\sa120\tx360\b\fs20 13.\tab\caps Limitation on and Exclusion of Remedies and Damages. You can recover from Microsoft and its suppliers only direct damages up to U.S. $5.00. You cannot recover any other damages, including consequential, lost profits, special, indirect or incidental damages.\b0\caps0\fs24\par -\pard\li357\sb120\sa120\fs20 This limitation applies to\par -\pard\fi-363\li720\sb120\sa120\tx720\f4\fs24\'b7\f1\tab\fs20 anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and\fs24\par -\pard\fi-363\li720\sb120\sa120\f4\'b7\f1\tab\fs20 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.\fs24\par -\pard\li360\sb120\sa120\fs20 It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.\par -\pard\sb120\sa120\i\fs28 OpenSSL\par -\i0\fs20 Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved.\par -\pard Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\f0\fs24\par - \f1\fs20 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. \f0\fs24\par - \f1\fs20 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 ith the distribution.\f0\fs24\par - \f1\fs20 3. All advertising materials mentioning features or use of this software must display the following acknowledgment:\f0\fs24\par -\pard\sb120\sa120 "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (\lang255\f1\fs20{\field{\*\fldinst{HYPERLINK "http://www.OpenSSL.org/"}}{\fldrslt{\ul\cf2 http://www.OpenSSL.org/}}}\lang1033\f1\fs20 )"\f0\fs24\par -\f1\fs20 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact licensing@OpenSSL.org.\par -\pard\f0\fs24 \f1\fs20 5. Products derived from this software may not be called "OpenSSL" nor may "OpenSSL" appear in their names without prior written permission of the OpenSSL Project.\f0\fs24\par - \f1\fs20 6. Redistributions of any form whatsoever must retain the following acknowledgment:\f0\fs24\par -\pard\sb120\sa120 "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (\lang255\f1\fs20{\field{\*\fldinst{HYPERLINK "http://www.OpenSSL.org/"}}{\fldrslt{\ul\cf2 http://www.OpenSSL.org/}}}\lang1033\f1\fs20 )" \f0\fs24\par -\f1\fs20 THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY EXPRESSED 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 OpenSSL PROJECT OR ITS 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.\par -\pard This product includes cryptographic software written by Eric Young (\f0\fs24{\field{\*\fldinst{HYPERLINK "mailto:eay@cryptsoft.com" }}{\fldrslt{\cf2\lang255\ul\f1\fs20 eay@cryptsoft.com\f1 }}}\cf0\lang1033\ulnone\f1\fs20 ). This product includes software written by Tim Hudson (\f0\fs24{\field{\*\fldinst{HYPERLINK "mailto:tjh@cryptsoft.com" }}{\fldrslt{\cf2\lang255\ul\f1\fs20 tjh@cryptsoft.com\f1 }}}\cf0\lang1033\ulnone\f1\fs20 ).\f0\fs24\par -\par -\pard\sb120\sa120\i\f1\fs28 PostgreSQL interface\par -\pard\sa200\sl276\slmult1\i0\f0\fs20 PostgreSQL Database Management System (formerly known as Postgres, then as Postgres95)\f1\par -\pard\f0 Portions Copyright (c) 1996-2010, The PostgreSQL Global Development Group\fs24\par -\fs20 Portions Copyright (c) 1994, The Regents of the University of California\fs24\par -\fs20 Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.\fs24\par -\fs20 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\fs24\par -\fs20 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\fs22\par -\fs24\par -\pard\nowidctlpar\sb120\sa120\i\fs28 7-Zip Command line version\line\pard\i0\fs20\par - 7-Zip Copyright (C) 1999-2010 Igor Pavlov.\par -\par - 7za.exe is distributed under the GNU LGPL license\par -\par - Notes: \par - You can use 7-Zip on any computer, including a computer in a commercial \par - organization. You don't need to register or pay for 7-Zip.\par -\par -\par - GNU LGPL information\par - --------------------\par -\par - This library is free software; you can redistribute it and/or\par - modify it under the terms of the GNU Lesser General Public\par - License as published by the Free Software Foundation; either\par - version 2.1 of the License, or (at your option) any later version.\par -\par - This library is distributed in the hope that it will be useful,\par - but WITHOUT ANY WARRANTY; without even the implied warranty of\par - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\par - Lesser General Public License for more details.\par -\par - You can receive a copy of the GNU Lesser General Public License from \par - {\field{\*\fldinst{HYPERLINK "http://www.gnu.org/"}}{\fldrslt{\ul\cf2 http://www.gnu.org/}}}\f0\fs20\par -\fs24\par -\pard\sa200\sl276\slmult1\lang1053\b Attributions\b0\fs20\par -\pard{\pntext\f5\'B7\tab}{\*\pn\pnlvlblt\pnf5\pnindent0{\pntxtb\'B7}}\fi-360\li720\sa200\sl276\slmult1\lang1033 This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit ({\field{\*\fldinst{HYPERLINK "http://www.OpenSSL.org/"}}{\fldrslt{\ul\cf2 http://www.OpenSSL.org/}}}\f0\fs20 )\f1\par -\f0{\pntext\f5\'B7\tab}This product includes icons from the Fat Cow Icon library, available under the Creative Commons Attribution 3.0 license at {\field{\*\fldinst{HYPERLINK "http://www.fatcow.com/free-icons/"}}{\fldrslt{\ul\cf2 http://www.fatcow.com/free-icons/}}}\f0\fs20 .\f1\par -\f0{\pntext\f5\'B7\tab}This product uses 7-Zip, an open source compression library. 7-Zip is licensed according to GNU LGPL (see above). 7-Zip can be found on {\field{\*\fldinst{HYPERLINK "http://www.7-zip.org"}}{\fldrslt{\ul\cf2 http://www.7-zip.org}}}\f0\fs20 .\f1\par -} - \ No newline at end of file +{\rtf1\ansi\deff3\adeflang1025 +{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\fswiss\fprq2\fcharset0 Tahoma;}{\f4\fnil\fprq0\fcharset128 OpenSymbol{\*\falt Arial Unicode MS};}{\f5\fswiss\fprq2\fcharset128 Tahoma;}{\f6\fmodern\fprq1\fcharset0 Courier New;}{\f7\fnil\fprq0\fcharset2 Wingdings;}{\f8\fnil\fprq0\fcharset2 Symbol;}{\f9\fnil\fprq0\fcharset0 Segoe UI Light{\*\falt Segoe UI};}{\f10\fnil\fprq0\fcharset0 Segoe UI{\*\falt Tahoma};}{\f11\fnil\fprq2\fcharset0 Microsoft YaHei;}{\f12\fnil\fprq2\fcharset0 SimSun;}{\f13\fnil\fprq2\fcharset0 Mangal;}{\f14\fnil\fprq0\fcharset128 Mangal;}} +{\colortbl;\red0\green0\blue0;\red123\green79\blue157;\red0\green0\blue255;\red0\green0\blue128;\red37\green51\blue64;\red128\green128\blue128;} +{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053 Standard;} +{\s1\sbasedon17\snext18\ilvl0\outlinelevel0\sb240\sa120\keepn\b\hich\af12\dbch\af13\afs48\ab\loch\f0\fs48 Rubrik 1;} +{\*\cs15\snext15\cf4\ul\ulc0\langfe255\lang255\lang255 Internetl�nk;} +{\*\cs16\snext16\loch\f8 RTF_Num 2 1;} +{\s17\sbasedon0\snext18\sb240\sa120\keepn\hich\af11\dbch\af13\afs28\loch\f2\fs28 Rubrik;} +{\s18\sbasedon0\snext18\sb0\sa120 Br�dtext;} +{\s19\sbasedon18\snext19\sb0\sa120\dbch\af14 Lista;} +{\s20\sbasedon0\snext20\sb120\sa120\noline\i\dbch\af14\afs24\ai\fs24 Bildtext;} +{\s21\sbasedon0\snext21\noline\dbch\af14 F�rteckning;} +{\s22\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053 heading 1;} +{\s23\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053 heading 2;} +{\s24\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053 heading 3;} +}{\*\listtable{\list\listtemplateid1 +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\'b7;}{\levelnumbers;}\fi0\li0}\listid1} +{\list\listtemplateid2 +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'00;}{\levelnumbers;}\fi-432\li432} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'00;}{\levelnumbers;}\fi-576\li576} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'00;}{\levelnumbers;}\fi-720\li720} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'00;}{\levelnumbers;}\fi-864\li864} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'00;}{\levelnumbers;}\fi-1008\li1008} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'00;}{\levelnumbers;}\fi-1152\li1152} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'00;}{\levelnumbers;}\fi-1296\li1296} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'00;}{\levelnumbers;}\fi-1440\li1440} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'00;}{\levelnumbers;}\fi-1584\li1584}\listid2} +}{\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment OpenOffice}{\vern4100}}\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720\deftab720 + +{\*\pgdsctbl +{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Standard;}} +\formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc +\pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\b\hich\af5\afs28\ab\loch\f8\rtlch \ltrch\loch\fs28\lang1033\loch\f5 +hMailServer License Terms} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\b\hich\af5\ab\rtlch \ltrch\loch\lang1033\loch\f5 +Preamble} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This is a legal agreement between you and the author of this software, Martin Knafve. By installing this software, hMailServer, you agree to be bound by the terms of this agreement to the maximum extent permitted by applicable law.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +hMailServer is provided "as is" without any warranties of merchantability and fitness for a particular purpose. You agree to hold the author harmless for any result that may occur related to the use of this software.\line } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The hMailServer source code is licensed under AGPLv3, with exception for 3'rd party libraries licensed otherwise. By agreeing to this license you agree to be bound both by the AGPLv3 terms and the 3'rd party component licenses. } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang29\loch\f5 +The main points subject to the terms of the License are:\line } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sl276\slmult1\li360\ri0\lin360\rin0\fi-360\sb0\sa200{\fs20\dbch\af4\afs20\hich\af5\rtlch \ltrch\dbch\loch\f5\lang29 +\u12539\'fb}{\hich\af5\dbch\af4\afs20\rtlch \ltrch\loch\fs20\lang29\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang29\loch\f5 +hMailServer may be used, free of charge, both in commercial and non-commercial environments. } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sl276\slmult1\li360\ri0\lin360\rin0\fi-360\sb0\sa200{\fs20\dbch\af4\afs20\hich\af5\rtlch \ltrch\dbch\loch\f5\lang1033 +\u12539\'fb}{\hich\af5\dbch\af4\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang29\loch\f5 +The hMailServer source code may be modified to create derivate works. You may not redistribute or give users access to functionality of your derivate works over a network without also providing them with the source code, according to AGPLv3 and licenses for 3'rd party libraries. In other words, you may not create closed-source software based on hMailServer.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sl276\slmult1\sb0\sa200{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang29\loch\f5 +For details, see the full licensing terms below.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\b\hich\af5\dbch\af5\ab\rtlch \ltrch\loch\lang1033\loch\f5 +License} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\cf1\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af6\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +GNU AFFERO GENERAL PUBLIC LICENSE} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Version 3, 19 November 2007} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Copyright (C) 2007 Free Software Foundation, Inc. <}{{\field{\*\fldinst HYPERLINK "http://fsf.org/" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +http://fsf.org/}{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}}>} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Everyone is permitted to copy and distribute verbatim copies} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +of this license document, but changing it is not allowed.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Preamble} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The GNU Affero General Public License is a free, copyleft license for} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +software and other kinds of works, specifically designed to ensure} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +cooperation with the community in the case of network server software.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The licenses for most software and other practical works are designed} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to take away your freedom to share and change the works. By contrast,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +our General Public Licenses are intended to guarantee your freedom to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +share and change all versions of a program--to make sure it remains free} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +software for all its users.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +When we speak of free software, we are referring to freedom, not} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +price. Our General Public Licenses are designed to make sure that you} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +have the freedom to distribute copies of free software (and charge for} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +them if you wish), that you receive source code or can get it if you} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +want it, that you can change the software or use pieces of it in new} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +free programs, and that you know you can do these things.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Developers that use our General Public Licenses protect your rights} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +with two steps: (1) assert copyright on the software, and (2) offer} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +you this License which gives you legal permission to copy, distribute} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +and/or modify the software.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +A secondary benefit of defending all users' freedom is that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +improvements made in alternate versions of the program, if they} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +receive widespread use, become available for other developers to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +incorporate. Many developers of free software are heartened and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +encouraged by the resulting cooperation. However, in the case of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +software used on network servers, this result may fail to come about.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The GNU General Public License permits making a modified version and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +letting the public access it on a server without ever releasing its} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +source code to the public.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The GNU Affero General Public License is designed specifically to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +ensure that, in such cases, the modified source code becomes available} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to the community. It requires the operator of a network server to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +provide the source code of the modified version running there to the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +users of that server. Therefore, public use of a modified version, on} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a publicly accessible server, gives the public access to the source} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +code of the modified version.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +An older license, called the Affero General Public License and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +published by Affero, was designed to accomplish similar goals. This is} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a different license, not a version of the Affero GPL, but Affero has} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +released a new version of the Affero GPL which permits relicensing under} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +this license.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The precise terms and conditions for copying, distribution and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +modification follow.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +TERMS AND CONDITIONS} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +0. Definitions.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"This License" refers to version 3 of the GNU Affero General Public License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"Copyright" also means copyright-like laws that apply to other kinds of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +works, such as semiconductor masks.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"The Program" refers to any copyrightable work licensed under this} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License. Each licensee is addressed as "you". "Licensees" and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"recipients" may be individuals or organizations.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +To "modify" a work means to copy from or adapt all or part of the work} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +in a fashion requiring copyright permission, other than the making of an} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +exact copy. The resulting work is called a "modified version" of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +earlier work or a work "based on" the earlier work.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +A "covered work" means either the unmodified Program or a work based} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +on the Program.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +To "propagate" a work means to do anything with it that, without} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +permission, would make you directly or secondarily liable for} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +infringement under applicable copyright law, except executing it on a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +computer or modifying a private copy. Propagation includes copying,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +distribution (with or without modification), making available to the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +public, and in some countries other activities as well.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +To "convey" a work means any kind of propagation that enables other} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +parties to make or receive copies. Mere interaction with a user through} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a computer network, with no transfer of a copy, is not conveying.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +An interactive user interface displays "Appropriate Legal Notices"} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to the extent that it includes a convenient and prominently visible} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +feature that (1) displays an appropriate copyright notice, and (2)} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +tells the user that there is no warranty for the work (except to the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +extent that warranties are provided), that licensees may convey the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +work under this License, and how to view a copy of this License. If} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the interface presents a list of user commands or options, such as a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +menu, a prominent item in the list meets this criterion.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +1. Source Code.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The "source code" for a work means the preferred form of the work} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +for making modifications to it. "Object code" means any non-source} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +form of a work.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +A "Standard Interface" means an interface that either is an official} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +standard defined by a recognized standards body, or, in the case of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +interfaces specified for a particular programming language, one that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +is widely used among developers working in that language.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The "System Libraries" of an executable work include anything, other} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +than the work as a whole, that (a) is included in the normal form of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +packaging a Major Component, but which is not part of that Major} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Component, and (b) serves only to enable use of the work with that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Major Component, or to implement a Standard Interface for which an} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +implementation is available to the public in source code form. A} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"Major Component", in this context, means a major essential component} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +(kernel, window system, and so on) of the specific operating system} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +(if any) on which the executable work runs, or a compiler used to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +produce the work, or an object code interpreter used to run it.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The "Corresponding Source" for a work in object code form means all} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the source code needed to generate, install, and (for an executable} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +work) run the object code and to modify the work, including scripts to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +control those activities. However, it does not include the work's} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +System Libraries, or general-purpose tools or generally available free} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +programs which are used unmodified in performing those activities but} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +which are not part of the work. For example, Corresponding Source} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +includes interface definition files associated with source files for} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the work, and the source code for shared libraries and dynamically} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +linked subprograms that the work is specifically designed to require,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +such as by intimate data communication or control flow between those} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +subprograms and other parts of the work.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The Corresponding Source need not include anything that users} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +can regenerate automatically from other parts of the Corresponding} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Source.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The Corresponding Source for a work in source code form is that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +same work.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +2. Basic Permissions.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +All rights granted under this License are granted for the term of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +copyright on the Program, and are irrevocable provided the stated} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +conditions are met. This License explicitly affirms your unlimited} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +permission to run the unmodified Program. The output from running a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +covered work is covered by this License only if the output, given its} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +content, constitutes a covered work. This License acknowledges your} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +rights of fair use or other equivalent, as provided by copyright law.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may make, run and propagate covered works that you do not} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +convey, without conditions so long as your license otherwise remains} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +in force. You may convey covered works to others for the sole purpose} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +of having them make modifications exclusively for you, or provide you} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +with facilities for running those works, provided that you comply with} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the terms of this License in conveying all material for which you do} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +not control copyright. Those thus making or running the covered works} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +for you must do so exclusively on your behalf, under your direction} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +and control, on terms that prohibit them from making any copies of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +your copyrighted material outside their relationship with you.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Conveying under any other circumstances is permitted solely under} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the conditions stated below. Sublicensing is not allowed; section 10} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +makes it unnecessary.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +3. Protecting Users' Legal Rights From Anti-Circumvention Law.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +No covered work shall be deemed part of an effective technological} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +measure under any applicable law fulfilling obligations under article} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +11 of the WIPO copyright treaty adopted on 20 December 1996, or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +similar laws prohibiting or restricting circumvention of such} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +measures.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +When you convey a covered work, you waive any legal power to forbid} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +circumvention of technological measures to the extent such circumvention} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +is effected by exercising rights under this License with respect to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the covered work, and you disclaim any intention to limit operation or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +modification of the work as a means of enforcing, against the work's} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +users, your or third parties' legal rights to forbid circumvention of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +technological measures.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +4. Conveying Verbatim Copies.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may convey verbatim copies of the Program's source code as you} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +receive it, in any medium, provided that you conspicuously and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +appropriately publish on each copy an appropriate copyright notice;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +keep intact all notices stating that this License and any} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +non-permissive terms added in accord with section 7 apply to the code;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +keep intact all notices of the absence of any warranty; and give all} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +recipients a copy of this License along with the Program.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may charge any price or no price for each copy that you convey,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +and you may offer support or warranty protection for a fee.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +5. Conveying Modified Source Versions.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may convey a work based on the Program, or the modifications to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +produce it from the Program, in the form of source code under the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +terms of section 4, provided that you also meet all of these conditions:} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a) The work must carry prominent notices stating that you modified} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +it, and giving a relevant date.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +b) The work must carry prominent notices stating that it is} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +released under this License and any conditions added under section} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +7. This requirement modifies the requirement in section 4 to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"keep intact all notices".} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +c) You must license the entire work, as a whole, under this} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License to anyone who comes into possession of a copy. This} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License will therefore apply, along with any applicable section 7} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +additional terms, to the whole of the work, and all its parts,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +regardless of how they are packaged. This License gives no} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +permission to license the work in any other way, but it does not} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +invalidate such permission if you have separately received it.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +d) If the work has interactive user interfaces, each must display} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Appropriate Legal Notices; however, if the Program has interactive} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +interfaces that do not display Appropriate Legal Notices, your} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +work need not make them do so.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +A compilation of a covered work with other separate and independent} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +works, which are not by their nature extensions of the covered work,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +and which are not combined with it such as to form a larger program,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +in or on a volume of a storage or distribution medium, is called an} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"aggregate" if the compilation and its resulting copyright are not} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +used to limit the access or legal rights of the compilation's users} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +beyond what the individual works permit. Inclusion of a covered work} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +in an aggregate does not cause this License to apply to the other} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +parts of the aggregate.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +6. Conveying Non-Source Forms.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may convey a covered work in object code form under the terms} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +of sections 4 and 5, provided that you also convey the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +machine-readable Corresponding Source under the terms of this License,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +in one of these ways:} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a) Convey the object code in, or embodied in, a physical product} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +(including a physical distribution medium), accompanied by the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Corresponding Source fixed on a durable physical medium} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +customarily used for software interchange.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +b) Convey the object code in, or embodied in, a physical product} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +(including a physical distribution medium), accompanied by a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +written offer, valid for at least three years and valid for as} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +long as you offer spare parts or customer support for that product} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +model, to give anyone who possesses the object code either (1) a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +copy of the Corresponding Source for all the software in the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +product that is covered by this License, on a durable physical} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +medium customarily used for software interchange, for a price no} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +more than your reasonable cost of physically performing this} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +conveying of source, or (2) access to copy the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Corresponding Source from a network server at no charge.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +c) Convey individual copies of the object code with a copy of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +written offer to provide the Corresponding Source. This} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +alternative is allowed only occasionally and noncommercially, and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +only if you received the object code with such an offer, in accord} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +with subsection 6b.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +d) Convey the object code by offering access from a designated} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +place (gratis or for a charge), and offer equivalent access to the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Corresponding Source in the same way through the same place at no} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +further charge. You need not require recipients to copy the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Corresponding Source along with the object code. If the place to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +copy the object code is a network server, the Corresponding Source} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +may be on a different server (operated by you or a third party)} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +that supports equivalent copying facilities, provided you maintain} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +clear directions next to the object code saying where to find the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Corresponding Source. Regardless of what server hosts the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Corresponding Source, you remain obligated to ensure that it is} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +available for as long as needed to satisfy these requirements.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +e) Convey the object code using peer-to-peer transmission, provided} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +you inform other peers where the object code and Corresponding} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Source of the work are being offered to the general public at no} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +charge under subsection 6d.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +A separable portion of the object code, whose source code is excluded} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +from the Corresponding Source as a System Library, need not be} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +included in conveying the object code work.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +A "User Product" is either (1) a "consumer product", which means any} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +tangible personal property which is normally used for personal, family,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +or household purposes, or (2) anything designed or sold for incorporation} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +into a dwelling. In determining whether a product is a consumer product,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +doubtful cases shall be resolved in favor of coverage. For a particular} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +product received by a particular user, "normally used" refers to a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +typical or common use of that class of product, regardless of the status} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +of the particular user or of the way in which the particular user} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +actually uses, or expects or is expected to use, the product. A product} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +is a consumer product regardless of whether the product has substantial} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +commercial, industrial or non-consumer uses, unless such uses represent} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the only significant mode of use of the product.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"Installation Information" for a User Product means any methods,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +procedures, authorization keys, or other information required to install} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +and execute modified versions of a covered work in that User Product from} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a modified version of its Corresponding Source. The information must} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +suffice to ensure that the continued functioning of the modified object} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +code is in no case prevented or interfered with solely because} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +modification has been made.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If you convey an object code work under this section in, or with, or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +specifically for use in, a User Product, and the conveying occurs as} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +part of a transaction in which the right of possession and use of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +User Product is transferred to the recipient in perpetuity or for a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +fixed term (regardless of how the transaction is characterized), the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Corresponding Source conveyed under this section must be accompanied} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +by the Installation Information. But this requirement does not apply} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +if neither you nor any third party retains the ability to install} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +modified object code on the User Product (for example, the work has} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +been installed in ROM).} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The requirement to provide Installation Information does not include a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +requirement to continue to provide support service, warranty, or updates} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +for a work that has been modified or installed by the recipient, or for} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the User Product in which it has been modified or installed. Access to a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +network may be denied when the modification itself materially and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +adversely affects the operation of the network or violates the rules and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +protocols for communication across the network.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Corresponding Source conveyed, and Installation Information provided,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +in accord with this section must be in a format that is publicly} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +documented (and with an implementation available to the public in} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +source code form), and must require no special password or key for} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +unpacking, reading or copying.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +7. Additional Terms.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"Additional permissions" are terms that supplement the terms of this} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License by making exceptions from one or more of its conditions.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Additional permissions that are applicable to the entire Program shall} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +be treated as though they were included in this License, to the extent} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +that they are valid under applicable law. If additional permissions} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +apply only to part of the Program, that part may be used separately} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +under those permissions, but the entire Program remains governed by} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +this License without regard to the additional permissions.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +When you convey a copy of a covered work, you may at your option} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +remove any additional permissions from that copy, or from any part of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +it. (Additional permissions may be written to require their own} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +removal in certain cases when you modify the work.) You may place} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +additional permissions on material, added by you to a covered work,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +for which you have or can give appropriate copyright permission.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Notwithstanding any other provision of this License, for material you} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +add to a covered work, you may (if authorized by the copyright holders of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +that material) supplement the terms of this License with terms:} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a) Disclaiming warranty or limiting liability differently from the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +terms of sections 15 and 16 of this License; or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +b) Requiring preservation of specified reasonable legal notices or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +author attributions in that material or in the Appropriate Legal} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Notices displayed by works containing it; or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +c) Prohibiting misrepresentation of the origin of that material, or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +requiring that modified versions of such material be marked in} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +reasonable ways as different from the original version; or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +d) Limiting the use for publicity purposes of names of licensors or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +authors of the material; or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +e) Declining to grant rights under trademark law for use of some} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +trade names, trademarks, or service marks; or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +f) Requiring indemnification of licensors and authors of that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +material by anyone who conveys the material (or modified versions of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +it) with contractual assumptions of liability to the recipient, for} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +any liability that these contractual assumptions directly impose on} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af6\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +those licensors and authors.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +All other non-permissive additional terms are considered "further} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +restrictions" within the meaning of section 10. If the Program as you} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +received it, or any part of it, contains a notice stating that it is} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +governed by this License along with a term that is a further} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +restriction, you may remove that term. If a license document contains} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a further restriction but permits relicensing or conveying under this} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License, you may add to a covered work material governed by the terms} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +of that license document, provided that the further restriction does} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +not survive such relicensing or conveying.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If you add terms to a covered work in accord with this section, you} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +must place, in the relevant source files, a statement of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +additional terms that apply to those files, or a notice indicating} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +where to find the applicable terms.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Additional terms, permissive or non-permissive, may be stated in the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +form of a separately written license, or stated as exceptions;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the above requirements apply either way.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +8. Termination.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may not propagate or modify a covered work except as expressly} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +provided under this License. Any attempt otherwise to propagate or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +modify it is void, and will automatically terminate your rights under} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +this License (including any patent licenses granted under the third} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +paragraph of section 11).} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +However, if you cease all violation of this License, then your} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +license from a particular copyright holder is reinstated (a)} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +provisionally, unless and until the copyright holder explicitly and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +finally terminates your license, and (b) permanently, if the copyright} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +holder fails to notify you of the violation by some reasonable means} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +prior to 60 days after the cessation.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Moreover, your license from a particular copyright holder is} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +reinstated permanently if the copyright holder notifies you of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +violation by some reasonable means, this is the first time you have} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +received notice of violation of this License (for any work) from that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +copyright holder, and you cure the violation prior to 30 days after} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +your receipt of the notice.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Termination of your rights under this section does not terminate the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +licenses of parties who have received copies or rights from you under} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +this License. If your rights have been terminated and not permanently} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +reinstated, you do not qualify to receive new licenses for the same} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +material under section 10.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +9. Acceptance Not Required for Having Copies.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You are not required to accept this License in order to receive or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +run a copy of the Program. Ancillary propagation of a covered work} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +occurring solely as a consequence of using peer-to-peer transmission} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to receive a copy likewise does not require acceptance. However,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +nothing other than this License grants you permission to propagate or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +modify any covered work. These actions infringe copyright if you do} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +not accept this License. Therefore, by modifying or propagating a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +covered work, you indicate your acceptance of this License to do so.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +10. Automatic Licensing of Downstream Recipients.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Each time you convey a covered work, the recipient automatically} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +receives a license from the original licensors, to run, modify and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +propagate that work, subject to this License. You are not responsible} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +for enforcing compliance by third parties with this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +An "entity transaction" is a transaction transferring control of an} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +organization, or substantially all assets of one, or subdividing an} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +organization, or merging organizations. If propagation of a covered} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +work results from an entity transaction, each party to that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +transaction who receives a copy of the work also receives whatever} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +licenses to the work the party's predecessor in interest had or could} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +give under the previous paragraph, plus a right to possession of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Corresponding Source of the work from the predecessor in interest, if} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the predecessor has it or can get it with reasonable efforts.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may not impose any further restrictions on the exercise of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +rights granted or affirmed under this License. For example, you may} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +not impose a license fee, royalty, or other charge for exercise of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +rights granted under this License, and you may not initiate litigation} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +(including a cross-claim or counterclaim in a lawsuit) alleging that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +any patent claim is infringed by making, using, selling, offering for} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +sale, or importing the Program or any portion of it.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +11. Patents.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +A "contributor" is a copyright holder who authorizes use under this} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License of the Program or a work on which the Program is based. The} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +work thus licensed is called the contributor's "contributor version".} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +A contributor's "essential patent claims" are all patent claims} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +owned or controlled by the contributor, whether already acquired or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +hereafter acquired, that would be infringed by some manner, permitted} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +by this License, of making, using, or selling its contributor version,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +but do not include claims that would be infringed only as a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +consequence of further modification of the contributor version. For} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +purposes of this definition, "control" includes the right to grant} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +patent sublicenses in a manner consistent with the requirements of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Each contributor grants you a non-exclusive, worldwide, royalty-free} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +patent license under the contributor's essential patent claims, to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +make, use, sell, offer for sale, import and otherwise run, modify and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +propagate the contents of its contributor version.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +In the following three paragraphs, a "patent license" is any express} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +agreement or commitment, however denominated, not to enforce a patent} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +(such as an express permission to practice a patent or covenant not to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +sue for patent infringement). To "grant" such a patent license to a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +party means to make such an agreement or commitment not to enforce a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +patent against the party.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If you convey a covered work, knowingly relying on a patent license,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +and the Corresponding Source of the work is not available for anyone} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to copy, free of charge and under the terms of this License, through a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +publicly available network server or other readily accessible means,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +then you must either (1) cause the Corresponding Source to be so} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +available, or (2) arrange to deprive yourself of the benefit of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +patent license for this particular work, or (3) arrange, in a manner} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +consistent with the requirements of this License, to extend the patent} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +license to downstream recipients. "Knowingly relying" means you have} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +actual knowledge that, but for the patent license, your conveying the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +covered work in a country, or your recipient's use of the covered work} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +in a country, would infringe one or more identifiable patents in that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +country that you have reason to believe are valid.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If, pursuant to or in connection with a single transaction or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +arrangement, you convey, or propagate by procuring conveyance of, a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +covered work, and grant a patent license to some of the parties} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +receiving the covered work authorizing them to use, propagate, modify} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +or convey a specific copy of the covered work, then the patent license} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +you grant is automatically extended to all recipients of the covered} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +work and works based on it.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +A patent license is "discriminatory" if it does not include within} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the scope of its coverage, prohibits the exercise of, or is} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +conditioned on the non-exercise of one or more of the rights that are} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +specifically granted under this License. You may not convey a covered} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +work if you are a party to an arrangement with a third party that is} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +in the business of distributing software, under which you make payment} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to the third party based on the extent of your activity of conveying} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the work, and under which the third party grants, to any of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +parties who would receive the covered work from you, a discriminatory} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +patent license (a) in connection with copies of the covered work} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +conveyed by you (or copies made from those copies), or (b) primarily} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +for and in connection with specific products or compilations that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +contain the covered work, unless you entered into that arrangement,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +or that patent license was granted, prior to 28 March 2007.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Nothing in this License shall be construed as excluding or limiting} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +any implied license or other defenses to infringement that may} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +otherwise be available to you under applicable patent law.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +12. No Surrender of Others' Freedom.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If conditions are imposed on you (whether by court order, agreement or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +otherwise) that contradict the conditions of this License, they do not} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +excuse you from the conditions of this License. If you cannot convey a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +covered work so as to satisfy simultaneously your obligations under this} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License and any other pertinent obligations, then as a consequence you may} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +not convey it at all. For example, if you agree to terms that obligate you} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to collect a royalty for further conveying from those to whom you convey} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the Program, the only way you could satisfy both those terms and this} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License would be to refrain entirely from conveying the Program.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +13. Remote Network Interaction; Use with the GNU General Public License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Notwithstanding any other provision of this License, if you modify the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Program, your modified version must prominently offer all users} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +interacting with it remotely through a computer network (if your version} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +supports such interaction) an opportunity to receive the Corresponding} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Source of your version by providing access to the Corresponding Source} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +from a network server at no charge, through some standard or customary} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +means of facilitating copying of software. This Corresponding Source} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +shall include the Corresponding Source for any work covered by version 3} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +of the GNU General Public License that is incorporated pursuant to the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +following paragraph.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Notwithstanding any other provision of this License, you have} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +permission to link or combine any covered work with a work licensed} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +under version 3 of the GNU General Public License into a single} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +combined work, and to convey the resulting work. The terms of this} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License will continue to apply to the part which is the covered work,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +but the work with which it is combined will remain governed by version} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +3 of the GNU General Public License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +14. Revised Versions of this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The Free Software Foundation may publish revised and/or new versions of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the GNU Affero General Public License from time to time. Such new versions} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +will be similar in spirit to the present version, but may differ in detail to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +address new problems or concerns.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Each version is given a distinguishing version number. If the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Program specifies that a certain numbered version of the GNU Affero General} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Public License "or any later version" applies to it, you have the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +option of following the terms and conditions either of that numbered} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +version or of any later version published by the Free Software} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Foundation. If the Program does not specify a version number of the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +GNU Affero General Public License, you may choose any version ever published} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +by the Free Software Foundation.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If the Program specifies that a proxy can decide which future} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +versions of the GNU Affero General Public License can be used, that proxy's} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +public statement of acceptance of a version permanently authorizes you} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to choose that version for the Program.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Later license versions may give you additional or different} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +permissions. However, no additional obligations are imposed on any} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +author or copyright holder as a result of your choosing to follow a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +later version.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +15. Disclaimer of Warranty.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +ALL NECESSARY SERVICING, REPAIR OR CORRECTION.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +16. Limitation of Liability.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +SUCH DAMAGES.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +17. Interpretation of Sections 15 and 16.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If the disclaimer of warranty and limitation of liability provided} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\cf1\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +above cannot be given local legal effect according to their terms,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +reviewing courts shall apply local law that most closely approximates} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +an absolute waiver of all civil liability in connection with the} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Program, unless a warranty or assumption of liability accompanies a} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +copy of the Program in return for a fee.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +---------------------------------------} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +In addition to AGPLv3, as a special exception, the copyright holders give permission to link the code of portions of this program with the the following party libraries listed under section \u8220\'1c3'rd party libraries\u8221\'1d according to conditions as described in each individual license. You must obey the AGPLv3 in all respects for all of the code used other than the items listed below. } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sl276\slmult1\sb120\sa120{\i\hich\af5\dbch\af5\afs28\ai\rtlch \ltrch\loch\fs28\lang29\loch\f5 +Fat Cow Icons} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sl276\slmult1\sb0\sa200{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Creative Commons Attribution License 3.0 License} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +1. Definitions} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with one or more other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"Licensor" means the individual, individuals, entity or entities that offers the Work under the terms of this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"Original Author" means the individual, individuals, entity or entities who created the Work.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"Work" means the copyrightable work of authorship offered under the terms of this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\loch\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to create and reproduce Derivative Works provided that any such Derivative Work, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +For the avoidance of doubt, where the Work is a musical composition:} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or, in the event that Licensor is a member of a performance rights society (e.g. ASCAP, BMI, SESAC), via that society, royalties for the public performance or public digital performance (e.g. webcast) of the Work.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions).} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions).} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\loch\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of a recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. When You distribute, publicly display, publicly perform, or publicly digitally perform the Work, You may not impose any technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by Section 4(b), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by Section 4(b), as requested.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If You distribute, publicly display, publicly perform, or publicly digitally perform the Work (as defined in Section 1 above) or any Derivative Works (as defined in Section 1 above) or Collective Works (as defined in Section 1 above), You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, consistent with Section 3(b) in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(b) may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear, if a credit for all contributing authors of the Derivative Work or Collective Work appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +5. Representations, Warranties and Disclaimer} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND ONLY TO THE EXTENT OF ANY RIGHTS HELD IN THE LICENSED WORK BY THE LICENSOR. THE LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MARKETABILITY, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +7. Termination} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works (as defined in Section 1 above) or Collective Works (as defined in Section 1 above) from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +8. Miscellaneous} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Each time You distribute or publicly digitally perform the Work (as defined in Section 1 above) or a Collective Work (as defined in Section 1 above), the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Creative Commons Notice} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of the License.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sl276\slmult1\sb0\sa200{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Creative Commons may be contacted at }{{\field{\*\fldinst HYPERLINK "http://creativecommons.org/" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang255\loch\f5 +http://creativecommons.org/}{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}}.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\i\hich\af5\dbch\af5\afs28\ai\rtlch \ltrch\loch\fs28\lang1033\loch\f5 +Microsoft SQL Server Compact 3.5} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +MICROSOFT SOFTWARE LICENSE TERMS\line MICROSOFT SQL SERVER COMPACT 3.5} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx720\li720\ri0\lin720\rin0\fi-363\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +updates,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li720\ri0\lin720\rin0\fi-363\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +supplements,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Internet-based services, and } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +support services} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +for this software, unless other terms accompany those items. If so, those terms apply.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +If you comply with these license terms, you have the rights below.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx357\tx360\li357\ri0\lin357\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +1.\tab INSTALLATION AND USE RIGHTS. }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may install and use any number of copies of the software on your devices.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +2.\tab ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li720\ri0\lin720\rin0\fi-363\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a.\tab Distributable Code.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + The software contains code that you are permitted to distribute in programs you develop if you comply with the terms below.} +\par \pard\plain \s24\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx1077\tx1440\li1077\ri0\lin1077\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +i.\tab Right to Use and Distribute.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + The code and text files listed below are \u8220\'1cDistributable Code.\u8221\'1d} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx1435\tx1437\li1435\ri0\lin1435\rin0\fi-358\sb120\sa120{\ul\ulc0\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\ul\ulc0\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\ul\ulc0\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +REDIST.TXT Files}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +. You may copy and distribute the object code form of code listed in REDIST.TXT files.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li1435\ri0\lin1435\rin0\fi-358\sb120\sa120{\ul\ulc0\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\ul\ulc0\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\ul\ulc0\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Third Party Distribution}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs.} +\par \pard\plain \s24\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx1077\tx1440\li1077\ri0\lin1077\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +ii.\tab Distribution Requirements}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +. For any Distributable Code you distribute, you must} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx1435\tx1437\li1435\ri0\lin1435\rin0\fi-358\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +add significant primary functionality to it in your programs;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li1435\ri0\lin1435\rin0\fi-358\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +require distributors and external end users to agree to terms that protect it at least as much as this agreement; } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +display your valid copyright notice on your programs; and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\u8217\'19 fees, related to the distribution or use of your programs.} +\par \pard\plain \s24\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx1077\tx1440\li1077\ri0\lin1077\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +iii.\tab Distribution Restrictions. }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You may not} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx1435\tx1437\li1435\ri0\lin1435\rin0\fi-358\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +alter any copyright, trademark or patent notice in the Distributable Code; } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li1435\ri0\lin1435\rin0\fi-358\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +use Microsoft\u8217\'19s trademarks in your programs\u8217\'19 names or in a way that suggests your programs come from or are endorsed by Microsoft; } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +distribute Distributable Code to run on a platform other than the Windows platform;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +include Distributable Code in malicious, deceptive or unlawful programs; or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx1792\tx1795\li1792\ri0\lin1792\rin0\fi-357\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +the code be disclosed or distributed in source code form; or } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li1792\ri0\lin1792\rin0\fi-357\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +others have the right to modify it.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li357\ri0\lin357\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +3.\tab }{\caps\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Scope of License}{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li720\ri0\lin720\rin0\fi-363\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +work around any technical limitations in the software;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +make more copies of the software than specified in this agreement or allowed by applicable law, despite this limitation;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +publish the software for others to copy;} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +rent, lease or lend the software; or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +use the software for commercial software hosting services.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx357\tx360\li357\ri0\lin357\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +4.\tab BACKUP COPY.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + You may make one backup copy of the software. You may use it only to reinstall the software.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li357\ri0\lin357\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +5.\tab DOCUMENTATION.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +6.\tab TRANSFER TO A THIRD PARTY.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + The first user of the software may transfer it and this agreement directly to a third party. Before the transfer, that party must agree that this agreement applies to the transfer and use of the software. The first user must uninstall the software before transferring it separately from the device. The first user may not retain any copies.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li357\ri0\lin357\rin0\fi-357{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +7.\tab }{\caps\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Export Restrictions}{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{{\field{\*\fldinst HYPERLINK "http://www.microsoft.com/exporting" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang255\loch\f5 +www.microsoft.com/exporting}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}}.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li357\ri0\lin357\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +8.\tab }{\caps\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +SUPPORT SERVICES.}{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Because this software is \u8220\'1cas is,\u8221\'1d we may not provide support services for it.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +9.\tab }{\caps\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Entire Agreement.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li360\ri0\lin360\rin0\fi-360\sb120\sa120\keepn{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +10.\tab }{\caps\cf1\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Applicable Law}{\cf1\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx720\li720\ri0\lin720\rin0\fi-363\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +a.\tab United States.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li720\ri0\lin720\rin0\fi-363\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +b.\tab Outside the United States.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + If you acquired the software in any other country, the laws of that country apply.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx357\tx360\li357\ri0\lin357\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +11.\tab }{\caps\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Legal Effect.}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li357\ri0\lin357\rin0\fi-357\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +12.\tab }{\caps\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Disclaimer of Warranty.}{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 + }{\caps\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +The software is licensed \u8220\'1cas-is.\u8221\'1d You bear the risk of using it. Microsoft gives no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this agreement cannot change. To the extent permitted under your local laws, Microsoft excludes the implied warranties of merchantability, fitness for a particular purpose and non-infringement.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx360\li360\ri0\lin360\rin0\fi-360\sb120\sa120{\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +13.\tab }{\caps\b\hich\af5\dbch\af5\afs20\ab\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Limitation on and Exclusion of Remedies and Damages. You can recover from Microsoft and its suppliers only direct damages up to U.S. $5.00. You cannot recover any other damages, including consequential, lost profits, special, indirect or incidental damages.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li357\ri0\lin357\rin0\fi0\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This limitation applies to} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\tx720\li720\ri0\lin720\rin0\fi-363\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li720\ri0\lin720\rin0\fi-363\sb120\sa120{\hich\af5\dbch\af7\rtlch \ltrch\lang1033\loch\f5 +\u61623\'b7}{\hich\af5\dbch\af5\rtlch \ltrch\loch\lang1033\loch\f5 +\tab }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\li360\ri0\lin360\rin0\fi0\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\i\hich\af5\dbch\af5\afs28\ai\rtlch \ltrch\loch\fs28\lang1033\loch\f5 +OpenSSL} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +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 ith the distribution.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +3. All advertising materials mentioning features or use of this software must display the following acknowledgment:} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\rtlch \ltrch\lang1033\loch\f5 + }{\hich\af5\rtlch \ltrch\loch\lang1033\loch\f5 +"This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (}{{\field{\*\fldinst HYPERLINK "http://www.OpenSSL.org/" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang255\loch\f5 +http://www.OpenSSL.org/}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}})"} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact licensing@OpenSSL.org.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +5. Products derived from this software may not be called "OpenSSL" nor may "OpenSSL" appear in their names without prior written permission of the OpenSSL Project.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\lang1033\loch\f5 + }{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +6. Redistributions of any form whatsoever must retain the following acknowledgment:} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\rtlch \ltrch\lang1033\loch\f5 + }{\hich\af5\rtlch \ltrch\loch\lang1033\loch\f5 +"This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (}{{\field{\*\fldinst HYPERLINK "http://www.OpenSSL.org/" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang255\loch\f5 +http://www.OpenSSL.org/}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}})" } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY EXPRESSED 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 OpenSSL PROJECT OR ITS 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.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This product includes cryptographic software written by Eric Young (}{{\field{\*\fldinst HYPERLINK "mailto:eay@cryptsoft.com" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang255\loch\f5 +eay@cryptsoft.com}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}}). This product includes software written by Tim Hudson (}{{\field{\*\fldinst HYPERLINK "mailto:tjh@cryptsoft.com" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang255\loch\f5 +tjh@cryptsoft.com}{\hich\af5\dbch\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}}).} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\loch\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\i\hich\af5\dbch\af5\afs28\ai\rtlch \ltrch\loch\fs28\lang1033\loch\f5 +PostgreSQL interface} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sl276\slmult1\sb0\sa200{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +PostgreSQL Database Management System (formerly known as Postgres, then as Postgres95)} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Portions Copyright (c) 1996-2010, The PostgreSQL Global Development Group} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Portions Copyright (c) 1994, The Regents of the University of California} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\loch\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\i\hich\af5\afs28\ai\rtlch \ltrch\loch\fs28\lang1033\loch\f5 +7-Zip Command line version\line } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +7-Zip Copyright (C) 1999-2010 Igor Pavlov.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +7za.exe is distributed under the GNU LGPL license} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Notes: } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You can use 7-Zip on any computer, including a computer in a commercial } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\fs20\lang1033\loch\f5 + }{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +organization. You don't need to register or pay for 7-Zip.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +GNU LGPL information} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +--------------------} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This library is free software; you can redistribute it and/or} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +modify it under the terms of the GNU Lesser General Public} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +License as published by the Free Software Foundation; either} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +version 2.1 of the License, or (at your option) any later version.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This library is distributed in the hope that it will be useful,} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +but WITHOUT ANY WARRANTY; without even the implied warranty of} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +Lesser General Public License for more details.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +You can receive a copy of the GNU Lesser General Public License from } +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{{\field{\*\fldinst HYPERLINK "http://www.gnu.org/" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +http://www.gnu.org/}}} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\loch\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\i\hich\af5\afs28\ai\rtlch \ltrch\loch\fs28\lang1033\loch\f5 +StackWalker} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\i0\b0\hich\af5\afs20\ai0\ab0\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +hMailServeruses the open source library StackWalker to create stack traces when a problem occur. The following is the license for StackWalker.} +\par \pard\plain \s1\ilvl0\outlinelevel0\sb240\sa120\keepn\b\hich\af12\dbch\af13\afs48\ab\loch\f0\fs48\sb120\sa120{\scaps0\caps0\cf2\expnd0\expndtw0\i\b0\hich\af5\afs20\ai\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +New BSD License (BSD)} +\par \pard\plain \s18\sb0\sa120\sl285\slmult0\ql\li0\ri0\lin0\rin0\fi0\sb0\sa300{{\*\bkmkstart license_text}{\*\bkmkend license_text}\scaps0\caps0\cf5\expnd0\expndtw0\i0\b0\hich\af5\afs20\rtlch \ltrch\loch\fs20\loch\f5 +Copyright (c) 2009, Jochen Kalmbach\line All rights reserved.\line \line Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\line \line * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\line \line * 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.\line \line * Neither the name of Jochen Kalmbach nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\line \line 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.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sb120\sa120{\i\hich\af5\afs20\ai\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\hich\af5\rtlch \ltrch\loch\lang1033\loch\f5 +} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053\sl276\slmult1\sb0\sa200{\i\b0\hich\af5\afs28\ai\ab0\rtlch \ltrch\loch\fs28\loch\f5 +Attributions} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\listtext\pard\plain \loch\f8 \'b7\tab}\ilvl0\ls1 \li720\ri0\lin720\rin0\fi0\sl276\slmult1\tx720\li720\ri0\lin720\rin0\fi0\sb0\sa200{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (}{{\field{\*\fldinst HYPERLINK "http://www.OpenSSL.org/" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +http://www.OpenSSL.org/}{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}})} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\listtext\pard\plain \loch\f8 \'b7\tab}\ilvl0\ls1 \li720\ri0\lin720\rin0\fi0\sl276\slmult1\tx720\li720\ri0\lin720\rin0\fi0\sb0\sa200{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This product includes icons from the Fat Cow Icon library, available under the Creative Commons Attribution 3.0 license at }{{\field{\*\fldinst HYPERLINK "http://www.fatcow.com/free-icons/" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +http://www.fatcow.com/free-icons/}{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}}.} +\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af3\afs24\lang1081\loch\f3\fs24\lang1053{\listtext\pard\plain \loch\f8 \'b7\tab}\ilvl0\ls1 \li720\ri0\lin720\rin0\fi0\sl276\slmult1\tx720\li720\ri0\lin720\rin0\fi0\sb0\sa200{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +This product uses 7-Zip, an open source compression library. 7-Zip is licensed according to GNU LGPL (see above). 7-Zip can be found on }{{\field{\*\fldinst HYPERLINK "http://www.7-zip.org/" }{\fldrslt \cf4\ul\ulc0\langfe255\lang255\lang255\cf3\ul\ulc0\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +http://www.7-zip.org}{\hich\af5\afs20\rtlch \ltrch\loch\fs20\lang1033\loch\f5 +}}.} +\par } \ No newline at end of file diff --git a/hmailserver/source/Server/Common/Application/ErrorManager.cpp b/hmailserver/source/Server/Common/Application/ErrorManager.cpp index 377a2ee52..26bb94940 100644 --- a/hmailserver/source/Server/Common/Application/ErrorManager.cpp +++ b/hmailserver/source/Server/Common/Application/ErrorManager.cpp @@ -4,6 +4,7 @@ #include "stdafx.h" #include "ErrorManager.h" + #include @@ -113,7 +114,7 @@ namespace HM ErrorManager::ReportError(eSeverity iSeverity, int iErrorID, const String &sSource, const String &sDescription, const std::exception &error) { String formatted_message; - formatted_message.Format(_T("%s, Error code: %d, Message: %s"), sDescription, error.what()); + formatted_message.Format(_T("%s, Error code: %d, Message: %s"), sDescription, String(error.what())); ReportError(iSeverity, iErrorID, sSource, formatted_message); } diff --git a/hmailserver/source/Server/Common/Application/Errors.txt b/hmailserver/source/Server/Common/Application/Errors.txt index 8d24827ac..c6051c972 100644 --- a/hmailserver/source/Server/Common/Application/Errors.txt +++ b/hmailserver/source/Server/Common/Application/Errors.txt @@ -63,17 +63,13 @@ 5323, TCPConnection::_StartAsyncConnect, An unknown error occurred while starting asynchronous connect. 5324, TCPConnection::AsyncConnectCompleted, An unknown error occurred while handling asynchronous connect. 5325, TCPConnection::_StartAsyncConnect, An unknown error occurred while starting connection. -5326, TCPConnection::_StartAsyncConnect, An unknown error occurred while handling handshake. 5327, TCPConnection::EnqueueWrite, An unknown error occurred while posting write buffer. 5328, TCPConnection::EnqueueWrite, An unknown error occurred while posting write buffer. 5329, TCPConnection::Write, An unknown error occurred while writing buffer. -5330, TCPConnection::Shutdown, An unknown error occurred while shutting down socket. 5331, TCPConnection::EnqueueRead, An unknown error occurred while posting read buffer. 5332, TCPConnection::EnqueueRead, An unknown error occurred while starting async reading 5333, TCPConnection::UpdateLogoutTimer, An unknown error occurred while updating logout timer. 5334, TCPConnection::CancelLogoutTimer, An unknown error occurred while canceling logout timer. -5335, TCPConnection::EnqueueDisconnect, An unknown error occurred while posting disconnect. -5336, TCPConnection::Disconnect, An unknown error occurred while disconnecting. 5337, TCPConnection::OnTimeout, An unknown error occurred while disconnecting. 5338, TCPConnection::EnqueueShutdown, An unknown error occurred while posting shutdown. 5339, TCPConnection::AsyncWriteCompleted, An unknown error occurred while handling buffer write. @@ -112,4 +108,7 @@ 5513, BIO_read returned an unexpected number of characters. Expected: {0}, Returned: {1} 5514, Unable to find appropriate MySQL character set. 5515, Failed to enable lingering for session {0} -5516, Attempted DNS lookup for empty host name. \ No newline at end of file +5516, Attempted DNS lookup for empty host name. +5518, An error occured when accepting a connection +5519, An error has been detected and an error stack will be generated and saved in {0}. +5520, Failed to open socket on IP address {0}. \ No newline at end of file diff --git a/hmailserver/source/Server/Common/Application/ExceptionHandler.cpp b/hmailserver/source/Server/Common/Application/ExceptionHandler.cpp new file mode 100644 index 000000000..d4de96a7c --- /dev/null +++ b/hmailserver/source/Server/Common/Application/ExceptionHandler.cpp @@ -0,0 +1,94 @@ +// Copyright (c) 2010 Martin Knafve / hMailServer.com. +// http://www.hmailserver.com + +#include "StdAfx.h" + +#include "ExceptionHandler.h" +#include "../Util/StackLogger.h" + + +#ifdef _DEBUG +#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) +#define new DEBUG_NEW +#endif + +namespace HM +{ + ExceptionHandler::ExceptionHandler(void) + { + + } + + LONG WINAPI ExceptionFilterWithLogging(EXCEPTION_POINTERS* pExp, DWORD dwExpCode) + { + StackLogger::Log(dwExpCode, pExp->ContextRecord); + + return EXCEPTION_EXECUTE_HANDLER; + } + + bool + ExceptionHandler::Run(const String &descriptive_name, boost::function& func) + { + __try + { + RunWithStandardExceptions(descriptive_name, func); + return true; + } + __except (ExceptionFilterWithLogging(GetExceptionInformation(), GetExceptionCode())) + { + // this has been logged in the exception filter. + return false; + } + } + + void + ExceptionHandler::RunWithStandardExceptions(const String &descriptive_name, boost::function& func) + { + try + { + func(); + } + catch (thread_interrupted const&) + { + // shutting down + } + catch (boost::system::system_error error) + { + ErrorManager::Instance()->ReportError(ErrorManager::High, 4208, "ExceptionHandler::Run", GetExceptionText(descriptive_name), error); + + throw; + } + catch (std::exception const& error) + { + String sErrorMessage = + Formatter::Format("An error occured while executing '{0}'", descriptive_name); + + ErrorManager::Instance()->ReportError(ErrorManager::High, 4208, "ExceptionHandler::Run", GetExceptionText(descriptive_name), error); + + throw; + } + catch (...) + { + String sErrorMessage = + Formatter::Format("An error occured while executing '{0}'", descriptive_name); + + ErrorManager::Instance()->ReportError(ErrorManager::High, 4208, "ExceptionHandler::Run", GetExceptionText(descriptive_name)); + + throw; + } + } + + + + String + ExceptionHandler::GetExceptionText(const String &descriptive_name) + { + String sErrorMessage = + Formatter::Format("An error occured while executing '{0}'", descriptive_name); + + return sErrorMessage; + + } + + +} \ No newline at end of file diff --git a/hmailserver/source/Server/Common/Application/ExceptionHandler.h b/hmailserver/source/Server/Common/Application/ExceptionHandler.h new file mode 100644 index 000000000..ef31df7dc --- /dev/null +++ b/hmailserver/source/Server/Common/Application/ExceptionHandler.h @@ -0,0 +1,22 @@ +// Copyright (c) 2010 Martin Knafve / hMailServer.com. +// http://www.hmailserver.com + +#pragma once + +namespace HM +{ + class ExceptionHandler + { + public: + ExceptionHandler(); + + static bool Run(const String &descriptive_name, boost::function& functionToRun); + + private: + + static void RunWithStandardExceptions(const String &descriptive_name, boost::function& functionToRun); + + static String GetExceptionText(const String &descriptive_name); + + }; +} \ No newline at end of file diff --git a/hmailserver/source/Server/Common/Application/MessageIndexer.cpp b/hmailserver/source/Server/Common/Application/MessageIndexer.cpp index 956448879..3a3df3c2f 100644 --- a/hmailserver/source/Server/Common/Application/MessageIndexer.cpp +++ b/hmailserver/source/Server/Common/Application/MessageIndexer.cpp @@ -4,6 +4,8 @@ #include "StdAfx.h" #include "MessageIndexer.h" + +#include "../Application/ExceptionHandler.h" #include "../BO/Message.h" #include "../BO/MessageMetaData.h" #include "../MIME/MIME.h" @@ -52,30 +54,27 @@ namespace HM void MessageIndexer::WorkerFunc() { - LOG_DEBUG("Indexing messages..."); + boost::function func = boost::bind( &MessageIndexer::WorkerFuncInternal, this ); + if (ExceptionHandler::Run("MessageIndexer", func)) + return; + } - try - { - PersistentMessageMetaData persistentMetaData; - persistentMetaData.DeleteOrphanedItems(); + void + MessageIndexer::WorkerFuncInternal() + { + LOG_DEBUG("Indexing messages..."); - while (true) - { - IndexMessages_(); + PersistentMessageMetaData persistentMetaData; + persistentMetaData.DeleteOrphanedItems(); - index_now_.WaitFor(chrono::minutes(1)); - } - } - catch (thread_interrupted const&) + while (true) { - LOG_DEBUG("Indexing stopped."); + IndexMessages_(); - // shutting down. - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5158, "MessageIndexer::DoWork", "An error occured while indexing messages. The indexing was aborted."); + index_now_.WaitFor(chrono::minutes(1)); } + + } void diff --git a/hmailserver/source/Server/Common/Application/MessageIndexer.h b/hmailserver/source/Server/Common/Application/MessageIndexer.h index 2d199c445..6405e78a2 100644 --- a/hmailserver/source/Server/Common/Application/MessageIndexer.h +++ b/hmailserver/source/Server/Common/Application/MessageIndexer.h @@ -23,6 +23,7 @@ namespace HM void WorkerFunc(); + void WorkerFuncInternal(); void IndexMessages_(); diff --git a/hmailserver/source/Server/Common/Application/Scheduler.cpp b/hmailserver/source/Server/Common/Application/Scheduler.cpp index 944f7325f..25847c403 100644 --- a/hmailserver/source/Server/Common/Application/Scheduler.cpp +++ b/hmailserver/source/Server/Common/Application/Scheduler.cpp @@ -71,7 +71,7 @@ namespace HM if (dtRunTime <= dtNow) { // Yup, we should run this task now. - pTask->DoWork(); + pTask->Run(); // Update run time. pTask->SetNextRunTime(); diff --git a/hmailserver/source/Server/Common/TCPIP/DNSResolver.cpp b/hmailserver/source/Server/Common/TCPIP/DNSResolver.cpp index 829ce1776..8924de24e 100644 --- a/hmailserver/source/Server/Common/TCPIP/DNSResolver.cpp +++ b/hmailserver/source/Server/Common/TCPIP/DNSResolver.cpp @@ -342,113 +342,105 @@ namespace HM std::vector vecFoundMXRecords; - try + if (!Resolve_(sDomainName, vecFoundMXRecords, DNS_TYPE_MX, 0)) { - if (!Resolve_(sDomainName, vecFoundMXRecords, DNS_TYPE_MX, 0)) + String logMessage; + logMessage.Format(_T("Failed to resolve email servers (MX lookup). Domain name: %s."), sDomainName); + LOG_DEBUG(logMessage); + + return false; + } + + if (vecFoundMXRecords.empty()) + { + /* RFC 2821: + If no MX records are found, but an A RR is found, the A RR is treated as + if it was associated with an implicit MX RR, with a preference of 0, + pointing to that host. If one or more MX RRs are found for a given + name, SMTP systems MUST NOT utilize any A RRs associated with that + name unless they are located using the MX RRs; + (implemented here) + */ + + std::vector a_records; + if (!GetARecords(sDomainName, a_records)) { String logMessage; - logMessage.Format(_T("Failed to resolve email servers (MX lookup). Domain name: %s."), sDomainName); + logMessage.Format(_T("Failed to resolve email servers (A lookup). Domain name: %s."), sDomainName); LOG_DEBUG(logMessage); return false; } - if (vecFoundMXRecords.empty()) + boost_foreach(String record, a_records) { - /* RFC 2821: - If no MX records are found, but an A RR is found, the A RR is treated as - if it was associated with an implicit MX RR, with a preference of 0, - pointing to that host. If one or more MX RRs are found for a given - name, SMTP systems MUST NOT utilize any A RRs associated with that - name unless they are located using the MX RRs; - (implemented here) - */ + HostNameAndIpAddress hostAndAddress; + hostAndAddress.SetHostName(sDomainName); + hostAndAddress.SetIpAddress(record); + + saFoundNames.push_back(hostAndAddress); + } + } + else + { + // We've been able to find host names in the MX records. We should + // now translate them to IP addresses. Some host names may result + // in several IP addreses. + std::vector::iterator iterDomain = vecFoundMXRecords.begin(); + + bool dnsSuccess = false; + boost_foreach(String domain, vecFoundMXRecords) + { + // Resolve to domain name to IP address and put it in the list. + int iCountBefore = saFoundNames.size(); std::vector a_records; - if (!GetARecords(sDomainName, a_records)) + if (!GetARecords(domain, a_records)) + continue; + + dnsSuccess = true; + + if (saFoundNames.size() == iCountBefore) { - String logMessage; - logMessage.Format(_T("Failed to resolve email servers (A lookup). Domain name: %s."), sDomainName); - LOG_DEBUG(logMessage); + // No mx records were found for this host name. Check if the host + // name is actually an IP address? It shouldn't be but.... - return false; + if (StringParser::IsValidIPAddress(domain)) + { + // Okay, this is an invalid MX record. The MX record should always contain + // a host name but in this case it appears an IP address. We'll be kind to + // the domain owner and still deliver the email to him. + a_records.push_back(domain); + } } boost_foreach(String record, a_records) { HostNameAndIpAddress hostAndAddress; - hostAndAddress.SetHostName(sDomainName); + hostAndAddress.SetHostName(domain); hostAndAddress.SetIpAddress(record); saFoundNames.push_back(hostAndAddress); } } - else - { - // We've been able to find host names in the MX records. We should - // now translate them to IP addresses. Some host names may result - // in several IP addreses. - std::vector::iterator iterDomain = vecFoundMXRecords.begin(); - - bool dnsSuccess = false; - boost_foreach(String domain, vecFoundMXRecords) - { - // Resolve to domain name to IP address and put it in the list. - int iCountBefore = saFoundNames.size(); - - std::vector a_records; - if (!GetARecords(domain, a_records)) - continue; - - dnsSuccess = true; - - if (saFoundNames.size() == iCountBefore) - { - // No mx records were found for this host name. Check if the host - // name is actually an IP address? It shouldn't be but.... - if (StringParser::IsValidIPAddress(domain)) - { - // Okay, this is an invalid MX record. The MX record should always contain - // a host name but in this case it appears an IP address. We'll be kind to - // the domain owner and still deliver the email to him. - a_records.push_back(domain); - } - } - - boost_foreach(String record, a_records) - { - HostNameAndIpAddress hostAndAddress; - hostAndAddress.SetHostName(domain); - hostAndAddress.SetIpAddress(record); - - saFoundNames.push_back(hostAndAddress); - } - } - - if (!dnsSuccess) - { - // All dns queries failed. - String logMessage; - logMessage.Format(_T("Failed to resolve email servers (A lookup). Domain name: %s."), sDomainName); - LOG_DEBUG(logMessage); - - return false; - } + if (!dnsSuccess) + { + // All dns queries failed. + String logMessage; + logMessage.Format(_T("Failed to resolve email servers (A lookup). Domain name: %s."), sDomainName); + LOG_DEBUG(logMessage); + return false; } - String sLogMsg; - sLogMsg.Format(_T("DNS - MX Result: %d IP addresses were found."), saFoundNames.size()); - - LOG_SMTP(0,"TCP",sLogMsg); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5038, "DNSResolver::GetEmailServers", "An exception was thrown."); - throw; } + String sLogMsg; + sLogMsg.Format(_T("DNS - MX Result: %d IP addresses were found."), saFoundNames.size()); + + LOG_SMTP(0,"TCP",sLogMsg); + // Remove duplicate names. std::vector::iterator iter = saFoundNames.begin(); @@ -477,40 +469,17 @@ namespace HM bool DNSResolver::GetMXRecords(const String &sDomain, std::vector &vecFoundNames) { - try - { - return Resolve_(sDomain, vecFoundNames, DNS_TYPE_MX, 0); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5039, "DNSResolver::GetMXRecords", "An exception was thrown."); - throw; - } - - return false; + return Resolve_(sDomain, vecFoundNames, DNS_TYPE_MX, 0); } // JDR: added to do PTR lookups. bool DNSResolver::GetPTRRecords(const String &sIP, std::vector &vecFoundNames) { - - try - { - std::vector vecItems = StringParser::SplitString(sIP, "."); - reverse(vecItems.begin(), vecItems.end()); - String result = StringParser::JoinVector(vecItems, "."); - return Resolve_(result + ".in-addr.arpa", vecFoundNames, DNS_TYPE_PTR, 0); - } - catch (std::exception& e) - { - string ErrorMessage = "An exception was thrown: "; - ErrorMessage.append(e.what()); - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5039, "DNSResolver::GetPTRRecords", ErrorMessage); - throw; - } - - return false; + std::vector vecItems = StringParser::SplitString(sIP, "."); + reverse(vecItems.begin(), vecItems.end()); + String result = StringParser::JoinVector(vecItems, "."); + return Resolve_(result + ".in-addr.arpa", vecFoundNames, DNS_TYPE_PTR, 0); } } diff --git a/hmailserver/source/Server/Common/TCPIP/IOQueueWorkerTask.cpp b/hmailserver/source/Server/Common/TCPIP/IOQueueWorkerTask.cpp index 2f4825760..ea483cb2c 100644 --- a/hmailserver/source/Server/Common/TCPIP/IOQueueWorkerTask.cpp +++ b/hmailserver/source/Server/Common/TCPIP/IOQueueWorkerTask.cpp @@ -8,7 +8,8 @@ #include "IOQueueWorkerTask.h" #include "../Application/SessionManager.h" - +#include "../Application/ExceptionHandler.h" +#include "../Util/CustomStackWalker.h" #ifdef _DEBUG #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) @@ -29,34 +30,24 @@ namespace HM { while (true) { - try - { - io_service_.run(); - - return; - } - catch (thread_interrupted const&) - { + boost::function func = boost::bind( &IOCPQueueWorkerTask::DoWorkInner, this ); + if (ExceptionHandler::Run("IOCPQueueWorkerTask", func)) return; - } - catch (boost::system::system_error error) - { - String sErrorMessage; - sErrorMessage.Format(_T("An error occured while handling asynchronous requests. Error number: %d, Description: %s"), error.code().value(), String(error.what())); - - ErrorManager::Instance()->ReportError(ErrorManager::High, 4208, "IOCPQueueWorkerTask::DoWork", sErrorMessage); - } - catch (std::exception const& e) - { - String sErrorMessage = Formatter::Format("An unknown error occured while handling asynchronous requests. Error number: {0}", e.what()); - ErrorManager::Instance()->ReportError(ErrorManager::High, 4208, "IOCPQueueWorkerTask::DoWork", sErrorMessage); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 4208, "IOCPQueueWorkerTask::DoWork", "An unknown error occured while handling asynchronous requests."); - } - - io_service_.reset(); + + } + } + + + void + IOCPQueueWorkerTask::DoWorkInner() + { + try + { + io_service_.run(); + } + catch (thread_interrupted const&) + { + return; } } diff --git a/hmailserver/source/Server/Common/TCPIP/IOQueueWorkerTask.h b/hmailserver/source/Server/Common/TCPIP/IOQueueWorkerTask.h index da390e485..7d82a99b9 100644 --- a/hmailserver/source/Server/Common/TCPIP/IOQueueWorkerTask.h +++ b/hmailserver/source/Server/Common/TCPIP/IOQueueWorkerTask.h @@ -18,6 +18,7 @@ namespace HM IOCPQueueWorkerTask(boost::asio::io_service &io_service); virtual void DoWork(); + void DoWorkInner(); private: diff --git a/hmailserver/source/Server/Common/TCPIP/TCPConnection.cpp b/hmailserver/source/Server/Common/TCPIP/TCPConnection.cpp index 98a276a10..42ea0705c 100644 --- a/hmailserver/source/Server/Common/TCPIP/TCPConnection.cpp +++ b/hmailserver/source/Server/Common/TCPIP/TCPConnection.cpp @@ -42,7 +42,8 @@ namespace HM context_(context), is_ssl_(false), expected_remote_hostname_(expected_remote_hostname), - is_client_(false) + is_client_(false), + timeout_(0) { session_id_ = Application::Instance()->GetUniqueID(); @@ -57,149 +58,114 @@ namespace HM if (disconnected_) disconnected_->Set(); - CancelLogoutTimer(); + try + { + CancelLogoutTimer(); + } + catch(...) + { + // should never, and must never throw. + } } bool TCPConnection::Connect(const AnsiString &remote_ip_address, long remotePort, const IPAddress &localAddress) { - try - { #if _DEBUG - if (!StringParser::IsValidIPAddress(remote_ip_address)) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5506, "TCPConnection::Connect", - Formatter::Format("Attempting to connect to {0} - Not a valid IP address.", remote_ip_address)); - } + if (!StringParser::IsValidIPAddress(remote_ip_address)) + { + ErrorManager::Instance()->ReportError(ErrorManager::High, 5506, "TCPConnection::Connect", + Formatter::Format("Attempting to connect to {0} - Not a valid IP address.", remote_ip_address)); + } #endif - remote_port_ = remotePort; - remote_ip_address_ = remote_ip_address; - is_client_ = true; + remote_port_ = remotePort; + remote_ip_address_ = remote_ip_address; + is_client_ = true; + + LOG_TCPIP(Formatter::Format("Connecting to {0}:{1}...", remote_ip_address_, remotePort)); - LOG_TCPIP(Formatter::Format("Connecting to {0}:{1}...", remote_ip_address_, remotePort)); + if (!localAddress.IsAny()) + { + boost::system::error_code error_code; - if (!localAddress.IsAny()) + if (localAddress.GetType() == IPAddress::IPV4) + socket_.open(boost::asio::ip::tcp::v4(), error_code); + else if (localAddress.GetType() == IPAddress::IPV6) + socket_.open(boost::asio::ip::tcp::v6(), error_code); + + if (error_code) { - try - { - if (localAddress.GetType() == IPAddress::IPV4) - socket_.open(boost::asio::ip::tcp::v4()); - else if (localAddress.GetType() == IPAddress::IPV6) - socket_.open(boost::asio::ip::tcp::v6()); + String errorMessage = Formatter::Format("Failed to open local socket on IP address {0}", localAddress.ToString()); + ReportError(ErrorManager::Medium, 5520, "TCPConnection::Connect", errorMessage, error_code); + return false; + } - socket_.bind(boost::asio::ip::tcp::endpoint(localAddress.GetAddress(), 0)); - } - catch (boost::system::system_error error) - { - try - { - // this may throw... - socket_.close(); - } - catch (...) - { - // shouldn't be an error. - } + socket_.bind(boost::asio::ip::tcp::endpoint(localAddress.GetAddress(), 0), error_code); - String errorMessage = Formatter::Format("Failed to bind to IP address {0}.", localAddress.ToString()); - ReportError(ErrorManager::Medium, 4330, "TCPConnection::Connect", errorMessage, error); + if (error_code) + { + String errorMessage = Formatter::Format("Failed to bind to IP address {0}.", localAddress.ToString()); + ReportError(ErrorManager::Medium, 4330, "TCPConnection::Connect", errorMessage, error_code); - return false; - } + boost::system::error_code ignored_error_code; + socket_.close(ignored_error_code); + return false; } - - #ifdef _DEBUG - String sMessage; - sMessage.Format(_T("RESOLVE: %s\r\n"), String(remote_ip_address_)); - #endif - - // Start an asynchronous resolve to translate the server and service names - // into a list of endpoints. - StartAsyncConnect_(remote_ip_address, remotePort); - return true; - } - catch (...) - { - String errorMessage = Formatter::Format("An unknown error occurred while connecting to {0} on port {1}", remote_ip_address, remotePort); - ErrorManager::Instance()->ReportError(ErrorManager::High, 5321, "TCPConnection::Connect", errorMessage); - throw; } + + // Start an asynchronous resolve to translate the server and service names + // into a list of endpoints. + StartAsyncConnect_(remote_ip_address, remotePort); + return true; } void TCPConnection::StartAsyncConnect_(const String &ip_adress, int port) { - try - { - IPAddress adress; - adress.TryParse(ip_adress, true); + IPAddress adress; + adress.TryParse(ip_adress, true); - tcp::endpoint ep; - ep.address(adress.GetAddress()); - ep.port(port); + tcp::endpoint ep; + ep.address(adress.GetAddress()); + ep.port(port); - //// Check that we don't try to connect to a port we're listening on. Doing - //// that could start evil loops. - //tcp::endpoint endpoint = *endpoint_iterator; + //// Check that we don't try to connect to a port we're listening on. Doing + //// that could start evil loops. + //tcp::endpoint endpoint = *endpoint_iterator; - if (LocalIPAddresses::Instance()->IsLocalPort(ep.address(), remote_port_)) - { - String sMessage; - sMessage.Format(_T("Could not connect to %s on port %d since this would mean connecting to myself."), remote_ip_address_, remote_port_); + if (LocalIPAddresses::Instance()->IsLocalPort(ep.address(), remote_port_)) + { + String sMessage; + sMessage.Format(_T("Could not connect to %s on port %d since this would mean connecting to myself."), remote_ip_address_, remote_port_); - OnCouldNotConnect(sMessage); + OnCouldNotConnect(sMessage); - LOG_TCPIP(_T("TCPConnection - ") + sMessage); + LOG_TCPIP(_T("TCPConnection - ") + sMessage); - return; - } - - // Attempt a connection to the first endpoint in the list. Each endpoint - // will be tried until we successfully establish a connection. - try - { - socket_.async_connect(ep, - boost::bind(&TCPConnection::AsyncConnectCompleted, shared_from_this(), boost::asio::placeholders::error)); - } - catch (boost::system::system_error error) - { - // We failed to send the data to the client. Log an message in the log, - // and switch of operation-in-progress flag. We don't log this as an - // error since it most likely isn't. - String sMessage; - sMessage.Format(_T("TCPConnection - Call to async_connect failed. Error code: %d, Message: %s"), error.code().value(), String(error.what())); - LOG_TCPIP(sMessage); - } - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5323, "TCPConnection::StartAsyncConnect_", "An unknown error occurred while starting asynchronous connect."); - throw; + return; } + + // Attempt a connection to the first endpoint in the list. Each endpoint + // will be tried until we successfully establish a connection. + socket_.async_connect(ep, + boost::bind(&TCPConnection::AsyncConnectCompleted, shared_from_this(), boost::asio::placeholders::error)); } void TCPConnection::AsyncConnectCompleted(const boost::system::error_code& err) { - try + if (err) { - if (err) - { - // Are there more addresses we should attempt to connect to? - AnsiString error = err.message(); - OnCouldNotConnect("Host name: " + remote_ip_address_ + ", message: " + error); + // Are there more addresses we should attempt to connect to? + AnsiString error = err.message(); + OnCouldNotConnect("Host name: " + remote_ip_address_ + ", message: " + error); - return; - } - - Start(); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5324, "TCPConnection::AsyncConnectCompleted", "An unknown error occurred while handling asynchronous connect."); + return; } + + Start(); } void @@ -207,8 +173,6 @@ namespace HM { LOG_DEBUG(Formatter::Format("TCP connection started for session {0}", session_id_)); - EnableLingering_(); - OnConnected(); if (connection_security_ == CSSSL) @@ -220,160 +184,88 @@ namespace HM void TCPConnection::ProcessOperationQueue_() { - int stage = 0; + // Pick out the next item to process... + shared_ptr operation = operation_queue_.Front(); - try + if (!operation) { + // We're no longer sending... + return; + } - stage = 1; - // Pick out the next item to process... - shared_ptr operation = operation_queue_.Front(); - - stage = 2; - if (!operation) + switch (operation->GetType()) + { + case IOOperation::BCTHandshake: + { + AsyncHandshake(); + break; + } + case IOOperation::BCTWrite: { - // We're no longer sending... - stage = 20; - return; + shared_ptr pBuf = operation->GetBuffer(); + AsyncWrite(pBuf); + break; } - stage = 3; - - switch (operation->GetType()) + case IOOperation::BCTRead: { - case IOOperation::BCTHandshake: - { - stage = 4; - AsyncHandshake(); - stage = 5; - break; - } - case IOOperation::BCTWrite: - { - stage = 6; - shared_ptr pBuf = operation->GetBuffer(); - AsyncWrite(pBuf); - stage = 7; - break; - } - case IOOperation::BCTRead: - { - stage = 8; - AsyncRead(operation->GetString()); - stage = 9; - break; - } - case IOOperation::BCTShutdownSend: - { - stage = 10; - Shutdown(boost::asio::ip::tcp::socket::shutdown_send); - operation_queue_.Pop(IOOperation::BCTShutdownSend); - ProcessOperationQueue_(); - stage = 11; - break; - } - case IOOperation::BCTDisconnect: - { - stage = 12; - Disconnect(); - operation_queue_.Pop(IOOperation::BCTDisconnect); - ProcessOperationQueue_(); - stage = 13; - break; - } - + AsyncRead(operation->GetString()); + break; + } + case IOOperation::BCTShutdownSend: + { + Shutdown(boost::asio::ip::tcp::socket::shutdown_send); + operation_queue_.Pop(IOOperation::BCTShutdownSend); + ProcessOperationQueue_(); + break; + } + case IOOperation::BCTDisconnect: + { + Disconnect(); + operation_queue_.Pop(IOOperation::BCTDisconnect); + ProcessOperationQueue_(); + break; } - } - catch (boost::system::system_error error) - { - ReportError(ErrorManager::Medium, 5138, "TCPConnection::ProcessOperationQueue_", - Formatter::Format("An error occured while processing the queue. Stage: {0}", stage), error); - } - catch (...) - { - ReportError(ErrorManager::Medium, 5138, "TCPConnection::ProcessOperationQueue_", - Formatter::Format("An error occured while processing the queue. Stage: {0}", stage)); - } - + } } void TCPConnection::Shutdown(boost::asio::socket_base::shutdown_type what) { - try - { - try - { - socket_.shutdown(what); - } - catch (boost::system::system_error) - { - // hopefully should not matter. - } - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5330, "TCPConnection::Shutdown", "An unknown error occurred while shutting down socket."); - throw; - } - + boost::system::error_code ignored_error; + socket_.shutdown(what, ignored_error); } void TCPConnection::EnqueueDisconnect() { - try - { - shared_ptr pBuf; - shared_ptr operation = shared_ptr(new IOOperation(IOOperation::BCTDisconnect, pBuf)); - operation_queue_.Push(operation); + shared_ptr pBuf; + shared_ptr operation = shared_ptr(new IOOperation(IOOperation::BCTDisconnect, pBuf)); + operation_queue_.Push(operation); - ProcessOperationQueue_(); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5335, "TCPConnection::EnqueueDisconnect", "An unknown error occurred while posting disconnect."); - throw; - } + ProcessOperationQueue_(); } void TCPConnection::Disconnect() { - try - { - LOG_DEBUG("Closing TCP/IP socket"); - - // Perform graceful shutdown. No more operations will be performed. - Shutdown(boost::asio::socket_base::shutdown_both); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5336, "TCPConnection::Disconnect", "An unknown error occurred while disconnecting."); - throw; - } + LOG_DEBUG("Closing TCP/IP socket"); - } + // Perform graceful shutdown. No more operations will be performed. + Shutdown(boost::asio::socket_base::shutdown_both); + } void TCPConnection::EnqueueHandshake() { - try - { - shared_ptr pBuf; - shared_ptr operation = shared_ptr(new IOOperation(IOOperation::BCTHandshake, pBuf)); - operation_queue_.Push(operation); + shared_ptr pBuf; + shared_ptr operation = shared_ptr(new IOOperation(IOOperation::BCTHandshake, pBuf)); + operation_queue_.Push(operation); - ProcessOperationQueue_(); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5335, "TCPConnection::EnqueueDisconnect", "An unknown error occurred while posting disconnect."); - throw; - } + ProcessOperationQueue_(); } @@ -441,29 +333,21 @@ namespace HM void TCPConnection::AsyncHandshakeCompleted(const boost::system::error_code& error) { - try - { - BOOST_SCOPE_EXIT(&operation_queue_, this_) { - operation_queue_.Pop(IOOperation::BCTHandshake); - this_->ProcessOperationQueue_(); - } BOOST_SCOPE_EXIT_END + BOOST_SCOPE_EXIT(&operation_queue_, this_) { + operation_queue_.Pop(IOOperation::BCTHandshake); + this_->ProcessOperationQueue_(); + } BOOST_SCOPE_EXIT_END - if (!error) - { - // Send welcome message to client. - is_ssl_ = true; - OnHandshakeCompleted(); - } - else - { - HandshakeFailed_(error); - } + if (!error) + { + // Send welcome message to client. + is_ssl_ = true; + OnHandshakeCompleted(); } - catch (...) + else { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5326, "TCPConnection::AsyncHandshakeCompleted", "An unknown error occurred while handling handshake."); + HandshakeFailed_(error); } - } void @@ -499,389 +383,201 @@ namespace HM void TCPConnection::EnqueueRead(const AnsiString &delimitor) { - try - { - shared_ptr operation = shared_ptr(new IOOperation(IOOperation::BCTRead, delimitor)); - operation_queue_.Push(operation); + shared_ptr operation = shared_ptr(new IOOperation(IOOperation::BCTRead, delimitor)); + operation_queue_.Push(operation); - ProcessOperationQueue_(); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5331, "TCPConnection::EnqueueRead", "An unknown error occurred while posting read buffer."); - throw; - } + ProcessOperationQueue_(); } void TCPConnection::AsyncRead(const AnsiString &delimitor) { - int stage = 1; + function AsyncReadCompletedFunction = + boost::bind(&TCPConnection::AsyncReadCompleted, shared_from_this(), + boost::asio::placeholders::error, + boost::asio::placeholders::bytes_transferred); - try + if (is_ssl_) { - function AsyncReadCompletedFunction = - boost::bind(&TCPConnection::AsyncReadCompleted, shared_from_this(), - boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred); - - stage = 2; - try - { - if (is_ssl_) - { - stage = 3; - if (delimitor.GetLength() == 0) - boost::asio::async_read(ssl_socket_, receive_buffer_, boost::asio::transfer_at_least(1), AsyncReadCompletedFunction); - else - boost::asio::async_read_until(ssl_socket_, receive_buffer_, delimitor, AsyncReadCompletedFunction); - } - else - { - stage = 4; - if (delimitor.GetLength() == 0) - { - stage = 41; - boost::asio::async_read(socket_, receive_buffer_, boost::asio::transfer_at_least(1), AsyncReadCompletedFunction); - stage = 42; - } - else - { - stage = 43; - boost::asio::async_read_until(socket_, receive_buffer_, delimitor, AsyncReadCompletedFunction); - stage = 44; - } - } - - stage = 5; - UpdateLogoutTimer(); - } - catch (boost::system::system_error error) - { - // We failed to send the data to the client. Log an message in the log, - // and switch of operation-in-progress flag. We don't log this as an - // error since it most likely isn't. - String sMessage; - sMessage.Format(_T("TCPConnection - Receiving of data from client failed. Error code: %d, Message: %s, Remote IP: %s"), error.code().value(), String(error.what()), SafeGetIPAddress()); - LOG_TCPIP(sMessage); - } - catch (std::exception const& e) + if (delimitor.GetLength() == 0) + boost::asio::async_read(ssl_socket_, receive_buffer_, boost::asio::transfer_at_least(1), AsyncReadCompletedFunction); + else + boost::asio::async_read_until(ssl_socket_, receive_buffer_, delimitor, AsyncReadCompletedFunction); + } + else + { + if (delimitor.GetLength() == 0) { - String sErrorMessage = Formatter::Format("Start Async Read operation failed. Error: {0}", e.what()); - ErrorManager::Instance()->ReportError(ErrorManager::High, 4208, "TCPConnection::AsyncRead", sErrorMessage); + boost::asio::async_read(socket_, receive_buffer_, boost::asio::transfer_at_least(1), AsyncReadCompletedFunction); } - catch (...) + else { - String message = Formatter::Format("Read operation failed. Stage: {0}", stage); - ErrorManager::Instance()->ReportError(ErrorManager::High, 5000, "TCPConnection::AsyncRead", message); - throw; + boost::asio::async_read_until(socket_, receive_buffer_, delimitor, AsyncReadCompletedFunction); } } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5332, "TCPConnection::AsyncRead", "An unknown error occurred while starting async reading."); - throw; - } + + UpdateLogoutTimer(); } void TCPConnection::AsyncReadCompleted(const boost::system::error_code& error, size_t bytes_transferred) { - try + BOOST_SCOPE_EXIT(&operation_queue_, this_) { + operation_queue_.Pop(IOOperation::BCTRead); + this_->ProcessOperationQueue_(); + } BOOST_SCOPE_EXIT_END + + if (error.value() != 0) { - BOOST_SCOPE_EXIT(&operation_queue_, this_) { - operation_queue_.Pop(IOOperation::BCTRead); - this_->ProcessOperationQueue_(); - } BOOST_SCOPE_EXIT_END + OnReadError(error.value()); - try + String message; + message.Format(_T("The read operation failed. Bytes transferred: %d"), bytes_transferred); + ReportDebugMessage(message, error); + + if (error.value() == boost::asio::error::not_found) { - if (error.value() != 0) - { - OnReadError(error.value()); + // read buffer is full... + OnExcessiveDataReceived(); + } + + EnqueueDisconnect(); - String message; - message.Format(_T("The read operation failed. Bytes transferred: %d"), bytes_transferred); - ReportDebugMessage(message, error); + - if (error.value() == boost::asio::error::not_found) - { - // read buffer is full... - OnExcessiveDataReceived(); - } + return; + } - EnqueueDisconnect(); + - + // Disable the logout timer while we're parsing data. We don't want to terminate + // a client just because he has issued a long-running command. If we do this, we + // would have to take care of the fact that we're dropping a connection despite it + // still being active. + CancelLogoutTimer(); - return; - } - } - catch (...) - { - ReportError(ErrorManager::Medium, 5141, "TCPConnection::AsyncReadCompleted", "An error occurred while checking error state"); - throw; - } + if (receive_binary_) + { + shared_ptr pBuffer = shared_ptr(new ByteBuffer()); + pBuffer->Allocate(receive_buffer_.size()); + + std::istream is(&receive_buffer_); + is.read((char*) pBuffer->GetBuffer(), receive_buffer_.size()); - // Disable the logout timer while we're parsing data. We don't want to terminate - // a client just because he has issued a long-running command. If we do this, we - // would have to take care of the fact that we're dropping a connection despite it - // still being active. try { - CancelLogoutTimer(); + ParseData(pBuffer); } catch (...) { - ReportError(ErrorManager::Medium, 5141, "TCPConnection::AsyncReadCompleted", "An error occurred while cancelling logout timer."); + String message; + message.Format(_T("An error occured while parsing data. Data size: %d"), pBuffer->GetSize()); + + ReportError(ErrorManager::Medium, 5136, "TCPConnection::AsyncReadCompleted", message); + throw; } + } + else + { + std::string s; + std::istream is(&receive_buffer_); + std::getline(is, s, '\r'); - if (receive_binary_) + // consume trailing \n on line. + receive_buffer_.consume(1); + + #ifdef _DEBUG + String sDebugOutput; + sDebugOutput.Format(_T("RECEIVED: %s\r\n"), String(s)); + OutputDebugString(sDebugOutput); + #endif + + try { - try - { - shared_ptr pBuffer = shared_ptr(new ByteBuffer()); - pBuffer->Allocate(receive_buffer_.size()); - - std::istream is(&receive_buffer_); - is.read((char*) pBuffer->GetBuffer(), receive_buffer_.size()); - - try - { - ParseData(pBuffer); - } - catch (boost::system::system_error error) - { - ReportError(ErrorManager::Medium, 5136, "TCPConnection::AsyncReadCompleted", "An error occured while parsing buffer.", error); - throw; - } - catch (...) - { - String message; - message.Format(_T("An error occured while parsing buffer. Received bytes: %d, Buffer: %d, Buffer size: %d"), bytes_transferred, &pBuffer, pBuffer->GetSize()); - - ReportError(ErrorManager::Medium, 5136, "TCPConnection::AsyncReadCompleted", "An error occured while parsing buffer."); - throw; - } - } - catch (...) - { - ReportError(ErrorManager::Medium, 5136, "TCPConnection::AsyncReadCompleted", "An error occured while parsing binary data."); - throw; - } + ParseData(s); } - else + catch (...) { - std::string s; - std::istream is(&receive_buffer_); - std::getline(is, s, '\r'); - - // consume trailing \n on line. - receive_buffer_.consume(1); - - #ifdef _DEBUG - String sDebugOutput; - sDebugOutput.Format(_T("RECEIVED: %s\r\n"), String(s)); - OutputDebugString(sDebugOutput); - #endif - - try - { - ParseData(s); - } - catch (boost::system::system_error error) - { - String message; - message.Format(_T("An error occured while parsing data. Bytes transferred: %d, ") - _T("Data length: %d, Data: %s."), - bytes_transferred, - s.size(), - String(s)); - - ReportError(ErrorManager::Medium, 5136, "TCPConnection::AsyncReadCompleted", message, error); - - throw; - } - catch (...) - { - String message; - message.Format(_T("An error occured while parsing data. Data length: %d, Data: %s."), s.size(), String(s)); + String message; + message.Format(_T("An error occured while parsing data. Data length: %d, Data: %s."), s.size(), String(s)); - ReportError(ErrorManager::Medium, 5136, "TCPConnection::AsyncReadCompleted", message); + ReportError(ErrorManager::Medium, 5136, "TCPConnection::AsyncReadCompleted", message); - throw; - } + throw; } } - catch (...) - { - ReportError(ErrorManager::Medium, 5141, "TCPConnection::AsyncReadCompleted", "An error occurred while handling read operation."); - } } void TCPConnection::EnqueueWrite(const AnsiString &sData) { - try - { - AnsiString sTemp = sData; - char *pBuf = sTemp.GetBuffer(); + AnsiString sTemp = sData; + char *pBuf = sTemp.GetBuffer(); - shared_ptr pBuffer = shared_ptr(new ByteBuffer()); - pBuffer->Add((BYTE*) pBuf, sData.GetLength()); + shared_ptr pBuffer = shared_ptr(new ByteBuffer()); + pBuffer->Add((BYTE*) pBuf, sData.GetLength()); #ifdef _DEBUG - String sDebugOutput; - sDebugOutput.Format(_T("SENT: %s"), String(sTemp)); - OutputDebugString(sDebugOutput); + String sDebugOutput; + sDebugOutput.Format(_T("SENT: %s"), String(sTemp)); + OutputDebugString(sDebugOutput); #endif - EnqueueWrite(pBuffer); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5327, "TCPConnection::EnqueueWrite", "An unknown error occurred while posting write buffer."); - throw; - } + EnqueueWrite(pBuffer); } void TCPConnection::EnqueueWrite(shared_ptr pBuffer) { - try - { - shared_ptr operation = shared_ptr(new IOOperation(IOOperation::BCTWrite, pBuffer)); + shared_ptr operation = shared_ptr(new IOOperation(IOOperation::BCTWrite, pBuffer)); - operation_queue_.Push(operation); - ProcessOperationQueue_(); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5328, "TCPConnection::EnqueueWrite", "An unknown error occurred while posting write buffer."); - throw; - } + operation_queue_.Push(operation); + ProcessOperationQueue_(); } void TCPConnection::AsyncWrite(shared_ptr buffer) { - try - { - function AsyncWriteCompletedFunction = - boost::bind(&TCPConnection::AsyncWriteCompleted, shared_from_this(), - boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred); + function AsyncWriteCompletedFunction = + boost::bind(&TCPConnection::AsyncWriteCompleted, shared_from_this(), + boost::asio::placeholders::error, + boost::asio::placeholders::bytes_transferred); - try - { - if (is_ssl_) - boost::asio::async_write - (ssl_socket_, boost::asio::buffer(buffer->GetCharBuffer(), buffer->GetSize()), AsyncWriteCompletedFunction); - else - boost::asio::async_write - (socket_, boost::asio::buffer(buffer->GetCharBuffer(), buffer->GetSize()), AsyncWriteCompletedFunction); - - UpdateLogoutTimer(); - } - catch (boost::system::system_error error) - { - // We failed to send the data to the client. Log an message in the log, - // and switch of operation-in-progress flag. We don't log this as an - // error since it most likely isn't. - String sMessage; - sMessage.Format(_T("TCPConnection - Sending of data to client failed. Error code: %d, Message: %s, Remote IP: %s"), error.code().value(), String(error.what()), SafeGetIPAddress()); - LOG_TCPIP(sMessage); - } - catch (std::exception const& e) - { - String sErrorMessage = Formatter::Format("Write operation failed. Error: {0}", e.what()); - ErrorManager::Instance()->ReportError(ErrorManager::High, 4208, "TCPConnection::AsyncWrite", sErrorMessage); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5000, "TCPConnection::AsyncWrite", "Write operation failed."); - throw; - } - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5329, "TCPConnection::AsyncWrite", "An unknown error occurred while writing buffer."); - throw; - } + if (is_ssl_) + boost::asio::async_write + (ssl_socket_, boost::asio::buffer(buffer->GetCharBuffer(), buffer->GetSize()), AsyncWriteCompletedFunction); + else + boost::asio::async_write + (socket_, boost::asio::buffer(buffer->GetCharBuffer(), buffer->GetSize()), AsyncWriteCompletedFunction); + UpdateLogoutTimer(); } void TCPConnection::AsyncWriteCompleted(const boost::system::error_code& error, size_t bytes_transferred) { - try - { - BOOST_SCOPE_EXIT(&operation_queue_, this_) { - operation_queue_.Pop(IOOperation::BCTWrite); - this_->ProcessOperationQueue_(); - } BOOST_SCOPE_EXIT_END - - if (error.value() != 0) - { - String message; - message.Format(_T("The read operation failed. Bytes transferred: %d"), bytes_transferred); - ReportDebugMessage(message, error); - - EnqueueDisconnect(); - } - - bool containsQueuedSendOperations = false; - - try - { - containsQueuedSendOperations = operation_queue_.ContainsQueuedSendOperation(); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5339, "TCPConnection::AsyncWriteCompleted", "An unknown error occurred while handling buffer write and checking if queue contained buffered operations."); - throw; - } - - if (!containsQueuedSendOperations) - { - try - { - OnDataSent(); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5339, "TCPConnection::AsyncWriteCompleted", "An unknown error occurred while handling buffer write and notifying protocol parser that data was sent."); - throw; - } + BOOST_SCOPE_EXIT(&operation_queue_, this_) { + operation_queue_.Pop(IOOperation::BCTWrite); + this_->ProcessOperationQueue_(); + } BOOST_SCOPE_EXIT_END - } - } - catch (...) + if (error.value() != 0) { String message; - message.Format(_T("An unknown error occurred while handling buffer write. Session ID: %d, Transferred bytes: %d"), GetSessionID(), bytes_transferred); + message.Format(_T("The read operation failed. Bytes transferred: %d"), bytes_transferred); + ReportDebugMessage(message, error); - ErrorManager::Instance()->ReportError(ErrorManager::High, 5339, "TCPConnection::AsyncWriteCompleted", message); + EnqueueDisconnect(); } - } - void - TCPConnection::EnableLingering_() - { - //boost::asio::socket_base::linger option(true, 15); - - //boost::system::error_code error_code; - // - //socket_.set_option(option, error_code); + bool containsQueuedSendOperations = operation_queue_.ContainsQueuedSendOperation(); - //if (error_code.value() != 0) - //{ - // // This is not a critical error. We do not have to close the session. - // String errorMessage = Formatter::Format(_T("Failed to enable lingering for session {0}"), GetSessionID()); - // ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5515, "TCPConnection::EnableLingering_", errorMessage, error_code); - //} + if (!containsQueuedSendOperations) + { + OnDataSent(); + } } @@ -950,15 +646,7 @@ namespace HM int TCPConnection::GetSessionID() { - try - { - int sessionID = session_id_; - return sessionID; - } - catch (...) - { - return 0; - } + return session_id_; } @@ -979,96 +667,71 @@ namespace HM void TCPConnection::UpdateLogoutTimer() { - try - { - // Put a timeout... - timer_.expires_from_now(boost::posix_time::seconds(timeout_)); - timer_.async_wait(bind(&TCPConnection::OnTimeout, - boost::weak_ptr(shared_from_this()), _1)); - } - catch (...) + boost::system::error_code error_code; + + // Put a timeout... + timer_.expires_from_now(boost::posix_time::seconds(timeout_), error_code); + + if (error_code) { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5333, "TCPConnection::UpdateLogoutTimer", "An unknown error occurred while updating logout timer."); - throw; + ReportError(ErrorManager::Low, 5333, "TCPConnection::UpdateLogoutTimer", "An unknown error occurred while updating logout timer.", error_code); + return; } + + timer_.async_wait(bind(&TCPConnection::OnTimeout, + boost::weak_ptr(shared_from_this()), _1)); } void TCPConnection::CancelLogoutTimer() { - try - { - timer_.cancel(); - } - catch (boost::system::system_error error) - { - ReportError(ErrorManager::Low, 5211, "TCPConnection::CancelLogoutTimer", "Failed to logout timer", error); - } - catch (...) + boost::system::error_code error_code; + timer_.cancel(error_code); + + if (error_code) { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5334, "TCPConnection::CancelLogoutTimer", "An unknown error occurred while canceling logout timer."); - throw; + ReportError(ErrorManager::Low, 5211, "TCPConnection::CancelLogoutTimer", "Failed to logout timer", error_code); } - } void TCPConnection::OnTimeout(boost::weak_ptr connection, boost::system::error_code const& err) { - try + boost::shared_ptr conn = connection.lock(); + if (!conn) { - boost::shared_ptr conn = connection.lock(); - if (!conn) - { - return; - } - - if (err == asio::error::operation_aborted) - { - // the timeout operation was cancelled. - return; - } - - String message; - message.Format(_T("The client has timed out. Session: %d"), conn->GetSessionID()); - LOG_DEBUG(message); - - conn->Timeout(); + return; } - catch (...) + + if (err == asio::error::operation_aborted) { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5337, "TCPConnection::OnTimeout", "An unknown error occurred while handling timeout."); - throw; + // the timeout operation was cancelled. + return; } + + String message; + message.Format(_T("The client has timed out. Session: %d"), conn->GetSessionID()); + LOG_DEBUG(message); + + conn->Timeout(); } void TCPConnection::Timeout() { - try + if (has_timeout_) { - if (has_timeout_) - { - // We've already posted a timeout once. Disconnect now. - Disconnect(); - return; - } + // We've already posted a timeout once. Disconnect now. + Disconnect(); + return; + } - has_timeout_ = true; + has_timeout_ = true; - OnConnectionTimeout(); + OnConnectionTimeout(); - EnqueueDisconnect(); - } - catch (boost::system::system_error error) - { - ReportError(ErrorManager::Low, 5137, "TCPConnection::PostTimeout", "An error occured while sending a timeout message to the client.", error); - } - catch (...) - { - ReportError(ErrorManager::Low, 5137, "TCPConnection::PostTimeout", "An error occured while sending a timeout message to the client."); - } + EnqueueDisconnect(); } void diff --git a/hmailserver/source/Server/Common/TCPIP/TCPConnection.h b/hmailserver/source/Server/Common/TCPIP/TCPConnection.h index 8edb198f0..e6c137ec5 100644 --- a/hmailserver/source/Server/Common/TCPIP/TCPConnection.h +++ b/hmailserver/source/Server/Common/TCPIP/TCPConnection.h @@ -87,7 +87,6 @@ namespace HM private: - void EnableLingering_(); void HandshakeFailed_(const boost::system::error_code& error); void StartAsyncConnect_(const String &ip_adress, int port); diff --git a/hmailserver/source/Server/Common/Threading/Task.cpp b/hmailserver/source/Server/Common/Threading/Task.cpp index 81a8bfb19..f2f9496ad 100644 --- a/hmailserver/source/Server/Common/Threading/Task.cpp +++ b/hmailserver/source/Server/Common/Threading/Task.cpp @@ -3,6 +3,7 @@ // Created 2005-07-21 #include "StdAfx.h" #include ".\task.h" +#include #ifdef _DEBUG #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) @@ -21,4 +22,18 @@ namespace HM { } + + void + Task::Run() + { + try + { + DoWork(); + } + catch (thread_interrupted const&) + { + boost::this_thread::disable_interruption disabled; + return; + } + } } \ No newline at end of file diff --git a/hmailserver/source/Server/Common/Threading/Task.h b/hmailserver/source/Server/Common/Threading/Task.h index 6bffe3007..58e270dbe 100644 --- a/hmailserver/source/Server/Common/Threading/Task.h +++ b/hmailserver/source/Server/Common/Threading/Task.h @@ -12,7 +12,7 @@ namespace HM Task(const String &name); ~Task(void); - virtual void DoWork() = 0; + void Run(); String GetName() const {return name_; } @@ -21,6 +21,7 @@ namespace HM protected: void SetIsStarted() {is_started_.Set();} + virtual void DoWork() = 0; private: diff --git a/hmailserver/source/Server/Common/Threading/WorkQueue.cpp b/hmailserver/source/Server/Common/Threading/WorkQueue.cpp index 86e9cb331..9d2cda4a7 100644 --- a/hmailserver/source/Server/Common/Threading/WorkQueue.cpp +++ b/hmailserver/source/Server/Common/Threading/WorkQueue.cpp @@ -8,6 +8,7 @@ #include "Task.h" +#include "../Application/ExceptionHandler.h" #ifdef _DEBUG #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) @@ -63,32 +64,10 @@ namespace HM } LOG_DEBUG(Formatter::Format("Executing task {0} in work queue {1}", pTask->GetName(), queue_name_)); - - try - { - pTask->DoWork(); - } - catch (thread_interrupted const&) - { - boost::this_thread::disable_interruption disabled; - RemoveRunningTask_(pTask); - return; - } - catch (boost::system::system_error error) - { - String exception_text = Formatter::Format("An error occured while executing task {0}", pTask->GetName()); - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5501, "WorkQueue::ExecuteTask", exception_text, error); - } - catch (std::exception error) - { - String exception_text = Formatter::Format("An error occured while executing task {0}", pTask->GetName()); - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5501, "WorkQueue::ExecuteTask", exception_text, error); - } - catch (...) - { - String exception_text = Formatter::Format("An error occured while executing task {0}", pTask->GetName()); - ErrorManager::Instance()->ReportError(ErrorManager::High, 5317, "WorkQueue::ExecuteTask", exception_text); - } + + String descriptive_name = Formatter::Format("Task-{0}", pTask->GetName()); + boost::function func = boost::bind( &Task::Run, pTask ); + ExceptionHandler::Run(descriptive_name, func); RemoveRunningTask_(pTask); } diff --git a/hmailserver/source/Server/Common/Util/ByteBuffer.cpp b/hmailserver/source/Server/Common/Util/ByteBuffer.cpp index 4a6c758c0..dd091683d 100644 --- a/hmailserver/source/Server/Common/Util/ByteBuffer.cpp +++ b/hmailserver/source/Server/Common/Util/ByteBuffer.cpp @@ -20,23 +20,13 @@ namespace HM ByteBuffer::~ByteBuffer() { - try + if (buffer_) { - if (buffer_) - { - delete [] buffer_; - buffer_ = 0; + delete [] buffer_; + buffer_ = 0; - buffer_size_ = 0; - } - } - catch (...) - { - String message; - message.Format(_T("Error when emptying buffer. This: %d"), this); - ErrorManager::Instance()->ReportError(ErrorManager::High, 5339, "ByteBuffer::~ByteBuffer", message); - throw; - } + buffer_size_ = 0; + } } void diff --git a/hmailserver/source/Server/Common/Util/CustomStackWalker.cpp b/hmailserver/source/Server/Common/Util/CustomStackWalker.cpp new file mode 100644 index 000000000..3a9975199 --- /dev/null +++ b/hmailserver/source/Server/Common/Util/CustomStackWalker.cpp @@ -0,0 +1,25 @@ +// Copyright (c) 2010 Martin Knafve / hMailServer.com. +// http://www.hmailserver.com + +#include "stdafx.h" +#include "CustomStackWalker.h" + +#ifdef _DEBUG +#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) +#define new DEBUG_NEW +#endif + +namespace HM +{ + CustomStackWalker::CustomStackWalker() + { + + } + + void + CustomStackWalker::OnOutput(LPCSTR szText) + { + stack_data_.append(szText); + stack_data_.append("\r\n"); + } +} diff --git a/hmailserver/source/Server/Common/Util/CustomStackWalker.h b/hmailserver/source/Server/Common/Util/CustomStackWalker.h new file mode 100644 index 000000000..0da3a520c --- /dev/null +++ b/hmailserver/source/Server/Common/Util/CustomStackWalker.h @@ -0,0 +1,22 @@ +// Copyright (c) 2010 Martin Knafve / hMailServer.com. +// http://www.hmailserver.com + +#pragma once + +#include "StackWalker.h" + +namespace HM +{ + class CustomStackWalker : public StackWalker + { + public: + CustomStackWalker(); + + AnsiString GetStackData() {return stack_data_; } + protected: + virtual void OnOutput(LPCSTR szText); + private: + + AnsiString stack_data_; + }; +} diff --git a/hmailserver/source/Server/Common/Util/FileUtilities.cpp b/hmailserver/source/Server/Common/Util/FileUtilities.cpp index 601fa4bcd..bcd2350da 100644 --- a/hmailserver/source/Server/Common/Util/FileUtilities.cpp +++ b/hmailserver/source/Server/Common/Util/FileUtilities.cpp @@ -365,7 +365,7 @@ namespace HM } bool - FileUtilities::WriteToFile(const String &sFilename, String &sData, bool bUnicode) + FileUtilities::WriteToFile(const String &sFilename, const String &sData, bool bUnicode) { File oFile; if (!oFile.Open(sFilename, File::OTCreate)) @@ -394,7 +394,7 @@ namespace HM } bool - FileUtilities::WriteToFile(const String &sFilename, AnsiString &sData) + FileUtilities::WriteToFile(const String &sFilename, const AnsiString &sData) { File oFile; if (!oFile.Open(sFilename, File::OTCreate)) diff --git a/hmailserver/source/Server/Common/Util/FileUtilities.h b/hmailserver/source/Server/Common/Util/FileUtilities.h index 60259dc69..ecfd17f98 100644 --- a/hmailserver/source/Server/Common/Util/FileUtilities.h +++ b/hmailserver/source/Server/Common/Util/FileUtilities.h @@ -27,8 +27,8 @@ namespace HM static void ReadFileToBuf(HANDLE hFile, char *Buf, int iStart = -1, int iCount = -1); static String ReadCompleteTextFile(const String &sFilename); - static bool WriteToFile(const String &sFilename, String &sData, bool bUnicode); - static bool WriteToFile(const String &sFilename, AnsiString &sData); + static bool WriteToFile(const String &sFilename, const String &sData, bool bUnicode); + static bool WriteToFile(const String &sFilename, const AnsiString &sData); static long FileSize(const String &sFileName); diff --git a/hmailserver/source/Server/Common/Util/StackLogger.cpp b/hmailserver/source/Server/Common/Util/StackLogger.cpp new file mode 100644 index 000000000..cc781ac57 --- /dev/null +++ b/hmailserver/source/Server/Common/Util/StackLogger.cpp @@ -0,0 +1,54 @@ +// Copyright (c) 2010 Martin Knafve / hMailServer.com. +// http://www.hmailserver.com + +#include "StdAfx.h" + +#include "StackLogger.h" +#include "CustomStackWalker.h" + +#include "../Util/Time.h" +#include "../Util/GUIDCreator.h" +#include "../Util/FileUtilities.h" + +#ifdef _DEBUG +#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) +#define new DEBUG_NEW +#endif + +namespace HM +{ + CustomStackWalker StackLogger::stack_walker_; + boost::mutex StackLogger::stack_walker_mutex_; + + void + StackLogger::Log(int exception_code, const CONTEXT *context) + { + boost::mutex::scoped_lock lock(stack_walker_mutex_); + + CustomStackWalker sw; + sw.ShowCallstack(GetCurrentThread(), context); + + String stack_trace = sw.GetStackData(); + + String log_directory = IniFileSettings::Instance()->GetLogDirectory(); + String current_date_time = Time::GetCurrentDateTime(); + current_date_time.Replace(_T(":"), _T("")); + String stack_file_name = "stacktrace_" + current_date_time + "_" + GUIDCreator::GetGUID() + ".log"; + + String full_path_to_stack_file = FileUtilities::Combine(log_directory, stack_file_name); + + String stack_dump_data; + stack_dump_data.append(Formatter::Format(_T("Exception code: {0}\r\n"), exception_code)); + stack_dump_data.append(Formatter::Format(_T("Stack trace follows: {0}\r\n"), String(stack_trace))); + + FileUtilities::WriteToFile(full_path_to_stack_file, stack_dump_data); + + String message = Formatter::Format("An error has been detected and an error stack will be generated and saved in {0}.", full_path_to_stack_file); + + ErrorManager::Instance()->ReportError(ErrorManager::Critical, 5519, "ErrorManager::LogErrorDump", message); + + } + + + +} \ No newline at end of file diff --git a/hmailserver/source/Server/Common/Util/StackLogger.h b/hmailserver/source/Server/Common/Util/StackLogger.h new file mode 100644 index 000000000..ab1e34956 --- /dev/null +++ b/hmailserver/source/Server/Common/Util/StackLogger.h @@ -0,0 +1,23 @@ +// Copyright (c) 2010 Martin Knafve / hMailServer.com. +// http://www.hmailserver.com + +#pragma once + +#include "CustomStackWalker.h" + +namespace HM +{ + class StackLogger + { + private: + StackLogger(); + + public: + static void Log(int exception_code, const CONTEXT *context); + + private: + + static CustomStackWalker stack_walker_; + static boost::mutex stack_walker_mutex_; + }; +} \ No newline at end of file diff --git a/hmailserver/source/Server/Common/Util/StackWalker.cpp b/hmailserver/source/Server/Common/Util/StackWalker.cpp new file mode 100644 index 000000000..c3db3f700 --- /dev/null +++ b/hmailserver/source/Server/Common/Util/StackWalker.cpp @@ -0,0 +1,1357 @@ +#include "stdafx.h" + + +/********************************************************************** + * + * StackWalker.cpp + * http://stackwalker.codeplex.com/ + * + * + * History: + * 2005-07-27 v1 - First public release on http://www.codeproject.com/ + * http://www.codeproject.com/threads/StackWalker.asp + * 2005-07-28 v2 - Changed the params of the constructor and ShowCallstack + * (to simplify the usage) + * 2005-08-01 v3 - Changed to use 'CONTEXT_FULL' instead of CONTEXT_ALL + * (should also be enough) + * - Changed to compile correctly with the PSDK of VC7.0 + * (GetFileVersionInfoSizeA and GetFileVersionInfoA is wrongly defined: + * it uses LPSTR instead of LPCSTR as first paremeter) + * - Added declarations to support VC5/6 without using 'dbghelp.h' + * - Added a 'pUserData' member to the ShowCallstack function and the + * PReadProcessMemoryRoutine declaration (to pass some user-defined data, + * which can be used in the readMemoryFunction-callback) + * 2005-08-02 v4 - OnSymInit now also outputs the OS-Version by default + * - Added example for doing an exception-callstack-walking in main.cpp + * (thanks to owillebo: http://www.codeproject.com/script/profile/whos_who.asp?id=536268) + * 2005-08-05 v5 - Removed most Lint (http://www.gimpel.com/) errors... thanks to Okko Willeboordse! + * 2008-08-04 v6 - Fixed Bug: Missing LEAK-end-tag + * http://www.codeproject.com/KB/applications/leakfinder.aspx?msg=2502890#xx2502890xx + * Fixed Bug: Compiled with "WIN32_LEAN_AND_MEAN" + * http://www.codeproject.com/KB/applications/leakfinder.aspx?msg=1824718#xx1824718xx + * Fixed Bug: Compiling with "/Wall" + * http://www.codeproject.com/KB/threads/StackWalker.aspx?msg=2638243#xx2638243xx + * Fixed Bug: Now checking SymUseSymSrv + * http://www.codeproject.com/KB/threads/StackWalker.aspx?msg=1388979#xx1388979xx + * Fixed Bug: Support for recursive function calls + * http://www.codeproject.com/KB/threads/StackWalker.aspx?msg=1434538#xx1434538xx + * Fixed Bug: Missing FreeLibrary call in "GetModuleListTH32" + * http://www.codeproject.com/KB/threads/StackWalker.aspx?msg=1326923#xx1326923xx + * Fixed Bug: SymDia is number 7, not 9! + * 2008-09-11 v7 For some (undocumented) reason, dbhelp.h is needing a packing of 8! + * Thanks to Teajay which reported the bug... + * http://www.codeproject.com/KB/applications/leakfinder.aspx?msg=2718933#xx2718933xx + * 2008-11-27 v8 Debugging Tools for Windows are now stored in a different directory + * Thanks to Luiz Salamon which reported this "bug"... + * http://www.codeproject.com/KB/threads/StackWalker.aspx?msg=2822736#xx2822736xx + * 2009-04-10 v9 License slihtly corrected ( replaced) + * 2009-11-01 v10 Moved to http://stackwalker.codeplex.com/ + * 2009-11-02 v11 Now try to use IMAGEHLP_MODULE64_V3 if available + * 2010-04-15 v12 Added support for VS2010 RTM + * 2010-05-25 v13 Now using secure MyStrcCpy. Thanks to luke.simon: + * http://www.codeproject.com/KB/applications/leakfinder.aspx?msg=3477467#xx3477467xx + * 2013-01-07 v14 Runtime Check Error VS2010 Debug Builds fixed: + * http://stackwalker.codeplex.com/workitem/10511 + * + * + * LICENSE (http://www.opensource.org/licenses/bsd-license.php) + * + * Copyright (c) 2005-2013, Jochen Kalmbach + * 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 Jochen Kalmbach 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. + * + **********************************************************************/ +#include +#include +#include +#include +#pragma comment(lib, "version.lib") // for "VerQueryValue" +#pragma warning(disable:4826) + +#include "StackWalker.h" + + +// If VC7 and later, then use the shipped 'dbghelp.h'-file +#pragma pack(push,8) +#if _MSC_VER >= 1300 +#include +#else +// inline the important dbghelp.h-declarations... +typedef enum { + SymNone = 0, + SymCoff, + SymCv, + SymPdb, + SymExport, + SymDeferred, + SymSym, + SymDia, + SymVirtual, + NumSymTypes +} SYM_TYPE; +typedef struct _IMAGEHLP_LINE64 { + DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_LINE64) + PVOID Key; // internal + DWORD LineNumber; // line number in file + PCHAR FileName; // full filename + DWORD64 Address; // first instruction of line +} IMAGEHLP_LINE64, *PIMAGEHLP_LINE64; +typedef struct _IMAGEHLP_MODULE64 { + DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE64) + DWORD64 BaseOfImage; // base load address of module + DWORD ImageSize; // virtual size of the loaded module + DWORD TimeDateStamp; // date/time stamp from pe header + DWORD CheckSum; // checksum from the pe header + DWORD NumSyms; // number of symbols in the symbol table + SYM_TYPE SymType; // type of symbols loaded + CHAR ModuleName[32]; // module name + CHAR ImageName[256]; // image name + CHAR LoadedImageName[256]; // symbol file name +} IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64; +typedef struct _IMAGEHLP_SYMBOL64 { + DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_SYMBOL64) + DWORD64 Address; // virtual address including dll base address + DWORD Size; // estimated size of symbol, can be zero + DWORD Flags; // info about the symbols, see the SYMF defines + DWORD MaxNameLength; // maximum size of symbol name in 'Name' + CHAR Name[1]; // symbol name (null terminated string) +} IMAGEHLP_SYMBOL64, *PIMAGEHLP_SYMBOL64; +typedef enum { + AddrMode1616, + AddrMode1632, + AddrModeReal, + AddrModeFlat +} ADDRESS_MODE; +typedef struct _tagADDRESS64 { + DWORD64 Offset; + WORD Segment; + ADDRESS_MODE Mode; +} ADDRESS64, *LPADDRESS64; +typedef struct _KDHELP64 { + DWORD64 Thread; + DWORD ThCallbackStack; + DWORD ThCallbackBStore; + DWORD NextCallback; + DWORD FramePointer; + DWORD64 KiCallUserMode; + DWORD64 KeUserCallbackDispatcher; + DWORD64 SystemRangeStart; + DWORD64 Reserved[8]; +} KDHELP64, *PKDHELP64; +typedef struct _tagSTACKFRAME64 { + ADDRESS64 AddrPC; // program counter + ADDRESS64 AddrReturn; // return address + ADDRESS64 AddrFrame; // frame pointer + ADDRESS64 AddrStack; // stack pointer + ADDRESS64 AddrBStore; // backing store pointer + PVOID FuncTableEntry; // pointer to pdata/fpo or NULL + DWORD64 Params[4]; // possible arguments to the function + BOOL Far; // WOW far call + BOOL Virtual; // is this a virtual frame? + DWORD64 Reserved[3]; + KDHELP64 KdHelp; +} STACKFRAME64, *LPSTACKFRAME64; +typedef +BOOL +(__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)( + HANDLE hProcess, + DWORD64 qwBaseAddress, + PVOID lpBuffer, + DWORD nSize, + LPDWORD lpNumberOfBytesRead + ); +typedef +PVOID +(__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)( + HANDLE hProcess, + DWORD64 AddrBase + ); +typedef +DWORD64 +(__stdcall *PGET_MODULE_BASE_ROUTINE64)( + HANDLE hProcess, + DWORD64 Address + ); +typedef +DWORD64 +(__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)( + HANDLE hProcess, + HANDLE hThread, + LPADDRESS64 lpaddr + ); +#define SYMOPT_CASE_INSENSITIVE 0x00000001 +#define SYMOPT_UNDNAME 0x00000002 +#define SYMOPT_DEFERRED_LOADS 0x00000004 +#define SYMOPT_NO_CPP 0x00000008 +#define SYMOPT_LOAD_LINES 0x00000010 +#define SYMOPT_OMAP_FIND_NEAREST 0x00000020 +#define SYMOPT_LOAD_ANYTHING 0x00000040 +#define SYMOPT_IGNORE_CVREC 0x00000080 +#define SYMOPT_NO_UNQUALIFIED_LOADS 0x00000100 +#define SYMOPT_FAIL_CRITICAL_ERRORS 0x00000200 +#define SYMOPT_EXACT_SYMBOLS 0x00000400 +#define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS 0x00000800 +#define SYMOPT_IGNORE_NT_SYMPATH 0x00001000 +#define SYMOPT_INCLUDE_32BIT_MODULES 0x00002000 +#define SYMOPT_PUBLICS_ONLY 0x00004000 +#define SYMOPT_NO_PUBLICS 0x00008000 +#define SYMOPT_AUTO_PUBLICS 0x00010000 +#define SYMOPT_NO_IMAGE_SEARCH 0x00020000 +#define SYMOPT_SECURE 0x00040000 +#define SYMOPT_DEBUG 0x80000000 +#define UNDNAME_COMPLETE (0x0000) // Enable full undecoration +#define UNDNAME_NAME_ONLY (0x1000) // Crack only the name for primary declaration; +#endif // _MSC_VER < 1300 +#pragma pack(pop) + +// Some missing defines (for VC5/6): +#ifndef INVALID_FILE_ATTRIBUTES +#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) +#endif + + +// secure-CRT_functions are only available starting with VC8 +#if _MSC_VER < 1400 +#define strcpy_s(dst, len, src) strcpy(dst, src) +#define strncpy_s(dst, len, src, maxLen) strncpy(dst, len, src) +#define strcat_s(dst, len, src) strcat(dst, src) +#define _snprintf_s _snprintf +#define _tcscat_s _tcscat +#endif + +static void MyStrCpy(char* szDest, size_t nMaxDestSize, const char* szSrc) +{ + if (nMaxDestSize <= 0) return; + if (strlen(szSrc) < nMaxDestSize) + { + strcpy_s(szDest, nMaxDestSize, szSrc); + } + else + { + strncpy_s(szDest, nMaxDestSize, szSrc, nMaxDestSize); + szDest[nMaxDestSize-1] = 0; + } +} // MyStrCpy + +// Normally it should be enough to use 'CONTEXT_FULL' (better would be 'CONTEXT_ALL') +#define USED_CONTEXT_FLAGS CONTEXT_FULL + + +class StackWalkerInternal +{ +public: + StackWalkerInternal(StackWalker *parent, HANDLE hProcess) + { + m_parent = parent; + m_hDbhHelp = NULL; + pSC = NULL; + m_hProcess = hProcess; + m_szSymPath = NULL; + pSFTA = NULL; + pSGLFA = NULL; + pSGMB = NULL; + pSGMI = NULL; + pSGO = NULL; + pSGSFA = NULL; + pSI = NULL; + pSLM = NULL; + pSSO = NULL; + pSW = NULL; + pUDSN = NULL; + pSGSP = NULL; + } + ~StackWalkerInternal() + { + if (pSC != NULL) + pSC(m_hProcess); // SymCleanup + if (m_hDbhHelp != NULL) + FreeLibrary(m_hDbhHelp); + m_hDbhHelp = NULL; + m_parent = NULL; + if(m_szSymPath != NULL) + free(m_szSymPath); + m_szSymPath = NULL; + } + BOOL Init(LPCSTR szSymPath) + { + if (m_parent == NULL) + return FALSE; + // Dynamically load the Entry-Points for dbghelp.dll: + // First try to load the newsest one from + TCHAR szTemp[4096]; + // But before wqe do this, we first check if the ".local" file exists + if (GetModuleFileName(NULL, szTemp, 4096) > 0) + { + _tcscat_s(szTemp, _T(".local")); + if (GetFileAttributes(szTemp) == INVALID_FILE_ATTRIBUTES) + { + // ".local" file does not exist, so we can try to load the dbghelp.dll from the "Debugging Tools for Windows" + // Ok, first try the new path according to the archtitecture: +#ifdef _M_IX86 + if ( (m_hDbhHelp == NULL) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) ) + { + _tcscat_s(szTemp, _T("\\Debugging Tools for Windows (x86)\\dbghelp.dll")); + // now check if the file exists: + if (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES) + { + m_hDbhHelp = LoadLibrary(szTemp); + } + } +#elif _M_X64 + if ( (m_hDbhHelp == NULL) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) ) + { + _tcscat_s(szTemp, _T("\\Debugging Tools for Windows (x64)\\dbghelp.dll")); + // now check if the file exists: + if (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES) + { + m_hDbhHelp = LoadLibrary(szTemp); + } + } +#elif _M_IA64 + if ( (m_hDbhHelp == NULL) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) ) + { + _tcscat_s(szTemp, _T("\\Debugging Tools for Windows (ia64)\\dbghelp.dll")); + // now check if the file exists: + if (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES) + { + m_hDbhHelp = LoadLibrary(szTemp); + } + } +#endif + // If still not found, try the old directories... + if ( (m_hDbhHelp == NULL) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) ) + { + _tcscat_s(szTemp, _T("\\Debugging Tools for Windows\\dbghelp.dll")); + // now check if the file exists: + if (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES) + { + m_hDbhHelp = LoadLibrary(szTemp); + } + } +#if defined _M_X64 || defined _M_IA64 + // Still not found? Then try to load the (old) 64-Bit version: + if ( (m_hDbhHelp == NULL) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) ) + { + _tcscat_s(szTemp, _T("\\Debugging Tools for Windows 64-Bit\\dbghelp.dll")); + if (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES) + { + m_hDbhHelp = LoadLibrary(szTemp); + } + } +#endif + } + } + if (m_hDbhHelp == NULL) // if not already loaded, try to load a default-one + m_hDbhHelp = LoadLibrary( _T("dbghelp.dll") ); + if (m_hDbhHelp == NULL) + return FALSE; + pSI = (tSI) GetProcAddress(m_hDbhHelp, "SymInitialize" ); + pSC = (tSC) GetProcAddress(m_hDbhHelp, "SymCleanup" ); + + pSW = (tSW) GetProcAddress(m_hDbhHelp, "StackWalk64" ); + pSGO = (tSGO) GetProcAddress(m_hDbhHelp, "SymGetOptions" ); + pSSO = (tSSO) GetProcAddress(m_hDbhHelp, "SymSetOptions" ); + + pSFTA = (tSFTA) GetProcAddress(m_hDbhHelp, "SymFunctionTableAccess64" ); + pSGLFA = (tSGLFA) GetProcAddress(m_hDbhHelp, "SymGetLineFromAddr64" ); + pSGMB = (tSGMB) GetProcAddress(m_hDbhHelp, "SymGetModuleBase64" ); + pSGMI = (tSGMI) GetProcAddress(m_hDbhHelp, "SymGetModuleInfo64" ); + pSGSFA = (tSGSFA) GetProcAddress(m_hDbhHelp, "SymGetSymFromAddr64" ); + pUDSN = (tUDSN) GetProcAddress(m_hDbhHelp, "UnDecorateSymbolName" ); + pSLM = (tSLM) GetProcAddress(m_hDbhHelp, "SymLoadModule64" ); + pSGSP =(tSGSP) GetProcAddress(m_hDbhHelp, "SymGetSearchPath" ); + + if ( pSC == NULL || pSFTA == NULL || pSGMB == NULL || pSGMI == NULL || + pSGO == NULL || pSGSFA == NULL || pSI == NULL || pSSO == NULL || + pSW == NULL || pUDSN == NULL || pSLM == NULL ) + { + FreeLibrary(m_hDbhHelp); + m_hDbhHelp = NULL; + pSC = NULL; + return FALSE; + } + + // SymInitialize + if (szSymPath != NULL) + m_szSymPath = _strdup(szSymPath); + if (this->pSI(m_hProcess, m_szSymPath, FALSE) == FALSE) + this->m_parent->OnDbgHelpErr("SymInitialize", GetLastError(), 0); + + DWORD symOptions = this->pSGO(); // SymGetOptions + symOptions |= SYMOPT_LOAD_LINES; + symOptions |= SYMOPT_FAIL_CRITICAL_ERRORS; + //symOptions |= SYMOPT_NO_PROMPTS; + // SymSetOptions + symOptions = this->pSSO(symOptions); + + char buf[StackWalker::STACKWALK_MAX_NAMELEN] = {0}; + if (this->pSGSP != NULL) + { + if (this->pSGSP(m_hProcess, buf, StackWalker::STACKWALK_MAX_NAMELEN) == FALSE) + this->m_parent->OnDbgHelpErr("SymGetSearchPath", GetLastError(), 0); + } + char szUserName[1024] = {0}; + DWORD dwSize = 1024; + GetUserNameA(szUserName, &dwSize); + this->m_parent->OnSymInit(buf, symOptions, szUserName); + + return TRUE; + } + + StackWalker *m_parent; + + HMODULE m_hDbhHelp; + HANDLE m_hProcess; + LPSTR m_szSymPath; + +#pragma pack(push,8) +typedef struct IMAGEHLP_MODULE64_V3 { + DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE64) + DWORD64 BaseOfImage; // base load address of module + DWORD ImageSize; // virtual size of the loaded module + DWORD TimeDateStamp; // date/time stamp from pe header + DWORD CheckSum; // checksum from the pe header + DWORD NumSyms; // number of symbols in the symbol table + SYM_TYPE SymType; // type of symbols loaded + CHAR ModuleName[32]; // module name + CHAR ImageName[256]; // image name + CHAR LoadedImageName[256]; // symbol file name + // new elements: 07-Jun-2002 + CHAR LoadedPdbName[256]; // pdb file name + DWORD CVSig; // Signature of the CV record in the debug directories + CHAR CVData[MAX_PATH * 3]; // Contents of the CV record + DWORD PdbSig; // Signature of PDB + GUID PdbSig70; // Signature of PDB (VC 7 and up) + DWORD PdbAge; // DBI age of pdb + BOOL PdbUnmatched; // loaded an unmatched pdb + BOOL DbgUnmatched; // loaded an unmatched dbg + BOOL LineNumbers; // we have line number information + BOOL GlobalSymbols; // we have internal symbol information + BOOL TypeInfo; // we have type information + // new elements: 17-Dec-2003 + BOOL SourceIndexed; // pdb supports source server + BOOL Publics; // contains public symbols +}; + +typedef struct IMAGEHLP_MODULE64_V2 { + DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE64) + DWORD64 BaseOfImage; // base load address of module + DWORD ImageSize; // virtual size of the loaded module + DWORD TimeDateStamp; // date/time stamp from pe header + DWORD CheckSum; // checksum from the pe header + DWORD NumSyms; // number of symbols in the symbol table + SYM_TYPE SymType; // type of symbols loaded + CHAR ModuleName[32]; // module name + CHAR ImageName[256]; // image name + CHAR LoadedImageName[256]; // symbol file name +}; +#pragma pack(pop) + + + // SymCleanup() + typedef BOOL (__stdcall *tSC)( IN HANDLE hProcess ); + tSC pSC; + + // SymFunctionTableAccess64() + typedef PVOID (__stdcall *tSFTA)( HANDLE hProcess, DWORD64 AddrBase ); + tSFTA pSFTA; + + // SymGetLineFromAddr64() + typedef BOOL (__stdcall *tSGLFA)( IN HANDLE hProcess, IN DWORD64 dwAddr, + OUT PDWORD pdwDisplacement, OUT PIMAGEHLP_LINE64 Line ); + tSGLFA pSGLFA; + + // SymGetModuleBase64() + typedef DWORD64 (__stdcall *tSGMB)( IN HANDLE hProcess, IN DWORD64 dwAddr ); + tSGMB pSGMB; + + // SymGetModuleInfo64() + typedef BOOL (__stdcall *tSGMI)( IN HANDLE hProcess, IN DWORD64 dwAddr, OUT IMAGEHLP_MODULE64_V3 *ModuleInfo ); + tSGMI pSGMI; + + // SymGetOptions() + typedef DWORD (__stdcall *tSGO)( VOID ); + tSGO pSGO; + + // SymGetSymFromAddr64() + typedef BOOL (__stdcall *tSGSFA)( IN HANDLE hProcess, IN DWORD64 dwAddr, + OUT PDWORD64 pdwDisplacement, OUT PIMAGEHLP_SYMBOL64 Symbol ); + tSGSFA pSGSFA; + + // SymInitialize() + typedef BOOL (__stdcall *tSI)( IN HANDLE hProcess, IN PSTR UserSearchPath, IN BOOL fInvadeProcess ); + tSI pSI; + + // SymLoadModule64() + typedef DWORD64 (__stdcall *tSLM)( IN HANDLE hProcess, IN HANDLE hFile, + IN PSTR ImageName, IN PSTR ModuleName, IN DWORD64 BaseOfDll, IN DWORD SizeOfDll ); + tSLM pSLM; + + // SymSetOptions() + typedef DWORD (__stdcall *tSSO)( IN DWORD SymOptions ); + tSSO pSSO; + + // StackWalk64() + typedef BOOL (__stdcall *tSW)( + DWORD MachineType, + HANDLE hProcess, + HANDLE hThread, + LPSTACKFRAME64 StackFrame, + PVOID ContextRecord, + PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, + PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress ); + tSW pSW; + + // UnDecorateSymbolName() + typedef DWORD (__stdcall WINAPI *tUDSN)( PCSTR DecoratedName, PSTR UnDecoratedName, + DWORD UndecoratedLength, DWORD Flags ); + tUDSN pUDSN; + + typedef BOOL (__stdcall WINAPI *tSGSP)(HANDLE hProcess, PSTR SearchPath, DWORD SearchPathLength); + tSGSP pSGSP; + + +private: + // **************************************** ToolHelp32 ************************ + #define MAX_MODULE_NAME32 255 + #define TH32CS_SNAPMODULE 0x00000008 + #pragma pack( push, 8 ) + typedef struct tagMODULEENTRY32 + { + DWORD dwSize; + DWORD th32ModuleID; // This module + DWORD th32ProcessID; // owning process + DWORD GlblcntUsage; // Global usage count on the module + DWORD ProccntUsage; // Module usage count in th32ProcessID's context + BYTE * modBaseAddr; // Base address of module in th32ProcessID's context + DWORD modBaseSize; // Size in bytes of module starting at modBaseAddr + HMODULE hModule; // The hModule of this module in th32ProcessID's context + char szModule[MAX_MODULE_NAME32 + 1]; + char szExePath[MAX_PATH]; + } MODULEENTRY32; + typedef MODULEENTRY32 * PMODULEENTRY32; + typedef MODULEENTRY32 * LPMODULEENTRY32; + #pragma pack( pop ) + + BOOL GetModuleListTH32(HANDLE hProcess, DWORD pid) + { + // CreateToolhelp32Snapshot() + typedef HANDLE (__stdcall *tCT32S)(DWORD dwFlags, DWORD th32ProcessID); + // Module32First() + typedef BOOL (__stdcall *tM32F)(HANDLE hSnapshot, LPMODULEENTRY32 lpme); + // Module32Next() + typedef BOOL (__stdcall *tM32N)(HANDLE hSnapshot, LPMODULEENTRY32 lpme); + + // try both dlls... + const TCHAR *dllname[] = { _T("kernel32.dll"), _T("tlhelp32.dll") }; + HINSTANCE hToolhelp = NULL; + tCT32S pCT32S = NULL; + tM32F pM32F = NULL; + tM32N pM32N = NULL; + + HANDLE hSnap; + MODULEENTRY32 me; + me.dwSize = sizeof(me); + BOOL keepGoing; + size_t i; + + for (i = 0; i<(sizeof(dllname) / sizeof(dllname[0])); i++ ) + { + hToolhelp = LoadLibrary( dllname[i] ); + if (hToolhelp == NULL) + continue; + pCT32S = (tCT32S) GetProcAddress(hToolhelp, "CreateToolhelp32Snapshot"); + pM32F = (tM32F) GetProcAddress(hToolhelp, "Module32First"); + pM32N = (tM32N) GetProcAddress(hToolhelp, "Module32Next"); + if ( (pCT32S != NULL) && (pM32F != NULL) && (pM32N != NULL) ) + break; // found the functions! + FreeLibrary(hToolhelp); + hToolhelp = NULL; + } + + if (hToolhelp == NULL) + return FALSE; + + hSnap = pCT32S( TH32CS_SNAPMODULE, pid ); + if (hSnap == (HANDLE) -1) + { + FreeLibrary(hToolhelp); + return FALSE; + } + + keepGoing = !!pM32F( hSnap, &me ); + int cnt = 0; + while (keepGoing) + { + this->LoadModule(hProcess, me.szExePath, me.szModule, (DWORD64) me.modBaseAddr, me.modBaseSize); + cnt++; + keepGoing = !!pM32N( hSnap, &me ); + } + CloseHandle(hSnap); + FreeLibrary(hToolhelp); + if (cnt <= 0) + return FALSE; + return TRUE; + } // GetModuleListTH32 + + // **************************************** PSAPI ************************ + typedef struct _MODULEINFO { + LPVOID lpBaseOfDll; + DWORD SizeOfImage; + LPVOID EntryPoint; + } MODULEINFO, *LPMODULEINFO; + + BOOL GetModuleListPSAPI(HANDLE hProcess) + { + // EnumProcessModules() + typedef BOOL (__stdcall *tEPM)(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded ); + // GetModuleFileNameEx() + typedef DWORD (__stdcall *tGMFNE)(HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize ); + // GetModuleBaseName() + typedef DWORD (__stdcall *tGMBN)(HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize ); + // GetModuleInformation() + typedef BOOL (__stdcall *tGMI)(HANDLE hProcess, HMODULE hModule, LPMODULEINFO pmi, DWORD nSize ); + + HINSTANCE hPsapi; + tEPM pEPM; + tGMFNE pGMFNE; + tGMBN pGMBN; + tGMI pGMI; + + DWORD i; + //ModuleEntry e; + DWORD cbNeeded; + MODULEINFO mi; + HMODULE *hMods = 0; + char *tt = NULL; + char *tt2 = NULL; + const SIZE_T TTBUFLEN = 8096; + int cnt = 0; + + hPsapi = LoadLibrary( _T("psapi.dll") ); + if (hPsapi == NULL) + return FALSE; + + pEPM = (tEPM) GetProcAddress( hPsapi, "EnumProcessModules" ); + pGMFNE = (tGMFNE) GetProcAddress( hPsapi, "GetModuleFileNameExA" ); + pGMBN = (tGMFNE) GetProcAddress( hPsapi, "GetModuleBaseNameA" ); + pGMI = (tGMI) GetProcAddress( hPsapi, "GetModuleInformation" ); + if ( (pEPM == NULL) || (pGMFNE == NULL) || (pGMBN == NULL) || (pGMI == NULL) ) + { + // we couldn�t find all functions + FreeLibrary(hPsapi); + return FALSE; + } + + hMods = (HMODULE*) malloc(sizeof(HMODULE) * (TTBUFLEN / sizeof HMODULE)); + tt = (char*) malloc(sizeof(char) * TTBUFLEN); + tt2 = (char*) malloc(sizeof(char) * TTBUFLEN); + if ( (hMods == NULL) || (tt == NULL) || (tt2 == NULL) ) + goto cleanup; + + if ( ! pEPM( hProcess, hMods, TTBUFLEN, &cbNeeded ) ) + { + //_ftprintf(fLogFile, _T("%lu: EPM failed, GetLastError = %lu\n"), g_dwShowCount, gle ); + goto cleanup; + } + + if ( cbNeeded > TTBUFLEN ) + { + //_ftprintf(fLogFile, _T("%lu: More than %lu module handles. Huh?\n"), g_dwShowCount, lenof( hMods ) ); + goto cleanup; + } + + for ( i = 0; i < cbNeeded / sizeof hMods[0]; i++ ) + { + // base address, size + pGMI(hProcess, hMods[i], &mi, sizeof mi ); + // image file name + tt[0] = 0; + pGMFNE(hProcess, hMods[i], tt, TTBUFLEN ); + // module name + tt2[0] = 0; + pGMBN(hProcess, hMods[i], tt2, TTBUFLEN ); + + DWORD dwRes = this->LoadModule(hProcess, tt, tt2, (DWORD64) mi.lpBaseOfDll, mi.SizeOfImage); + if (dwRes != ERROR_SUCCESS) + this->m_parent->OnDbgHelpErr("LoadModule", dwRes, 0); + cnt++; + } + + cleanup: + if (hPsapi != NULL) FreeLibrary(hPsapi); + if (tt2 != NULL) free(tt2); + if (tt != NULL) free(tt); + if (hMods != NULL) free(hMods); + + return cnt != 0; + } // GetModuleListPSAPI + + DWORD LoadModule(HANDLE hProcess, LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size) + { + CHAR *szImg = _strdup(img); + CHAR *szMod = _strdup(mod); + DWORD result = ERROR_SUCCESS; + if ( (szImg == NULL) || (szMod == NULL) ) + result = ERROR_NOT_ENOUGH_MEMORY; + else + { + if (pSLM(hProcess, 0, szImg, szMod, baseAddr, size) == 0) + result = GetLastError(); + } + ULONGLONG fileVersion = 0; + if ( (m_parent != NULL) && (szImg != NULL) ) + { + // try to retrive the file-version: + if ( (this->m_parent->m_options & StackWalker::RetrieveFileVersion) != 0) + { + VS_FIXEDFILEINFO *fInfo = NULL; + DWORD dwHandle; + DWORD dwSize = GetFileVersionInfoSizeA(szImg, &dwHandle); + if (dwSize > 0) + { + LPVOID vData = malloc(dwSize); + if (vData != NULL) + { + if (GetFileVersionInfoA(szImg, dwHandle, dwSize, vData) != 0) + { + UINT len; + TCHAR szSubBlock[] = _T("\\"); + if (VerQueryValue(vData, szSubBlock, (LPVOID*) &fInfo, &len) == 0) + fInfo = NULL; + else + { + fileVersion = ((ULONGLONG)fInfo->dwFileVersionLS) + ((ULONGLONG)fInfo->dwFileVersionMS << 32); + } + } + free(vData); + } + } + } + + // Retrive some additional-infos about the module + IMAGEHLP_MODULE64_V3 Module; + const char *szSymType = "-unknown-"; + if (this->GetModuleInfo(hProcess, baseAddr, &Module) != FALSE) + { + switch(Module.SymType) + { + case SymNone: + szSymType = "-nosymbols-"; + break; + case SymCoff: // 1 + szSymType = "COFF"; + break; + case SymCv: // 2 + szSymType = "CV"; + break; + case SymPdb: // 3 + szSymType = "PDB"; + break; + case SymExport: // 4 + szSymType = "-exported-"; + break; + case SymDeferred: // 5 + szSymType = "-deferred-"; + break; + case SymSym: // 6 + szSymType = "SYM"; + break; + case 7: // SymDia: + szSymType = "DIA"; + break; + case 8: //SymVirtual: + szSymType = "Virtual"; + break; + } + } + LPCSTR pdbName = Module.LoadedImageName; + if (Module.LoadedPdbName[0] != 0) + pdbName = Module.LoadedPdbName; + this->m_parent->OnLoadModule(img, mod, baseAddr, size, result, szSymType, pdbName, fileVersion); + } + if (szImg != NULL) free(szImg); + if (szMod != NULL) free(szMod); + return result; + } +public: + BOOL LoadModules(HANDLE hProcess, DWORD dwProcessId) + { + // first try toolhelp32 + if (GetModuleListTH32(hProcess, dwProcessId)) + return true; + // then try psapi + return GetModuleListPSAPI(hProcess); + } + + + BOOL GetModuleInfo(HANDLE hProcess, DWORD64 baseAddr, IMAGEHLP_MODULE64_V3 *pModuleInfo) + { + memset(pModuleInfo, 0, sizeof(IMAGEHLP_MODULE64_V3)); + if(this->pSGMI == NULL) + { + SetLastError(ERROR_DLL_INIT_FAILED); + return FALSE; + } + // First try to use the larger ModuleInfo-Structure + pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V3); + void *pData = malloc(4096); // reserve enough memory, so the bug in v6.3.5.1 does not lead to memory-overwrites... + if (pData == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + memcpy(pData, pModuleInfo, sizeof(IMAGEHLP_MODULE64_V3)); + static bool s_useV3Version = true; + if (s_useV3Version) + { + if (this->pSGMI(hProcess, baseAddr, (IMAGEHLP_MODULE64_V3*) pData) != FALSE) + { + // only copy as much memory as is reserved... + memcpy(pModuleInfo, pData, sizeof(IMAGEHLP_MODULE64_V3)); + pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V3); + free(pData); + return TRUE; + } + s_useV3Version = false; // to prevent unneccessarry calls with the larger struct... + } + + // could not retrive the bigger structure, try with the smaller one (as defined in VC7.1)... + pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V2); + memcpy(pData, pModuleInfo, sizeof(IMAGEHLP_MODULE64_V2)); + if (this->pSGMI(hProcess, baseAddr, (IMAGEHLP_MODULE64_V3*) pData) != FALSE) + { + // only copy as much memory as is reserved... + memcpy(pModuleInfo, pData, sizeof(IMAGEHLP_MODULE64_V2)); + pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V2); + free(pData); + return TRUE; + } + free(pData); + SetLastError(ERROR_DLL_INIT_FAILED); + return FALSE; + } +}; + +// ############################################################# +StackWalker::StackWalker(DWORD dwProcessId, HANDLE hProcess) +{ + this->m_options = OptionsAll; + this->m_modulesLoaded = FALSE; + this->m_hProcess = hProcess; + this->m_sw = new StackWalkerInternal(this, this->m_hProcess); + this->m_dwProcessId = dwProcessId; + this->m_szSymPath = NULL; + this->m_MaxRecursionCount = 1000; +} +StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDLE hProcess) +{ + this->m_options = options; + this->m_modulesLoaded = FALSE; + this->m_hProcess = hProcess; + this->m_sw = new StackWalkerInternal(this, this->m_hProcess); + this->m_dwProcessId = dwProcessId; + if (szSymPath != NULL) + { + this->m_szSymPath = _strdup(szSymPath); + this->m_options |= SymBuildPath; + } + else + this->m_szSymPath = NULL; + this->m_MaxRecursionCount = 1000; +} + +StackWalker::~StackWalker() +{ + if (m_szSymPath != NULL) + free(m_szSymPath); + m_szSymPath = NULL; + if (this->m_sw != NULL) + delete this->m_sw; + this->m_sw = NULL; +} + +BOOL StackWalker::LoadModules() +{ + if (this->m_sw == NULL) + { + SetLastError(ERROR_DLL_INIT_FAILED); + return FALSE; + } + if (m_modulesLoaded != FALSE) + return TRUE; + + // Build the sym-path: + char *szSymPath = NULL; + if ( (this->m_options & SymBuildPath) != 0) + { + const size_t nSymPathLen = 4096; + szSymPath = (char*) malloc(nSymPathLen); + if (szSymPath == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + szSymPath[0] = 0; + // Now first add the (optional) provided sympath: + if (this->m_szSymPath != NULL) + { + strcat_s(szSymPath, nSymPathLen, this->m_szSymPath); + strcat_s(szSymPath, nSymPathLen, ";"); + } + + strcat_s(szSymPath, nSymPathLen, ".;"); + + const size_t nTempLen = 1024; + char szTemp[nTempLen]; + // Now add the current directory: + if (GetCurrentDirectoryA(nTempLen, szTemp) > 0) + { + szTemp[nTempLen-1] = 0; + strcat_s(szSymPath, nSymPathLen, szTemp); + strcat_s(szSymPath, nSymPathLen, ";"); + } + + // Now add the path for the main-module: + if (GetModuleFileNameA(NULL, szTemp, nTempLen) > 0) + { + szTemp[nTempLen-1] = 0; + for (char *p = (szTemp+strlen(szTemp)-1); p >= szTemp; --p) + { + // locate the rightmost path separator + if ( (*p == '\\') || (*p == '/') || (*p == ':') ) + { + *p = 0; + break; + } + } // for (search for path separator...) + if (strlen(szTemp) > 0) + { + strcat_s(szSymPath, nSymPathLen, szTemp); + strcat_s(szSymPath, nSymPathLen, ";"); + } + } + if (GetEnvironmentVariableA("_NT_SYMBOL_PATH", szTemp, nTempLen) > 0) + { + szTemp[nTempLen-1] = 0; + strcat_s(szSymPath, nSymPathLen, szTemp); + strcat_s(szSymPath, nSymPathLen, ";"); + } + if (GetEnvironmentVariableA("_NT_ALTERNATE_SYMBOL_PATH", szTemp, nTempLen) > 0) + { + szTemp[nTempLen-1] = 0; + strcat_s(szSymPath, nSymPathLen, szTemp); + strcat_s(szSymPath, nSymPathLen, ";"); + } + if (GetEnvironmentVariableA("SYSTEMROOT", szTemp, nTempLen) > 0) + { + szTemp[nTempLen-1] = 0; + strcat_s(szSymPath, nSymPathLen, szTemp); + strcat_s(szSymPath, nSymPathLen, ";"); + // also add the "system32"-directory: + strcat_s(szTemp, nTempLen, "\\system32"); + strcat_s(szSymPath, nSymPathLen, szTemp); + strcat_s(szSymPath, nSymPathLen, ";"); + } + + if ( (this->m_options & SymUseSymSrv) != 0) + { + if (GetEnvironmentVariableA("SYSTEMDRIVE", szTemp, nTempLen) > 0) + { + szTemp[nTempLen-1] = 0; + strcat_s(szSymPath, nSymPathLen, "SRV*"); + strcat_s(szSymPath, nSymPathLen, szTemp); + strcat_s(szSymPath, nSymPathLen, "\\websymbols"); + strcat_s(szSymPath, nSymPathLen, "*http://msdl.microsoft.com/download/symbols;"); + } + else + strcat_s(szSymPath, nSymPathLen, "SRV*c:\\websymbols*http://msdl.microsoft.com/download/symbols;"); + } + } // if SymBuildPath + + // First Init the whole stuff... + BOOL bRet = this->m_sw->Init(szSymPath); + if (szSymPath != NULL) free(szSymPath); szSymPath = NULL; + if (bRet == FALSE) + { + this->OnDbgHelpErr("Error while initializing dbghelp.dll", 0, 0); + SetLastError(ERROR_DLL_INIT_FAILED); + return FALSE; + } + + bRet = this->m_sw->LoadModules(this->m_hProcess, this->m_dwProcessId); + if (bRet != FALSE) + m_modulesLoaded = TRUE; + return bRet; +} + + +// The following is used to pass the "userData"-Pointer to the user-provided readMemoryFunction +// This has to be done due to a problem with the "hProcess"-parameter in x64... +// Because this class is in no case multi-threading-enabled (because of the limitations +// of dbghelp.dll) it is "safe" to use a static-variable +static StackWalker::PReadProcessMemoryRoutine s_readMemoryFunction = NULL; +static LPVOID s_readMemoryFunction_UserData = NULL; + +BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadProcessMemoryRoutine readMemoryFunction, LPVOID pUserData) +{ + CONTEXT c; + CallstackEntry csEntry; + IMAGEHLP_SYMBOL64 *pSym = NULL; + StackWalkerInternal::IMAGEHLP_MODULE64_V3 Module; + IMAGEHLP_LINE64 Line; + int frameNum; + bool bLastEntryCalled = true; + int curRecursionCount = 0; + + if (m_modulesLoaded == FALSE) + this->LoadModules(); // ignore the result... + + if (this->m_sw->m_hDbhHelp == NULL) + { + SetLastError(ERROR_DLL_INIT_FAILED); + return FALSE; + } + + s_readMemoryFunction = readMemoryFunction; + s_readMemoryFunction_UserData = pUserData; + + if (context == NULL) + { + // If no context is provided, capture the context + if (hThread == GetCurrentThread()) + { + GET_CURRENT_CONTEXT(c, USED_CONTEXT_FLAGS); + } + else + { + SuspendThread(hThread); + memset(&c, 0, sizeof(CONTEXT)); + c.ContextFlags = USED_CONTEXT_FLAGS; + if (GetThreadContext(hThread, &c) == FALSE) + { + ResumeThread(hThread); + return FALSE; + } + } + } + else + c = *context; + + // init STACKFRAME for first call + STACKFRAME64 s; // in/out stackframe + memset(&s, 0, sizeof(s)); + DWORD imageType; +#ifdef _M_IX86 + // normally, call ImageNtHeader() and use machine info from PE header + imageType = IMAGE_FILE_MACHINE_I386; + s.AddrPC.Offset = c.Eip; + s.AddrPC.Mode = AddrModeFlat; + s.AddrFrame.Offset = c.Ebp; + s.AddrFrame.Mode = AddrModeFlat; + s.AddrStack.Offset = c.Esp; + s.AddrStack.Mode = AddrModeFlat; +#elif _M_X64 + imageType = IMAGE_FILE_MACHINE_AMD64; + s.AddrPC.Offset = c.Rip; + s.AddrPC.Mode = AddrModeFlat; + s.AddrFrame.Offset = c.Rsp; + s.AddrFrame.Mode = AddrModeFlat; + s.AddrStack.Offset = c.Rsp; + s.AddrStack.Mode = AddrModeFlat; +#elif _M_IA64 + imageType = IMAGE_FILE_MACHINE_IA64; + s.AddrPC.Offset = c.StIIP; + s.AddrPC.Mode = AddrModeFlat; + s.AddrFrame.Offset = c.IntSp; + s.AddrFrame.Mode = AddrModeFlat; + s.AddrBStore.Offset = c.RsBSP; + s.AddrBStore.Mode = AddrModeFlat; + s.AddrStack.Offset = c.IntSp; + s.AddrStack.Mode = AddrModeFlat; +#else +#error "Platform not supported!" +#endif + + pSym = (IMAGEHLP_SYMBOL64 *) malloc(sizeof(IMAGEHLP_SYMBOL64) + STACKWALK_MAX_NAMELEN); + if (!pSym) goto cleanup; // not enough memory... + memset(pSym, 0, sizeof(IMAGEHLP_SYMBOL64) + STACKWALK_MAX_NAMELEN); + pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); + pSym->MaxNameLength = STACKWALK_MAX_NAMELEN; + + memset(&Line, 0, sizeof(Line)); + Line.SizeOfStruct = sizeof(Line); + + memset(&Module, 0, sizeof(Module)); + Module.SizeOfStruct = sizeof(Module); + + for (frameNum = 0; ; ++frameNum ) + { + // get next stack frame (StackWalk64(), SymFunctionTableAccess64(), SymGetModuleBase64()) + // if this returns ERROR_INVALID_ADDRESS (487) or ERROR_NOACCESS (998), you can + // assume that either you are done, or that the stack is so hosed that the next + // deeper frame could not be found. + // CONTEXT need not to be suplied if imageTyp is IMAGE_FILE_MACHINE_I386! + if ( ! this->m_sw->pSW(imageType, this->m_hProcess, hThread, &s, &c, myReadProcMem, this->m_sw->pSFTA, this->m_sw->pSGMB, NULL) ) + { + // INFO: "StackWalk64" does not set "GetLastError"... + this->OnDbgHelpErr("StackWalk64", 0, s.AddrPC.Offset); + break; + } + + csEntry.offset = s.AddrPC.Offset; + csEntry.name[0] = 0; + csEntry.undName[0] = 0; + csEntry.undFullName[0] = 0; + csEntry.offsetFromSmybol = 0; + csEntry.offsetFromLine = 0; + csEntry.lineFileName[0] = 0; + csEntry.lineNumber = 0; + csEntry.loadedImageName[0] = 0; + csEntry.moduleName[0] = 0; + if (s.AddrPC.Offset == s.AddrReturn.Offset) + { + if ( (this->m_MaxRecursionCount > 0) && (curRecursionCount > m_MaxRecursionCount) ) + { + this->OnDbgHelpErr("StackWalk64-Endless-Callstack!", 0, s.AddrPC.Offset); + break; + } + curRecursionCount++; + } + else + curRecursionCount = 0; + if (s.AddrPC.Offset != 0) + { + // we seem to have a valid PC + // show procedure info (SymGetSymFromAddr64()) + if (this->m_sw->pSGSFA(this->m_hProcess, s.AddrPC.Offset, &(csEntry.offsetFromSmybol), pSym) != FALSE) + { + MyStrCpy(csEntry.name, STACKWALK_MAX_NAMELEN, pSym->Name); + // UnDecorateSymbolName() + this->m_sw->pUDSN( pSym->Name, csEntry.undName, STACKWALK_MAX_NAMELEN, UNDNAME_NAME_ONLY ); + this->m_sw->pUDSN( pSym->Name, csEntry.undFullName, STACKWALK_MAX_NAMELEN, UNDNAME_COMPLETE ); + } + else + { + this->OnDbgHelpErr("SymGetSymFromAddr64", GetLastError(), s.AddrPC.Offset); + } + + // show line number info, NT5.0-method (SymGetLineFromAddr64()) + if (this->m_sw->pSGLFA != NULL ) + { // yes, we have SymGetLineFromAddr64() + if (this->m_sw->pSGLFA(this->m_hProcess, s.AddrPC.Offset, &(csEntry.offsetFromLine), &Line) != FALSE) + { + csEntry.lineNumber = Line.LineNumber; + MyStrCpy(csEntry.lineFileName, STACKWALK_MAX_NAMELEN, Line.FileName); + } + else + { + this->OnDbgHelpErr("SymGetLineFromAddr64", GetLastError(), s.AddrPC.Offset); + } + } // yes, we have SymGetLineFromAddr64() + + // show module info (SymGetModuleInfo64()) + if (this->m_sw->GetModuleInfo(this->m_hProcess, s.AddrPC.Offset, &Module ) != FALSE) + { // got module info OK + switch ( Module.SymType ) + { + case SymNone: + csEntry.symTypeString = "-nosymbols-"; + break; + case SymCoff: + csEntry.symTypeString = "COFF"; + break; + case SymCv: + csEntry.symTypeString = "CV"; + break; + case SymPdb: + csEntry.symTypeString = "PDB"; + break; + case SymExport: + csEntry.symTypeString = "-exported-"; + break; + case SymDeferred: + csEntry.symTypeString = "-deferred-"; + break; + case SymSym: + csEntry.symTypeString = "SYM"; + break; +#if API_VERSION_NUMBER >= 9 + case SymDia: + csEntry.symTypeString = "DIA"; + break; +#endif + case 8: //SymVirtual: + csEntry.symTypeString = "Virtual"; + break; + default: + //_snprintf( ty, sizeof ty, "symtype=%ld", (long) Module.SymType ); + csEntry.symTypeString = NULL; + break; + } + + MyStrCpy(csEntry.moduleName, STACKWALK_MAX_NAMELEN, Module.ModuleName); + csEntry.baseOfImage = Module.BaseOfImage; + MyStrCpy(csEntry.loadedImageName, STACKWALK_MAX_NAMELEN, Module.LoadedImageName); + } // got module info OK + else + { + this->OnDbgHelpErr("SymGetModuleInfo64", GetLastError(), s.AddrPC.Offset); + } + } // we seem to have a valid PC + + CallstackEntryType et = nextEntry; + if (frameNum == 0) + et = firstEntry; + bLastEntryCalled = false; + this->OnCallstackEntry(et, csEntry); + + if (s.AddrReturn.Offset == 0) + { + bLastEntryCalled = true; + this->OnCallstackEntry(lastEntry, csEntry); + SetLastError(ERROR_SUCCESS); + break; + } + } // for ( frameNum ) + + cleanup: + if (pSym) free( pSym ); + + if (bLastEntryCalled == false) + this->OnCallstackEntry(lastEntry, csEntry); + + if (context == NULL) + ResumeThread(hThread); + + return TRUE; +} + +BOOL __stdcall StackWalker::myReadProcMem( + HANDLE hProcess, + DWORD64 qwBaseAddress, + PVOID lpBuffer, + DWORD nSize, + LPDWORD lpNumberOfBytesRead + ) +{ + if (s_readMemoryFunction == NULL) + { + SIZE_T st; + BOOL bRet = ReadProcessMemory(hProcess, (LPVOID) qwBaseAddress, lpBuffer, nSize, &st); + *lpNumberOfBytesRead = (DWORD) st; + //printf("ReadMemory: hProcess: %p, baseAddr: %p, buffer: %p, size: %d, read: %d, result: %d\n", hProcess, (LPVOID) qwBaseAddress, lpBuffer, nSize, (DWORD) st, (DWORD) bRet); + return bRet; + } + else + { + return s_readMemoryFunction(hProcess, qwBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead, s_readMemoryFunction_UserData); + } +} + +void StackWalker::OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion) +{ + CHAR buffer[STACKWALK_MAX_NAMELEN]; + if (fileVersion == 0) + _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "%s:%s (%p), size: %d (result: %d), SymType: '%s', PDB: '%s'\n", img, mod, (LPVOID) baseAddr, size, result, symType, pdbName); + else + { + DWORD v4 = (DWORD) (fileVersion & 0xFFFF); + DWORD v3 = (DWORD) ((fileVersion>>16) & 0xFFFF); + DWORD v2 = (DWORD) ((fileVersion>>32) & 0xFFFF); + DWORD v1 = (DWORD) ((fileVersion>>48) & 0xFFFF); + _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "%s:%s (%p), size: %d (result: %d), SymType: '%s', PDB: '%s', fileVersion: %d.%d.%d.%d\n", img, mod, (LPVOID) baseAddr, size, result, symType, pdbName, v1, v2, v3, v4); + } + OnOutput(buffer); +} + +void StackWalker::OnCallstackEntry(CallstackEntryType eType, CallstackEntry &entry) +{ + CHAR buffer[STACKWALK_MAX_NAMELEN]; + if ( (eType != lastEntry) && (entry.offset != 0) ) + { + if (entry.name[0] == 0) + MyStrCpy(entry.name, STACKWALK_MAX_NAMELEN, "(function-name not available)"); + if (entry.undName[0] != 0) + MyStrCpy(entry.name, STACKWALK_MAX_NAMELEN, entry.undName); + if (entry.undFullName[0] != 0) + MyStrCpy(entry.name, STACKWALK_MAX_NAMELEN, entry.undFullName); + if (entry.lineFileName[0] == 0) + { + MyStrCpy(entry.lineFileName, STACKWALK_MAX_NAMELEN, "(filename not available)"); + if (entry.moduleName[0] == 0) + MyStrCpy(entry.moduleName, STACKWALK_MAX_NAMELEN, "(module-name not available)"); + _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "%p (%s): %s: %s\n", (LPVOID) entry.offset, entry.moduleName, entry.lineFileName, entry.name); + } + else + _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "%s (%d): %s\n", entry.lineFileName, entry.lineNumber, entry.name); + buffer[STACKWALK_MAX_NAMELEN-1] = 0; + OnOutput(buffer); + } +} + +void StackWalker::OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr) +{ + CHAR buffer[STACKWALK_MAX_NAMELEN]; + _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "ERROR: %s, GetLastError: %d (Address: %p)\n", szFuncName, gle, (LPVOID) addr); + OnOutput(buffer); +} + +void StackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName) +{ + CHAR buffer[STACKWALK_MAX_NAMELEN]; + _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "SymInit: Symbol-SearchPath: '%s', symOptions: %d, UserName: '%s'\n", szSearchPath, symOptions, szUserName); + OnOutput(buffer); + // Also display the OS-version +#if _MSC_VER <= 1200 + OSVERSIONINFOA ver; + ZeroMemory(&ver, sizeof(OSVERSIONINFOA)); + ver.dwOSVersionInfoSize = sizeof(ver); + if (GetVersionExA(&ver) != FALSE) + { + _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "OS-Version: %d.%d.%d (%s)\n", + ver.dwMajorVersion, ver.dwMinorVersion, ver.dwBuildNumber, + ver.szCSDVersion); + OnOutput(buffer); + } +#else + OSVERSIONINFOEXA ver; + ZeroMemory(&ver, sizeof(OSVERSIONINFOEXA)); + ver.dwOSVersionInfoSize = sizeof(ver); + if (GetVersionExA( (OSVERSIONINFOA*) &ver) != FALSE) + { + _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "OS-Version: %d.%d.%d (%s) 0x%x-0x%x\n", + ver.dwMajorVersion, ver.dwMinorVersion, ver.dwBuildNumber, + ver.szCSDVersion, ver.wSuiteMask, ver.wProductType); + OnOutput(buffer); + } +#endif +} + +void StackWalker::OnOutput(LPCSTR buffer) +{ + OutputDebugStringA(buffer); +} diff --git a/hmailserver/source/Server/Common/Util/StackWalker.h b/hmailserver/source/Server/Common/Util/StackWalker.h new file mode 100644 index 000000000..c538547d0 --- /dev/null +++ b/hmailserver/source/Server/Common/Util/StackWalker.h @@ -0,0 +1,214 @@ +/********************************************************************** + * + * StackWalker.h + * + * + * + * LICENSE (http://www.opensource.org/licenses/bsd-license.php) + * + * Copyright (c) 2005-2009, Jochen Kalmbach + * 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 Jochen Kalmbach 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. + * + * **********************************************************************/ +// #pragma once is supported starting with _MCS_VER 1000, +// so we need not to check the version (because we only support _MSC_VER >= 1100)! +#pragma once + +#include + +// special defines for VC5/6 (if no actual PSDK is installed): +#if _MSC_VER < 1300 +typedef unsigned __int64 DWORD64, *PDWORD64; +#if defined(_WIN64) +typedef unsigned __int64 SIZE_T, *PSIZE_T; +#else +typedef unsigned long SIZE_T, *PSIZE_T; +#endif +#endif // _MSC_VER < 1300 + +class StackWalkerInternal; // forward +class StackWalker +{ +public: + typedef enum StackWalkOptions + { + // No addition info will be retrived + // (only the address is available) + RetrieveNone = 0, + + // Try to get the symbol-name + RetrieveSymbol = 1, + + // Try to get the line for this symbol + RetrieveLine = 2, + + // Try to retrieve the module-infos + RetrieveModuleInfo = 4, + + // Also retrieve the version for the DLL/EXE + RetrieveFileVersion = 8, + + // Contains all the abouve + RetrieveVerbose = 0xF, + + // Generate a "good" symbol-search-path + SymBuildPath = 0x10, + + // Also use the public Microsoft-Symbol-Server + SymUseSymSrv = 0x20, + + // Contains all the abouve "Sym"-options + SymAll = 0x30, + + // Contains all options (default) + OptionsAll = 0x3F + } StackWalkOptions; + + StackWalker( + int options = OptionsAll, // 'int' is by design, to combine the enum-flags + LPCSTR szSymPath = NULL, + DWORD dwProcessId = GetCurrentProcessId(), + HANDLE hProcess = GetCurrentProcess() + ); + StackWalker(DWORD dwProcessId, HANDLE hProcess); + virtual ~StackWalker(); + + typedef BOOL (__stdcall *PReadProcessMemoryRoutine)( + HANDLE hProcess, + DWORD64 qwBaseAddress, + PVOID lpBuffer, + DWORD nSize, + LPDWORD lpNumberOfBytesRead, + LPVOID pUserData // optional data, which was passed in "ShowCallstack" + ); + + BOOL LoadModules(); + + BOOL ShowCallstack( + HANDLE hThread = GetCurrentThread(), + const CONTEXT *context = NULL, + PReadProcessMemoryRoutine readMemoryFunction = NULL, + LPVOID pUserData = NULL // optional to identify some data in the 'readMemoryFunction'-callback + ); + +#if _MSC_VER >= 1300 +// due to some reasons, the "STACKWALK_MAX_NAMELEN" must be declared as "public" +// in older compilers in order to use it... starting with VC7 we can declare it as "protected" +protected: +#endif + enum { STACKWALK_MAX_NAMELEN = 1024 }; // max name length for found symbols + +protected: + // Entry for each Callstack-Entry + typedef struct CallstackEntry + { + DWORD64 offset; // if 0, we have no valid entry + CHAR name[STACKWALK_MAX_NAMELEN]; + CHAR undName[STACKWALK_MAX_NAMELEN]; + CHAR undFullName[STACKWALK_MAX_NAMELEN]; + DWORD64 offsetFromSmybol; + DWORD offsetFromLine; + DWORD lineNumber; + CHAR lineFileName[STACKWALK_MAX_NAMELEN]; + DWORD symType; + LPCSTR symTypeString; + CHAR moduleName[STACKWALK_MAX_NAMELEN]; + DWORD64 baseOfImage; + CHAR loadedImageName[STACKWALK_MAX_NAMELEN]; + } CallstackEntry; + + typedef enum CallstackEntryType {firstEntry, nextEntry, lastEntry}; + + virtual void OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName); + virtual void OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion); + virtual void OnCallstackEntry(CallstackEntryType eType, CallstackEntry &entry); + virtual void OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr); + virtual void OnOutput(LPCSTR szText); + + StackWalkerInternal *m_sw; + HANDLE m_hProcess; + DWORD m_dwProcessId; + BOOL m_modulesLoaded; + LPSTR m_szSymPath; + + int m_options; + int m_MaxRecursionCount; + + static BOOL __stdcall myReadProcMem(HANDLE hProcess, DWORD64 qwBaseAddress, PVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead); + + friend StackWalkerInternal; +}; // class StackWalker + + +// The "ugly" assembler-implementation is needed for systems before XP +// If you have a new PSDK and you only compile for XP and later, then you can use +// the "RtlCaptureContext" +// Currently there is no define which determines the PSDK-Version... +// So we just use the compiler-version (and assumes that the PSDK is +// the one which was installed by the VS-IDE) + +// INFO: If you want, you can use the RtlCaptureContext if you only target XP and later... +// But I currently use it in x64/IA64 environments... +//#if defined(_M_IX86) && (_WIN32_WINNT <= 0x0500) && (_MSC_VER < 1400) + +#if defined(_M_IX86) +#ifdef CURRENT_THREAD_VIA_EXCEPTION +// TODO: The following is not a "good" implementation, +// because the callstack is only valid in the "__except" block... +#define GET_CURRENT_CONTEXT(c, contextFlags) \ + do { \ + memset(&c, 0, sizeof(CONTEXT)); \ + EXCEPTION_POINTERS *pExp = NULL; \ + __try { \ + throw 0; \ + } __except( ( (pExp = GetExceptionInformation()) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_EXECUTE_HANDLER)) {} \ + if (pExp != NULL) \ + memcpy(&c, pExp->ContextRecord, sizeof(CONTEXT)); \ + c.ContextFlags = contextFlags; \ + } while(0); +#else +// The following should be enough for walking the callstack... +#define GET_CURRENT_CONTEXT(c, contextFlags) \ + do { \ + memset(&c, 0, sizeof(CONTEXT)); \ + c.ContextFlags = contextFlags; \ + __asm call x \ + __asm x: pop eax \ + __asm mov c.Eip, eax \ + __asm mov c.Ebp, ebp \ + __asm mov c.Esp, esp \ + } while(0); +#endif + +#else + +// The following is defined for x86 (XP and higher), x64 and IA64: +#define GET_CURRENT_CONTEXT(c, contextFlags) \ + do { \ + memset(&c, 0, sizeof(CONTEXT)); \ + c.ContextFlags = contextFlags; \ + RtlCaptureContext(&c); \ +} while(0); +#endif diff --git a/hmailserver/source/Server/Common/Util/TransparentTransmissionBuffer.cpp b/hmailserver/source/Server/Common/Util/TransparentTransmissionBuffer.cpp index 247fbb603..3417ef0e4 100644 --- a/hmailserver/source/Server/Common/Util/TransparentTransmissionBuffer.cpp +++ b/hmailserver/source/Server/Common/Util/TransparentTransmissionBuffer.cpp @@ -91,52 +91,32 @@ namespace HM data_sent_+= iBufferSize; // Add the new data to the buffer. - try - { - // Add the new data to the buffer. - buffer_->Add(pBuffer, iBufferSize); - } - catch (...) - { - String message; - message.Format(_T("Error when appending buffer. Buffer: %d, pBuffer: %d, Size: %d"), &buffer_, &pBuffer, iBufferSize); - - ErrorManager::Instance()->ReportError(ErrorManager::High, 5413, "TransparentTransmissionBuffer::Append", message); - throw; - } + buffer_->Add(pBuffer, iBufferSize); // Check if we have received the entire buffer. if (buffer_->GetSize() >= 3 && !is_sending_) { - try + // If receiving, we should check for end-of-data + int iSize = buffer_->GetSize(); + const char *pCharBuffer = buffer_->GetCharBuffer(); + + // Check if the buffer only contains a dot on an empty line. + bool bDotCRLFOnEmptyLine = (pCharBuffer[0] == '.' && pCharBuffer[1] == '\r' && pCharBuffer[2] == '\n'); + + // Look for \r\n.\r\n. + bool bLineBeginnningWithDotCRLF = buffer_->GetSize() >= 5 && + (pCharBuffer[iSize -5] == '\r' && + pCharBuffer[iSize -4] == '\n' && + pCharBuffer[iSize -3] == '.' && + pCharBuffer[iSize -2] == '\r' && + pCharBuffer[iSize -1] == '\n'); + + if (bDotCRLFOnEmptyLine || bLineBeginnningWithDotCRLF) { - // If receiving, we should check for end-of-data - int iSize = buffer_->GetSize(); - const char *pCharBuffer = buffer_->GetCharBuffer(); - - // Check if the buffer only contains a dot on an empty line. - bool bDotCRLFOnEmptyLine = (pCharBuffer[0] == '.' && pCharBuffer[1] == '\r' && pCharBuffer[2] == '\n'); - - // Look for \r\n.\r\n. - bool bLineBeginnningWithDotCRLF = buffer_->GetSize() >= 5 && - (pCharBuffer[iSize -5] == '\r' && - pCharBuffer[iSize -4] == '\n' && - pCharBuffer[iSize -3] == '.' && - pCharBuffer[iSize -2] == '\r' && - pCharBuffer[iSize -1] == '\n'); - - if (bDotCRLFOnEmptyLine || bLineBeginnningWithDotCRLF) - { - // Remove the transmission-end characters. (the 3 last) - buffer_->DecreaseSize(3); + // Remove the transmission-end characters. (the 3 last) + buffer_->DecreaseSize(3); - transmission_ended_ = true; - } - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::High, 5339, "TransparentTransmissionBuffer::Append", "Error when checking for linebreaks."); - throw; + transmission_ended_ = true; } } } diff --git a/hmailserver/source/Server/IMAP/IMAPCommandIdle.cpp b/hmailserver/source/Server/IMAP/IMAPCommandIdle.cpp index ef45b2c14..3ebd84da3 100644 --- a/hmailserver/source/Server/IMAP/IMAPCommandIdle.cpp +++ b/hmailserver/source/Server/IMAP/IMAPCommandIdle.cpp @@ -30,19 +30,11 @@ namespace HM if (!safeConnection) return; - try - { - if (safeConnection->GetIsIdling()) - { - Finish(false); - } - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 4301, "IMAPCommandIdle::~IMAPCommandIdle", "An unknown error has occurred."); - - throw; + if (safeConnection->GetIsIdling()) + { + Finish(false); } + } IMAPResult @@ -59,19 +51,10 @@ namespace HM if (!pConnection->IsAuthenticated()) return IMAPResult(IMAPResult::ResultBad, "Command requires authentication."); - try - { - pConnection->SetIsIdling(true); - pConnection->SendAsciiData("+ idling\r\n"); + pConnection->SetIsIdling(true); + pConnection->SendAsciiData("+ idling\r\n"); - tag_ = pArgument->Tag(); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 4302, "IMAPCommandIdle::ExecuteCommand", "An unknown error has occurred."); - - throw; - } + tag_ = pArgument->Tag(); return IMAPResult(); } @@ -87,21 +70,12 @@ namespace HM if (!safeConnection) return; - try - { - safeConnection->SetIsIdling(false); + safeConnection->SetIsIdling(false); - if (sendNotificationToClient) - { - String sResponse = tag_ + " OK IDLE terminated\r\n"; - safeConnection->SendAsciiData(sResponse); - } - } - catch (...) + if (sendNotificationToClient) { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 4303, "IMAPCommandIdle::Finish", "An unknown error has occurred."); - - throw; + String sResponse = tag_ + " OK IDLE terminated\r\n"; + safeConnection->SendAsciiData(sResponse); } } diff --git a/hmailserver/source/Server/IMAP/IMAPFetch.cpp b/hmailserver/source/Server/IMAP/IMAPFetch.cpp index 51885c847..16e845bfc 100644 --- a/hmailserver/source/Server/IMAP/IMAPFetch.cpp +++ b/hmailserver/source/Server/IMAP/IMAPFetch.cpp @@ -152,26 +152,12 @@ namespace HM { sMessageHeader = PersistentMessage::LoadHeader(messageFileName); - try - { - oMimeHeader.Load(sMessageHeader, sMessageHeader.length()); - } - catch (...) - { - ReportCriticalError_(messageFileName, "ERROR HM10003 - IMAP FETCH: Error when loading MIME header for message."); - } + oMimeHeader.Load(sMessageHeader, sMessageHeader.length()); } - try - { - String sTemp; - sTemp = "ENVELOPE " + CreateEnvelopeStructure_(oMimeHeader); - AppendOutput_(sOutput, sTemp); - } - catch (...) - { - ReportCriticalError_(messageFileName, "ERROR HM10004 - IMAP FETCH: Error when creating ENVELOPE structure for message."); - } + String sTemp; + sTemp = "ENVELOPE " + CreateEnvelopeStructure_(oMimeHeader); + AppendOutput_(sOutput, sTemp); } @@ -185,20 +171,13 @@ namespace HM if (parser_->GetShowBodyStructure() || parser_->GetShowBodyStructureNonExtensible()) { - try - { - String sResult = ""; - if (parser_->GetShowBodyStructure()) - sResult = "BODYSTRUCTURE " + IteratePartRecursive_(pMimeBody, true, 0); - else - sResult = "BODY " + IteratePartRecursive_(pMimeBody, false, 0); + String sResult = ""; + if (parser_->GetShowBodyStructure()) + sResult = "BODYSTRUCTURE " + IteratePartRecursive_(pMimeBody, true, 0); + else + sResult = "BODY " + IteratePartRecursive_(pMimeBody, false, 0); - AppendOutput_(sOutput, sResult); - } - catch (...) - { - ReportCriticalError_(messageFileName, "ERROR HM10002 - IMAP FETCH: Error when creating body structure for message."); - } + AppendOutput_(sOutput, sResult); } std::vector vecPartsToPeekAt = parser_->GetPartsToLookAt(); diff --git a/hmailserver/source/Server/IMAP/IMAPNotificationClient.cpp b/hmailserver/source/Server/IMAP/IMAPNotificationClient.cpp index 806ffb25b..736eaf9ed 100644 --- a/hmailserver/source/Server/IMAP/IMAPNotificationClient.cpp +++ b/hmailserver/source/Server/IMAP/IMAPNotificationClient.cpp @@ -186,49 +186,41 @@ namespace HM if (!connection) return; - try + switch (pChangeNotification->GetType()) { - switch (pChangeNotification->GetType()) + case ChangeNotification::NotificationMessageAdded: { - case ChangeNotification::NotificationMessageAdded: - { - shared_ptr pMessages = connection->GetCurrentFolder()->GetMessages(); - SendEXISTS_(pMessages->GetCount()); - SendRECENT_(pMessages->GetNoOfRecent()); - break; - } - case ChangeNotification::NotificationMessageDeleted: - { - // Send EXPUNGE - SendEXPUNGE_(pChangeNotification->GetAffectedMessages()); + shared_ptr pMessages = connection->GetCurrentFolder()->GetMessages(); + SendEXISTS_(pMessages->GetCount()); + SendRECENT_(pMessages->GetNoOfRecent()); + break; + } + case ChangeNotification::NotificationMessageDeleted: + { + // Send EXPUNGE + SendEXPUNGE_(pChangeNotification->GetAffectedMessages()); - // Send EXISTS - shared_ptr pMessages = connection->GetCurrentFolder()->GetMessages(); - SendEXISTS_(pMessages->GetCount()); - SendRECENT_(pMessages->GetNoOfRecent()); + // Send EXISTS + shared_ptr pMessages = connection->GetCurrentFolder()->GetMessages(); + SendEXISTS_(pMessages->GetCount()); + SendRECENT_(pMessages->GetNoOfRecent()); - break; - } - case ChangeNotification::NotificationMessageFlagsChanged: + break; + } + case ChangeNotification::NotificationMessageFlagsChanged: + { + // Send flag notification + std::set<__int64> affectedMessages; + boost_foreach(__int64 messageID, pChangeNotification->GetAffectedMessages()) { - // Send flag notification - std::set<__int64> affectedMessages; - boost_foreach(__int64 messageID, pChangeNotification->GetAffectedMessages()) - { - affectedMessages.insert(messageID); - } - - SendFLAGS_(affectedMessages); - - break; + affectedMessages.insert(messageID); } + + SendFLAGS_(affectedMessages); + + break; } } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 4345, "IMAPMailboxChangeNotifier::OnMailboxChange", "An unknown error has occurred."); - throw; - } } void diff --git a/hmailserver/source/Server/POP3/POP3Connection.cpp b/hmailserver/source/Server/POP3/POP3Connection.cpp index 59d604246..a87aef238 100644 --- a/hmailserver/source/Server/POP3/POP3Connection.cpp +++ b/hmailserver/source/Server/POP3/POP3Connection.cpp @@ -667,49 +667,39 @@ namespace HM void POP3Connection::ReadAndSend_() { - try - { - // Continue sending the file.. - int bufferSize = GetBufferSize(); - - shared_ptr pBuffer = current_file_.ReadChunk(bufferSize); + // Continue sending the file.. + int bufferSize = GetBufferSize(); - while (pBuffer) - { - transmission_buffer_.Append(pBuffer->GetBuffer(), pBuffer->GetSize()); + shared_ptr pBuffer = current_file_.ReadChunk(bufferSize); - if (transmission_buffer_.Flush()) - { - // Data was sent. We'll wait with sending more data until - // the current data has been sent. - return; - } + while (pBuffer) + { + transmission_buffer_.Append(pBuffer->GetBuffer(), pBuffer->GetSize()); - // No data was sent. Send some more... - pBuffer = current_file_.ReadChunk(bufferSize); + if (transmission_buffer_.Flush()) + { + // Data was sent. We'll wait with sending more data until + // the current data has been sent. + return; } - // We're done. Cleanup... - current_file_.Close(); + // No data was sent. Send some more... + pBuffer = current_file_.ReadChunk(bufferSize); + } - // No more data to send. Make sure all buffered data is flushed. - transmission_buffer_.Flush(true); + // We're done. Cleanup... + current_file_.Close(); - if (!transmission_buffer_.GetLastSendEndedWithNewline()) - EnqueueWrite_(""); // Send a newline character now. + // No more data to send. Make sure all buffered data is flushed. + transmission_buffer_.Flush(true); - EnqueueWrite_("."); + if (!transmission_buffer_.GetLastSendEndedWithNewline()) + EnqueueWrite_(""); // Send a newline character now. - // Request new data from the client now. - EnqueueRead(); - } - catch (...) - { - String location = _T("An unknown error occurred while reading and sending file data."); - ErrorManager::Instance()->ReportError(ErrorManager::High, 5414, "POP3Connection::ReadAndSend_", location); + EnqueueWrite_("."); - throw; - } + // Request new data from the client now. + EnqueueRead(); } void diff --git a/hmailserver/source/Server/SMTP/DeliveryQueue.cpp b/hmailserver/source/Server/SMTP/DeliveryQueue.cpp index 4294f5c34..beee07450 100644 --- a/hmailserver/source/Server/SMTP/DeliveryQueue.cpp +++ b/hmailserver/source/Server/SMTP/DeliveryQueue.cpp @@ -39,54 +39,45 @@ namespace HM // This function does the actual clearing of the queue. //---------------------------------------------------------------------------() { - try - { - LOG_DEBUG("Clearing delivery queue"); - - // First stop the delivery queue. - const String& sQueueName = Application::Instance()->GetSMTPDeliveryManager()->GetQueueName(); - shared_ptr pWQ = WorkQueueManager::Instance()->GetQueue(sQueueName); - if (!pWQ) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 4210, "DeliveryQueueClearer::DoWork", "Could not fetch SMTP delivery queue."); + LOG_DEBUG("Clearing delivery queue"); - return; - } - - pWQ->Stop(); + // First stop the delivery queue. + const String& sQueueName = Application::Instance()->GetSMTPDeliveryManager()->GetQueueName(); + shared_ptr pWQ = WorkQueueManager::Instance()->GetQueue(sQueueName); + if (!pWQ) + { + ErrorManager::Instance()->ReportError(ErrorManager::Medium, 4210, "DeliveryQueueClearer::DoWork", "Could not fetch SMTP delivery queue."); - // Load the delivery queue from the database - Messages oMessages(-1,-1); - oMessages.Refresh(); + return; + } + + pWQ->Stop(); - // Iterate over messages to deliver. - std::vector > vecMessages = oMessages.GetVector(); - std::vector >::iterator iterMessage = vecMessages.begin(); - while (iterMessage != vecMessages.end()) - { - // Delete the message from the database - PersistentMessage::DeleteObject(*iterMessage); + // Load the delivery queue from the database + Messages oMessages(-1,-1); + oMessages.Refresh(); - // Next message in queue - iterMessage++; - } + // Iterate over messages to deliver. + std::vector > vecMessages = oMessages.GetVector(); + std::vector >::iterator iterMessage = vecMessages.begin(); + while (iterMessage != vecMessages.end()) + { + // Delete the message from the database + PersistentMessage::DeleteObject(*iterMessage); - // Tell the delivery queue to clear it's pending messages list. - Application::Instance()->GetSMTPDeliveryManager()->UncachePendingMessages(); + // Next message in queue + iterMessage++; + } - // Make sure there doesn't exist any delivery tasks. - pWQ->Start(); + // Tell the delivery queue to clear it's pending messages list. + Application::Instance()->GetSMTPDeliveryManager()->UncachePendingMessages(); - DeliveryQueue::OnDeliveryQueueCleared(); + // Make sure there doesn't exist any delivery tasks. + pWQ->Start(); - LOG_DEBUG("Delivery queue cleared."); + DeliveryQueue::OnDeliveryQueueCleared(); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 4209, "DeliveryQueueClearer::DoWork()", "An unknown error occurred while clearing the delivery queue."); - throw; - } + LOG_DEBUG("Delivery queue cleared."); } diff --git a/hmailserver/source/Server/SMTP/RecipientParser.cpp b/hmailserver/source/Server/SMTP/RecipientParser.cpp index 465dffc82..796e12cb7 100644 --- a/hmailserver/source/Server/SMTP/RecipientParser.cpp +++ b/hmailserver/source/Server/SMTP/RecipientParser.cpp @@ -208,16 +208,8 @@ namespace HM { recipientOK = false; - try - { - long lRecurse = 0; - CreateMessageRecipientList_(sRecipientAddress, sRecipientAddress, 0, pRecipients, recipientOK); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 4381, "RecipientParser::CreateMessageRecipientList", "An error occurred while creating message recipient list."); - throw; - } + long lRecurse = 0; + CreateMessageRecipientList_(sRecipientAddress, sRecipientAddress, 0, pRecipients, recipientOK); } void diff --git a/hmailserver/source/Server/SMTP/SMTPConnection.cpp b/hmailserver/source/Server/SMTP/SMTPConnection.cpp index 4fc50b11b..b9775e4f1 100644 --- a/hmailserver/source/Server/SMTP/SMTPConnection.cpp +++ b/hmailserver/source/Server/SMTP/SMTPConnection.cpp @@ -497,78 +497,36 @@ namespace HM } } - try - { - sender_domain_ = CacheContainer::Instance()->GetDomain(StringParser::ExtractDomain(sAccountAddress)); - sender_account_ = CacheContainer::Instance()->GetAccount(sAccountAddress); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 10001, "SMTPConnection::_ProtocolMAIL", "Exception 1"); - throw; - } - + sender_domain_ = CacheContainer::Instance()->GetDomain(StringParser::ExtractDomain(sAccountAddress)); + sender_account_ = CacheContainer::Instance()->GetAccount(sAccountAddress); - try - { - // Check the max size - max_message_size_kb_ = GetMaxMessageSize_(sender_domain_); + // Check the max size + max_message_size_kb_ = GetMaxMessageSize_(sender_domain_); - // Check if estimated message size exceedes our - // maximum message size (according to RFC1653) - if (max_message_size_kb_ > 0 && - iEstimatedMessageSize / 1024 > max_message_size_kb_) - { - // Message to big. Reject it. - String sMessage; - sMessage.Format(_T("552 Message size exceeds fixed maximum message size. Size: %d KB, Max size: %d KB"), - iEstimatedMessageSize / 1024, max_message_size_kb_); - EnqueueWrite_(sMessage); - return ; - } - } - catch (...) + // Check if estimated message size exceedes our + // maximum message size (according to RFC1653) + if (max_message_size_kb_ > 0 && + iEstimatedMessageSize / 1024 > max_message_size_kb_) { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 10002, "SMTPConnection::_ProtocolMAIL", "Exception 2"); - throw; + // Message to big. Reject it. + String sMessage; + sMessage.Format(_T("552 Message size exceeds fixed maximum message size. Size: %d KB, Max size: %d KB"), + iEstimatedMessageSize / 1024, max_message_size_kb_); + EnqueueWrite_(sMessage); + return ; } - try - { - if (re_authenticate_user_ && !ReAuthenticateUser()) - return; - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 10003, "SMTPConnection::_ProtocolMAIL", "Exception 3"); - throw; - } - + if (re_authenticate_user_ && !ReAuthenticateUser()) + return; - try - { - // Next time we do a mail from, we should re-authenticate the login credentials - re_authenticate_user_ = true; + // Next time we do a mail from, we should re-authenticate the login credentials + re_authenticate_user_ = true; - current_message_ = shared_ptr (new Message); - current_message_->SetFromAddress(sFromAddress); - current_message_->SetState(Message::Delivering); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 10004, "SMTPConnection::_ProtocolMAIL", "Exception 4"); - throw; - } + current_message_ = shared_ptr (new Message); + current_message_->SetFromAddress(sFromAddress); + current_message_->SetState(Message::Delivering); - try - { - EnqueueWrite_("250 OK"); - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 10005, "SMTPConnection::_ProtocolMAIL", "Exception 5"); - throw; - } + EnqueueWrite_("250 OK"); } bool @@ -1355,64 +1313,56 @@ namespace HM // missing CR. //---------------------------------------------------------------------------() { - try - { - if (!current_message_) - return false; - - const String fileName = PersistentMessage::GetFileName(current_message_); + if (!current_message_) + return false; - File oFile; - if (!oFile.Open(fileName, File::OTReadOnly)) - return false; + const String fileName = PersistentMessage::GetFileName(current_message_); - const int iChunkSize = 10000; - shared_ptr pBuffer = oFile.ReadChunk(iChunkSize); - while (pBuffer) - { - // Check that buffer contains correct line endings. - const char *pChar = pBuffer->GetCharBuffer(); - int iBufferSize = pBuffer->GetSize(); + File oFile; + if (!oFile.Open(fileName, File::OTReadOnly)) + return false; - // Check from pos 3 to size-3. Not 100% sure, but - // we don't have to worry about buffer start/endings. + const int iChunkSize = 10000; + shared_ptr pBuffer = oFile.ReadChunk(iChunkSize); + while (pBuffer) + { + // Check that buffer contains correct line endings. + const char *pChar = pBuffer->GetCharBuffer(); + int iBufferSize = pBuffer->GetSize(); - for (int i = 3; i < iBufferSize - 3; i++) - { - const char *pCurrentChar = pChar + i; + // Check from pos 3 to size-3. Not 100% sure, but + // we don't have to worry about buffer start/endings. - // Check chars. - if (*pCurrentChar == '\r') - { - // Check next character - if (i >= iBufferSize) - return false; + for (int i = 3; i < iBufferSize - 3; i++) + { + const char *pCurrentChar = pChar + i; - const char *pNextChar = pCurrentChar + 1; - if (*pNextChar != '\n') - return false; - } - else if (*pCurrentChar == '\n') - { - // Check previous char - if (i == 0) - return false; + // Check chars. + if (*pCurrentChar == '\r') + { + // Check next character + if (i >= iBufferSize) + return false; - const char *pPreviousChar = pCurrentChar - 1; - if (*pPreviousChar != '\r') - return false; - } + const char *pNextChar = pCurrentChar + 1; + if (*pNextChar != '\n') + return false; } + else if (*pCurrentChar == '\n') + { + // Check previous char + if (i == 0) + return false; - // Read next chunk - pBuffer = oFile.ReadChunk(iChunkSize); + const char *pPreviousChar = pCurrentChar - 1; + if (*pPreviousChar != '\r') + return false; + } } - } - catch (...) - { - ErrorManager::Instance()->ReportError(ErrorManager::Medium, 4328, "SMTPConnection::_CheckLineEndings", "Failed to check line endings."); - } + // Read next chunk + pBuffer = oFile.ReadChunk(iChunkSize); + } return true; } diff --git a/hmailserver/source/Server/hMailServer/hMailServer.vcproj b/hmailserver/source/Server/hMailServer/hMailServer.vcproj index ae6b18bc6..8d508a58b 100644 --- a/hmailserver/source/Server/hMailServer/hMailServer.vcproj +++ b/hmailserver/source/Server/hMailServer/hMailServer.vcproj @@ -843,11 +843,11 @@ > + + + + @@ -3787,6 +3795,14 @@ RelativePath="..\Common\Util\Crypt.h" > + + + + @@ -4007,6 +4023,22 @@ RelativePath="..\Common\Util\SSPIValidation.h" > + + + + + + + + diff --git a/hmailserver/test/RegressionTests/Infrastructure/SessionLimitingTests.cs b/hmailserver/test/RegressionTests/Infrastructure/SessionLimitingTests.cs index 2cf3bbb12..445fb791a 100644 --- a/hmailserver/test/RegressionTests/Infrastructure/SessionLimitingTests.cs +++ b/hmailserver/test/RegressionTests/Infrastructure/SessionLimitingTests.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Text; using hMailServer; using NUnit.Framework; using RegressionTests.Shared; @@ -10,6 +8,8 @@ namespace RegressionTests.Infrastructure [TestFixture] public class SessionLimitingTests : TestFixtureBase { + private TimeSpan _readTimeout = TimeSpan.FromSeconds(5); + [Test] public void TestLimitImapSessionCount() { @@ -20,16 +20,13 @@ public void TestLimitImapSessionCount() using (var conn3 = new TcpConnection()) { CustomAssert.IsTrue(conn1.Connect(143)); - string s1 = conn1.Receive(); - CustomAssert.IsNotEmpty(s1); CustomAssert.IsTrue(conn2.Connect(143)); - string s2 = conn2.Receive(); - CustomAssert.IsNotEmpty(s2); CustomAssert.IsTrue(conn3.Connect(143)); - string s3 = conn3.Receive(); - CustomAssert.IsEmpty(s3); + CustomAssert.IsEmpty(conn3.Receive()); } + var log2 = TestSetup.ReadCurrentDefaultLog(); + CustomAssert.IsTrue(log2.Contains("Blocked either by IP range or by connection limit.")); } [Test] @@ -42,15 +39,13 @@ public void TestLimitSMTPSessionCount() using (var conn3 = new TcpConnection()) { CustomAssert.IsTrue(conn1.Connect(25)); - string s1 = conn1.Receive(); - CustomAssert.IsNotEmpty(s1); CustomAssert.IsTrue(conn2.Connect(25)); - string s2 = conn2.Receive(); - CustomAssert.IsNotEmpty(s2); CustomAssert.IsTrue(conn3.Connect(25)); - string s3 = conn3.Receive(); - CustomAssert.IsEmpty(s3); + CustomAssert.IsEmpty(conn3.Receive()); } + + var log2 = TestSetup.ReadCurrentDefaultLog(); + CustomAssert.IsTrue(log2.Contains("Blocked either by IP range or by connection limit.")); } [Test] @@ -63,14 +58,9 @@ public void TestLimitPOP3SessionCount() using (var conn3 = new TcpConnection()) { CustomAssert.IsTrue(conn1.Connect(110)); - string s1 = conn1.Receive(); - CustomAssert.IsNotEmpty(s1); CustomAssert.IsTrue(conn2.Connect(110)); - string s2 = conn2.Receive(); - CustomAssert.IsNotEmpty(s2); CustomAssert.IsTrue(conn3.Connect(110)); - string s3 = conn3.Receive(); - CustomAssert.IsEmpty(s3); + CustomAssert.IsEmpty(conn3.Receive()); } } diff --git a/hmailserver/test/RegressionTests/POP3/Fetching/Basics.cs b/hmailserver/test/RegressionTests/POP3/Fetching/Basics.cs index 6218e0960..649e26895 100644 --- a/hmailserver/test/RegressionTests/POP3/Fetching/Basics.cs +++ b/hmailserver/test/RegressionTests/POP3/Fetching/Basics.cs @@ -1,9 +1,11 @@ // Copyright (c) 2010 Martin Knafve / hMailServer.com. // http://www.hmailserver.com +using System; using System.Collections.Generic; using System.Threading; using NUnit.Framework; +using RegressionTests.Infrastructure; using RegressionTests.SMTP; using RegressionTests.Shared; using hMailServer; @@ -167,9 +169,15 @@ public void TestFetchFromInvalidHostName() fa.DownloadNow(); - TestSetup.AssertReportedError("The IP address for external account Test could not be resolved. Aborting fetch."); + RetryHelper.TryAction(TimeSpan.FromSeconds(10), () => + { + var + log = TestSetup.ReadCurrentDefaultLog(); + CustomAssert.IsTrue( + log.Contains("The IP address for external account Test could not be resolved. Aborting fetch.")); + }); - fa.Delete(); + fa.Delete(); } @@ -562,9 +570,12 @@ public void TestServerNotSupportingUIDL() fa.Delete(); - string error = TestSetup.ReadAndDeleteErrorLog(); - - CustomAssert.IsTrue(error.Contains("-ERR unhandled command")); + RetryHelper.TryAction(TimeSpan.FromSeconds(10), () => + { + string error = TestSetup.ReadCurrentDefaultLog(); + CustomAssert.IsTrue(error.Contains("-ERR unhandled command")); + CustomAssert.IsTrue(error.Contains("Completed retrieval of messages from external account.")); + }); } } diff --git a/hmailserver/test/RegressionTests/SMTP/DistributionLists.cs b/hmailserver/test/RegressionTests/SMTP/DistributionLists.cs index 6acc00462..298aeeb7c 100644 --- a/hmailserver/test/RegressionTests/SMTP/DistributionLists.cs +++ b/hmailserver/test/RegressionTests/SMTP/DistributionLists.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Net.Mail; using System.Text; using System.Threading; using NUnit.Framework; @@ -96,76 +97,93 @@ public void TestDistributionListWithEmptyAddress() } [Test] - public void TestDistributionLists() + public void TestDistributionListModePublic() { - // Fetch default domain + var recipients = new List(); + recipients.Add("recipient1@test.com"); + recipients.Add("recipient2@test.com"); + recipients.Add("recipient3@test.com"); + var list = SingletonProvider.Instance.AddDistributionList(_domain, "list1@test.com", recipients); - // Add distribution list - var oRecipients = new List(); - oRecipients.Add("recipient1@test.com"); - oRecipients.Add("recipient2@test.com"); - oRecipients.Add("recipient3@test.com"); + SingletonProvider.Instance.AddAccount(_domain, "recipient1@test.com", "test"); + SingletonProvider.Instance.AddAccount(_domain, "recipient2@test.com", "test"); + SingletonProvider.Instance.AddAccount(_domain, "recipient3@test.com", "test"); - SingletonProvider.Instance.AddDistributionList(_domain, "list1@test.com", oRecipients); + var announcer = SingletonProvider.Instance.AddAccount(_domain, "announcer@test.com", "test"); - Account oAccount; - oAccount = SingletonProvider.Instance.AddAccount(_domain, "recipient1@test.com", "test"); - oAccount = SingletonProvider.Instance.AddAccount(_domain, "recipient2@test.com", "test"); - oAccount = SingletonProvider.Instance.AddAccount(_domain, "recipient3@test.com", "test"); + // Switch list mode so that only a single announcer can send to list. + list.Mode = eDistributionListMode.eLMPublic; + list.RequireSMTPAuth = false; + list.Save(); - // Add alias pointing at the distribution list. - SingletonProvider.Instance.AddAlias(_domain, "listalias@test.com", "list1@test.com"); + var smtpClient = new SMTPClientSimulator(); + CustomAssert.IsTrue(smtpClient.Send("test@test.com", list.Address, "Mail 1", "Mail 1")); + + foreach (var recipient in recipients) + IMAPClientSimulator.AssertMessageCount(recipient, "test", "Inbox", 1); + } - var oSMTP = new SMTPClientSimulator(); - CustomAssert.IsTrue(oSMTP.Send("test@test.com", "list1@test.com", "Mail 1", "Mail 1")); - CustomAssert.IsTrue(oSMTP.Send("test@test.com", "listalias@test.com", "Mail 2", "Mail 2")); - CustomAssert.IsTrue(oSMTP.Send("test@test.com", "listalias@test.com", "Mail 3", "Mail 3")); + [Test] + public void TestDistributionListModeAnnouncer() + { + var recipients = new List(); + recipients.Add("recipient1@test.com"); + recipients.Add("recipient2@test.com"); + recipients.Add("recipient3@test.com"); + + var list = SingletonProvider.Instance.AddDistributionList(_domain, "list1@test.com", recipients); - IMAPClientSimulator.AssertMessageCount("recipient1@test.com", "test", "Inbox", 3); - IMAPClientSimulator.AssertMessageCount("recipient2@test.com", "test", "Inbox", 3); - IMAPClientSimulator.AssertMessageCount("recipient3@test.com", "test", "Inbox", 3); + SingletonProvider.Instance.AddAccount(_domain, "recipient1@test.com", "test"); + SingletonProvider.Instance.AddAccount(_domain, "recipient2@test.com", "test"); + SingletonProvider.Instance.AddAccount(_domain, "recipient3@test.com", "test"); - oRecipients.Add("recipient4@test.com"); - oRecipients.Add("recipient5@test.com"); - oRecipients.Add("recipient6@test.com"); - oRecipients.Add("recipient7@test.com"); - oRecipients.Add("recipient8@test.com"); + var announcer = SingletonProvider.Instance.AddAccount(_domain, "announcer@test.com", "test"); + + // Switch list mode so that only a single announcer can send to list. + list.Mode = eDistributionListMode.eLMAnnouncement; + list.RequireSenderAddress = announcer.Address; + list.RequireSMTPAuth = false; + list.Save(); - SingletonProvider.Instance.AddDistributionList(_domain, "list2@test.com", oRecipients); - oAccount = SingletonProvider.Instance.AddAccount(_domain, "recipient7@test.com", "test"); - oAccount = SingletonProvider.Instance.AddAccount(_domain, "recipient8@test.com", "test"); - oAccount = SingletonProvider.Instance.AddAccount(_domain, "test@test.com", "test"); + var smtpClient = new SMTPClientSimulator(); + CustomAssert.IsFalse(smtpClient.Send("test@test.com", list.Address, "Mail 1", "Mail 1")); + CustomAssert.IsTrue(smtpClient.Send(announcer.Address, list.Address, "Mail 1", "Mail 1")); - CustomAssert.IsTrue(oSMTP.Send("test@test.com", "list2@test.com", "Mail 1", "Mail 1")); + foreach (var recipient in recipients) + IMAPClientSimulator.AssertMessageCount(recipient, "test", "Inbox", 1); + } - IMAPClientSimulator.AssertMessageCount("recipient7@test.com", "test", "Inbox", 1); + [Test] + public void TestDistributionListModeMembers() + { + var recipients = new List(); + recipients.Add("recipient1@test.com"); + recipients.Add("recipient2@test.com"); + recipients.Add("recipient3@test.com"); - // Wait for the message to be completely delivered. The above assertion isn't enough to confirm that. - Thread.Sleep(1000); + var list = SingletonProvider.Instance.AddDistributionList(_domain, "list1@test.com", recipients); - oAccount = SingletonProvider.Instance.AddAccount(_domain, "announcer@test.com", "test"); - DistributionList oList = SingletonProvider.Instance.AddDistributionList(_domain, - "list3-security@test.com", - oRecipients); - oList.Mode = eDistributionListMode.eLMAnnouncement; - oList.RequireSenderAddress = oAccount.Address; - oList.RequireSMTPAuth = false; - oList.Save(); + SingletonProvider.Instance.AddAccount(_domain, "recipient1@test.com", "test"); + SingletonProvider.Instance.AddAccount(_domain, "recipient2@test.com", "test"); + SingletonProvider.Instance.AddAccount(_domain, "recipient3@test.com", "test"); - CustomAssert.IsFalse(oSMTP.Send("test@test.com", "list3-security@test.com", "Mail 1", "Mail 1")); - CustomAssert.IsTrue(oSMTP.Send(oAccount.Address, "list3-security@test.com", "Mail 1", "Mail 1")); - IMAPClientSimulator.AssertMessageCount("recipient7@test.com", "test", "Inbox", 2); + var announcer = SingletonProvider.Instance.AddAccount(_domain, "announcer@test.com", "test"); - oList.Mode = eDistributionListMode.eLMMembership; - oList.Save(); + // Switch list mode so that only a single announcer can send to list. + list.Mode = eDistributionListMode.eLMMembership; + list.RequireSenderAddress = announcer.Address; + list.RequireSMTPAuth = false; + list.Save(); - CustomAssert.IsFalse(oSMTP.Send(oAccount.Address, "list3-security@test.com", "Mail 1", "Mail 1")); + var smtpClient = new SMTPClientSimulator(); + CustomAssert.IsFalse(smtpClient.Send("test@test.com", list.Address, "Mail 1", "Mail 1")); + CustomAssert.IsFalse(smtpClient.Send(announcer.Address, list.Address, "Mail 1", "Mail 1")); + CustomAssert.IsTrue(smtpClient.Send(recipients[0], list.Address, "Mail 1", "Mail 1")); - // THIS MESSAGE SHOULD SUCCED - CustomAssert.IsTrue(oSMTP.Send("recipient5@test.com", "list3-security@test.com", "Mail 1", "Mail 1")); - IMAPClientSimulator.AssertMessageCount("recipient7@test.com", "test", "Inbox", 3); + foreach (var recipient in recipients) + IMAPClientSimulator.AssertMessageCount(recipient, "test", "Inbox", 1); } [Test] diff --git a/hmailserver/test/RegressionTests/Shared/TcpConnection.cs b/hmailserver/test/RegressionTests/Shared/TcpConnection.cs index 1e473b41a..fec9cf388 100644 --- a/hmailserver/test/RegressionTests/Shared/TcpConnection.cs +++ b/hmailserver/test/RegressionTests/Shared/TcpConnection.cs @@ -195,9 +195,16 @@ public void Send(string s) public string ReadUntil(string text) { + return ReadUntil(text, TimeSpan.FromSeconds(10)); + } + + public string ReadUntil(string text, TimeSpan timeout) + { + DateTime stopTime = DateTime.Now + timeout; + string result = Receive(); - for (int i = 0; i < 1000; i++) + while (DateTime.Now < stopTime) { if (result.Contains(text)) return result; @@ -210,7 +217,7 @@ public string ReadUntil(string text) Thread.Sleep(10); } - throw new InvalidOperationException("Timeout while waiting for server response: " + text); + throw new TimeoutException("Timeout while waiting for server response: " + text); } diff --git a/hmailserver/test/VMwareIntegration/VMWareIntegration.Console/Program.cs b/hmailserver/test/VMwareIntegration/VMWareIntegration.Console/Program.cs index c649ff840..cfffe8efb 100644 --- a/hmailserver/test/VMwareIntegration/VMWareIntegration.Console/Program.cs +++ b/hmailserver/test/VMwareIntegration/VMWareIntegration.Console/Program.cs @@ -93,18 +93,13 @@ static int Main(string[] args) } }); - + C: System.Console.WriteLine("All tests completed. Press Enter to exit."); System.Console.ReadLine(); return 0; } - static void runner_TestCompleted(int testIndex, bool result, string message, string failureText) - { - - } - private static void LogText(string text) { lock (_outputLogLock)