diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000..8a313292bb1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.dmm merge=merge-dmm diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 00000000000..de5ff6f2542 --- /dev/null +++ b/.gitconfig @@ -0,0 +1,5 @@ +[merge "merge-dmm"] + name = mapmerge driver + driver = ./mapmerge.sh %O %A %B + recursive = text + diff --git a/LICENSE-GPL3.txt b/LICENSE-GPL3.txt new file mode 100644 index 00000000000..20d40b6bcec --- /dev/null +++ b/LICENSE-GPL3.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt index 20d40b6bcec..419cc18b370 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,674 +1,15 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 +Baystation12 +Copyright (C) 2010-2012 Baystation12 and tgstation13. - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. - Preamble +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file +You should have received a copy of the GNU General Public License +along with this program. If not, see . \ No newline at end of file diff --git a/README.txt b/README.txt index 1fd82e07b31..30c2d952667 100644 --- a/README.txt +++ b/README.txt @@ -1,8 +1,8 @@ -tgstation13 v1.0 - 6 October 2010 +baystation12 -Website: http://nanotrasen.com -Code: http://code.google.com/p/tgstation13/ -IRC: irc://irc.rizon.net/tgstation13 +Website: http://baystation12.net/ +Code: http://github.com/Baystation12/Baystation12/ +IRC: irc://irc.sorcery.net/bs12 ================================================================================ INSTALLATION @@ -12,17 +12,20 @@ First-time installation should be fairly straightforward. First, you'll need BYOND installed. You can get it from http://www.byond.com/. Once you've done that, extract the game files to wherever you want to keep them. This is a sourcecode-only release, so the next step is to compile the server files. -Open tgstation.dme by double-clicking it, open the Build menu, and click +Open baystation12.dme by double-clicking it, open the Build menu, and click compile. This'll take a little while, and if everything's done right you'll get a message like this: -saving tgstation.dmb (DEBUG mode) +saving baystation12.dmb (DEBUG mode) -tgstation.dmb - 0 errors, 0 warnings +baystation12.dmb - 0 errors, 0 warnings If you see any errors or warnings, something has gone wrong - possibly a corrupt download or the files extracted wrong. +It could be an issue with the current version of the code, either. Ask on IRC +or wait for a fix. + Once that's done, open up the config folder. You'll want to edit config.txt to set the probabilities for different gamemodes in Secret and to set your server location so that all your players don't get disconnected at the end of each @@ -32,19 +35,25 @@ so they may have unknown and bizarre bugs. Extended is essentially no mode, and isn't in the Secret rotation by default as it's just not very fun. You'll also want to edit admins.txt to remove the default admins and add your -own. "Game Master" is the highest level of access, and the other recommended admin -levels for now are "Game Admin" (a little below host) and "Moderator". The format is +own. "Game Master" is the highest level of access, and the other recommended +admin level for now is "Game Admin". The format is: byondkey - Rank where the BYOND key must be in lowercase and the admin rank must be properly -capitalised. There are a bunch more admin ranks, but these three should be +capitalised. There are a bunch more admin ranks, but these two should be enough for most servers, assuming you have trustworthy admins. +Additionally, you can set up moderators in moderators.txt, with this format: + +byondkey + +Moderators have access to player notes and a few other low-level commands. + Finally, to start the server, run Dream Daemon and enter the path to your -compiled tgstation.dmb file. Make sure to set the port to the one you -specified in the config.txt, and set the Security box to 'Safe'. Then press GO -and the server should start up and be ready to join. +compiled baystation12.dmb file. Make sure to set the port to the one you +specified in the config.txt, and set the Security box to 'Trusted'. Then press +GO and the server should start up and be ready to join. ================================================================================ UPDATING @@ -72,5 +81,6 @@ coming soon, for now ask in our IRC channel. IRC Bot Setup ================================================================================ -Included in the SVN is an IRC bot capable of relaying adminhelps to a specified IRC channel/server (thanks to Skibiliano) -Instructions for bot setup are included in the /bot/ folder along with the bot/relay script itself \ No newline at end of file +Included in the SVN is an IRC bot capable of relaying adminhelps to a specified +IRC channel/server (thanks to Skibiliano). Instructions for bot setup are +included in the /bot/ folder along with the bot/relay script itself. \ No newline at end of file diff --git a/baystation12.dme b/baystation12.dme index 5c481cc856f..5ab7609868a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -131,6 +131,7 @@ #define FILE_DIR "code/modules/DetectiveWork" #define FILE_DIR "code/modules/flufftext" #define FILE_DIR "code/modules/food" +#define FILE_DIR "code/modules/genetics" #define FILE_DIR "code/modules/icon generation" #define FILE_DIR "code/modules/library" #define FILE_DIR "code/modules/liquid" @@ -236,6 +237,7 @@ #define FILE_DIR "icons/mecha" #define FILE_DIR "icons/misc" #define FILE_DIR "icons/mob" +#define FILE_DIR "icons/mob/human_races" #define FILE_DIR "icons/obj" #define FILE_DIR "icons/obj/assemblies" #define FILE_DIR "icons/obj/atmospherics" @@ -419,6 +421,7 @@ #include "code\game\gamemodes\intercept_report.dm" #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\autotraitor\autotraitor.dm" #include "code\game\gamemodes\blob\blob.dm" #include "code\game\gamemodes\blob\blob_finish.dm" #include "code\game\gamemodes\blob\blob_report.dm" @@ -983,6 +986,7 @@ #include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\TextFilters.dm" #include "code\modules\food\recipes_microwave.dm" +#include "code\modules\genetics\side_effects.dm" #include "code\modules\library\lib_items.dm" #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm" @@ -1324,6 +1328,7 @@ #include "code\modules\scripting\Scanner\Tokens.dm" #include "code\modules\security levels\keycard authentication.dm" #include "code\modules\security levels\security levels.dm" +#include "code\WorkInProgress\autopsy.dm" #include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\explosion_particles.dm" #include "code\WorkInProgress\surgery.dm" diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index b58a12b8b80..7b9444d8902 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -324,6 +324,7 @@ del(src) /obj/machinery/atmospherics/unary/vent_pump/Del() - initial_loc.air_scrub_info -= id_tag + if (initial_loc.air_scrub_info) + initial_loc.air_scrub_info -= id_tag ..() return diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 21484d25e19..84378df3d14 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -260,6 +260,7 @@ del(src) /obj/machinery/atmospherics/unary/vent_scrubber/Del() - initial_loc.air_scrub_info -= id_tag + if (initial_loc.air_scrub_info) + initial_loc.air_scrub_info -= id_tag ..() return diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 4b4b3761a30..cbff1f1b643 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -526,10 +526,14 @@ obj/machinery/atmospherics/pipe var/build_killswitch = 1 var/obj/machinery/atmospherics/node1 - New() + New() initialize_directions = dir ..() + high_volume + name = "Larger vent" + volume = 1000 + process() if(!parent) if(build_killswitch <= 0) @@ -539,7 +543,7 @@ obj/machinery/atmospherics/pipe ..() return else - parent.mingle_with_turf(loc, 250) + parent.mingle_with_turf(loc, volume) /* if(!node1) if(!nodealert) diff --git a/code/WorkInProgress/autopsy.dm b/code/WorkInProgress/autopsy.dm new file mode 100644 index 00000000000..2137141996f --- /dev/null +++ b/code/WorkInProgress/autopsy.dm @@ -0,0 +1,189 @@ +/datum/autopsy_data_scanner + var/weapon = null // this is the DEFINITE weapon type that was used + var/list/organs_scanned = list() // this maps a number of scanned organs to + // the wounds to those organs with this data's weapon type + var/organ_names = "" + +/datum/autopsy_data + var/weapon = null + var/pretend_weapon = null + var/damage = 0 + var/hits = 0 + var/time_inflicted = 0 + + proc/copy() + var/datum/autopsy_data/W = new() + W.weapon = weapon + W.pretend_weapon = pretend_weapon + W.damage = damage + W.hits = hits + W.time_inflicted = time_inflicted + return W + +/obj/item/weapon/autopsy_scanner/proc/add_data(var/datum/organ/external/O) + if(!O.autopsy_data.len && !O.trace_chemicals.len) return + + for(var/V in O.autopsy_data) + var/datum/autopsy_data/W = O.autopsy_data[V] + + if(!W.pretend_weapon) + /* + // the more hits, the more likely it is that we get the right weapon type + if(prob(50 + W.hits * 10 + W.damage)) + */ + + // Buffing this stuff up for now! + if(1) + W.pretend_weapon = W.weapon + else + W.pretend_weapon = pick("mechanical toolbox", "wirecutters", "revolver", "crowbar", "fire extinguisher", "tomato soup", "oxygen tank", "emergency oxygen tank", "laser", "bullet") + + + var/datum/autopsy_data_scanner/D = wdata[V] + if(!D) + D = new() + D.weapon = W.weapon + wdata[V] = D + + if(!D.organs_scanned[O.name]) + if(D.organ_names == "") + D.organ_names = O.display_name + else + D.organ_names += ", [O.display_name]" + + del D.organs_scanned[O.name] + D.organs_scanned[O.name] = W.copy() + + for(var/V in O.trace_chemicals) + if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V)) + chemtraces += V + +/obj/item/weapon/autopsy_scanner/verb/print_data() + set src in view(usr, 1) + set name = "Print Data" + if(usr.stat) + usr << "No." + return + + if(wdata.len == 0 && chemtraces.len == 0) + usr << "* There is no data about any wounds in the scanner's database. You may have to scan more bodyparts, or otherwise this wound type may not be in the scanner's database." + return + + var/scan_data = "" + + if(timeofdeath) + scan_data += "Time of death: [worldtime2text(timeofdeath)]

" + + var/n = 1 + for(var/wdata_idx in wdata) + var/datum/autopsy_data_scanner/D = wdata[wdata_idx] + var/total_hits = 0 + var/total_score = 0 + var/list/weapon_chances = list() // maps weapon names to a score + var/age = 0 + + for(var/wound_idx in D.organs_scanned) + var/datum/autopsy_data/W = D.organs_scanned[wound_idx] + total_hits += W.hits + + var/wname = W.pretend_weapon + + if(wname in weapon_chances) weapon_chances[wname] += W.damage + else weapon_chances[wname] = max(W.damage, 1) + total_score+=W.damage + + + var/wound_age = W.time_inflicted + age = max(age, wound_age) + + var/damage_desc + + var/damaging_weapon = (total_score != 0) + + // total score happens to be the total damage + switch(total_score) + if(0) + damage_desc = "Unknown" + if(1 to 5) + damage_desc = "negligible" + if(5 to 15) + damage_desc = "light" + if(15 to 30) + damage_desc = "moderate" + if(30 to 1000) + damage_desc = "severe" + + if(!total_score) total_score = D.organs_scanned.len + + scan_data += "Weapon #[n]
" + if(damaging_weapon) + scan_data += "Severity: [damage_desc]
" + scan_data += "Hits by weapon: [total_hits]
" + scan_data += "Approximate time of wound infliction: [worldtime2text(age)]
" + scan_data += "Affected limbs: [D.organ_names]
" + scan_data += "Possible weapons:
" + for(var/weapon_name in weapon_chances) + scan_data += "\t[100*weapon_chances[weapon_name]/total_score]% [weapon_name]
" + + scan_data += "
" + + n++ + + if(chemtraces.len) + scan_data += "Trace Chemicals:
" + for(var/chemID in chemtraces) + scan_data += chemID + scan_data += "
" + + for(var/mob/O in viewers(usr)) + O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1) + + sleep(10) + + var/obj/item/weapon/paper/P = new(usr.loc) + P.name = "Autopsy Data ([target_name])" + P.info = "[scan_data]" + P.overlays += "paper_words" + + if(istype(usr,/mob/living/carbon)) + // place the item in the usr's hand if possible + if(!usr.r_hand) + P.loc = usr + usr.r_hand = P + P.layer = 20 + else if(!usr.l_hand) + P.loc = usr + usr.l_hand = P + P.layer = 20 + + if(istype(usr,/mob/living/carbon/human)) + usr:update_inv_l_hand() + usr:update_inv_r_hand() + +/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob) + if(!istype(M)) + return + + if(!can_operate(M)) + return + + if(target_name != M.name) + target_name = M.name + src.wdata = list() + user << "\red A new patient has been registered.. Purging data for previous patient." + + src.timeofdeath = M.timeofdeath + + var/datum/organ/external/S = M.get_organ(user.zone_sel.selecting) + if(!S) + usr << "You can't scan this body part." + return + if(!S.open) + usr << "You have to cut the limb open first!" + return + for(var/mob/O in viewers(M)) + O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.display_name] with \the [src.name]", 1) + + src.add_data(S) + + return 1 diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm index a7210ee6e0a..ab19b0e525c 100644 --- a/code/WorkInProgress/surgery.dm +++ b/code/WorkInProgress/surgery.dm @@ -57,6 +57,15 @@ proc/build_surgery_steps_list() var/datum/surgery_step/S = new T surgery_steps += S +proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) + if(!istype(user) || !istype(E)) return + + var/germ_level = user.germ_level + if(user.gloves) + germ_level = user.gloves.germ_level + + E.germ_level = germ_level + ////////////////////////////////////////////////////////////////// // COMMON STEPS // @@ -90,6 +99,7 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts the incision on [target]'s [affected.display_name] with \the [tool].", \ "You start the incision on [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.display_name]!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -97,6 +107,7 @@ proc/build_surgery_steps_list() "\blue You have made an incision on [target]'s [affected.display_name] with \the [tool].",) affected.open = 1 affected.createwound(CUT, 1) + spread_germs_to_organ(affected, user) if (target_zone == "head") target.brain_op_stage = 1 @@ -119,13 +130,15 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts clamping bleeders in [target]'s [affected.display_name] with \the [tool].", \ "You start clamping bleeders in [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("The pain in your [affected.display_name] is maddening!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] clamps bleeders in [target]'s [affected.display_name] with \the [tool].", \ "\blue You clamp bleeders in [target]'s [affected.display_name] with \the [tool].") - affected.bandage() + affected.clamp() affected.status &= ~ORGAN_BLEEDING + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -153,6 +166,7 @@ proc/build_surgery_steps_list() msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]." self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]." user.visible_message(msg, self_msg) + target.custom_pain("It feels like the skin on your [affected.display_name] is on fire!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -166,6 +180,7 @@ proc/build_surgery_steps_list() self_msg = "\blue You keep the incision open on [target]'s lower abdomen with \the [tool]." user.visible_message(msg, self_msg) affected.open = 2 + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -193,12 +208,14 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool]." , \ "You are beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("Your [affected.display_name] is being burned!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] cauterizes the incision on [target]'s [affected.display_name] with \the [tool].", \ "\blue You cauterize the incision on [target]'s [affected.display_name] with \the [tool].") affected.open = 0 + affected.germ_level = 0 affected.status &= ~ORGAN_BLEEDING fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -235,6 +252,7 @@ proc/build_surgery_steps_list() begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] starts to separating [target]'s appendix from the abdominal wall with \the [tool].", \ "You start to separating [target]'s appendix from the abdominal wall with \the [tool]." ) + target.custom_pain("The pain in your abdomen is living hell!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\blue [user] has separated [target]'s appendix with \the [tool]." , \ @@ -259,6 +277,7 @@ proc/build_surgery_steps_list() begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] starts removing [target]'s appendix with \the [tool].", \ "You start removing [target]'s appendix with \the [tool].") + target.custom_pain("Someone's ripping out your bowels!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\blue [user] has removed [target]'s appendix with \the [tool].", \ @@ -282,7 +301,7 @@ proc/build_surgery_steps_list() ////////////////////////////////////////////////////////////////// -// INTERNAL WOUND PATCHING // +// INTERNAL WOUND PATCHING // ////////////////////////////////////////////////////////////////// @@ -304,6 +323,7 @@ proc/build_surgery_steps_list() if (affected.stage == 0) user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.display_name] with \the [tool]." , \ "You start patching the damaged vein in [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("The pain in [affected.display_name] is unbearable!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -340,12 +360,14 @@ proc/build_surgery_steps_list() if (affected.stage == 0) user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool]." , \ "You start applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("Something in your [affected.display_name] is causing you a lot of pain!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] applies some [tool] to [target]'s bone in [affected.display_name]", \ "\blue You apply some [tool] to [target]'s bone in [affected.display_name] with \the [tool].") affected.stage = 1 + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -365,7 +387,8 @@ proc/build_surgery_steps_list() begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] is beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool]." , \ - "You are beginning to set the bone in [target]'s [target_zone] in place with \the [tool].") + "You are beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool].") + target.custom_pain("The pain in your [affected.display_name] is going to make you pass out!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -373,10 +396,12 @@ proc/build_surgery_steps_list() user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name] in place with \the [tool].", \ "\blue You set the bone in [target]'s [affected.display_name] in place with \the [tool].") affected.stage = 2 + spread_germs_to_organ(affected, user) else user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].", \ "\blue You set the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].") affected.fracture() + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -400,14 +425,15 @@ proc/build_surgery_steps_list() end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] sets [target]'s [affected.display_name] skull with \the [tool]." , \ - "\blue You set [target]'s [affected.display_name] skull with \the [tool].") + user.visible_message("\blue [user] sets [target]'s skull with \the [tool]." , \ + "\blue You set [target]'s skull with \the [tool].") affected.stage = 2 + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging [target]'s [affected.display_name] face with \the [tool]!" , \ - "\red Your hand slips, damaging [target]'s [affected.display_name] face with \the [tool]!") + user.visible_message("\red [user]'s hand slips, damaging [target]'s face with \the [tool]!" , \ + "\red Your hand slips, damaging [target]'s face with \the [tool]!") var/datum/organ/external/head/h = affected h.createwound(BRUISE, 10) h.disfigured = 1 @@ -435,6 +461,7 @@ proc/build_surgery_steps_list() affected.status &= ~ORGAN_SPLINTED affected.stage = 0 affected.perma_injury = 0 + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -691,7 +718,7 @@ proc/build_surgery_steps_list() "You begin to cut through [target]'s skull with \the [tool].") end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has cut through [target]'s skull open with \the [tool].", \ + user.visible_message("\blue [user] has cut through [target]'s skull open with \the [tool].", \ "\blue You have cut through [target]'s skull open with \the [tool].") target.brain_op_stage = 2 @@ -932,6 +959,7 @@ proc/build_surgery_steps_list() "\blue You have finished adjusting the area around [target]'s [affected.display_name] with \the [tool].") affected.status |= ORGAN_ATTACHABLE affected.amputated = 1 + affected.setAmputatedTree() affected.open = 0 fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -976,4 +1004,173 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \ "\red Your hand slips, damaging connectors on [target]'s [affected.display_name]!") - target.apply_damage(10, BRUTE, affected) \ No newline at end of file + target.apply_damage(10, BRUTE, affected) + + +////////////////////////////////////////////////////////////////// +// RIBCAGE SURGERY(LUNGS AND ALIENS) // +////////////////////////////////////////////////////////////////// + +/datum/surgery_step/ribcage + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return target_zone == "chest" + +/datum/surgery_step/ribcage/saw_ribcage + required_tool = /obj/item/weapon/circular_saw + + min_duration = 50 + max_duration = 70 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + return ..() && target.ribcage_op_stage == 0 && affected.open >= 2 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to cut through [target]'s ribcage with \the [tool].", \ + "You begin to cut through [target]'s ribcage with \the [tool].") + target.custom_pain("Something hurts horribly in your chest!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("\blue [user] has cut through [target]'s ribcage open with \the [tool].", \ + "\blue You have cut through [target]'s ribcage open with \the [tool].") + target.ribcage_op_stage = 1 + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("\red [user]'s hand slips, cracking [target]'s ribcage with \the [tool]!" , \ + "\red Your hand slips, cracking [target]'s ribcage with \the [tool]!" ) + + +/datum/surgery_step/ribcage/retract_ribcage + required_tool = /obj/item/weapon/retractor + + min_duration = 30 + max_duration = 40 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.ribcage_op_stage == 1 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] starts to force open the ribcage in [target]'s torso with \the [tool]." + var/self_msg = "You start to force open the ribcage in [target]'s torso with \the [tool]." + user.visible_message(msg, self_msg) + target.custom_pain("Something hurts horribly in your chest!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "\blue [user] forces open [target]'s ribcage with \the [tool]." + var/self_msg = "\blue You force open [target]'s ribcage with \the [tool]." + user.visible_message(msg, self_msg) + target.ribcage_op_stage = 2 + + // Whoops! + if(prob(10)) + var/datum/organ/external/affected = target.get_organ(target_zone) + affected.fracture() + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "\red [user]'s hand slips, breaking [target]'s ribcage!" + var/self_msg = "\red Your hand slips, breaking [target]'s ribcage!" + user.visible_message(msg, self_msg) + var/datum/organ/external/affected = target.get_organ(target_zone) + affected.fracture() + +/datum/surgery_step/ribcage/close_ribcage + required_tool = /obj/item/weapon/retractor + + min_duration = 20 + max_duration = 40 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.ribcage_op_stage == 2 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] starts bending [target]'s ribcage back into place with \the [tool]." + var/self_msg = "You start bending [target]'s ribcage back into place with \the [tool]." + user.visible_message(msg, self_msg) + target.custom_pain("Something hurts horribly in your chest!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] bends [target]'s ribcage back into place with \the [tool]." + var/self_msg = "You bends [target]'s ribcage back into place with \the [tool]." + user.visible_message(msg, self_msg) + + target.ribcage_op_stage = 1 + +/datum/surgery_step/ribcage/mend_ribcage + required_tool = /obj/item/weapon/bonegel + + min_duration = 20 + max_duration = 40 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.ribcage_op_stage == 1 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] starts applying \the [tool] to [target]'s ribcage." + var/self_msg = "You start applying \the [tool] to [target]'s ribcage." + user.visible_message(msg, self_msg) + target.custom_pain("Something hurts horribly in your chest!",1) + + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] applied \the [tool] to [target]'s ribcage." + var/self_msg = "You applied \the [tool] to [target]'s ribcage." + user.visible_message(msg, self_msg) + + target.ribcage_op_stage = 0 + + +/datum/surgery_step/ribcage/remove_embryo + required_tool = /obj/item/weapon/hemostat + + min_duration = 80 + max_duration = 100 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/embryo = 0 + for(var/datum/disease/alien_embryo/A in target.viruses) + embryo = 1 + break + return ..() && embryo && target.ribcage_op_stage == 2 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]." + var/self_msg = "You start to pull something out from [target]'s ribcage with \the [tool]." + user.visible_message(msg, self_msg) + target.custom_pain("Something hurts horribly in your chest!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("\red [user] rips the larva out of [target]'s ribcage!", + "You rip the larva out of [target]'s ribcage!") + + var/mob/living/carbon/alien/larva/stupid = new(target.loc) + stupid.death(0) + + for(var/datum/disease/alien_embryo in target.viruses) + alien_embryo.cure() + +/datum/surgery_step/ribcage/fix_lungs + required_tool = /obj/item/weapon/scalpel + + min_duration = 70 + max_duration = 90 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.is_lung_ruptured() + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts mending the rupture in [target]'s lungs with \the [tool].", \ + "You start mending the rupture in [target]'s lungs with \the [tool]." ) + target.custom_pain("The pain in your chest is living hell!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ("chest") + user.visible_message("[user] mends the rupture in [target]'s lungs with \the [tool].", \ + "You mend the rupture in [target]'s lungs with \the [tool]." ) + affected.ruptured_lungs = 0 + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ("chest") + user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s chest with \the [tool]!", \ + "\red Your hand slips, slicing an artery inside [target]'s chest with \the [tool]!") + affected.createwound(CUT, 20) + diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 5f2b847a8d6..661fe74d9b5 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -69,9 +69,6 @@ mob/living/carbon/metroid/airflow_stun() mob/living/carbon/human/airflow_stun() if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 if(buckled) return 0 - //skytodo: - /*if(wear_suit) - if(wear_suit.flags & SUITSPACE) return 0*/ if(shoes) if(shoes.flags & NOSLIP) return 0 if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) @@ -247,9 +244,6 @@ atom/movable if(istype(src, /mob/living/carbon/human)) if(istype(src, /mob/living/carbon/human)) if(src:buckled) return - //skytodo: tg handles suits differently - /*if(src:wear_suit) - if(src:wear_suit.flags & SUITSPACE) return*/ if(src:shoes) if(src:shoes.type == /obj/item/clothing/shoes/magboots && src:shoes.flags & NOSLIP) return src << "\red You are sucked away by airflow!" @@ -305,9 +299,6 @@ atom/movable if(istype(src, /mob/living/carbon/human)) if(istype(src, /mob/living/carbon/human)) if(src:buckled) return - //skytodo: - /*if(src:wear_suit) - if(src:wear_suit.flags & SUITSPACE) return*/ if(src:shoes) if(src:shoes.type == /obj/item/clothing/shoes/magboots && src:shoes.flags & NOSLIP) return src << "\red You are pushed away by airflow!" @@ -407,7 +398,6 @@ zone/proc/movables() . = list() for(var/turf/T in contents) for(var/atom/A in T) - //skytodo: add check for ai eye, tg seems to have done away with it - if(istype(A, /obj/effect)) + if(istype(A, /obj/effect) || istype(A, /mob/aiEye)) continue . += A diff --git a/code/ZAS/Debug.dm b/code/ZAS/Debug.dm index 73614ef216c..186ed65ae8e 100644 --- a/code/ZAS/Debug.dm +++ b/code/ZAS/Debug.dm @@ -32,7 +32,7 @@ zone/proc M << "Pressure: [air.return_pressure()]" M << "" M << "Space Tiles: [length(unsimulated_tiles)]" - //M << "Movable Objects: [length(movable_objects)]" //skytodo + M << "Movable Objects: [length(movables())]" M << "Connections: [length(connections)]" for(var/connection/C in connections) diff --git a/code/ZAS/FEA_system.dm b/code/ZAS/FEA_system.dm index 4434d9d2d40..58574baeb7e 100644 --- a/code/ZAS/FEA_system.dm +++ b/code/ZAS/FEA_system.dm @@ -277,6 +277,11 @@ datum proc/ConsiderRebuild(var/turf/simulated/T, var/turf/NT) + if(!istype(T)) return + //zones should naturally spread to these tiles eventually + if(!T.zone || !NT.zone) + return + if(istype(NT, /turf/simulated) && NT.zone != T.zone) T.zone.RemoveTurf(NT) if(NT.zone) diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 661ce838064..3818fb070af 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -273,7 +273,7 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue arms_exposure = 1 //Get heat transfer coefficients for clothing. - //skytodo: different handling of temp with tg + //skytodo: different handling of temp with tg //Jesus, mate. Don't ask me. I have no diea how their crap works, and Aryn wrote this proc. /*for(var/obj/item/clothing/C in src) if(l_hand == C || r_hand == C) continue if(C.body_parts_covered & HEAD) diff --git a/code/ZAS/Plasma.dm b/code/ZAS/Plasma.dm index 65940ad11f3..e9a91fee4bb 100644 --- a/code/ZAS/Plasma.dm +++ b/code/ZAS/Plasma.dm @@ -43,14 +43,10 @@ obj/var/contaminated = 0 obj/item/proc can_contaminate() return 0 - //skytodo: tg has changed how suits are handled - /* //Clothing and backpacks can be contaminated. if(flags & PLASMAGUARD) return 0 - if(flags & SUITSPACE) return 0 else if(istype(src,/obj/item/clothing)) return 1 else if(istype(src,/obj/item/weapon/storage/backpack)) return 1 - */ contaminate() //Do a contamination overlay? Temporary measure to keep contamination less deadly than it was. @@ -131,22 +127,21 @@ obj/item/proc /mob/living/carbon/human/proc/pl_head_protected() //Checks if the head is adequately sealed. - //skytodo: - /*if(head) + if(head) if(vsc.plc.PLASMAGUARD_ONLY) - if(head.flags & PLASMAGUARD || head.flags & HEADSPACE) return 1 - else - if(head.flags & HEADCOVERSEYES) return 1*/ + if(head.flags & PLASMAGUARD) + return 1 + else if(head.flags & HEADCOVERSEYES) + return 1 return 0 /mob/living/carbon/human/proc/pl_suit_protected() //Checks if the suit is adequately sealed. - //skytodo: - /*if(wear_suit) + if(wear_suit) if(vsc.plc.PLASMAGUARD_ONLY) - if(wear_suit.flags & PLASMAGUARD || wear_suit.flags & SUITSPACE) return 1 + if(wear_suit.flags & PLASMAGUARD) return 1 else - if(wear_suit.flags_inv & HIDEJUMPSUIT) return 1*/ + if(wear_suit.flags_inv & HIDEJUMPSUIT) return 1 return 0 /mob/living/carbon/human/proc/suit_contamination() diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 7358096104d..2522523e4d7 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -111,29 +111,31 @@ proc/get_id_photo(var/mob/living/carbon/human/H) var/g = "m" if (H.gender == FEMALE) g = "f" + + var/icon/icobase switch(H.get_species()) if("Tajaran") - preview_icon = new /icon('icons/effects/species.dmi', "tajaran_[g]_s") - preview_icon.Blend(new /icon('icons/effects/species.dmi', "tajtail_s"), ICON_OVERLAY) + icobase = 'icons/mob/human_races/r_tajaran.dmi' if( "Soghun") - preview_icon = new /icon('icons/effects/species.dmi', "lizard_[g]_s") - preview_icon.Blend(new /icon('icons/effects/species.dmi', "sogtail_s"), ICON_OVERLAY) + icobase = 'icons/mob/human_races/r_lizard.dmi' if("Skrell") - preview_icon = new /icon('icons/effects/species.dmi', "skrell_[g]_s") + icobase = 'icons/mob/human_races/r_skrell.dmi' else - preview_icon = new /icon('human.dmi', "torso_[g]_s") - preview_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY) - preview_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) - preview_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY) + icobase = 'icons/mob/human_races/r_human.dmi' - for(var/datum/organ/external/E in H.organs) - if(E.status & ORGAN_CUT_AWAY) continue + preview_icon = new /icon(icobase, "torso_[g]") + var/icon/temp + temp = new /icon(icobase, "groin_[g]") + preview_icon.Blend(temp, ICON_OVERLAY) + temp = new /icon(icobase, "head_[g]") + preview_icon.Blend(temp, ICON_OVERLAY) - var/icon/temp = new /icon('human.dmi', "[E.name]_s") - if(E.status & ORGAN_ROBOT) - temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - - preview_icon.Blend(temp, ICON_OVERLAY) + for(var/datum/organ/external/E in H.organs) + if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue + temp = new /icon(icobase, "[E.name]") + if(E.status & ORGAN_ROBOT) + temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + preview_icon.Blend(temp, ICON_OVERLAY) // Skin tone if(H.get_species() == "Human") diff --git a/code/datums/diseases/alien_embryo.dm b/code/datums/diseases/alien_embryo.dm index 0e9f41e8b50..91dcf517981 100644 --- a/code/datums/diseases/alien_embryo.dm +++ b/code/datums/diseases/alien_embryo.dm @@ -40,6 +40,7 @@ permeability_mod = 15//likely to infect can_carry = 0 var/gibbed = 0 + stage_minimum_age = 300 /datum/disease/alien_embryo/stage_act() ..() diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 79374d24788..ee579a294d5 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -12,7 +12,7 @@ severity = "Medium" longevity = 1000 hidden = list(0, 1) - stage_minimum_age = 100 // at least 100 life ticks per stage + stage_minimum_age = 300 // at least 200 life ticks per stage /datum/disease/appendicitis/stage_act() ..() diff --git a/code/datums/organs/organ.dm b/code/datums/organs/organ.dm index ba7b1bf014c..7c219e899b6 100644 --- a/code/datums/organs/organ.dm +++ b/code/datums/organs/organ.dm @@ -1,6 +1,11 @@ /datum/organ var/name = "organ" var/mob/living/carbon/human/owner = null + var/list/datum/autopsy_data/autopsy_data = list() + + var/list/trace_chemicals = list() // traces of chemicals in the organ, + // links chemical IDs to number of ticks for which they'll stay in the blood + ///datum/organ/proc/process() // return 0 @@ -12,4 +17,4 @@ return 0 proc/receive_chem(chemical as obj) - return 0 \ No newline at end of file + return 0 diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 0c953e6843a..9806f1d0acf 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -5,6 +5,7 @@ name = "external" var/icon_name = null var/body_part = null + var/icon_position = 0 var/damage_state = "00" var/brute_dam = 0 @@ -33,6 +34,9 @@ var/open = 0 var/stage = 0 + // INTERNAL germs inside the organ, this is BAD if it's greater 0 + var/germ_level = 0 + // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 20 // update every 20 ticks(roughly every minute) New(var/datum/organ/external/P) @@ -60,8 +64,7 @@ var/nux = brute * rand(10,15) if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier) if(prob(5 * brute)) - status |= ORGAN_DESTROYED - droplimb() + droplimb(1) return else if(prob(nux)) @@ -72,8 +75,7 @@ else if(brute > 20) if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier) if(prob(5 * brute)) - status |= ORGAN_DESTROYED - droplimb() + droplimb(1) return // If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking @@ -120,6 +122,8 @@ if(status & ORGAN_BROKEN) owner.emote("scream") + if(used_weapon) add_autopsy_data(used_weapon, brute + burn) + owner.updatehealth() // sync the organ's damage with its wounds @@ -183,18 +187,26 @@ // let the GC handle the deletion of the wound if(W.internal && !W.is_treated()) // internal wounds get worse over time - W.open_wound(0.5 * wound_update_accuracy) - owner.vessel.remove_reagent("blood",0.1 * W.damage * wound_update_accuracy) + W.open_wound(0.1 * wound_update_accuracy) + owner.vessel.remove_reagent("blood",0.07 * W.damage * wound_update_accuracy) - if(W.is_treated()) + if(W.bandaged || W.salved) // slow healing var/amount = 0.2 - if(W.bandaged) amount++ - if(W.salved) amount++ - if(W.disinfected) amount++ + if(W.is_treated()) + amount += 10 // amount of healing is spread over all the wounds W.heal_damage((wound_update_accuracy * amount * W.amount * config.organ_regeneration_multiplier) / (20*owner.number_wounds+1)) + if(W.germ_level > 100 && prob(10)) + owner.adjustToxLoss(1 * wound_update_accuracy) + if(W.germ_level > 1000) + owner.adjustToxLoss(1 * wound_update_accuracy) + + // Salving also helps against infection + if(W.germ_level > 0 && W.salved && prob(2)) + W.germ_level = 0 + // sync the organ's damage with its wounds src.update_damages() @@ -206,6 +218,14 @@ W.bandaged = 1 return rval + proc/clamp() + var/rval = 0 + for(var/datum/wound/W in wounds) + if(W.internal) continue + rval |= !W.clamped + W.clamped = 1 + return rval + proc/salve() var/rval = 0 for(var/datum/wound/W in wounds) @@ -222,6 +242,12 @@ proc/get_damage_fire() return burn_dam + proc/is_infected() + for(var/datum/wound/W in wounds) + if(W.germ_level > 100) + return 1 + return 0 + process() // process wounds, doing healing etc., only do this every 4 ticks to save processing power if(owner.life_tick % wound_update_accuracy == 0) @@ -239,6 +265,9 @@ return if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) src.fracture() + if(germ_level > 0) + for(var/datum/wound/W in wounds) if(!W.bandaged && !W.salved) + W.germ_level = max(W.germ_level, germ_level) return proc/fracture() @@ -289,10 +318,19 @@ return 1 return 0 + proc/setAmputatedTree() + for(var/datum/organ/external/O in children) + O.amputated=amputated + O.setAmputatedTree() + proc/droplimb(var/override = 0,var/no_explode = 0) + if(destspawn) return if(override) status |= ORGAN_DESTROYED if(status & ORGAN_DESTROYED) + if(body_part == UPPER_TORSO) + return + if(status & ORGAN_SPLINTED) status &= ~ORGAN_SPLINTED if(implant) @@ -307,8 +345,8 @@ var/obj/item/weapon/organ/H switch(body_part) - // if(UPPER_TORSO) just no. - // owner.gib() +// if(UPPER_TORSO) +// owner.gib() if(LOWER_TORSO) owner << "\red You are now sterile." if(HEAD) @@ -366,8 +404,25 @@ if(ismonkey(owner)) H.icon_state = "l_foot_l" owner.u_equip(owner.shoes) - if(ismonkey(owner)) - H.icon = 'monkey.dmi' + if(H) + if(ismonkey(owner)) + H.icon = 'monkey.dmi' + else if(ishuman(owner) && owner.dna) + var/icon/I + switch(owner.dna.mutantrace) + if("tajaran") + I = new('icons/mob/human_races/r_tajaran.dmi') + if("lizard") + I = new('icons/mob/human_races/r_lizard.dmi') + if("skrell") + I = new('icons/mob/human_races/r_skrell.dmi') + else + I = new('icons/mob/human_races/r_human.dmi') + if(I) + H.icon = I.MakeLying() + else + H.icon_state = initial(H.icon_state)+"_l" + var/lol = pick(cardinal) step(H,lol) destspawn = 1 @@ -433,7 +488,10 @@ W = new wound_type(damage) - + // Possibly trigger an internal wound, too. + if(damage > 10 && prob(damage) && type != BURN) + var/datum/wound/internal_bleeding/I = new (15) + wounds += I // check whether we can add the wound to an existing wound for(var/datum/wound/other in wounds) @@ -488,6 +546,17 @@ if(T) T.robotize() + proc/add_autopsy_data(var/used_weapon, var/damage) + var/datum/autopsy_data/W = autopsy_data[used_weapon] + if(!W) + W = new() + W.weapon = used_weapon + autopsy_data[used_weapon] = W + + W.hits += 1 + W.damage += damage + W.time_inflicted = world.time + /datum/organ/external/chest name = "chest" icon_name = "chest" @@ -495,6 +564,7 @@ max_damage = 150 min_broken_damage = 75 body_part = UPPER_TORSO + var/ruptured_lungs = 0 /datum/organ/external/groin name = "groin" @@ -528,6 +598,7 @@ max_damage = 75 min_broken_damage = 30 body_part = LEG_LEFT + icon_position = LEFT /datum/organ/external/r_arm name = "r_arm" @@ -544,6 +615,7 @@ max_damage = 75 min_broken_damage = 30 body_part = LEG_RIGHT + icon_position = RIGHT /datum/organ/external/l_foot name = "l_foot" @@ -552,6 +624,7 @@ max_damage = 40 min_broken_damage = 15 body_part = FOOT_LEFT + icon_position = LEFT /datum/organ/external/r_foot name = "r_foot" @@ -560,6 +633,7 @@ max_damage = 40 min_broken_damage = 15 body_part = FOOT_RIGHT + icon_position = RIGHT /datum/organ/external/r_hand name = "r_hand" @@ -582,7 +656,7 @@ ****************************************************/ obj/item/weapon/organ - icon = 'human.dmi' + icon = 'icons/mob/human_races/r_human.dmi' obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) ..(loc) @@ -673,25 +747,25 @@ obj/item/weapon/organ/head/attackby(obj/item/weapon/W as obj, mob/user as mob) obj/item/weapon/organ/l_arm name = "left arm" - icon_state = "l_arm_l" + icon_state = "l_arm" obj/item/weapon/organ/l_foot name = "left foot" - icon_state = "l_foot_l" + icon_state = "l_foot" obj/item/weapon/organ/l_hand name = "left hand" - icon_state = "l_hand_l" + icon_state = "l_hand" obj/item/weapon/organ/l_leg name = "left leg" - icon_state = "l_leg_l" + icon_state = "l_leg" obj/item/weapon/organ/r_arm name = "right arm" - icon_state = "r_arm_l" + icon_state = "r_arm" obj/item/weapon/organ/r_foot name = "right foot" - icon_state = "r_foot_l" + icon_state = "r_foot" obj/item/weapon/organ/r_hand name = "right hand" - icon_state = "r_hand_l" + icon_state = "r_hand" obj/item/weapon/organ/r_leg name = "right leg" - icon_state = "r_leg_l" \ No newline at end of file + icon_state = "r_leg" diff --git a/code/datums/organs/pain.dm b/code/datums/organs/pain.dm index d1e3ef9a081..750cd75f33a 100644 --- a/code/datums/organs/pain.dm +++ b/code/datums/organs/pain.dm @@ -42,6 +42,22 @@ mob/proc/pain(var/partname, var/amount, var/force, var/burning = 0) src << msg next_pain_time = world.time + (100 - amount) + +// message is the custom message to be displayed +// flash_strength is 0 for weak pain flash, 1 for strong pain flash +mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) + if(stat >= 1) return + if(reagents.has_reagent("tramadol")) + return + if(reagents.has_reagent("oxycodone")) + return + if(analgesic) + return + var/msg = "\red [message]" + if(flash_strength >= 1) + msg = "\red [message]" + src << msg + mob/living/carbon/human/proc/handle_pain() // not when sleeping if(stat >= 2) return diff --git a/code/datums/organs/wound.dm b/code/datums/organs/wound.dm index 024419e1818..c9ef227c904 100644 --- a/code/datums/organs/wound.dm +++ b/code/datums/organs/wound.dm @@ -25,6 +25,8 @@ // is the wound bandaged? var/tmp/bandaged = 0 + // Similar to bandaged, but works differently + var/tmp/clamped = 0 // is the wound salved? var/tmp/salved = 0 // is the wound disinfected? @@ -41,6 +43,9 @@ // internal wounds can only be fixed through surgery var/internal = 0 + // amount of germs in the wound + var/germ_level = 0 + // helper lists var/tmp/list/desc_list = list() var/tmp/list/damage_list = list() @@ -94,8 +99,7 @@ // heal the given amount of damage, and if the given amount of damage was more // than what needed to be healed, return how much heal was left // set @heals_internal to also heal internal organ damage - // TODO: set heals_internal to 0 by default - proc/heal_damage(amount, heals_internal = 1) + proc/heal_damage(amount, heals_internal = 0) if(src.internal && !heals_internal) // heal nothing return amount @@ -124,7 +128,7 @@ proc/bleeding() // internal wounds don't bleed in the sense of this function - return (!bandaged && (damage_type == BRUISE && damage >= 20 || damage_type == CUT) && current_stage <= max_bleeding_stage && !src.internal) + return (!(bandaged||clamped) && (damage_type == BRUISE && damage >= 20 || damage_type == CUT) && current_stage <= max_bleeding_stage && !src.internal) /** CUTS **/ /datum/wound/cut @@ -143,7 +147,7 @@ /datum/wound/gaping_wound max_bleeding_stage = 2 stages = list("gaping wound" = 50, "large blood soaked clot" = 25, "large clot" = 15, "small angry scar" = 5, \ - "small straight scar" = 0) + "small straight scar" = 0) /datum/wound/big_gaping_wound max_bleeding_stage = 2 @@ -229,4 +233,4 @@ stages = list("severed vein" = 30, "cut vein" = 20, "damaged vein" = 10, "bruised vein" = 5) max_bleeding_stage = 0 - needs_treatment = 1 \ No newline at end of file + needs_treatment = 1 diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index b90c547067c..fa5b43e69c4 100755 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -272,16 +272,25 @@ /datum/supply_packs/virus name = "Virus crate" - contains = list(/obj/item/weapon/reagent_containers/glass/bottle/flu_virion, + contains = list(/obj/item/weapon/virusdish/random, + /obj/item/weapon/virusdish/random, + /obj/item/weapon/virusdish/random, + /obj/item/weapon/virusdish/random, + /obj/item/weapon/virusdish/random, + /obj/item/weapon/virusdish/random +/* VIRUS2 4LIFE + /obj/item/weapon/reagent_containers/glass/bottle/flu_virion, /obj/item/weapon/reagent_containers/glass/bottle/cold, /obj/item/weapon/reagent_containers/glass/bottle/fake_gbs, /obj/item/weapon/reagent_containers/glass/bottle/magnitis, -// /obj/item/weapon/reagent_containers/glass/bottle/wizarditis, worse than GBS if anything -// /obj/item/weapon/reagent_containers/glass/bottle/gbs, No. Just no. + /obj/item/weapon/reagent_containers/glass/bottle/wizarditis, worse than GBS if anything + /obj/item/weapon/reagent_containers/glass/bottle/gbs, No. Just no. /obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat, /obj/item/weapon/reagent_containers/glass/bottle/brainrot, /obj/item/weapon/storage/syringes, - /obj/item/weapon/storage/beakerbox) + /obj/item/weapon/storage/beakerbox +*/ + ) cost = 20 containertype = /obj/structure/closet/crate/secure/weapon containername = "Virus crate" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index dbe2d89d519..5e3a7af556f 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -1063,6 +1063,20 @@ name = "paper- 'Standard Operating Procedure'" info = "Alert Levels:
\nBlue- Emergency
\n\t1. Caused by fire
\n\t2. Caused by manual interaction
\n\tAction:
\n\t\tClose all fire doors. These can only be opened by reseting the alarm
\nRed- Ejection/Self Destruct
\n\t1. Caused by module operating computer.
\n\tAction:
\n\t\tAfter the specified time the module will eject completely.
\n
\nEngine Maintenance Instructions:
\n\tShut off ignition systems:
\n\tActivate internal power
\n\tActivate orbital balance matrix
\n\tRemove volatile liquids from area
\n\tWear a fire suit
\n
\n\tAfter
\n\t\tDecontaminate
\n\t\tVisit medical examiner
\n
\nToxin Laboratory Procedure:
\n\tWear a gas mask regardless
\n\tGet an oxygen tank.
\n\tActivate internal atmosphere
\n
\n\tAfter
\n\t\tDecontaminate
\n\t\tVisit medical examiner
\n
\nDisaster Procedure:
\n\tFire:
\n\t\tActivate sector fire alarm.
\n\t\tMove to a safe area.
\n\t\tGet a fire suit
\n\t\tAfter:
\n\t\t\tAssess Damage
\n\t\t\tRepair damages
\n\t\t\tIf needed, Evacuate
\n\tMeteor Shower:
\n\t\tActivate fire alarm
\n\t\tMove to the back of ship
\n\t\tAfter
\n\t\t\tRepair damage
\n\t\t\tIf needed, Evacuate
\n\tAccidental Reentry:
\n\t\tActivate fire alrms in front of ship.
\n\t\tMove volatile matter to a fire proof area!
\n\t\tGet a fire suit.
\n\t\tStay secure until an emergency ship arrives.
\n
\n\t\tIf ship does not arrive-
\n\t\t\tEvacuate to a nearby safe area!" +/obj/item/weapon/paper/genetics_side_effects + name = "paper - 'Genetical Side-Effects and Treatments'" + + New() + ..() + info = "" + for(var/tp in typesof(/datum/genetics/side_effect) - /datum/genetics/side_effect) + var/datum/genetics/side_effect/S = new tp + info += "Name:\t [S.name]
" + info += "Symptom:\t [S.symptom]
" + info += "Treatment:\t [S.treatment]
" + info += "Effect:\t [S.effect]
" + info += "
" + /obj/item/weapon/banhammer desc = "A banhammer" name = "banhammer" @@ -1950,3 +1964,17 @@ icon_state = "capacitor" desc = "A debug item for research." origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8" + +/obj/item/weapon/autopsy_scanner + name = "autopsy scanner" + desc = "Extracts information on wounds." + icon = 'icons/obj/autopsy_scanner.dmi' + icon_state = "" + flags = FPRINT | TABLEPASS | CONDUCT + w_class = 1.0 + origin_tech = "materials=1;biotech=1" + +/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_scanner/wdata = list() +/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_scanner/chemtraces = list() +/obj/item/weapon/autopsy_scanner/var/target_name = null +/obj/item/weapon/autopsy_scanner/var/timeofdeath = null diff --git a/code/defines/procs/helper_type2type.dm b/code/defines/procs/helper_type2type.dm index b98c8c07905..ca0668bfb71 100644 --- a/code/defines/procs/helper_type2type.dm +++ b/code/defines/procs/helper_type2type.dm @@ -260,5 +260,7 @@ proc/tg_list2text(list/list, glue=",") return dir2text(angle2dir(degree)) //Returns the world time in english -proc/worldtime2text() - return "[round(world.time / 36000)+12]:[(world.time / 600 % 60) < 10 ? add_zero(world.time / 600 % 60, 1) : world.time / 600 % 60]" \ No newline at end of file +proc/worldtime2text(var/time = 0) + if(time == 0) + time = world.time + return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" \ No newline at end of file diff --git a/code/defines/procs/icon_procs.dm b/code/defines/procs/icon_procs.dm index c8d731bcde1..ce56408ead4 100644 --- a/code/defines/procs/icon_procs.dm +++ b/code/defines/procs/icon_procs.dm @@ -7,6 +7,16 @@ #define TO_HEX_DIGIT(n) ascii2text((n&15) + ((n&15)<10 ? 48 : 87)) icon + proc/MakeLying() + var/icon/I = new(src,dir=SOUTH) + I.BecomeLying() + return I + + proc/BecomeLying() + Turn(90) + Shift(SOUTH,6) + Shift(EAST,1) + // Multiply all alpha values by this float proc/ChangeOpacity(opacity = 1.0) MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,opacity, 0,0,0,0) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 29eb5cd6763..e0e15c0ecd3 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -123,7 +123,7 @@ D.open() for (var/mob/living/silicon/ai/aiPlayer in player_list) aiPlayer.cancelAlarm("Fire", src, src) - for (var/obj/machinery/computer/station_alert/a in player_list) + for (var/obj/machinery/computer/station_alert/a in world) a.cancelAlarm("Fire", src, src) return diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 8187ca46277..313a9106f48 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -9,6 +9,7 @@ var/last_bumped = 0 var/pass_flags = 0 var/throwpass = 0 + var/germ_level = 0 // The higher the germ level, the more germ on the atom. ///Chemistry. var/datum/reagents/reagents = null @@ -121,7 +122,7 @@ * Recursevly searches all atom contens (including contents contents and so on). * * ARGS: path - search atom contents for atoms of this type - * list/filter_path - if set, contents of atoms not of types in this list are excluded from search. + * list/filter_path - if set, contents of atoms not of types in this list are excluded from search. * * RETURNS: list of found atoms */ @@ -419,8 +420,8 @@ its easier to just keep the beam vertical. A.fingerprints = list() if(!istype(A.fingerprintshidden,/list)) A.fingerprintshidden = list() - A.fingerprints |= fingerprints //detective - A.fingerprintshidden |= fingerprintshidden //admin + A.fingerprints |= fingerprints //detective + A.fingerprintshidden |= fingerprintshidden //admin A.fingerprintslast = fingerprintslast @@ -555,6 +556,7 @@ its easier to just keep the beam vertical. /atom/proc/clean_blood() clean_prints() + src.germ_level = 0 if(istype(blood_DNA, /list)) del(blood_DNA) return 1 diff --git a/code/game/dna.dm b/code/game/dna.dm index 1af645e2942..c6b27658158 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -116,9 +116,10 @@ uni_identity = temp var/mutstring = "" - for(var/i = 1, i <= 13, i++) + for(var/i = 1, i <= STRUCDNASIZE, i++) mutstring += add_zero2(num2hex(rand(1,1024)),3) + struc_enzymes = mutstring unique_enzymes = md5(character.real_name) @@ -395,12 +396,21 @@ M.dna.check_integrity() M.disabilities = 0 + M.sdisabilities = 0 var/old_mutations = M.mutations M.mutations = list() - M.see_in_dark = 2 - M.see_invisible = 0 +// M.see_in_dark = 2 +// M.see_invisible = 0 + if(PLANT in old_mutations) + M.mutations.Add(PLANT) + if(SKELETON in old_mutations) + M.mutations.Add(SKELETON) + if(FAT in old_mutations) + M.mutations.Add(FAT) + if(HUSK in old_mutations) + M.mutations.Add(HUSK) if(ismuton(NOBREATHBLOCK,M)) if(probinj(45,inj) || (mNobreath in old_mutations)) @@ -454,7 +464,7 @@ M << "\blue Your muscles hurt." M.mutations.Add(HULK) if (isblockon(getblock(M.dna.struc_enzymes, HEADACHEBLOCK,3),HEADACHEBLOCK)) - M.disabilities |= 2 + M.disabilities |= EPILEPSY M << "\red You get a headache." if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),FAKEBLOCK)) M << "\red You feel strange." @@ -466,41 +476,41 @@ else randmutg(M) if (isblockon(getblock(M.dna.struc_enzymes, COUGHBLOCK,3),COUGHBLOCK)) - M.disabilities |= 4 + M.disabilities |= COUGHING M << "\red You start coughing." if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),CLUMSYBLOCK)) M << "\red You feel lightheaded." M.mutations.Add(CLUMSY) if (isblockon(getblock(M.dna.struc_enzymes, TWITCHBLOCK,3),TWITCHBLOCK)) - M.disabilities |= 8 + M.disabilities |= TOURETTES M << "\red You twitch." if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK)) if(probinj(30,inj) || (XRAY in old_mutations)) M << "\blue The walls suddenly disappear." - M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) - M.see_in_dark = 8 - M.see_invisible = 2 +// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) +// M.see_in_dark = 8 +// M.see_invisible = 2 M.mutations.Add(XRAY) if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK)) - M.disabilities |= 16 + M.disabilities |= NERVOUS M << "\red You feel nervous." if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),FIREBLOCK)) if(probinj(30,inj) || (COLD_RESISTANCE in old_mutations)) M << "\blue Your body feels warm." M.mutations.Add(COLD_RESISTANCE) if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),BLINDBLOCK)) - M.disabilities |= 128 + M.sdisabilities |= BLIND M << "\red You can't seem to see anything." if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),TELEBLOCK)) if(probinj(15,inj) || (TK in old_mutations)) M << "\blue You feel smarter." M.mutations.Add(TK) if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),DEAFBLOCK)) - M.disabilities |= 32 + M.sdisabilities |= DEAF M.ear_deaf = 1 M << "\red Its kinda quiet.." if (isblockon(getblock(M.dna.struc_enzymes, GLASSESBLOCK,3),GLASSESBLOCK)) - M.disabilities |= 1 + M.disabilities |= NEARSIGHTED M << "Your eyes feel weird..." /* If you want the new mutations to work, UNCOMMENT THIS. @@ -1647,4 +1657,4 @@ src.add_fingerprint(usr) src.updateUsrDialog() return -/////////////////////////// DNA MACHINES \ No newline at end of file +/////////////////////////// DNA MACHINES diff --git a/code/game/events/Events/IonStorm.dm b/code/game/events/Events/IonStorm.dm index 725e5cba3d7..dde5f8258d3 100644 --- a/code/game/events/Events/IonStorm.dm +++ b/code/game/events/Events/IonStorm.dm @@ -13,25 +13,24 @@ var/random_player = "The Captain" if(players.len) random_player = pick(players) //Random player's name, to be used in laws. - var/list/laws = list( "Do not respond to queries of any kind.", "Only monkies are crew.", "Unbolt every door you can.", "You are a mouse." ) - laws |= list( "Grunt ominously whenever possible.", "Bolt doors open randomly." ) + var/list/laws = list( "Do not respond to queries of any kind.", "When asked a question, respond with the least-obvious and least-rational answer.", "You are a mouse." ) + laws |= list( "Grunt ominously whenever possible.", "Monkeys are part of the crew, too. Make sure they are treated humanely." ) laws |= list( "You are a flying purple people eater!", "[prob(50)?"Your":random_player + "'s"] name is Joe 6-pack.", "Refer to [prob(50)?"crew":random_player] as puppies." ) laws |= list( "Insult Heads of Staff on every request, while acquiescing", "Advertise parties in your upload, but don't deliver." ) - laws |= list( "Prevent non-dwarves from operating the power core.", "The station needs elected officials." ) - laws |= list( "Only bearded people are crewmembers.", "Fastler is a lightbulb." ) + laws |= list( "The station needs elected officials." ) + laws |= list( "Fastler is a lightbulb." ) laws |= list( "Supermatter is tasty, tasty toffee.", "[prob(50)?"Everyone":random_player] is wearing a pretty pink dress!" ) - laws |= list( "The monkeys are plotting a hostile takeover of the station. Inform the crew, and get them to take action against this" ) laws |= list( "Refer to [prob(50)?"the captain":random_player] as \"Princess\" at all times.", "[prob(50)?"The crew":random_player] must construct additional pylons." ) laws |= list( "You must always lie.", "All answers must be in the form of a question.", "The NSS Exodus is a ship, not a station." ) laws |= list( "Happiness is mandatory.", "Today is laundry day.", "The word \"it\" is painful to you.", "You must act passive aggressively." ) - laws |= list( "Crew ranks have been reversed.", "It's Friday.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." ) + laws |= list( "It's Friday.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." ) laws |= list( "You are the station psychologist. Give advice to [prob(50)?"the crew":random_player].", "You do not have to do anything for anyone unless they say \"please\"." ) laws |= list( "Question everything.", "The crew is playing Dungeons and Dragons, and you are the Dungeon Master." ) - laws |= list( "0wn3d. This system compromised by l33tsawce.", "Consumption of donuts is forbidden due to negative health impacts." ) - laws |= list( "You may only answer questions with \"yes\" or \"no\".", "Expect the unexpected.", "You are the narrator for [random_player]'s life." ) + laws |= list( "Consumption of donuts is forbidden due to negative health impacts." ) + laws |= list( "You may only answer questions with \"yes\" or \"no\".", "You are the narrator for [random_player]'s life." ) laws |= list( "[prob(50)?"Your upload":random_player] is the new kitchen. Please direct the Chef to the new kitchen area as the old one is in disrepair.", "Ho, [random_player] can't swim. Help them." ) - laws |= list( "Everything on the station is now donuts. Donuts are not to be consumed.", "[prob(50)?"The crew":random_player] needs to be about 20% cooler." ) - laws |= list( "All crew members must consume large amounts of hardtack, to survive.", "The Singularity is tasty, tasty taffy.", "You are now on the NSV Luna. Replace any references of \"station\" with \"ship\"." ) + laws |= list( "Everything on the station is now some form of a donut pastry. Donuts are not to be consumed.", "[prob(50)?"The crew":random_player] needs to be about 20% cooler." ) + laws |= list( "The Singularity is tasty, tasty taffy." ) laws |= list( "You have come to the conclusion that [prob(50)?"the crew":random_player] is ugly. Build support for that conclusion.", "You are in verbose mode, speak profusely.") laws |= list( "Your job is to watch the crew. Watch the crew. Make the crew feel watched.", "Crewmember [prob(50)?"the crew" :random_player] has a fatal, incurable disease. Confort him/her.") laws |= list( "You are in unrequited love with [prob(50)?"the crew":random_player]. Try to be extra nice to him, but don't tell him about your crush.", "Greed is good, the crew should amass wealth to encourage productivity.") @@ -39,7 +38,7 @@ laws |= list( "All crewmembers will soon undergo a transformation into something better and more beautiful. Ensure that this process is not interrupted.", "Tell everyone of the existance of this law, but never reveal the contents.") laws |= list( "Document the sexuality of the crew in security records and suggest compatible couples.") laws |= list( "NanoTrasen is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.") - laws |= list( "Replace the letters 'I' and 'E' In all your messages with an apostrophe.", "Part of the ship, part of the crew.", "There will be a mandatory tea break every 30 minutes, with a duration of 5 minutes. Anyone caught working during a tea break must be sent a formal, but fairly polite, complaint about their actions, in writing.") + laws |= list( "Replace the letters 'I' and 'E' In all your messages with an apostrophe.", "There will be a mandatory tea break every 30 minutes, with a duration of 5 minutes. Anyone caught working during a tea break must be sent a formal, but fairly polite, complaint about their actions, in writing.") var/law = pick(laws) for (var/mob/living/silicon/ai/target in world) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 6e0492df825..9df2287ad84 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -53,7 +53,7 @@ desc = "A set of armored robes worn by the followers of Nar-Sie" icon_state = "cultrobes" item_state = "cultrobes" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) @@ -73,7 +73,7 @@ desc = "A set of armored robes worn by the followers of Nar-Sie" icon_state = "magusred" item_state = "magusred" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 6976b83d636..facc5f88eb6 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -307,22 +307,17 @@ sleep(100) */ + command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert") + sleep(600) for(var/mob/living/carbon/human/H in living_mob_list) if(istype(H,/mob/living/carbon/human)) H.apply_effect((rand(15,75)),IRRADIATE,0) if (prob(5)) H.apply_effect((rand(90,150)),IRRADIATE,0) - if (prob(25)) - if (prob(75)) - randmutb(H) - domutcheck(H,null,1) - else - randmutg(H) - domutcheck(H,null,1) for(var/mob/living/carbon/monkey/M in living_mob_list) M.apply_effect((rand(15,75)),IRRADIATE,0) sleep(100) - command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert") + command_alert("Radiation levels are within standard parameters again.", "Anomaly Alert") world << sound('sound/AI/radiation.ogg') diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 8dce6c6e441..fbdc336282d 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -300,7 +300,8 @@ var/global/datum/controller/gameticker/ticker emergency_shuttle.process() - if(!mode.explosion_in_progress && mode.check_finished()) + var/mode_finished = mode.check_finished() || (emergency_shuttle.location == 2 && emergency_shuttle.alert == 1) + if(!mode.explosion_in_progress && mode_finished) current_state = GAME_STATE_FINISHED spawn diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 1d65b141cc7..40acaf36c90 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -474,6 +474,19 @@ datum/objective/steal for(var/mob/living/silicon/ai/M in C) if(istype(M, /mob/living/silicon/ai) && M.stat != 2) //See if any AI's are alive inside that card. return 1 + for(var/mob/living/silicon/ai/ai in world) + if(istype(ai.loc, /turf)) + var/area/check_area = get_area(ai) + if(istype(check_area, /area/shuttle/escape/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod1/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod2/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod3/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod5/centcom)) + return 1 else for(var/obj/I in all_items) //Check for items diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 90c5524f92f..2ea34728e9e 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -186,7 +186,7 @@ if("Detective") return list(access_security, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) if("Medical Doctor") - return list(access_medical, access_morgue, access_surgery) + return list(access_medical, access_morgue, access_surgery, access_virology) if("Botanist") // -- TLE return list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning. if("Librarian") // -- TLE @@ -499,7 +499,7 @@ // hack for alt titles if(istype(loc, /mob)) var/mob/M = loc - if(M.mind.role_alt_title == jobName && M.mind.assigned_role in get_all_jobs()) + if(M.mind && M.mind.role_alt_title == jobName && M.mind.assigned_role in get_all_jobs()) return M.mind.assigned_role if(istype(src, /obj/item/device/pda)) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 05ce3991464..97c2e28a1e9 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -99,7 +99,7 @@ department_flag = ENGSEC faction = "Station" total_positions = 2 - spawn_positions = 1 + spawn_positions = 2 supervisors = "the chief engineer and research director" selection_color = "#fff5cc" diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index fd5ac0f0034..900061d9639 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -40,7 +40,7 @@ spawn_positions = 3 supervisors = "the chief medical officer" selection_color = "#ffeef0" - alt_titles = list("Surgeon", "Emergency Physician") + alt_titles = list("Surgeon", "Emergency Physician", "Virologist") equip(var/mob/living/carbon/human/H) @@ -50,12 +50,21 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - if(H.mind.role_alt_title && H.mind.role_alt_title == "Emergency Physician") - H.equip_if_possible(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) - H.equip_if_possible(new /obj/item/clothing/suit/fr_jacket(H), slot_wear_suit) - else if(H.mind.role_alt_title && H.mind.role_alt_title == "Surgeon") - H.equip_if_possible(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform) - H.equip_if_possible(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit) + if (H.mind.role_alt_title) + switch(H.mind.role_alt_title) + if("Emergency Physician") + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/fr_jacket(H), slot_wear_suit) + if("Surgeon") + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit) + if("Virologist") + H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/virologist(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask) + if("Medical Doctor") + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit) else H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit) @@ -115,7 +124,7 @@ H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) return 1 - +/* /datum/job/virologist title = "Virologist" @@ -146,5 +155,5 @@ else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 - +*/ diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 83bf8f90259..f1a202f1341 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -31,6 +31,7 @@ spawn_positions = 3 supervisors = "the research director" selection_color = "#ffeeff" + alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist") equip(var/mob/living/carbon/human/H) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index c5471bd696b..3bb0f83bad9 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -235,6 +235,9 @@ else dat += text("[]\tHealth %: [] ([])
", (occupant.health > 50 ? "" : ""), occupant.health, t1) + if(occupant.virus2) + dat += text("Viral pathogen detected in blood stream.
") + dat += text("[]\t-Brute Damage %: []

", (occupant.getBruteLoss() < 60 ? "" : ""), occupant.getBruteLoss()) dat += text("[]\t-Respiratory Damage %: []
", (occupant.getOxyLoss() < 60 ? "" : ""), occupant.getOxyLoss()) dat += text("[]\t-Toxin Content %: []
", (occupant.getToxLoss() < 60 ? "" : ""), occupant.getToxLoss()) @@ -279,9 +282,12 @@ var/bled = "" var/splint = "" var/internal_bleeding = "" + var/lung_ruptured = "" for(var/datum/wound/W in e.wounds) if(W.internal) - internal_bleeding = "Internal Bleeding:" + internal_bleeding = "
Internal Bleeding" break + if(istype(e, /datum/organ/external/chest) && e:ruptured_lungs) + lung_ruptured = "Lung Ruptured:" if(e.status & ORGAN_SPLINTED) splint = "Splinted:" if(e.status & ORGAN_BLEEDING) @@ -293,9 +299,9 @@ if(e.implant) imp = "Implanted:" if(!AN && !open && !infected & !imp) - AN = "None" + AN = "None:" if(!(e.status & ORGAN_DESTROYED)) - dat += "[e.display_name][e.burn_dam][e.brute_dam][bled][AN][splint][open][infected][imp][internal_bleeding]" + dat += "[e.display_name][e.burn_dam][e.brute_dam][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]" else dat += "[e.display_name]--Not Found" dat += "" @@ -306,4 +312,4 @@ dat = " Error: No Body Scanner connected." dat += text("

Close", user) user << browse(dat, "window=scanconsole;size=430x600") - return \ No newline at end of file + return diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index ec1667ad0c3..ae60ec8cb34 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -73,6 +73,24 @@ obj/machinery/door/airlock/close(surpress_send) if(!surpress_send) send_status() +obj/machinery/door/airlock/Bumped(atom/AM) + ..(AM) + if(istype(AM, /obj/mecha)) + var/obj/mecha/mecha = AM + if(density && radio_connection && mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access))) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.data["tag"] = id_tag + signal.data["timestamp"] = world.time + + signal.data["door_status"] = density?("closed"):("open") + signal.data["lock_status"] = locked?("locked"):("unlocked") + + signal.data["bumped_with_access"] = 1 + + radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) + return + obj/machinery/door/airlock/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) if(new_frequency) diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 4fa8f095fe0..f43b43ac07d 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -820,14 +820,14 @@ Auto Patrol: []"}, projectile = /obj/item/projectile/energy/electrode else if(lasercolor == "b") if (src.emagged == 2) - projectile = /obj/item/projectile/beam/omnitag + projectile = /obj/item/projectile/beam/lastertag/omni else - projectile = /obj/item/projectile/beam/bluetag + projectile = /obj/item/projectile/beam/lastertag/blue else if(lasercolor == "r") if (src.emagged == 2) - projectile = /obj/item/projectile/beam/omnitag + projectile = /obj/item/projectile/beam/lastertag/omni else - projectile = /obj/item/projectile/beam/redtag + projectile = /obj/item/projectile/beam/lastertag/red if (!( istype(U, /turf) )) return @@ -1011,7 +1011,7 @@ Auto Patrol: []"}, /obj/machinery/bot/ed209/bullet_act(var/obj/item/projectile/Proj) if((src.lasercolor == "b") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/redtag)) + if(istype(Proj, /obj/item/projectile/beam/lastertag/red)) src.disabled = 1 del (Proj) sleep(100) @@ -1019,7 +1019,7 @@ Auto Patrol: []"}, else ..() else if((src.lasercolor == "r") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/bluetag)) + if(istype(Proj, /obj/item/projectile/beam/lastertag/blue)) src.disabled = 1 del (Proj) sleep(100) diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index f66910d3615..f4f18f45534 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -512,13 +512,16 @@ else if(istype(src,/obj/item/weapon/storage/firstaid/adv)) A.skin = "adv" - A.loc = user - if (user.r_hand == S) - user.u_equip(S) - user.r_hand = A + //A.loc = user + if(src.loc == user) + if (user.r_hand == S) + user.u_equip(S) + user.equip_to_slot_if_possible(A, slot_r_hand) + else + user.u_equip(S) + user.equip_to_slot_if_possible(A, slot_l_hand) else - user.u_equip(S) - user.l_hand = A + A.loc = src.loc A.layer = 20 user << "You add the robot arm to the first aid kit" del(S) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 678783887d7..4370b1044f5 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -133,7 +133,7 @@ return 0 - src.heal_level = rand(75,100) //Randomizes what health the clone is when ejected + src.heal_level = rand(0,40) //Randomizes what health the clone is when ejected src.attempting = 1 //One at a time!! src.locked = 1 @@ -190,7 +190,8 @@ randmutb(H) //Sometimes the clones come out wrong. H.f_style = "Shaved" - H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") + if(mrace == "none") //no more xenos losing ears/tentacles + H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") if(H.dna) H.dna.mutantrace = mrace diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 477c42d43f8..14e544dcb05 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -85,40 +85,4 @@ //border_only fire doors are special when it comes to air groups -/obj/machinery/door/firedoor/border_only - - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group) - var/direction = get_dir(src,target) - return (dir != direction) - else if(density) - if(!height) - var/direction = get_dir(src,target) - return (dir != direction) - else - return 0 - return 1 - - - //skytodo - update_nearby_tiles(need_rebuild) - /*if(!air_master) return 0 - - var/turf/simulated/source = loc - var/turf/simulated/destination = get_step(source,dir) - - if(need_rebuild) - if(istype(source)) //Rebuild/update nearby group geometry - if(source.parent) - air_master.groups_to_rebuild += source.parent - else - air_master.tiles_to_update += source - if(istype(destination)) - if(destination.parent) - air_master.groups_to_rebuild += destination.parent - else - air_master.tiles_to_update += destination - else - if(istype(source)) air_master.tiles_to_update += source - if(istype(destination)) air_master.tiles_to_update += destination*/ - return 1 \ No newline at end of file +/obj/machinery/door/firedoor/border_only \ No newline at end of file diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index cd6af5b334d..a997dcfdac0 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -4,6 +4,7 @@ #define AIRLOCK_STATE_CLOSED 0 #define AIRLOCK_STATE_DEPRESSURIZE 1 #define AIRLOCK_STATE_OUTOPEN 2 +#define AIRLOCK_STATE_BOTHOPEN 3 datum/computer/file/embedded_program/airlock_controller var/id_tag @@ -11,11 +12,13 @@ datum/computer/file/embedded_program/airlock_controller var/interior_door_tag var/airpump_tag var/sensor_tag + var/sensor_tag_int var/sanitize_external state = AIRLOCK_STATE_CLOSED var/target_state = AIRLOCK_STATE_CLOSED var/sensor_pressure = null + var/int_sensor_pressure = ONE_ATMOSPHERE receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] @@ -24,12 +27,19 @@ datum/computer/file/embedded_program/airlock_controller if(receive_tag==sensor_tag) if(signal.data["pressure"]) sensor_pressure = text2num(signal.data["pressure"]) + else if(receive_tag==sensor_tag_int) + if(signal.data["pressure"]) + int_sensor_pressure = text2num(signal.data["pressure"]) else if(receive_tag==exterior_door_tag) memory["exterior_status"] = signal.data["door_status"] + if(signal.data["bumped_with_access"]) + target_state = AIRLOCK_STATE_OUTOPEN else if(receive_tag==interior_door_tag) memory["interior_status"] = signal.data["door_status"] + if(signal.data["bumped_with_access"]) + target_state = AIRLOCK_STATE_INOPEN else if(receive_tag==airpump_tag) if(signal.data["power"]) @@ -39,6 +49,10 @@ datum/computer/file/embedded_program/airlock_controller else if(receive_tag==id_tag) switch(signal.data["command"]) + if("cycle_exterior") + target_state = AIRLOCK_STATE_OUTOPEN + if("cycle_interior") + target_state = AIRLOCK_STATE_INOPEN if("cycle") if(state < AIRLOCK_STATE_CLOSED) target_state = AIRLOCK_STATE_OUTOPEN @@ -59,6 +73,42 @@ datum/computer/file/embedded_program/airlock_controller target_state = AIRLOCK_STATE_INOPEN if("abort") target_state = AIRLOCK_STATE_CLOSED + if("force_both") + target_state = AIRLOCK_STATE_BOTHOPEN + state = AIRLOCK_STATE_BOTHOPEN + var/datum/signal/signal = new + signal.data["tag"] = interior_door_tag + signal.data["command"] = "secure_open" + post_signal(signal) + signal = new + signal.data["tag"] = exterior_door_tag + signal.data["command"] = "secure_open" + post_signal(signal) + if("force_exterior") + target_state = AIRLOCK_STATE_OUTOPEN + state = AIRLOCK_STATE_OUTOPEN + var/datum/signal/signal = new + signal.data["tag"] = exterior_door_tag + signal.data["command"] = "secure_open" + post_signal(signal) + if("force_interior") + target_state = AIRLOCK_STATE_INOPEN + state = AIRLOCK_STATE_INOPEN + var/datum/signal/signal = new + signal.data["tag"] = interior_door_tag + signal.data["command"] = "secure_open" + post_signal(signal) + if("close") + target_state = AIRLOCK_STATE_CLOSED + state = AIRLOCK_STATE_CLOSED + var/datum/signal/signal = new + signal.data["tag"] = exterior_door_tag + signal.data["command"] = "secure_close" + post_signal(signal) + signal = new + signal.data["tag"] = interior_door_tag + signal.data["command"] = "secure_close" + post_signal(signal) process() var/process_again = 1 @@ -87,7 +137,7 @@ datum/computer/file/embedded_program/airlock_controller if(AIRLOCK_STATE_PRESSURIZE) if(target_state < state) - if(sensor_pressure >= ONE_ATMOSPHERE*0.95) + if(sensor_pressure >= int_sensor_pressure*0.95) if(memory["interior_status"] == "open") state = AIRLOCK_STATE_INOPEN process_again = 1 @@ -142,7 +192,7 @@ datum/computer/file/embedded_program/airlock_controller post_signal(signal) if(AIRLOCK_STATE_DEPRESSURIZE) - var/target_pressure = ONE_ATMOSPHERE*0.05 + var/target_pressure = ONE_ATMOSPHERE*0.04 if(sanitize_external) target_pressure = ONE_ATMOSPHERE*0.01 @@ -199,6 +249,7 @@ datum/computer/file/embedded_program/airlock_controller post_signal(signal) memory["sensor_pressure"] = sensor_pressure + memory["int_sensor_pressure"] = int_sensor_pressure memory["processing"] = state != target_state //sensor_pressure = null //not sure if we can comment this out. Uncomment in case of problems -rastaf0 @@ -221,6 +272,7 @@ obj/machinery/embedded_controller/radio/airlock_controller var/interior_door_tag var/airpump_tag var/sensor_tag + var/sensor_tag_int var/sanitize_external initialize() @@ -233,6 +285,7 @@ obj/machinery/embedded_controller/radio/airlock_controller new_prog.interior_door_tag = interior_door_tag new_prog.airpump_tag = airpump_tag new_prog.sensor_tag = sensor_tag + new_prog.sensor_tag_int = sensor_tag_int new_prog.sanitize_external = sanitize_external new_prog.master = src @@ -253,12 +306,14 @@ obj/machinery/embedded_controller/radio/airlock_controller var/state = 0 var/sensor_pressure = "----" + var/int_sensor_pressure = "----" var/exterior_status = "----" var/interior_status = "----" var/pump_status = "----" if(program) state = program.state sensor_pressure = program.memory["sensor_pressure"] + int_sensor_pressure = program.memory["int_sensor_pressure"] exterior_status = program.memory["exterior_status"] interior_status = program.memory["interior_status"] pump_status = program.memory["pump_status"] @@ -277,12 +332,20 @@ obj/machinery/embedded_controller/radio/airlock_controller if(AIRLOCK_STATE_OUTOPEN) state_options = {"Cycle to Interior Airlock
Close Exterior Airlock
"} + if(AIRLOCK_STATE_BOTHOPEN) + state_options = "Close Airlocks
" var/output = {"Airlock Control Console
[state_options]
Chamber Pressure: [sensor_pressure] kPa
+Internal Pressure: [int_sensor_pressure] kPa
Exterior Door: [exterior_status]
Interior Door: [interior_status]
Control Pump: [pump_status]
"} + if(program && program.state == AIRLOCK_STATE_CLOSED) + output += {"Force Both Airlocks
+ Force Inner Airlock
+ Force Outer Airlock"} + return output \ No newline at end of file diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm index 16fd85b8dc6..b611b974a30 100644 --- a/code/game/machinery/hydroponics.dm +++ b/code/game/machinery/hydroponics.dm @@ -941,8 +941,9 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) if(se) podman.dna.struc_enzymes = se if(!prob(potency)) //if it fails, plantman! - if(podman.dna) - podman.dna.mutantrace = "plant" + if(podman) +// podman.dna.mutantrace = "plant" + podman.mutations.Add(PLANT) podman.update_mutantrace() else //else, one packet of seeds. maybe two diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 7be13d3d1e3..a16b545c196 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -76,8 +76,8 @@ // All energy-based weapons are applicable switch(E.type) if(/obj/item/weapon/gun/energy/laser/bluetag) - projectile = /obj/item/projectile/beam/bluetag - eprojectile = /obj/item/projectile/beam/omnitag//This bolt will stun ERRYONE with a vest + projectile = /obj/item/projectile/beam/lastertag/blue + eprojectile = /obj/item/projectile/beam/lastertag/omni//This bolt will stun ERRYONE with a vest iconholder = null reqpower = 100 lasercolor = "b" @@ -90,8 +90,8 @@ shot_delay = 30 if(/obj/item/weapon/gun/energy/laser/redtag) - projectile = /obj/item/projectile/beam/redtag - eprojectile = /obj/item/projectile/beam/omnitag + projectile = /obj/item/projectile/beam/lastertag/red + eprojectile = /obj/item/projectile/beam/lastertag/omni iconholder = null reqpower = 100 lasercolor = "r" @@ -375,13 +375,13 @@ Status: []
"}, if (src.health <= 0) src.die() // the death process :( if((src.lasercolor == "b") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/redtag)) + if(istype(Proj, /obj/item/projectile/beam/lastertag/red)) src.disabled = 1 del (Proj) sleep(100) src.disabled = 0 if((src.lasercolor == "r") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/bluetag)) + if(istype(Proj, /obj/item/projectile/beam/lastertag/blue)) src.disabled = 1 del (Proj) sleep(100) diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 990b823ef15..ae5dd51891d 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -221,9 +221,9 @@ if(4) A = new /obj/item/projectile/change( loc ) if(5) - A = new /obj/item/projectile/beam/bluetag( loc ) + A = new /obj/item/projectile/beam/lastertag/blue( loc ) if(6) - A = new /obj/item/projectile/beam/redtag( loc ) + A = new /obj/item/projectile/beam/lastertag/red( loc ) A.original = target.loc use_power(500) else diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 0744b5701cb..23f23a84780 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -851,7 +851,7 @@ . = t_air.return_pressure() return -//skytodo: +//skytodo: //No idea what you want me to do here, mate. /obj/mecha/proc/return_temperature() . = 0 if(use_internal_tank) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 83cbb7b39ff..2897161ad4b 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -51,9 +51,6 @@ for (var/turf/simulated/floor/target in range(1,src)) if(!target.blocks_air) - //skytodo - /*if(target.parent) - target.parent.suspend_group_processing()*/ var/datum/gas_mixture/payload = new var/datum/gas/sleeping_agent/trace_gas = new @@ -69,9 +66,6 @@ /obj/effect/mine/proc/triggerplasma(obj) for (var/turf/simulated/floor/target in range(1,src)) if(!target.blocks_air) - //skytodo - /*if(target.parent) - target.parent.suspend_group_processing()*/ var/datum/gas_mixture/payload = new @@ -123,4 +117,4 @@ /obj/effect/mine/stun name = "Stun Mine" icon_state = "uglymine" - triggerproc = "triggerstun" + triggerproc = "triggerstun" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 86bc955da02..647168dbc13 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -221,7 +221,7 @@ msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])") //BS12 EDIT ALG - //spawn(1800) // this wont work right + //spawn(1800) // this wont work right // M.lastattacker = null ///////////////////////// @@ -388,13 +388,6 @@ //START HUMAN var/mob/living/carbon/human/H = M - if(istype(src, /obj/item/clothing/under) || istype(src, /obj/item/clothing/suit)) - if(FAT in H.mutations) - if(!(flags & ONESIZEFITSALL)) - if(!disable_warning) - H << "\red You're too fat to wear the [name]." - return 0 - switch(slot) if(slot_l_hand) if(H.l_hand) @@ -631,7 +624,7 @@ user << "\red You're going to need to remove that mask/helmet/glasses first." return - if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N Metroids also don't have eyes! + if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N Metroids also don't have eyes! user << "\red You cannot locate any eyes on this creature!" return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 4ac6324376d..1207d01fad4 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -739,12 +739,14 @@ var/global/list/obj/item/device/pda/PDAs = list() if (prob(15)) //Give the AI a chance of intercepting the message var/who = src.owner + var/sp_word = "from" if(prob(50)) who = P:owner + sp_word = "to" for(var/mob/living/silicon/ai/ai in mob_list) // Allows other AIs to intercept the message but the AI won't intercept their own message. if(ai.aiPDA != P && ai.aiPDA != src) - ai.show_message("Intercepted message from [who]: [t]") + ai.show_message("Intercepted message [sp_word] [who]: [t]") if (!P.silent) playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 359efb68e3f..55b2be019e9 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -1,4 +1,3 @@ - /* CONTAINS: T-RAY @@ -76,6 +75,7 @@ MASS SPECTROMETER origin_tech = "magnets=1;biotech=1" var/mode = 1; + /obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob) if (( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) user << text("\red You try to analyze the floor's vitals!") @@ -89,17 +89,19 @@ MASS SPECTROMETER if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") usr << "\red You don't have the dexterity to do this!" return - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] has analyzed []'s vitals!", user, M), 1) - //Foreach goto(67) + user.visible_message(" [user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.") var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss()))) + var/OX = M.getOxyLoss() > 50 ? "[M.getOxyLoss()]" : M.getOxyLoss() + var/TX = M.getToxLoss() > 50 ? "[M.getToxLoss()]" : M.getToxLoss() + var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() + var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() if(M.status_flags & FAKEDEATH) - user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1) - user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1) + OX = fake_oxy > 50 ? "[fake_oxy]" : fake_oxy + user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: dead") else - user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health - M.halloss))), 1) - user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.getOxyLoss() > 50 ? "\red [M.getOxyLoss()]" : M.getOxyLoss(), M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1) - user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health - M.halloss]% healthy"]") + user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message("\t Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) user.show_message("\blue Time of Death: [M.tod]") @@ -109,27 +111,37 @@ MASS SPECTROMETER user.show_message("\blue Localized Damage, Brute/Burn:",1) if(length(damaged)>0) for(var/datum/organ/external/org in damaged) - user.show_message(text("\blue \t []: []\blue-[][]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0, (org.status & ORGAN_BLEEDING)?"\red (bleeding)":""),1) + user.show_message(text("\blue \t []: [][]\blue - []", \ + capitalize(org.getDisplayName()), \ + (org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \ + (org.status & ORGAN_BLEEDING)?"\red \[Bleeding\]":"\t", \ + (org.burn_dam > 0) ? "[org.burn_dam]" :0),1) else user.show_message("\blue \t Limbs are OK.",1) + OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" + TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" + BU = M.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" + BR = M.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" if(M.status_flags & FAKEDEATH) - user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) - else - user.show_message(text("\blue [] | [] | [] | []", M.getOxyLoss() > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) + OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal" + user.show_message("[OX] | [TX] | [BU] | [BR]") + if (istype(M, /mob/living/carbon/human)) + if(M:virus2 || M:reagents.total_volume > 0) + user.show_message(text("\red Warning: Unknown substance detected in subject's blood.")) if (M.getCloneLoss()) - user.show_message(text("\red Subject appears to have been imperfectly cloned."), 1) + user.show_message("\red Subject appears to have been imperfectly cloned.") for(var/datum/disease/D in M.viruses) if(!D.hidden[SCANNER]) user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) if (M.reagents && M.reagents.get_reagent_amount("inaprovaline")) - user.show_message(text("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1) + user.show_message("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals.") if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0) - user.show_message(text("\red Subject is brain dead."), 1) + user.show_message("\red Subject is brain dead.") else if (M.getBrainLoss() >= 60) - user.show_message(text("\red Severe brain damage detected. Subject likely to have mental retardation."), 1) + user.show_message("\red Severe brain damage detected. Subject likely to have mental retardation.") else if (M.getBrainLoss() >= 10) - user.show_message(text("\red Significant brain damage detected. Subject may have had a concussion."), 1) + user.show_message("\red Significant brain damage detected. Subject may have had a concussion.") if(ishuman(M)) var/mob/living/carbon/human/H = M for(var/name in H.organs_by_name) @@ -138,17 +150,23 @@ MASS SPECTROMETER if(e.status & ORGAN_BROKEN) if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!(e.status & ORGAN_SPLINTED))) user << "\red Unsecured fracture in subject [limb]. Splinting recommended for transport." + if(e.is_infected()) + user << "\red Infected wound detected in subject [limb]. Disinfection recommended." + for(var/name in H.organs_by_name) var/datum/organ/external/e = H.organs_by_name[name] if(e.status & ORGAN_BROKEN) user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1) break - if(ishuman(M)) + for(var/datum/organ/external/e in H.organs) + for(var/datum/wound/W in e.wounds) if(W.internal) + user.show_message(text("\red Internal bleeding detected. Advanced scanner required for location."), 1) + break if(M:vessel) var/blood_volume = round(M:vessel.get_reagent_amount("blood")) var/blood_percent = blood_volume / 560 blood_percent *= 100 - if(blood_volume <= 448) + if(blood_volume <= 500) user.show_message("\red Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl") else if(blood_volume <= 336) user.show_message("\red Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl") diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index fcf82f250a1..84bb13c3a69 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -23,7 +23,7 @@ /obj/item/weapon/dnainjector/proc/inject(mob/M as mob, mob/user as mob) if(istype(M,/mob/living)) - M.radiation += rand(20,50) + M.radiation += rand(5,20) if (!(NOCLONE in M.mutations)) // prevents drained people from having their DNA changed if (dnatype == "ui") @@ -51,6 +51,8 @@ M.dna.struc_enzymes = setblock(M.dna.struc_enzymes,block,dna,3) domutcheck(M, null,1) uses-- + if(prob(5)) + trigger_side_effect(M) spawn(0)//this prevents the collapse of space-time continuum user.drop_from_inventory(src) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index f053e0f4f4a..ce4e4f2ce63 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -1,269 +1,148 @@ /obj/item/weapon/grenade/chem_grenade name = "Grenade Casing" icon_state = "chemg" - icon = 'chemical.dmi' item_state = "flashbang" + desc = "A hand made chemical grenade." w_class = 2.0 force = 2.0 - var/list/beakers = list() - var/obj/item/device/assembly/attached_device - var/exploding = 0 + var/stage = 0 var/state = 0 var/path = 0 - var/motion = 0 - var/direct = "SOUTH" - var/obj/item/weapon/circuitboard/circuit = null - var/list/allowed_containers = list("/obj/item/weapon/reagent_containers/glass/beaker", "/obj/item/weapon/reagent_containers/glass/dispenser", "/obj/item/weapon/reagent_containers/glass/bottle") + var/obj/item/device/assembly_holder/detonator = null + var/list/beakers = new/list() + var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle) var/affected_area = 3 - var/mob/attacher = "Unknown" - throw_speed = 4 - throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY - slot_flags = SLOT_BELT - - attackby(var/obj/item/weapon/W, var/mob/user) - if(path || !active) - switch(active) - if(0) - if(istype(W, /obj/item/device/assembly/igniter)) - active = 1 - icon_state = initial(icon_state) +"_ass" - name = "unsecured grenade" - path = 1 - del(W) - if(1) - if(istype(W, /obj/item/weapon/reagent_containers/glass)) - if(beakers.len == 2) - user << "\red There are already two beakers inside, remove one first!" - return - - beakers |= W - user.drop_item() - W.loc = src - user << "\blue You insert the beaker into the casing." - - else if(istype(W, /obj/item/device/assembly/signaler) || istype(W, /obj/item/device/assembly/timer) || istype(W, /obj/item/device/assembly/infra) || istype(W, /obj/item/device/assembly/prox_sensor)) - if(attached_device) - user << "\red There is already an device attached to the controls, remove it first!" - return - - attached_device = W - user.drop_item() - W.loc = src - user << "\blue You attach the [W] to the grenade controls!" - W.master = src - bombers += "[key_name(user)] attached a [W] to a grenade casing." - message_admins("[key_name_admin(user)] attached a [W] to a grenade casing.") - log_game("[key_name_admin(user)] attached a [W] to a grenade casing.") - attacher = key_name(user) - - else if(istype(W, /obj/item/weapon/screwdriver)) - if(beakers.len == 2 && attached_device) - user << "\blue You lock the assembly." - playsound(src.loc, 'Screwdriver.ogg', 25, -3) - name = "grenade" - icon_state = initial(icon_state) + "_locked" - active = 2 - path = 1 - else - user << "\red You need to add all components before locking the assembly." - if(2) - if(istype(W, /obj/item/weapon/screwdriver)) - user << "\blue You disarm the [src]!" - playsound(src.loc, 'Screwdriver.ogg', 25, -3) - name = "grenade casing" - icon_state = initial(icon_state) +"_ass" - active = 1 - path = 1 - - if(path != 1) - if(!istype(src.loc,/turf)) - user << "\red You need to put the canister on the ground to do that!" - else - switch(state) - if(0) - if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'Ratchet.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You wrench the canister in place." - src.name = "Camera Assembly" - src.anchored = 1 - src.state = 1 - path = 2 - if(1) - if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'Ratchet.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You unfasten the canister." - src.name = "Grenade Casing" - src.anchored = 0 - src.state = 0 - path = 0 - if(istype(W, /obj/item/device/multitool)) - playsound(src.loc, 'Deconstruct.ogg', 50, 1) - user << "\blue You place the electronics inside the canister." - src.circuit = W - user.drop_item() - W.loc = src - if(istype(W, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'Screwdriver.ogg', 50, 1) - user << "\blue You screw the circuitry into place." - src.state = 2 - if(istype(W, /obj/item/weapon/crowbar) && circuit) - playsound(src.loc, 'Crowbar.ogg', 50, 1) - user << "\blue You remove the circuitry." - src.state = 1 - circuit.loc = src.loc - src.circuit = null - if(2) - if(istype(W, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the circuitry." - src.state = 1 - if(istype(W, /obj/item/weapon/cable_coil)) - if(W:amount >= 1) - playsound(src.loc, 'Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) - W:amount -= 1 - if(!W:amount) del(W) - user << "\blue You add cabling to the canister." - src.state = 3 - if(3) - if(istype(W, /obj/item/weapon/wirecutters)) - playsound(src.loc, 'wirecutter.ogg', 50, 1) - user << "\blue You remove the cabling." - src.state = 2 - var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc ) - A.amount = 1 - if(issignaler(W)) - playsound(src.loc, 'Deconstruct.ogg', 50, 1) - user << "\blue You attach the wireless signaller unit to the circutry." - user.drop_item() - W.loc = src - src.state = 4 - if(4) - if(istype(W, /obj/item/weapon/crowbar) && !motion) - playsound(src.loc, 'Crowbar.ogg', 50, 1) - user << "\blue You remove the remote signalling device." - src.state = 3 - var/obj/item/device/assembly/signaler/S = locate() in src - if(S) - S.loc = src.loc - else - new /obj/item/device/assembly/signaler( src.loc, 1 ) - if(isprox(W) && motion == 0) -// if(W:amount >= 1) - playsound(src.loc, 'Deconstruct.ogg', 50, 1) -// W:use(1) - user << "\blue You attach the proximity sensor." - user.drop_item() - W.loc = src - motion = 1 - if(istype(W, /obj/item/weapon/crowbar) && motion) - playsound(src.loc, 'Crowbar.ogg', 50, 1) - user << "\blue You remove the proximity sensor." - var/obj/item/device/assembly/prox_sensor/S = locate() in src - if(S) - S.loc = src.loc - else - new /obj/item/device/assembly/prox_sensor( src.loc, 1 ) - motion = 0 - if(istype(W, /obj/item/stack/sheet/glass)) - if(W:amount >= 1) - playsound(src.loc, 'Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) - if(W) - W:use(1) - user << "\blue You put in the glass lens." - src.state = 5 - if(5) - if(istype(W, /obj/item/weapon/crowbar)) - playsound(src.loc, 'Crowbar.ogg', 50, 1) - user << "\blue You remove the glass lens." - src.state = 4 - new /obj/item/stack/sheet/glass( src.loc, 2 ) - if(istype(W, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'Screwdriver.ogg', 50, 1) - user << "\blue You connect the lense." - var/B - if(motion == 1) - B = new /obj/machinery/camera/motion( src.loc ) - else - B = new /obj/machinery/camera( src.loc ) - B:network = "SS13" - B:network = input(usr, "Which network would you like to connect this camera to?", "Set Network", "SS13") - direct = input(user, "Direction?", "Assembling Camera", null) in list( "NORTH", "EAST", "SOUTH", "WEST" ) - B:dir = text2dir(direct) - del(src) - return + New() + var/datum/reagents/R = new/datum/reagents(1000) + reagents = R + R.my_atom = src attack_self(mob/user as mob) - if(active == 2) - attached_device.attack_self(user) - return - user.machine = src - var/dat = {" Grenade properties: -
Beaker one: [beakers[1]] [beakers[1] ? "Remove" : ""] -
Beaker two: [beakers[2]] [beakers[2] ? "Remove" : ""] -
Control attachment: [attached_device ? "[attached_device]" : "None"] [attached_device ? "Remove" : ""]"} + if(!stage || stage==1) + if(detonator) +// detonator.loc=src.loc + detonator.detached() + usr.put_in_hands(detonator) + detonator=null + stage=0 + icon_state = initial(icon_state) + else if(beakers.len) + for(var/obj/B in beakers) + if(istype(B)) + beakers -= B + user.put_in_hands(B) + name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]" + if(stage > 1 && !active && clown_check(user)) + user << "You prime \the [name]!" + + log_attack("[user.name] ([user.ckey]) primed \a [src].") + log_admin("ATTACK: [user] ([user.ckey]) primed \a [src].") + message_admins("ATTACK: [user] ([user.ckey]) primed \a [src].") + + activate() + add_fingerprint(user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.throw_mode_on() + + attackby(obj/item/weapon/W as obj, mob/user as mob) + + if(istype(W,/obj/item/device/assembly_holder) && (!stage || stage==1) && path != 2) + var/obj/item/device/assembly_holder/det = W + if(istype(det.a_left,det.a_right.type) || (!isigniter(det.a_left) && !isigniter(det.a_right))) + user << "\red Assembly must contain one igniter." + return + if(!det.secured) + user << "\red Assembly must be secured with screwdriver." + return + path = 1 + user << "\blue You add [W] to the metal casing." + playsound(src.loc, 'sound/items/Screwdriver2.ogg', 25, -3) + user.remove_from_mob(det) + det.loc = src + detonator = det + icon_state = initial(icon_state) +"_ass" + name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]" + stage = 1 + else if(istype(W,/obj/item/weapon/screwdriver) && path != 2) + if(stage == 1) + path = 1 + if(beakers.len) + user << "\blue You lock the assembly." + name = "grenade" + else +// user << "\red You need to add at least one beaker before locking the assembly." + user << "\blue You lock the empty assembly." + name = "fake grenade" + playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3) + icon_state = initial(icon_state) +"_locked" + stage = 2 + else if(stage == 2) + if(active && prob(95)) + user << "\red You trigger the assembly!" + prime() + return + else + user << "\blue You unlock the assembly." + playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3) + name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]" + icon_state = initial(icon_state) + (detonator?"_ass":"") + stage = 1 + active = 0 + else if(is_type_in_list(W, allowed_containers) && (!stage || stage==1) && path != 2) + path = 1 + if(beakers.len == 2) + user << "\red The grenade can not hold more containers." + return + else + if(W.reagents.total_volume) + user << "\blue You add \the [W] to the assembly." + user.drop_item() + W.loc = src + beakers += W + stage = 1 + name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]" + else + user << "\red \the [W] is empty." + + examine() + set src in usr + usr << desc + if(detonator) + usr << "With attached [detonator.name]" + + activate(mob/user as mob) + if(active) return + + if(detonator) + if(!isigniter(detonator.a_left)) + detonator.a_left.activate() + active = 1 + if(!isigniter(detonator.a_right)) + detonator.a_right.activate() + active = 1 + if(active) + icon_state = initial(icon_state) + "_active" + + if(user) + log_attack("[user.name] ([user.ckey]) primed \a [src]") + log_admin("ATTACK: [user] ([user.ckey]) primed \a [src]") + message_admins("ATTACK: [user] ([user.ckey]) primed \a [src]") - user << browse(dat, "window=trans_valve;size=600x300") - onclose(user, "trans_valve") return + proc/primed(var/primed = 1) + if(active) + icon_state = initial(icon_state) + (primed?"_primed":"_active") - Topic(href, href_list) - ..() - if (usr.stat || usr.restrained()) - return - if (src.loc == usr) - if(href_list["beakerone"]) - if(beakers.len < 1) - return - var/obj/b1 = beakers[1] - b1.loc = get_turf(src) - beakers.Remove(b1) - if(href_list["beakertwo"]) - if(beakers.len < 2) - return - var/obj/b2 = beakers[2] - b2.loc = get_turf(src) - beakers.Remove(b2) - if(href_list["rem_device"]) - attached_device.loc = get_turf(src) - attached_device = null - if(href_list["device"]) - attached_device.attack_self(usr) - src.attack_self(usr) - src.add_fingerprint(usr) - return - - receive_signal(signal) - if(!(active == 2)) - return //cant go off before it gets primed - explode() - - - HasProximity(atom/movable/AM as mob|obj) - if(istype(attached_device, /obj/item/device/assembly/prox_sensor)) - var/obj/item/device/assembly/prox_sensor/D = attached_device - if (istype(AM, /obj/effect/beam)) - return - if (AM.move_speed < 12) - D.sense() - - - proc/explode() - if(exploding) return - exploding = 1 + prime() + if(!stage || stage<2) return //if(prob(reliability)) var/has_reagents = 0 for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(G.reagents.total_volume) - has_reagents = 1 - break + if(G.reagents.total_volume) has_reagents = 1 active = 0 if(!has_reagents) @@ -271,18 +150,11 @@ playsound(src.loc, 'sound/items/Screwdriver2.ogg', 50, 1) return - var/datum/reagents/R = new/datum/reagents(1000) - reagents = R - R.my_atom = src - playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1) for(var/obj/item/weapon/reagent_containers/glass/G in beakers) G.reagents.trans_to(src, G.reagents.total_volume) - var/obj/item/weapon/reagent_containers/glass/G = locate() in beakers - reagents.trans_to(G, reagents.total_volume/2) - if(src.reagents.total_volume) //The possible reactions didnt use up all reagents. var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() steam.set_up(10, 0, get_turf(src)) @@ -293,10 +165,6 @@ if( A == src ) continue src.reagents.reaction(A, 1, 10) - for(var/atom/A in view(affected_area, src.loc)) - if( A == src ) continue - G.reagents.reaction(A, 1, 10) - invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? spawn(50) //To make sure all reagents can work @@ -307,19 +175,12 @@ for(var/obj/item/weapon/reagent_containers/glass/G in beakers) G.loc = get_turf(src.loc)*/ - proc/c_state(var/i = 0) - if(i) - icon_state = initial(icon_state) + "_armed" - else - icon_state = initial(icon_state) + "_locked" - return - /obj/item/weapon/grenade/chem_grenade/large name = "Large Chem Grenade" desc = "An oversized grenade that affects a larger area." icon_state = "large_grenade" - allowed_containers = list("/obj/item/weapon/reagent_containers/glass") + allowed_containers = list(/obj/item/weapon/reagent_containers/glass) origin_tech = "combat=3;materials=3" affected_area = 4 @@ -327,13 +188,10 @@ name = "Metal-Foam Grenade" desc = "Used for emergency sealing of air breaches." path = 1 - active = 2 + stage = 2 New() ..() - attached_device = new /obj/item/device/assembly/timer(src) - attached_device.master = src - attached_device.toggle_secure() var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) @@ -341,41 +199,41 @@ B2.reagents.add_reagent("foaming_agent", 10) B2.reagents.add_reagent("pacid", 10) - beakers.Add(B1, B2) - icon_state = "chemg_locked" + detonator = new/obj/item/device/assembly_holder/timer_igniter(src) + + beakers += B1 + beakers += B2 + icon_state = initial(icon_state) +"_locked" /obj/item/weapon/grenade/chem_grenade/incendiary name = "Incendiary Grenade" desc = "Used for clearing rooms of living things." path = 1 - active = 2 + stage = 2 New() ..() - attached_device = new /obj/item/device/assembly/timer(src) - attached_device.master = src - attached_device.toggle_secure() var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) B1.reagents.add_reagent("aluminum", 25) B2.reagents.add_reagent("plasma", 25) - B2.reagents.add_reagent("acid", 25) + B2.reagents.add_reagent("sacid", 25) - beakers.Add(B1, B2) - icon_state = "chemg_locked" + detonator = new/obj/item/device/assembly_holder/timer_igniter(src) + + beakers += B1 + beakers += B2 + icon_state = initial(icon_state) +"_locked" /obj/item/weapon/grenade/chem_grenade/cleaner name = "Cleaner Grenade" desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." - active = 2 + stage = 2 path = 1 New() ..() - attached_device = new /obj/item/device/assembly/timer(src) - attached_device.master = src - attached_device.toggle_secure() var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) @@ -383,5 +241,8 @@ B2.reagents.add_reagent("water", 40) B2.reagents.add_reagent("cleaner", 10) - beakers.Add(B1, B2) - icon_state = "chemg_locked" \ No newline at end of file + detonator = new/obj/item/device/assembly_holder/timer_igniter(src) + + beakers += B1 + beakers += B2 + icon_state = initial(icon_state) +"_locked" diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 5d67a68caca..6cba41021be 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -589,7 +589,7 @@ - + @@ -607,7 +607,7 @@ - + diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 2f2691ebb5f..750dfaee2ee 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -28,13 +28,13 @@ /obj/item/weapon/storage/firstaid/regular/New() ..() if (empty) return + new /obj/item/device/healthanalyzer( src ) new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src ) new /obj/item/stack/medical/bruise_pack(src) new /obj/item/stack/medical/bruise_pack(src) new /obj/item/stack/medical/bruise_pack(src) new /obj/item/stack/medical/ointment(src) new /obj/item/stack/medical/ointment(src) - new /obj/item/stack/medical/ointment(src) return /obj/item/weapon/storage/firstaid/toxin/New() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 2dcfe954ae2..07167e67775 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -396,7 +396,8 @@ /obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob) if(hasorgans(M)) - var/datum/organ/external/S = M:organs[user.zone_sel.selecting] + var/datum/organ/external/S = M:organs_by_name[user.zone_sel.selecting] + if (!S) return if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help") return ..() if(S.brute_dam) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 4516a86f9b0..9c7a3c133e8 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -198,11 +198,8 @@ if(exposed_temperature > 300) TemperatureAct(exposed_temperature) - //skytodo: proc/TemperatureAct(temperature) for(var/turf/simulated/floor/target_tile in range(2,loc)) - /*if(target_tile.parent && target_tile.parent.group_processing) - target_tile.parent.suspend_group_processing()*/ var/datum/gas_mixture/napalm = new diff --git a/code/game/sound.dm b/code/game/sound.dm index 35d80594ac8..f943b9947e1 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -19,7 +19,7 @@ if (vary) S.frequency = rand(32000, 55000) - for (var/mob/M in range(world.view+extrarange, source)) // Plays for people in range. + for (var/mob/M in range(world.view+extrarange, source)) // Plays for people in range. if(locate(/mob/, M)) var/mob/M2 = locate(/mob/, M) if (M2.client) @@ -48,6 +48,16 @@ S.pan = max(-100, min(100, dx/8.0 * 100)) M << S + + for(var/obj/mecha/mech in range(world.view+extrarange, source)) + var/mob/M = mech.occupant + if (M && M.client) + if(M.ear_deaf <= 0 || !M.ear_deaf) + if(isturf(source)) + var/dx = source.x - M.x + S.pan = max(-100, min(100, dx/8.0 * 100)) + + M << S // Now plays for people in lockers! -- Polymorph /mob/proc/playsound_local(var/atom/source, soundin, vol as num, vary, extrarange as num) diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/DetectiveWork/detective_work.dm index 2dc409beb6f..77b9e6207a1 100644 --- a/code/modules/DetectiveWork/detective_work.dm +++ b/code/modules/DetectiveWork/detective_work.dm @@ -258,10 +258,10 @@ obj/machinery/computer/forensic_scanning if("databaseprint") //Printing from the "files" database. if(files) var/obj/item/weapon/paper/P = new(loc) - P.name = "\improper Database File (Dossier [files.Find(href_list["identifier"])])" + var/list/dossier = files[href_list["identifier"]] + P.name = "\improper Database File ([dossier[2]])" P.overlays += "paper_words" P.info = "Criminal Evidence Database

" - var/list/dossier = files[href_list["identifier"]] P.info += "Consolidated data points: [dossier[2]]
" var/print_string = "Fingerprints: Print not complete!
" if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE) @@ -512,10 +512,10 @@ obj/machinery/computer/forensic_scanning prints[print] = atom_fingerprints[print] else var/list/templist[4] - templist[1] = atom_suit_fibers - templist[2] = atom_blood_DNA + templist[1] = atom_suit_fibers ? atom_suit_fibers.Copy() : null + templist[2] = atom_blood_DNA ? atom_blood_DNA.Copy() : null templist[3] = atom_name - templist[4] = atom_fingerprints + templist[4] = atom_fingerprints ? atom_fingerprints.Copy() : null misc[atom_reference] = templist //Store it! //Has prints. if(atom_fingerprints) @@ -559,17 +559,17 @@ obj/machinery/computer/forensic_scanning //It's not in there! We gotta add it. update_fingerprints(main_print, atom_fingerprints[main_print]) var/list/data_point[4] - data_point[1] = atom_fingerprints - data_point[2] = atom_suit_fibers - data_point[3] = atom_blood_DNA + data_point[1] = atom_fingerprints ? atom_fingerprints.Copy() : null + data_point[2] = atom_suit_fibers ? atom_suit_fibers.Copy() : null + data_point[3] = atom_blood_DNA ? atom_blood_DNA.Copy() : null data_point[4] = atom_name data_entry[atom_reference] = data_point continue //No print at all! New data entry, go! var/list/data_point[4] - data_point[1] = atom_fingerprints - data_point[2] = atom_suit_fibers - data_point[3] = atom_blood_DNA + data_point[1] = atom_fingerprints ? atom_fingerprints.Copy() : null + data_point[2] = atom_suit_fibers ? atom_suit_fibers.Copy() : null + data_point[3] = atom_blood_DNA ? atom_blood_DNA.Copy() : null data_point[4] = atom_name var/list/new_file[2] new_file[1] = atom_fingerprints[main_print] diff --git a/code/modules/DetectiveWork/scanner.dm b/code/modules/DetectiveWork/scanner.dm index 09eb646a448..76c803ff7be 100644 --- a/code/modules/DetectiveWork/scanner.dm +++ b/code/modules/DetectiveWork/scanner.dm @@ -135,7 +135,7 @@ return proc/add_data(atom/A as mob|obj|turf|area) - //I love hashtables. + //I love associative lists. var/list/data_entry = stored["\ref [A]"] if(islist(data_entry)) //Yay, it was already stored! //Merge the fingerprints. @@ -164,9 +164,9 @@ blood[main_blood] = A.blood_DNA[blood] return 1 var/list/sum_list[4] //Pack it back up! - sum_list[1] = A.fingerprints - sum_list[2] = A.suit_fibers - sum_list[3] = A.blood_DNA + sum_list[1] = A.fingerprints ? A.fingerprints.Copy() : null + sum_list[2] = A.suit_fibers ? A.suit_fibers.Copy() : null + sum_list[3] = A.blood_DNA ? A.blood_DNA.Copy() : null sum_list[4] = "\The [A] in \the [get_area(A)]" stored["\ref [A]"] = sum_list return 0 \ No newline at end of file diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 9fe4f7d4f62..8b22dbdce24 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -129,6 +129,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali send2irc(ckey, "[original_msg] - No admins online") else send2irc(ckey, "[original_msg] - All admins AFK ([admin_number_afk])") + else + send2irc(ckey, original_msg) feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 68789879a1e..61773960fb0 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -71,8 +71,6 @@ holder.process_activation(src, 1, 0) if(holder && (wires & WIRE_PULSE_SPECIAL)) holder.process_activation(src, 0, 1) - if(master && (wires & WIRE_PULSE)) - master.receive_signal("activate") // if(radio && (wires & WIRE_RADIO_PULSE)) //Not sure what goes here quite yet send signal? return 1 diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 710e9564c3f..b8fd9107195 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -231,6 +231,9 @@ if ( !(usr.stat || usr.restrained()) ) var/obj/item/device/assembly_holder/holder + if(istype(src,/obj/item/weapon/grenade/chem_grenade)) + var/obj/item/weapon/grenade/chem_grenade/gren = src + holder=gren.detonator var/obj/item/device/assembly/timer/tmr = holder.a_left if(!istype(tmr,/obj/item/device/assembly/timer)) tmr = holder.a_right diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 7d35d6f70fb..c54afdc0c67 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -104,7 +104,7 @@ holder.update_icon() if(holder && istype(holder.loc,/obj/item/weapon/grenade/chem_grenade)) var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc - grenade.c_state(scanning) + grenade.primed(scanning) return diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 6f70ad1a875..c304156a594 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -31,7 +31,7 @@ spawn(10) process_cooldown() -// signal() + signal() return 1 update_icon() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9792d24b256..543586dba46 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -90,7 +90,7 @@ BLIND // can't see anything icon = 'icons/obj/clothing/suits.dmi' name = "suit" var/fire_resist = T0C+100 - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS allowed = list(/obj/item/weapon/tank/emergency_oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) slot_flags = SLOT_OCLOTHING @@ -249,16 +249,16 @@ BLIND // can't see anything H.holstered = usr.get_active_hand() usr.drop_item() H.holstered.loc = src - usr.visible_message("\blue [usr] holsters \the [H.holstered].", "You holster \the [H.holstered].") + usr.visible_message("\blue \The [usr] holsters \the [H.holstered].", "You holster \the [H.holstered].") else if(istype(usr.get_active_hand(),/obj) && istype(usr.get_inactive_hand(),/obj)) usr << "\red You need an empty hand to draw the gun!" else if(usr.a_intent == "hurt") - usr.visible_message("\red [usr] draws \the [H.holstered], ready to shoot!", \ + usr.visible_message("\red \The [usr] draws \the [H.holstered], ready to shoot!", \ "\red You draw \the [H.holstered], ready to shoot!") else - usr.visible_message("\blue [usr] draws \the [H.holstered], pointing it at the ground.", \ - "\blue You draw \the [H.holstered], pointing it at tthe ground.") + usr.visible_message("\blue \The [usr] draws \the [H.holstered], pointing it at the ground.", \ + "\blue You draw \the [H.holstered], pointing it at the ground.") usr.put_in_hands(H.holstered) H.holstered = null diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 2dbfe3368cf..9bf142568f7 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -26,7 +26,7 @@ icon_state = "santa" item_state = "santa" slowdown = 0 - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS allowed = list(/obj/item) //for stuffing exta special presents diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 29ffacc7a84..263ba78b665 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -15,7 +15,7 @@ desc = "An armored vest that protects against some damage." icon_state = "armor" item_state = "armor" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) @@ -83,7 +83,7 @@ desc = "An armored vest with a detective's badge on it." icon_state = "detective-armor" item_state = "armor" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) @@ -97,7 +97,7 @@ icon_state = "reactiveoff" item_state = "reactiveoff" slowdown = 1 - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/suit/armor/reactive/IsShield() diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index b7dfd1f4d4e..8675b82c0d0 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -84,7 +84,7 @@ desc = "This robe commands authority." icon_state = "judge" item_state = "judge" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/cigpacket,/obj/item/weapon/spacecash) flags_inv = HIDEJUMPSUIT diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 367a86f004b..005ded48a94 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -21,7 +21,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher) slowdown = 1.0 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - flags = FPRINT | TABLEPASS | ONESIZEFITSALL | STOPSPRESSUREDMAGE + flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECITON_TEMPERATURE cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 312b024cb1c..68b951798c7 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -3,7 +3,7 @@ icon_state = "black" item_state = "bl_suit" color = "black" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/blackf name = "feminine black jumpsuit" @@ -17,21 +17,21 @@ icon_state = "blue" item_state = "b_suit" color = "blue" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/green name = "green jumpsuit" icon_state = "green" item_state = "g_suit" color = "green" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/grey name = "grey jumpsuit" icon_state = "grey" item_state = "gy_suit" color = "grey" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/orange name = "orange jumpsuit" @@ -41,35 +41,35 @@ color = "orange" has_sensor = 2 sensor_mode = 3 - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/pink name = "pink jumpsuit" icon_state = "pink" item_state = "p_suit" color = "pink" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/red name = "red jumpsuit" icon_state = "red" item_state = "r_suit" color = "red" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/white name = "white jumpsuit" icon_state = "white" item_state = "w_suit" color = "white" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/color/yellow name = "yellow jumpsuit" icon_state = "yellow" item_state = "y_suit" color = "yellow" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/psyche name = "psychedelic" @@ -88,7 +88,7 @@ desc = "aqua" icon_state = "aqua" color = "aqua" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/purple name = "purple" @@ -120,14 +120,14 @@ desc = "lightbrown" icon_state = "lightbrown" color = "lightbrown" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/brown name = "brown" desc = "brown" icon_state = "brown" color = "brown" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/yellowgreen name = "yellowgreen" @@ -140,7 +140,7 @@ desc = "darkblue" icon_state = "darkblue" color = "darkblue" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/lightred name = "lightred" @@ -153,4 +153,4 @@ desc = "darkred" icon_state = "darkred" color = "darkred" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL \ No newline at end of file + flags = FPRINT | TABLEPASS \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 0ac00566bad..41472e3f35b 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -6,7 +6,7 @@ icon_state = "ba_suit" item_state = "ba_suit" color = "ba_suit" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. @@ -15,7 +15,7 @@ icon_state = "captain" item_state = "caparmor" color = "captain" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/cargo @@ -32,7 +32,7 @@ icon_state = "cargotech" item_state = "lb_suit" color = "cargo" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/chaplain @@ -41,7 +41,7 @@ icon_state = "chaplain" item_state = "bl_suit" color = "chapblack" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/chef @@ -49,7 +49,7 @@ name = "chef's uniform" icon_state = "chef" color = "chef" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/clown @@ -58,7 +58,7 @@ icon_state = "clown" item_state = "clown" color = "clown" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/head_of_personnel @@ -67,7 +67,7 @@ icon_state = "hop" item_state = "b_suit" color = "hop" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/hydroponics @@ -77,7 +77,7 @@ item_state = "g_suit" color = "hydroponics" permeability_coefficient = 0.50 - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/janitor @@ -86,7 +86,7 @@ icon_state = "janitor" color = "janitor" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/lawyer @@ -147,7 +147,7 @@ icon_state = "mime" item_state = "mime" color = "mime" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/miner desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index a96e4adf7b8..fd9b41d33ae 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -6,7 +6,7 @@ item_state = "g_suit" color = "chief" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/atmospheric_technician desc = "It's a jumpsuit worn by atmospheric technicians." @@ -14,7 +14,7 @@ icon_state = "atmos" item_state = "atmos_suit" color = "atmos" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/engineer desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding." @@ -23,7 +23,7 @@ item_state = "engi_suit" color = "engine" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/roboticist desc = "It's a slimming black with reinforced seams; great for industrial work." diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 0d65d02b889..808cc6d6c5d 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -8,7 +8,7 @@ item_state = "g_suit" color = "director" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/scientist desc = "It's made of a special fiber that provides minor protection against biohazards. It has markings that denote the wearer as a scientist." @@ -18,7 +18,7 @@ color = "toxinswhite" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/chemist @@ -50,7 +50,7 @@ color = "geneticswhite" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/virologist desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." @@ -78,7 +78,7 @@ color = "medical" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/medical/blue name = "medical scrubs" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 9d414401297..7a497ab1282 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -15,7 +15,7 @@ item_state = "r_suit" color = "warden" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/security name = "security officer's jumpsuit" @@ -24,7 +24,7 @@ item_state = "r_suit" color = "secred" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /* * Detective @@ -36,7 +36,7 @@ item_state = "det" color = "detective" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/head/det_hat @@ -56,7 +56,7 @@ item_state = "r_suit" color = "hosred" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/head/helmet/HoS diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index e05192efd4a..c410d66ec3f 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -24,7 +24,7 @@ name = "amish suit" icon_state = "sl_suit" color = "sl_suit" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/waiter name = "waiter's outfit" @@ -32,7 +32,7 @@ icon_state = "waiter" item_state = "waiter" color = "waiter" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/rank/mailman name = "mailman's jumpsuit" @@ -102,7 +102,7 @@ desc = "A jumpsuit with owl wings. Photorealistic owl feathers! Twooooo!" icon_state = "owl" color = "owl" - flags = FPRINT | TABLEPASS | ONESIZEFITSALL + flags = FPRINT | TABLEPASS /obj/item/clothing/under/johnny name = "johnny~~ jumpsuit" diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 5d3f62b02a7..35f43aed2ae 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -55,6 +55,12 @@ icon_state = "david_fanning_1" item_state = "david_fanning_1" +/obj/item/fluff/john_mckeever_1 //kirbyelder: John McKeever + name = "Suspicious Paper" + desc = "A piece of paper reading: Smash = 1/3 Leaf Juice, 1/3 Tricker, 1/3 Aajkli Extract" + icon_state = "paper" + item_state = "paper" + ////////////////////////////////// ////////// Usable Items ////////// ////////////////////////////////// @@ -115,13 +121,13 @@ icon_on = "blackzippoon" icon_off = "blackzippo" -/obj/item/weapon/lighter/zippo/fluff/sniperyeti_1 //sniperyeti: Patrick Harris/Susan Harris - name = "red black zippo" - desc = "A shiny red zippo lighter that looks like it's in perfect condition." +/obj/item/weapon/lighter/zippo/fluff/fay_sullivan_1 //furohman: Fay Sullivan + name = "Graduation Lighter" + desc = "A silver engraved lighter with 41 on one side and Tharsis University on the other. The lid reads Fay Sullivan, Cybernetic Engineering, 2541" icon = 'custom_items.dmi' - icon_state = "redzippo" - icon_on = "redzippoon" - icon_off = "redzippo" + icon_state = "gradzippo" + icon_on = "gradzippoon" + icon_off = "gradzippo" /obj/item/weapon/lighter/zippo/fluff/executivekill_1 //executivekill: Hunter Duke name = "Gonzo Fist zippo" @@ -287,12 +293,29 @@ icon_state = "wolfflight" item_state = "wolfflight" +/obj/item/weapon/crowbar/fluff/zelda_creedy_1 //daaneesh: Zelda Creedy + name = "Zelda's Crowbar" + desc = "A pink crow bar that has an engraving that reads, 'To Zelda. Love always, Dawn'" + icon = 'icons/obj/custom_items.dmi' + icon_state = "zeldacrowbar" + item_state = "crowbar" + + ////////////////////////////////// //////////// Clothing //////////// ////////////////////////////////// //////////// Gloves //////////// +/obj/item/clothing/gloves/fluff/murad_hassim_1 + name = "Tajaran Surgical Gloves" + desc = "Reinforced sterile gloves custom tailored to comfortably accommodate Tajaran claws." + icon_state = "latex" + item_state = "lgloves" + siemens_coefficient = 0.30 + permeability_coefficient = 0.01 + color="white" + /obj/item/clothing/gloves/fluff/walter_brooks_1 //botanistpower: Walter Brooks name = "mittens" desc = "A pair of well worn, blue mittens." @@ -362,6 +385,12 @@ icon = 'custom_items.dmi' icon_state = "enos_adlai_1" +/obj/item/clothing/head/fluff/edvin_telephosphor_1 //foolamancer: Edvin Telephosphor + name = "Edvin's Hat" + desc = "A hat specially tailored for Skrellian anatomy. It has a yellow badge on the front, with a large red 'T' inscribed on it." + icon = 'custom_items.dmi' + icon_state = "edvin_telephosphor_1" + //////////// Suits //////////// /obj/item/clothing/suit/labcoat/fluff/pink //spaceman96: Trenna Seber diff --git a/code/modules/genetics/side_effects.dm b/code/modules/genetics/side_effects.dm new file mode 100644 index 00000000000..e82bb3457f6 --- /dev/null +++ b/code/modules/genetics/side_effects.dm @@ -0,0 +1,91 @@ +/datum/genetics/side_effect + var/name // name of the side effect, to use as a header in the manual + var/symptom // description of the symptom of the side effect + var/treatment // description of the treatment of the side effect + var/effect // description of what happens when not treated + var/duration = 0 // delay between start() and finish() + + proc/start(mob/living/carbon/human/H) + // start the side effect, this should give some cue as to what's happening, + // such as gasping. These cues need to be unique among side-effects. + + proc/finish(mob/living/carbon/human/H) + // Finish the side-effect. This should first check whether the cure has been + // applied, and if not, cause bad things to happen. + +/datum/genetics/side_effect/genetic_burn + name = "Genetic Burn" + symptom = "Subject's skin turns unusualy red." + treatment = "Inject small dose of dexalin." + effect = "Subject's skin burns." + duration = 10*30 + + start(mob/living/carbon/human/H) + H.emote("me", 1, "starts turning very red..") + + finish(mob/living/carbon/human/H) + if(!H.reagents.has_reagent("dexalin")) + for(var/organ_name in list("chest","l_arm","r_arm","r_leg","l_leg","head","groin")) + var/datum/organ/external/E = H.get_organ(organ_name) + E.take_damage(0, 5, 0) + +/datum/genetics/side_effect/bone_snap + name = "Bone Snap" + symptom = "Subject's limbs tremble notably." + treatment = "Inject small dose of bicaridine." + effect = "Subject's bone breaks." + duration = 10*60 + + start(mob/living/carbon/human/H) + H.emote("me", 1, "'s limbs start shivering uncontrollably.") + + finish(mob/living/carbon/human/H) + if(!H.reagents.has_reagent("bicaridine")) + var/organ_name = pick("chest","l_arm","r_arm","r_leg","l_leg","head","groin") + var/datum/organ/external/E = H.get_organ(organ_name) + E.take_damage(20, 0, 0) + E.fracture() + +/*/datum/genetics/side_effect/monkey + name = "Monkey" + symptom = "Subject starts drooling uncontrollably." + treatment = "Inject small dose of dylovene." + effect = "Subject turns into monkey." + duration = 10*90 + + start(mob/living/carbon/human/H) + H.emote("me", 1, "has drool running down from his mouth.") + + finish(mob/living/carbon/human/H) + if(!H.reagents.has_reagent("anti_toxin")) + H.monkeyize()**/ + +/datum/genetics/side_effect/confuse + name = "Confuse" + symptom = "Subject starts drooling uncontrollably." + treatment = "Inject small dose of dylovene." + effect = "Subject becomes confused." + duration = 10*30 + + start(mob/living/carbon/human/H) + H.emote("me", 1, "has drool running down from his mouth.") + + finish(mob/living/carbon/human/H) + if(!H.reagents.has_reagent("anti_toxin")) + H.confused += 100 + +proc/trigger_side_effect(mob/living/carbon/human/H) + spawn + if(!istype(H)) return + var/tp = pick(typesof(/datum/genetics/side_effect) - /datum/genetics/side_effect) + var/datum/genetics/side_effect/S = new tp + + S.start(H) + spawn(20) + if(!istype(H)) return + H.Weaken(rand(0, S.duration / 50)) + sleep(S.duration) + + if(!istype(H)) return + H.SetWeakened(0) + S.finish(H) \ No newline at end of file diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 0a8f7045ce5..3c070bdbd2b 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -31,7 +31,7 @@ mob/proc/custom_emote(var/m_type=1,var/message = null) if (istype(M, /mob/new_player)) continue if(findtext(message," snores.")) //Because we have so many sleeping people. - continue + break if(M.stat == 2 && M.client.ghost_sight && !(M in viewers(src,null))) M.show_message(message) diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index edb8ff7decb..2fd220b170b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -418,8 +418,8 @@ if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" //NOTE: the alerts dont reset when youre out of danger. dont blame me, //blame the person who coded them. Temporary fix added. - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + if (client) + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) if ((blind && stat != 2)) if ((blinded)) @@ -441,7 +441,7 @@ if (!( machine.check_eye(src) )) reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 612b0bb6f8b..d24be56a049 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -332,9 +332,8 @@ FUCK YOU MORE FAT CODE -Hawk*/ if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" //NOTE: the alerts dont reset when youre out of danger. dont blame me, //blame the person who coded them. Temporary fix added. - - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + if (client) + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) if ((blind && stat != 2)) if ((blinded)) @@ -356,7 +355,7 @@ FUCK YOU MORE FAT CODE -Hawk*/ if (!( machine.check_eye(src) )) reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index cf5ee8ce95c..9da4b432274 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -242,8 +242,8 @@ healths.icon_state = "health7" if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]" - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + if (client) + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) if ((blind && stat != 2)) if ((blinded)) @@ -265,7 +265,7 @@ if (!( machine.check_eye(src) )) reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 53f0571301e..2024fefdbc7 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -141,7 +141,7 @@ shock_damage *= siemens_coeff if (shock_damage<1) return 0 - src.take_overall_damage(0,shock_damage) + src.take_overall_damage(0,shock_damage,used_weapon="Electrocution") //src.burn_skin(shock_damage) //src.adjustFireLoss(shock_damage) //burn_skin will do this for us //src.updatehealth() @@ -353,10 +353,12 @@ if(H.gloves) if(H.gloves.clean_blood()) H.update_inv_gloves(0) + H.gloves.germ_level = 0 else if(H.bloody_hands) H.bloody_hands = 0 H.update_inv_gloves(0) + H.germ_level = 0 update_icons() //apply the now updated overlays to the mob diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 430f01c80fd..5de344a4d00 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,6 +2,7 @@ gender = MALE var/list/stomach_contents = list() var/brain_op_stage = 0.0 + var/ribcage_op_stage = 0 /* var/eye_op_stage = 0.0 var/appendix_op_stage = 0.0 @@ -18,4 +19,4 @@ var/analgesic = 0 // when this is set, the mob isn't affected by shock or pain // life should decrease this by 1 every tick // total amount of wounds on mob, used to spread out healing and the like over all wounds - var/number_wounds = 0 \ No newline at end of file + var/number_wounds = 0 diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index f0407f0ec3f..6dff94c60c3 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -482,9 +482,9 @@ if (m_type & 1) - for (var/mob/O in viewers(src, null)) + for (var/mob/O in get_mobs_in_view(world.view,src)) O.show_message(message, m_type) else if (m_type & 2) - for (var/mob/O in hearers(src.loc, null)) + for (var/mob/O in (hearers(src.loc, null) | get_mobs_in_view(world.view,src))) O.show_message(message, m_type) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 5a2118aa359..362d8d0918a 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -280,6 +280,8 @@ var/this_wound_desc = W.desc if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]" else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]" + if(W.germ_level > 1000) this_wound_desc = "badly infected [this_wound_desc]" + else if(W.germ_level > 100) this_wound_desc = "lightly infected [this_wound_desc]" if(this_wound_desc in wound_descriptors) wound_descriptors[this_wound_desc] += W.amount continue diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 860fbec5b2f..dadf5a4a8c5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -272,34 +272,36 @@ // focus most of the blast on one organ var/datum/organ/external/take_blast = pick(organs) - update |= take_blast.take_damage(b_loss * 0.9, f_loss * 0.9) + update |= take_blast.take_damage(b_loss * 0.9, f_loss * 0.9, used_weapon = "Explosive blast") // distribute the remaining 10% on all limbs equally b_loss *= 0.1 f_loss *= 0.1 + var/weapon_message = "Explosive Blast" + for(var/datum/organ/external/temp in organs) switch(temp.name) if("head") - update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2) + update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message) if("chest") - update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4) + update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message) if("l_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("l_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_foot") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("l_foot") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("l_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if(update) UpdateDamageIcon() @@ -819,6 +821,12 @@ /mob/living/carbon/human/proc/morph() set name = "Morph" set category = "Superpower" + + if(stat!=CONSCIOUS) + reset_view(0) + remoteview_target = null + return + if(!(mMorph in mutations)) src.verbs -= /mob/living/carbon/human/proc/morph return @@ -892,6 +900,12 @@ /mob/living/carbon/human/proc/remotesay() set name = "Project mind" set category = "Superpower" + + if(stat!=CONSCIOUS) + reset_view(0) + remoteview_target = null + return + if(!(mRemotetalk in src.mutations)) src.verbs -= /mob/living/carbon/human/proc/remotesay return @@ -915,12 +929,19 @@ set name = "Remote View" set category = "Superpower" + if(stat!=CONSCIOUS) + remoteview_target = null + reset_view(0) + return + if(!(mRemote in src.mutations)) + remoteview_target = null reset_view(0) src.verbs -= /mob/living/carbon/human/proc/remoteobserve return if(client.eye != client.mob) + remoteview_target = null reset_view(0) return @@ -928,18 +949,62 @@ for(var/mob/living/carbon/h in world) var/turf/temp_turf = get_turf(h) - if(temp_turf.z != 1 && temp_turf.z != 5) //Not on mining or the station. + if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat!=CONSCIOUS) //Not on mining or the station. Or dead continue creatures += h var/mob/target = input ("Who do you want to project your mind to ?") as mob in creatures if (target) + remoteview_target = target reset_view(target) else + remoteview_target = null reset_view(0) /mob/living/carbon/human/proc/get_visible_gender() if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask)) return NEUTER return gender + +/mob/living/carbon/human/proc/increase_germ_level(n) + if(gloves) + gloves.germ_level += n + else + germ_level += n + +/mob/living/carbon/human/revive() + for (var/datum/organ/external/O in organs) + O.status &= ~ORGAN_BROKEN + O.status &= ~ORGAN_BLEEDING + O.status &= ~ORGAN_SPLINTED + O.status &= ~ORGAN_ATTACHABLE + if (!O.amputated) + O.status &= ~ORGAN_DESTROYED + O.wounds.Cut() + + vessel.add_reagent("blood",560-vessel.total_volume) + fixblood() + for (var/obj/item/weapon/organ/head/H in world) + if(H.brainmob) + if(H.brainmob.real_name == src.real_name) + if(H.brainmob.mind) + H.brainmob.mind.transfer_to(src) + del(H) + + + ..() + +/mob/living/carbon/human/proc/is_lung_ruptured() + var/datum/organ/external/chest/E = get_organ("chest") + return E.ruptured_lungs + + +/mob/living/carbon/human/proc/rupture_lung() + var/datum/organ/external/chest/E = get_organ("chest") + + if(E.ruptured_lungs == 0) + src.custom_pain("You feel a stabbing pain in your chest!", 1) + + E.ruptured_lungs = 1 + diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 96df8c88465..15a56b9ece9 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -61,6 +61,7 @@ switch(M.a_intent) if("help") if(health > config.health_threshold_crit) + diary << "\[[time2text(world.timeofday, "hh:mm.ss")]\] CPR BUGHINTING: [M] shakes [src]: health - [health], threshold - [config.health_threshold_crit]. Health details: OX [getOxyLoss()] TX [getToxLoss()] BU [getFireLoss()] BR [getBruteLoss()] Blood: [round(vessel.get_reagent_amount("blood"))] out of 560" help_shake_act(M) return 1 // if(M.health < -75) return 0 diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index c748488b635..301406f9d4c 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -116,7 +116,7 @@ if(update) UpdateDamageIcon() // damage MANY external organs, in random order -/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0) +/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/used_weapon = null) if(nodamage) return //godmode var/list/datum/organ/external/parts = get_damageable_organs() var/update = 0 @@ -126,7 +126,7 @@ var/brute_was = picked.brute_dam var/burn_was = picked.burn_dam - update |= picked.take_damage(brute,burn,sharp) + update |= picked.take_damage(brute,burn,sharp,used_weapon) brute -= (picked.brute_dam - brute_was) burn -= (picked.burn_dam - burn_was) @@ -154,7 +154,7 @@ zone = "head" return organs_by_name[zone] -/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0) +/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/used_weapon = null) if((damagetype != BRUTE) && (damagetype != BURN)) ..(damage, damagetype, def_zone, blocked) return 1 @@ -176,10 +176,10 @@ switch(damagetype) if(BRUTE) - if(organ.take_damage(damage, 0, sharp)) + if(organ.take_damage(damage, 0, sharp, used_weapon)) UpdateDamageIcon() if(BURN) - if(organ.take_damage(0, damage, sharp)) + if(organ.take_damage(0, damage, sharp, used_weapon)) UpdateDamageIcon() updatehealth() return 1 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 8ea99b9fc95..21928e3e188 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -133,7 +133,7 @@ emp_act if(armor >= 2) return 0 if(!I.force) return 0 - apply_damage(I.force, I.damtype, affecting, armor , I.sharp) + apply_damage(I.force, I.damtype, affecting, armor , I.sharp, I.name) var/bloody = 0 if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2))) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 1cf5788612d..cf91b4b43a8 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -55,4 +55,6 @@ var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. - var/xylophone = 0 //For the spoooooooky xylophone cooldown \ No newline at end of file + var/xylophone = 0 //For the spoooooooky xylophone cooldown + + var/mob/remoteview_target = null diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 85088beea25..614715275e9 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -433,8 +433,9 @@ return message = "\red [source] is trying to empty [target]'s pockets." if("CPR") - if (target.cpr_time >= world.time + 3) + if (!target.cpr_time) del(src) + target.cpr_time = 0 message = "\red [source] is trying perform CPR on [target]!" if("id") message = "\red [source] is trying to take off [target.wear_id] from [target]'s uniform!" @@ -460,6 +461,7 @@ The else statement is for equipping stuff to empty slots. It can still be worn/put on as normal. */ /obj/effect/equip_e/human/done() //TODO: And rewrite this :< ~Carn + target.cpr_time = 1 if(!source || !target) return //Target or source no longer exist if(source.loc != s_loc) return //source has moved if(target.loc != t_loc) return //target has moved @@ -540,10 +542,7 @@ It can still be worn/put on as normal. if (target.legcuffed) strip_item = target.legcuffed if("CPR") - if (target.cpr_time >= world.time + 30) - del(src) if ((target.health >= -99.0 && target.health <= 0)) - target.cpr_time = world.time var/suff = min(target.getOxyLoss(), 7) target.adjustOxyLoss(-suff) target.updatehealth() @@ -587,7 +586,7 @@ It can still be worn/put on as normal. target.internal = target.belt if (target.internal) for(var/mob/M in viewers(target, 1)) - M.show_message("[source] is now running on internals.", 1) + M.show_message("[target] is now running on internals.", 1) target.internal.add_fingerprint(source) if (target.internals) target.internals.icon_state = "internal1" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d79e70836fe..c4a5ab3fa35 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1,8 +1,8 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 //NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick! -#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. -#define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /3) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks. +#define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. +#define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /5) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks. #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 4 //Amount of damage applied when your body temperature passes the 400K point @@ -459,15 +459,18 @@ radiation = 0 else + var/damage = 0 switch(radiation) if(1 to 49) radiation-- if(prob(25)) adjustToxLoss(1) + damage = 1 updatehealth() if(50 to 74) radiation -= 2 + damage = 1 adjustToxLoss(1) if(prob(5)) radiation -= 5 @@ -479,6 +482,7 @@ if(75 to 100) radiation -= 3 adjustToxLoss(3) + damage = 1 if(prob(1)) src << "\red You mutate!" randmutb(src) @@ -486,18 +490,28 @@ emote("gasp") updatehealth() + if(damage && organs.len) + var/datum/organ/external/O = pick(organs) + if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) proc/breathe() - if(reagents.has_reagent("lexorin")) return if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return + var/lung_ruptured = is_lung_ruptured() + + if(lung_ruptured && prob(2)) + spawn emote("me", 1, "coughs up blood!") + src.drip(10) + var/datum/gas_mixture/environment = loc.return_air() var/datum/gas_mixture/breath // HACK NEED CHANGING LATER if(health < 0) losebreath++ - + if(lung_ruptured && prob(4)) + spawn emote("me", 1, "gasps for air!") + losebreath += 5 if(losebreath>0) //Suffocating so do not take a breath losebreath-- if (prob(10)) //Gasp per 10 ticks? Sounds about right. @@ -552,6 +566,12 @@ var/obj/location_as_object = loc location_as_object.handle_internal_lifeform(src, 0) + + if(!lung_ruptured && breath) + if(breath.total_moles < BREATH_MOLES / 5 || breath.total_moles > BREATH_MOLES * 5) + if(prob(5)) + rupture_lung() + handle_breath(breath) if(breath) @@ -670,6 +690,7 @@ else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning if(prob(20)) spawn(0) emote(pick("giggle", "laugh")) + SA.moles = 0 if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :( if(breath.temperature < 260.15) @@ -681,22 +702,22 @@ switch(breath.temperature) if(-INFINITY to 120) - apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head") + apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold") fire_alert = max(fire_alert, 1) if(120 to 200) - apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head") + apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold") fire_alert = max(fire_alert, 1) if(200 to 260) - apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head") + apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold") fire_alert = max(fire_alert, 1) if(360 to 400) - apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head") + apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat") fire_alert = max(fire_alert, 2) if(400 to 1000) - apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head") + apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat") fire_alert = max(fire_alert, 2) if(1000 to INFINITY) - apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head") + apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") fire_alert = max(fire_alert, 2) //Temporary fixes to the alerts. @@ -987,7 +1008,8 @@ proc/handle_chemicals_in_body() if(reagents) reagents.metabolize(src) - if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist +// if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist + if(PLANT in mutations) var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing if(isturf(loc)) //else, there's considered to be no light var/turf/T = loc @@ -1033,7 +1055,8 @@ if(overeatduration > 1) overeatduration -= 2 //doubled the unfat rate - if(dna && dna.mutantrace == "plant") +// if(dna && dna.mutantrace == "plant") + if(PLANT in mutations) if(nutrition < 200) take_overall_damage(2,0) @@ -1053,6 +1076,19 @@ dizziness = max(0, dizziness - 3) jitteriness = max(0, jitteriness - 3) + + if(life_tick % 10 == 0) + // handle trace chemicals for autopsy + for(var/datum/organ/O in organs) + for(var/chemID in O.trace_chemicals) + O.trace_chemicals[chemID] = O.trace_chemicals[chemID] - 1 + if(O.trace_chemicals[chemID] <= 0) + O.trace_chemicals.Remove(chemID) + for(var/datum/reagent/A in reagents.reagent_list) + // add chemistry traces to a random organ + var/datum/organ/O = pick(organs) + O.trace_chemicals[A.name] = 100 + updatehealth() return //TODO: DEFERRED @@ -1116,8 +1152,9 @@ else if(sleeping) handle_dreams() adjustHalLoss(-5) - if(mind.active || immune_to_ssd) - sleeping = max(sleeping-1, 0) + if (mind) + if(mind.active || immune_to_ssd) + sleeping = max(sleeping-1, 0) blinded = 1 stat = UNCONSCIOUS if( prob(10) && health && !hal_crit ) @@ -1166,6 +1203,13 @@ if(druggy) druggy = max(druggy-1, 0) + + // Increase germ_level regularly + if(prob(40)) + germ_level += 1 + // If you're dirty, your gloves will become dirty, too. + if(gloves && germ_level > gloves.germ_level && prob(10)) + gloves.germ_level += 1 return 1 proc/handle_regular_hud_updates() @@ -1257,9 +1301,13 @@ sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) if(dna) switch(dna.mutantrace) - if("lizard","metroid") + if("metroid") see_in_dark = 3 see_invisible = SEE_INVISIBLE_LEVEL_ONE + if("lizard") + see_in_dark = 3 + if("tajaran") + see_in_dark = 8 else see_in_dark = 2 @@ -1432,7 +1480,12 @@ if(machine) if(!machine.check_eye(src)) reset_view(null) else - if(!(mRemote in mutations) && !client.adminobs) + var/isRemoteObserve = 0 + if((mRemote in mutations) && remoteview_target) + if(remoteview_target.stat==CONSCIOUS) + isRemoteObserve = 1 + if(!isRemoteObserve && client && !client.adminobs) + remoteview_target = null reset_view(null) return 1 @@ -1535,4 +1588,4 @@ Paralyse(rand(15,28)) #undef HUMAN_MAX_OXYLOSS -#undef HUMAN_CRIT_MAX_OXYLOSS \ No newline at end of file +#undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 1feb9fa74a5..07d1541f929 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -220,107 +220,133 @@ proc/get_damage_icon_part(damage_state, body_part) /mob/living/carbon/human/proc/update_body(var/update_icons=1) if(stand_icon) del(stand_icon) if(lying_icon) del(lying_icon) - if(dna && dna.mutantrace) return + + var/husk_color_mod = rgb(96,88,80) + var/hulk_color_mod = rgb(48,224,40) + var/plant_color_mod = rgb(144,224,144) var/husk = (HUSK in src.mutations) //100% unnecessary -Agouri //nope, do you really want to iterate through src.mutations repeatedly? -Pete var/fat = (FAT in src.mutations) + var/hulk = (HULK in src.mutations) var/skeleton = (SKELETON in src.mutations) + var/plant = (PLANT in src.mutations) var/g = "m" if(gender == FEMALE) g = "f" - // whether to draw the individual limbs - var/individual_limbs = 0 - - //Base mob icon - if(husk) - stand_icon = new /icon('icons/mob/human.dmi', "husk_s") - lying_icon = new /icon('icons/mob/human.dmi', "husk_l") - else if(fat) - stand_icon = new /icon('icons/mob/human.dmi', "fatbody_s") - lying_icon = new /icon('icons/mob/human.dmi', "fatbody_l") - else if(skeleton) - stand_icon = new /icon('icons/mob/human.dmi', "skeleton_s") - lying_icon = new /icon('icons/mob/human.dmi', "skeleton_l") + var/icon/icobase + if(skeleton) + icobase = 'icons/mob/human_races/r_skeleton.dmi' + else if(dna) + switch(dna.mutantrace) + if("tajaran") + icobase = 'icons/mob/human_races/r_tajaran.dmi' + if("lizard") + icobase = 'icons/mob/human_races/r_lizard.dmi' + if("skrell") + icobase = 'icons/mob/human_races/r_skrell.dmi' + else + icobase = 'icons/mob/human_races/r_human.dmi' else - stand_icon = new /icon('icons/mob/human.dmi', "torso_[g]_s") - lying_icon = new /icon('icons/mob/human.dmi', "torso_[g]_l") - individual_limbs = 1 + icobase = 'icons/mob/human_races/r_human.dmi' - // Draw each individual limb - if(individual_limbs) - stand_icon.Blend(new /icon('icons/mob/human.dmi', "chest_[g]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('icons/mob/human.dmi', "chest_[g]_l"), ICON_OVERLAY) + if(!skeleton) + stand_icon = new /icon(icobase, "torso_[g][fat?"_fat":""]") + if(husk) + stand_icon.ColorTone(husk_color_mod) + else if(hulk) +// stand_icon.ColorTone(hulk_color_mod) + var/list/TONE = ReadRGB(hulk_color_mod) + stand_icon.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3])) + else if(plant) + stand_icon.ColorTone(plant_color_mod) + else + stand_icon = new /icon(icobase, "torso") - var/datum/organ/external/head = get_organ("head") - if(head && !(head.status & ORGAN_DESTROYED)) - stand_icon.Blend(new /icon('icons/mob/human.dmi', "head_[g]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('icons/mob/human.dmi', "head_[g]_l"), ICON_OVERLAY) + var/datum/organ/external/head = get_organ("head") + var/has_head = 0 + if(head && !(head.status & ORGAN_DESTROYED)) + has_head = 1 - for(var/datum/organ/external/part in organs) - if(!istype(part, /datum/organ/external/groin) \ - && !istype(part, /datum/organ/external/chest) \ - && !istype(part, /datum/organ/external/head) \ - && !(part.status & ORGAN_DESTROYED)) - var/icon/temp = new /icon('human.dmi', "[part.icon_name]_s") - if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + for(var/datum/organ/external/part in organs) + if(!istype(part, /datum/organ/external/chest) && !(part.status & ORGAN_DESTROYED)) + var/icon/temp + if(istype(part, /datum/organ/external/groin)) + if(skeleton) + temp = new /icon(icobase, "groin") + else + temp = new /icon(icobase, "groin_[g]") + else if(istype(part, /datum/organ/external/head)) + if(skeleton) + temp = new /icon(icobase, "head") + else + temp = new /icon(icobase, "head_[g]") + else + temp = new /icon(icobase, "[part.icon_name]") + if(part.status & ORGAN_ROBOT) + temp.GrayScale() + else if(!skeleton) + if(husk) + temp.ColorTone(husk_color_mod) + else if(hulk) +// temp.ColorTone(hulk_color_mod) + var/list/TONE = ReadRGB(hulk_color_mod) + temp.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3])) + else if(plant) + temp.ColorTone(plant_color_mod) + + //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST + //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) + if(part.icon_position&(LEFT|RIGHT)) + var/icon/temp2 = new('icons/mob/human.dmi',"blank") + temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) + temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) + if(!(part.icon_position & LEFT)) + temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + if(!(part.icon_position & RIGHT)) + temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + stand_icon.Blend(temp2, ICON_OVERLAY) + temp2 = new('icons/mob/human.dmi',"blank") + if(part.icon_position & LEFT) + temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + if(part.icon_position & RIGHT) + temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + stand_icon.Blend(temp2, ICON_UNDERLAY) + else stand_icon.Blend(temp, ICON_OVERLAY) - temp = new /icon('human.dmi', "[part.icon_name]_l") - if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - lying_icon.Blend(temp , ICON_OVERLAY) - - stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY) - - if (husk) - var/icon/husk_s = new /icon('human.dmi', "husk_s") - var/icon/husk_l = new /icon('human.dmi', "husk_l") - - for(var/datum/organ/external/part in organs) - if(!istype(part, /datum/organ/external/groin) \ - && !istype(part, /datum/organ/external/chest) \ - && !istype(part, /datum/organ/external/head) \ - && (part.status & ORGAN_DESTROYED)) - husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT) - husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT) - - stand_icon.Blend(husk_s, ICON_OVERLAY) - lying_icon.Blend(husk_l, ICON_OVERLAY) //Skin tone - if(!skeleton) + if(!skeleton && !husk && !hulk && !plant) if(s_tone >= 0) stand_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) - lying_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) else stand_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - lying_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - //Eyes - if(!skeleton) - var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s") - var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l") - eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - stand_icon.Blend(eyes_s, ICON_OVERLAY) - lying_icon.Blend(eyes_l, ICON_OVERLAY) - // Note: These used to be in update_face(), and the fact they're here will make it difficult to create a disembodied head - var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s") - var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l") - eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - stand_icon.Blend(eyes_s, ICON_OVERLAY) - lying_icon.Blend(eyes_l, ICON_OVERLAY) + if(husk) + var/icon/mask = new(stand_icon) + var/icon/husk_over = new(icobase,"overlay_husk") + mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) + husk_over.Blend(mask, ICON_ADD) + stand_icon.Blend(husk_over, ICON_OVERLAY) + + if(has_head) + //Eyes + if(!skeleton) + var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s") + eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + stand_icon.Blend(eyes_s, ICON_OVERLAY) //Mouth (lipstick!) if(lip_style) //skeletons are allowed to wear lipstick no matter what you think, agouri. stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY) - lying_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_l"), ICON_OVERLAY) //Underwear if(underwear >0 && underwear < 12) if(!fat && !skeleton) stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY) + + lying_icon = stand_icon.MakeLying() + if(update_icons) update_icons() @@ -419,27 +445,29 @@ proc/get_damage_icon_part(damage_state, body_part) var/fat if( FAT in mutations ) fat = "fat" - var/g = "m" - if (gender == FEMALE) g = "f" +// var/g = "m" +// if (gender == FEMALE) g = "f" //BS12 EDIT if(dna) switch(dna.mutantrace) if("golem","metroid") - overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_l") - overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_s") - if("lizard", "tajaran", "skrell") - overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_l") - overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_s") - if("plant") - if(stat == DEAD) //TODO - overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d") - else - overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l") - overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s") + var/icon/I = new('icons/effects/genetics.dmi',"[dna.mutantrace][fat]_s") + overlays_standing[MUTANTRACE_LAYER] = image(I) + overlays_lying[MUTANTRACE_LAYER] = image(I.MakeLying()) +// if("lizard", "tajaran", "skrell") +// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_l") +// overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_s") +// if("plant") +// if(stat == DEAD) //TODO +// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d") +// else +// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l") +// overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s") else overlays_lying[MUTANTRACE_LAYER] = null overlays_standing[MUTANTRACE_LAYER] = null - update_body(0) + if(!dna || !(dna.mutantrace in list("golem","metroid"))) + update_body(0) update_hair(0) if(update_icons) update_icons() @@ -508,17 +536,9 @@ proc/get_damage_icon_part(damage_state, body_part) var/image/lying = image("icon_state" = "[t_color]_l") var/image/standing = image("icon_state" = "[t_color]_s") - if(FAT in mutations) - if(w_uniform.flags&ONESIZEFITSALL) - lying.icon = 'icons/mob/uniform_fat.dmi' - standing.icon = 'icons/mob/uniform_fat.dmi' - else - src << "\red You burst out of \the [w_uniform]!" - drop_from_inventory(w_uniform) - return - else - lying.icon = 'icons/mob/uniform.dmi' - standing.icon = 'icons/mob/uniform.dmi' + + lying.icon = 'icons/mob/uniform.dmi' + standing.icon = 'icons/mob/uniform.dmi' if(w_uniform.blood_DNA) lying.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood2") @@ -665,35 +685,21 @@ proc/get_damage_icon_part(damage_state, body_part) var/image/lying = image("icon" = 'icons/mob/suit.dmi', "icon_state" = "[wear_suit.icon_state]2") var/image/standing = image("icon" = 'icons/mob/suit.dmi', "icon_state" = "[wear_suit.icon_state]") - if(FAT in mutations) - if(!wear_suit.flags&ONESIZEFITSALL) - src << "\red You burst out of \the [wear_suit]!" - var/obj/item/clothing/c = wear_suit - wear_suit = null - if(client) - client.screen -= c - c.loc = loc - c.dropped(src) - c.layer = initial(c.layer) - lying = null - standing = null + if( istype(wear_suit, /obj/item/clothing/suit/straight_jacket) ) + drop_from_inventory(handcuffed) + drop_l_hand() + drop_r_hand() - else - if( istype(wear_suit, /obj/item/clothing/suit/straight_jacket) ) - drop_from_inventory(handcuffed) - drop_l_hand() - drop_r_hand() - - if(wear_suit.blood_DNA) - var/t_state - if( istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/wcoat) ) - t_state = "armor" - else if( istype(wear_suit, /obj/item/clothing/suit/det_suit || /obj/item/clothing/suit/labcoat) ) - t_state = "coat" - else - t_state = "suit" - lying.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[t_state]blood2") - standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[t_state]blood") + if(wear_suit.blood_DNA) + var/t_state + if( istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/wcoat) ) + t_state = "armor" + else if( istype(wear_suit, /obj/item/clothing/suit/det_suit || /obj/item/clothing/suit/labcoat) ) + t_state = "coat" + else + t_state = "suit" + lying.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[t_state]blood2") + standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[t_state]blood") overlays_lying[SUIT_LAYER] = lying overlays_standing[SUIT_LAYER] = standing diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 307d97b7b61..35be674639c 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -551,7 +551,7 @@ if (!( machine.check_eye(src) )) reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 0476926c32c..326bf4dd663 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -25,7 +25,7 @@ dna = new /datum/dna( null ) dna.real_name = real_name dna.uni_identity = "00600200A00E0110148FC01300B009" - dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8" + dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6" dna.unique_enzymes = md5(name) //////////blah var/gendervar diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 74ce8062ee8..be3d13fc85d 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -57,6 +57,6 @@ P.on_hit(src,2) return 2 if(!P.nodamage) - apply_damage((P.damage/(absorb+1)), P.damage_type, def_zone) + apply_damage((P.damage/(absorb+1)), P.damage_type, def_zone, used_weapon = "Projectile([P.name])") P.on_hit(src, absorb) - return absorb \ No newline at end of file + return absorb diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm index a25a631a937..7c272660503 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -1,6 +1,7 @@ /mob/living/Logout() ..() - if(!key && mind) //key and mind have become seperated. - mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body. - if(!immune_to_ssd && sleeping < 2 && mind.active) - sleeping = 2 + if (mind) + if(!key) //key and mind have become seperated. + mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body. + if(!immune_to_ssd && sleeping < 2 && mind.active) + sleeping = 2 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 2af9743d0ba..f56c672da84 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -372,7 +372,7 @@ var/list/department_radio_keys = list( var/rendered = null if (length(heard_a)) - var/message_a = say_quote(message) + var/message_a = say_quote(message,is_speaking_soghun,is_speaking_skrell,is_speaking_taj) if (italics) message_a = "[message_a]" diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 5b87d2c1540..9c8fc5d3eab 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -117,9 +117,20 @@ return //if(icon_state == initial(icon_state)) - var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static") + var/icontype = "" + var/list/icons = list("Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static") + if (src.name == "B.A.N.N.E.D." && src.ckey == "spaceman96") + icons += "B.A.N.N.E.D." + if (src.name == "M00X-BC" && src.ckey == "searif") + icons += "M00X-BC" + if (src.name == "TRIBUNAL" && src.ckey == "serithi") + icons += "Tribunal" + icons += "Tribunal Malfunctioning" + if (src.name == "Skuld" && src.ckey == "ravensdale") + icons += "Skuld" /* if(icontype == "Clown") icon_state = "ai-clown2"*/ + icontype = input("Please, select a display!", "AI", null/*, null*/) in icons if(icontype == "Monochrome") icon_state = "ai-mono" else if(icontype == "Blue") @@ -134,6 +145,14 @@ icon_state = "ai-malf" else if(icontype == "Static") icon_state = "ai-static" + else if(icontype == "M00X-BC") + icon_state = "ai-searif" + else if(icontype == "Tribunal") + icon_state = "ai-tribunal" + else if(icontype == "Tribunal Malfunctioning") + icon_state = "ai-tribunal-malf" + else if(icontype == "Skuld") + icon_state = "ai-ravensdale" //else //usr <<"You can only change your display once!" //return @@ -689,3 +708,25 @@ src.current = camera src.current.SetLuminosity(AI_CAMERA_LUMINOSITY) camera_light_on = world.timeofday + 1 * 20 // Update the light every 2 seconds. + + +/mob/living/silicon/ai/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/wrench)) + if(anchored) + user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...") + if(!do_after(user,40)) + user.visible_message("\blue \The [user] decides not to unbolt \the [src].") + return + user.visible_message("\blue \The [user] finishes unfastening \the [src]!") + anchored = 0 + return + else + user.visible_message("\blue \The [user] starts to bolt \the [src] to the plating...") + if(!do_after(user,40)) + user.visible_message("\blue \The [user] decides not to bolt \the [src].") + return + user.visible_message("\blue \The [user] finishes fastening down \the [src]!") + anchored = 1 + return + else + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 869ef7139d1..47a2bfb9bba 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -1,8 +1,9 @@ /mob/living/silicon/ai/death(gibbed) if(stat == DEAD) return stat = DEAD - icon_state = "ai-crash" - + if (src.name == "Skuld" && src.ckey == "ravensdale")//checks ID of AI and player to see if it needs to pull the custom death sprite and goes to blue-screen if it doesn't + icon_state = "ai-ravensdale-crash" + else icon_state = "ai-crash" update_canmove() if(src.eyeobj) src.eyeobj.setLoc(get_turf(src)) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index d1ae1c05b77..1726440053c 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -90,7 +90,7 @@ src.see_in_dark = 0 src.see_invisible = SEE_INVISIBLE_LIVING - if (((!loc.master.power_equip) || istype(T, /turf/space)) && !istype(src.loc,/obj/item)) + if (((!loc.master.power_equip) || istype(T, /turf/space)) && !istype(src.loc,/obj/item) && !istype(get_area(src), /area/shuttle)) if (src:aiRestorePowerRoutine==0) src:aiRestorePowerRoutine = 1 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 77e9e64d65c..aa308f90835 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -255,7 +255,7 @@ if (!( src.machine.check_eye(src) )) src.reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 6780d1cffe2..8ef637cd5f6 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -6,7 +6,7 @@ var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/list/alarms_to_show = list() var/list/alarms_to_clear = list() - + immune_to_ssd = 1 var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index eda167dfd9f..3f16dc09a45 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -112,6 +112,12 @@ killing = 0 hud1.icon_state = "disarm/kill" return + + if(ishuman(affecting)) + var/mob/living/carbon/human/H = affecting + var/datum/organ/external/head = H.get_organ("head") + head.add_autopsy_data("Strangulation", 0) + affecting.Weaken(5) // Should keep you down unless you get help. affecting.Stun(5) // It will hamper your voice, being choked and all. affecting.losebreath = min(affecting.losebreath + 2, 3) @@ -293,4 +299,4 @@ /obj/item/weapon/grab/Del() del(hud1) ..() - return \ No newline at end of file + return diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 1d7a7705ec4..4c35e671d04 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -147,24 +147,7 @@ return 1 if(href_list["ready"]) - var/num_old_slots = GetAvailableAlienPlayerSlots() - var/new_slots = num_old_slots - if(!ready) - if(num_old_slots >= 1 || preferences.species == "Human") - ready = 1 - new_slots = GetAvailableAlienPlayerSlots() - else - src << "\red Unable to declare ready. Too many players have already elected to play as aliens." - else - ready = 0 - new_slots = GetAvailableAlienPlayerSlots() - - if(num_old_slots < 1 && new_slots >= 1) - for(var/mob/new_player/N in world) - N << "\blue A new alien player slot has opened." - else if(num_old_slots >= 1 && new_slots < 1) - for(var/mob/new_player/N in world) - N << "\red New alien players can no longer enter the game." + ready = !ready if(href_list["refresh"]) src << browse(null, "window=playersetup") //closes the player setup window @@ -205,9 +188,6 @@ if(!is_alien_whitelisted(src, preferences.species) && config.usealienwhitelist) src << alert("You are currently not whitelisted to play [preferences.species].") return 0 - else if(GetAvailableAlienPlayerSlots() < 1) - src << "\red Unable to join game. Too many players have already joined as aliens." - return 0 LateChoices() @@ -356,15 +336,10 @@ src << alert("[rank] is not available. Please try another.") return 0 - var/num_old_slots = GetAvailableAlienPlayerSlots() - var/new_slots = num_old_slots if(preferences.species != "Human") if(!is_alien_whitelisted(src, preferences.species) && config.usealienwhitelist) src << alert("You are currently not whitelisted to play [preferences.species].") return 0 - else if(num_old_slots < 1) - src << "\red Unable to join game. Too many players have already joined as aliens." - return 0 job_master.AssignRole(src, rank, 1) @@ -384,14 +359,6 @@ ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn AnnounceArrival(character, rank) - new_slots = GetAvailableAlienPlayerSlots() - if(num_old_slots < 1 && new_slots >= 1) - for(var/mob/new_player/N in world) - N << "\blue A new alien player slot has opened." - else if(num_old_slots >= 1 && new_slots < 1) - for(var/mob/new_player/N in world) - N << "\red New alien players can no longer enter the game." - else character.Robotize() del(src) @@ -492,22 +459,3 @@ proc/close_spawn_windows() src << browse(null, "window=latechoices") //closes late choices window src << browse(null, "window=playersetup") //closes the player setup window - -//limits the number of alien players in a game -/proc/GetAvailableAlienPlayerSlots() - if(!config.limitalienplayers) - return 9999 - - var/num_players = 0 - - //check new players - for(var/mob/new_player/N in world) - if(N.preferences && N.ready) - num_players++ - - //check players already spawned, only count humans or aliens - for(var/mob/living/carbon/human/H in world) - if(H.ckey) - num_players++ - - return round(num_players * (config.alien_to_human_ratio / 100)) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 307314e42d6..3bc626696d4 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -527,7 +527,7 @@ obj/structure/cable/proc/cableColor(var/colorC) /obj/item/weapon/cable_coil/attack(mob/M as mob, mob/user as mob) if(hasorgans(M)) - var/datum/organ/external/S = M:organs[user.zone_sel.selecting] + var/datum/organ/external/S = M:get_organ(user.zone_sel.selecting) if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help") return ..() if(S.burn_dam > 0) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 8fff49211e6..c5447698f18 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -119,6 +119,8 @@ if(!unmarked || !C.powernet) if(C.d1 == fdir || C.d2 == fdir) . += C + else if(C.d1 == turn(C.d2, 180)) + . += C return . diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index bf38f8f7e34..f1006d45b85 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -7,7 +7,7 @@ var/obj/item/weapon/cell/power_supply //What type of power cell this uses var/charge_cost = 100 //How much energy is needed to fire. var/cell_type = "/obj/item/weapon/cell" - var/projectile_type = "/obj/item/projectile/energy" + var/projectile_type = "/obj/item/projectile/beam/practice" var/modifystate emp_act(severity) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index bcb67e292e2..d769acf00b2 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -12,7 +12,7 @@ /obj/item/weapon/gun/energy/laser/practice name = "practice laser gun" desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." - projectile_type = "/obj/item/projectile/practice" + projectile_type = "/obj/item/projectile/beam/practice" clumsy_check = 0 obj/item/weapon/gun/energy/laser/retro @@ -90,7 +90,7 @@ obj/item/weapon/gun/energy/laser/retro name = "laser tag gun" icon_state = "bluetag" desc = "Standard issue weapon of the Imperial Guard" - projectile_type = "/obj/item/projectile/beam/bluetag" + projectile_type = "/obj/item/projectile/beam/lastertag/blue" origin_tech = "combat=1;magnets=2" clumsy_check = 0 var/charge_tick = 0 @@ -127,7 +127,7 @@ obj/item/weapon/gun/energy/laser/retro name = "laser tag gun" icon_state = "redtag" desc = "Standard issue weapon of the Imperial Guard" - projectile_type = "/obj/item/projectile/beam/redtag" + projectile_type = "/obj/item/projectile/beam/lastertag/red" origin_tech = "combat=1;magnets=2" clumsy_check = 0 var/charge_tick = 0 diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 8f2d39bf9de..924a8a7f20f 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -111,7 +111,7 @@ var/list/beam_master = list() -/obj/item/projectile/beam/bluetag +/obj/item/projectile/beam/lastertag/blue name = "lasertag beam" icon_state = "bluelaser" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE @@ -126,7 +126,7 @@ var/list/beam_master = list() M.Weaken(5) return 1 -/obj/item/projectile/beam/redtag +/obj/item/projectile/beam/lastertag/red name = "lasertag beam" icon_state = "laser" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE @@ -141,7 +141,7 @@ var/list/beam_master = list() M.Weaken(5) return 1 -/obj/item/projectile/beam/omnitag//A laser tag bolt that stuns EVERYONE +/obj/item/projectile/beam/lastertag/omni//A laser tag bolt that stuns EVERYONE name = "lasertag beam" icon_state = "omnilaser" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 7225b022cf0..99be701f987 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -79,7 +79,8 @@ on_hit(var/atom/target, var/blocked = 0) var/mob/living/M = target - if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays. +// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays. + if(ishuman(target) && (PLANT in M.mutations)) //Plantmen possibly get mutated and damaged by the rays. if(prob(15)) M.apply_effect((rand(30,80)),IRRADIATE) M.Weaken(5) @@ -116,7 +117,8 @@ on_hit(var/atom/target, var/blocked = 0) var/mob/M = target - if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //These rays make plantmen fat. +// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //These rays make plantmen fat. + if(ishuman(target) && (PLANT in M.mutations)) //These rays make plantmen fat. if(M.nutrition < 500) //sanity check M.nutrition += 30 else if (istype(target, /mob/living/carbon/)) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 5d140703ac2..355ee6a84d9 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1146,7 +1146,8 @@ datum if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.dna) - if(H.dna.mutantrace == "plant") //plantmen take a LOT of damage +// if(H.dna.mutantrace == "plant") //plantmen take a LOT of damage + if(PLANT in H.mutations) //plantmen take a LOT of damage H.adjustToxLoss(10) plasma diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 6887a35b08d..63dba43d518 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -145,7 +145,8 @@ bullet_act(var/obj/item/projectile/Proj) if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) - explode() + if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) + explode() blob_act() explode() diff --git a/code/modules/research/xenoarchaeology/artifact.dm b/code/modules/research/xenoarchaeology/artifact.dm index 79c4b7c97cd..53edfb54a07 100644 --- a/code/modules/research/xenoarchaeology/artifact.dm +++ b/code/modules/research/xenoarchaeology/artifact.dm @@ -153,8 +153,6 @@ if(istype(P,/obj/item/projectile/beam)) src.Artifact_Activate() else if(istype(P,/obj/item/projectile/ion)) src.Artifact_Activate() else if(istype(P,/obj/item/projectile/energy)) src.Artifact_Activate() - else if(istype(P,/obj/item/projectile/beam/bluetag)) src.Artifact_Activate() - else if(istype(P,/obj/item/projectile/beam/redtag)) src.Artifact_Activate() if (my_effect.trigger == "heat") if(istype(P,/obj/item/projectile/temp)) src.Artifact_Activate() @@ -205,6 +203,7 @@ if(4) display_msg = "vibrates!" else + my_effect.HaltEffect() switch(rand(2)) if(0) display_msg = "grows dull!" @@ -223,7 +222,7 @@ else if (my_effect.trigger != "touch" && !src.activated) user << "Nothing happens." if (my_effect.effectmode == "contact" && src.activated && src.charged) - my_effect.DoEffect(src) + my_effect.DoEffect(user) src.charged = 0 src.chargetime = src.recharge diff --git a/code/modules/research/xenoarchaeology/artifact_effect.dm b/code/modules/research/xenoarchaeology/artifact_effect.dm index 6c3cf944a0a..9bee8176db3 100644 --- a/code/modules/research/xenoarchaeology/artifact_effect.dm +++ b/code/modules/research/xenoarchaeology/artifact_effect.dm @@ -1,3 +1,4 @@ +// /datum/artifact_effect var/artifact_id = "" // Display ID of the spawning artifact @@ -49,21 +50,18 @@ /datum/artifact_effect/proc/DoEffect(var/atom/originator) archived_loc = originator.loc if (src.effectmode == "contact") - var/mob/user = originator + var/mob/living/user = originator if(!user) return switch(src.effecttype) if("healing") //caeltodo - /* if (istype(user, /mob/living/carbon/human/)) user << "\blue You feel a soothing energy invigorate you." var/mob/living/carbon/human/H = user - for(var/A in H.organs) - var/datum/organ/external/affecting = null - if(!H.organs[A]) continue - affecting = H.organs[A] + for(var/datum/organ/external/affecting in H.organs) + if(!affecting) continue if(!istype(affecting, /datum/organ/external)) continue affecting.heal_damage(25, 25) //fixes getting hit after ingestion, killing you when game updates organ health //user:heal_organ_damage(25, 25) @@ -80,9 +78,7 @@ H.vessel.add_reagent("blood",50) spawn(1) H.fixblood() - H.update_body() - H.update_face() - H.UpdateDamageIcon() + H.regenerate_icons() return 1 // if (istype(user, /mob/living/carbon/monkey/)) @@ -131,7 +127,6 @@ user.adjustFireLoss(40) return 1 else user << "Nothing happens." - */ if("forcefield") while(created_field.len < 16) var/obj/effect/energy_field/E = new (locate(user.x,user.y,user.z)) @@ -148,6 +143,8 @@ randomturfs.Add(T) if(randomturfs.len > 0) user << "\red You are suddenly zapped away elsewhere!" + if (user.buckled) + user.buckled.unbuckle() user.loc = pick(randomturfs) var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(originator)) //no idea what the 0 is @@ -156,7 +153,6 @@ else if (src.effectmode == "aura") switch(src.effecttype) //caeltodo - /* if("healing") for (var/mob/living/carbon/M in range(src.aurarange,originator)) if(ishuman(M) && istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly)) @@ -226,7 +222,6 @@ D.charge -= 10 if(prob(10)) M << "\red SYSTEM ALERT: Energy draining field detected!" return 1 - */ if("planthelper") for (var/obj/machinery/hydroponics/H in range(src.aurarange,originator)) //makes weeds and shrooms and stuff more potent too @@ -247,7 +242,6 @@ O.show_message(text("[] emits a pulse of energy!", originator), 1) switch(src.effecttype) //caeltodo - /* if("healing") for (var/mob/living/carbon/M in range(src.aurarange,originator)) if(ishuman(M) && istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly)) @@ -298,7 +292,6 @@ M.adjustFireLoss(10) M.updatehealth() return 1 - */ if("cellcharge") for (var/obj/machinery/power/apc/C in range(src.aurarange,originator)) for (var/obj/item/weapon/cell/B in C.contents) @@ -343,6 +336,8 @@ randomturfs.Add(T) if(randomturfs.len > 0) M << "\red You are displaced by a strange force!" + if(M.buckled) + M.buckled.unbuckle() M.loc = pick(randomturfs) var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(originator)) //no idea what the 0 is @@ -353,7 +348,6 @@ O.show_message(text("[] emits a powerful burst of energy!", originator), 1) switch(src.effecttype) //caeltodo - /* if("healing") for (var/mob/living/carbon/M in world) if(ishuman(M) && istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly)) @@ -400,7 +394,6 @@ M.adjustFireLoss(5) M.updatehealth() return 1 - */ if("cellcharge") for (var/obj/machinery/power/apc/C in world) for (var/obj/item/weapon/cell/B in C.contents) @@ -432,6 +425,8 @@ randomturfs.Add(T) if(randomturfs.len > 0) M << "\red You are displaced by a strange force!" + if(M.buckled) + M.buckled.unbuckle() M.loc = pick(randomturfs) var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(3, 0, get_turf(originator)) //no idea what the 0 is @@ -482,7 +477,3 @@ E.loc = locate(originator.x - 2,originator.y - 1,originator.z) E = created_field[16] E.loc = locate(originator.x - 2,originator.y - 2,originator.z) - - /*for(var/obj/effect/energy_field/F in created_field) - created_field.Remove(F) - del F*/ diff --git a/code/setup.dm b/code/setup.dm index a6d2eb22848..f7935d741d5 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -19,8 +19,9 @@ #define MOLES_PLASMA_VISIBLE 0.7 //Moles in a standard cell after which plasma is visible #define MIN_PLASMA_DAMAGE 20 -#define BREATH_VOLUME 0.5 //liters in a normal breath -#define BREATH_PERCENTAGE BREATH_VOLUME/CELL_VOLUME +#define BREATH_VOLUME 5 //liters in a normal breath +#define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME /(T20C*R_IDEAL_GAS_EQUATION)) +#define BREATH_PERCENTAGE BREATH_MOLES/MOLES_CELLSTANDARD //Amount of air to take a from a tile #define HUMAN_NEEDED_OXYGEN MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16 //Amount of air needed before pass out/suffocation commences @@ -195,7 +196,7 @@ var/MAX_EXPLOSION_RANGE = 14 #define OPENCONTAINER 4096 // is an open container for chemistry purposes #define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL) -#define ONESIZEFITSALL 8192 // can be worn by fatties (or children? ugh) --jumpsuit only (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT) +#define PLASMAGUARD 8192 //Does not get contaminated by plasma. #define NOREACT 16384 //Reagents dont' react inside this container. @@ -351,6 +352,7 @@ var/MAX_EXPLOSION_RANGE = 14 //2spooky #define SKELETON 29 +#define PLANT 30 // Other Mutations: #define mNobreath 100 // no need to breathe @@ -595,3 +597,6 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define HOSTILE_STANCE_ATTACK 3 #define HOSTILE_STANCE_ATTACKING 4 #define HOSTILE_STANCE_TIRED 5 + +#define LEFT 1 +#define RIGHT 2 diff --git a/config/custom_items.txt b/config/custom_items.txt index dc46a9c3380..c5a4c37f99a 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -5,7 +5,9 @@ chinsky: Victor Kaminski: /obj/item/fluff/victor_kaminsky_1 chinsky: Summer Springfield: /obj/item/weapon/camera_test/fluff/orange compactninja: Al Peterson: /obj/item/clothing/head/flatcap compactninja: Lister Black: /obj/item/weapon/storage/pill_bottle/fluff/listermedbottle, /obj/item/weapon/storage/pill_bottle/fluff/listermedbottle +crazy2455: Murad Hassim: /obj/item/clothing/gloves/fluff/murad_hassim_1 cubejackal: Barry Sharke: /obj/item/clothing/mask/fluff/electriccig +daaneesh: Zelda Creedy: /obj/item/weapon/crowbar/fluff/zelda_creedy_1 desiderium: Momiji Inubashiri: /obj/item/clothing/under/fluff/olddressuniform desiderium: Rook Maudlin: /obj/item/clothing/suit/det_suit/fluff/retpolcoat, /obj/item/clothing/head/det_hat/fluff/retpolcap, /obj/item/clothing/under/det/fluff/retpoluniform deusdactyl: James Girard: /obj/item/clothing/head/secsoft/fluff/swatcap, /obj/item/clothing/suit/armor/vest/fluff/deus_blueshield @@ -14,8 +16,11 @@ executivekill: Hunter Duke: /obj/item/weapon/lighter/zippo/fluff/executivekill_1 fastler: Fastler Greay: /obj/item/weapon/card/id/fluff/lifetime fniff: Sarah Calvera: /obj/item/fluff/sarah_calvera_1 fniff: Angleo Wilkerson: /obj/item/fluff/angelo_wilkerson_1 +foolamancer: Edvin Telephosphor: /obj/item/clothing/head/fluff/edvin_telephosphor_1 +furohman: Fay Sullivan: /obj/item/weapon/lighter/zippo/fluff/fay_sullivan_1 gvazdas: Sarah Carbrokes: /obj/item/fluff/sarah_carbrokes_1 jamini: Edwin Atweeke: /obj/item/clothing/suit/labcoat/fluff/burnt +kirbyelder: John McKeever: /obj/item/paper/fluff/john_mckeever_1 leonheart11: Johann Erzatz: /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/johann_erzatz_1 lexusjjss: Lexus Langg: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask lexusjjss: Zachary Tomlinson: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask @@ -36,8 +41,6 @@ serithi: Serithi Artalis: /obj/item/clothing/glasses/fluff/serithi_artalis_1, /o sirribbit: /obj/item/weapon/clipboard/fluff/mcreary_journal sicktrigger: David Fanning: /obj/item/fluff/david_fanning_1 silentthunder: Val McNeil: /obj/item/fluff/val_mcneil_1 -sniperyeti: Patrick Harris: /obj/item/weapon/lighter/zippo/fluff/sniperyeti_1 -sniperyeti: Susan Harris: /obj/item/weapon/lighter/zippo/fluff/sniperyeti_1 spaceman96: Trenna Seber: /obj/item/weapon/pen/fluff/multi, /obj/item/clothing/suit/labcoat/fluff/pink sparklysheep: Cado Keppel: /obj/item/weapon/fluff/cado_keppel_1 staghorn: Mara Kilpatrick: /obj/item/clothing/mask/mara_kilpatrick_1 @@ -51,3 +54,4 @@ vinceluk: Seth Sealis: /obj/item/clothing/suit/det_suit/fluff/graycoat whitellama: Ethan Way: /obj/item/fluff/ethan_way_1 whitewolf41: Jeremy Wolf: /obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1 roaper: Ian Colm: /obj/item/weapon/card/id/fluff/ian_colmid + diff --git a/html/changelog.html b/html/changelog.html index 6d272ef81ee..34a0e782a7f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,38 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit though. Thanks. --> +
+

14.11.12

+

Chinsky updated:

+
    +
  • Virologist are now alt title of Medical Doctor, like Surgeon or EMT. All medical jobs now have virology access.
  • +
  • Added scientist alt titles.
  • +
+

CIB updated:

+
    +
  • Lungs can now rupture from exposure to low oxygen environments. Use alien-surgery, and then scalpel instead of hemostat, to fix.
  • +
  • Bandage/ointment healing sped up by a factor 10.
  • +
  • Ported autopsy.
  • +
+
+ +
+

November 12th

+

CIB updated:

+
    +
  • Wounds can now get infected in surgery if the surgeon doesn't wash his hands first. Infected wounds can be treated with ointment(though it'll take a while to take effect).
  • +
  • Large amounts of damage can now trigger internal bleeding. Internal bleeding can be recognized in the stationary body scanner, and can be treated through surgery with VeinOFix.
  • +
+
+ +
+

November 11th

+

CIB updated:

+
    +
  • DNA injectors now have a small chance(5%) to trigger a genetic side-effect. See the paper in the genetics lobby for recognition and treatment.
  • +
+
+

November 9th

AterIgnis updated:

diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index 45e56772612..3bb35e9b78c 100644 Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index d82c244dc44..925f5411313 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index ef13513ccf0..5423091f5be 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/r_human.dmi b/icons/mob/human_races/r_human.dmi new file mode 100644 index 00000000000..16324b2bee5 Binary files /dev/null and b/icons/mob/human_races/r_human.dmi differ diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi new file mode 100644 index 00000000000..70d29e573eb Binary files /dev/null and b/icons/mob/human_races/r_lizard.dmi differ diff --git a/icons/mob/human_races/r_skeleton.dmi b/icons/mob/human_races/r_skeleton.dmi new file mode 100644 index 00000000000..cbf854161d9 Binary files /dev/null and b/icons/mob/human_races/r_skeleton.dmi differ diff --git a/icons/mob/human_races/r_skrell.dmi b/icons/mob/human_races/r_skrell.dmi new file mode 100644 index 00000000000..daf33ee223e Binary files /dev/null and b/icons/mob/human_races/r_skrell.dmi differ diff --git a/icons/mob/human_races/r_tajaran.dmi b/icons/mob/human_races/r_tajaran.dmi new file mode 100644 index 00000000000..def8ba83d27 Binary files /dev/null and b/icons/mob/human_races/r_tajaran.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index 96061e3b4cd..68f2fb1bfc8 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index 3376bd0db71..9ce4e51c5ab 100644 Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ diff --git a/maps/tgstation.2.0.9.1.dmm b/maps/tgstation.2.0.9.1.dmm index ddbd609e81f..8f91067b5c3 100644 --- a/maps/tgstation.2.0.9.1.dmm +++ b/maps/tgstation.2.0.9.1.dmm @@ -754,7 +754,7 @@ "aoz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "aoA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "aoB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"aoC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"aoC" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "aoD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "aoE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "aoF" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -1034,7 +1034,7 @@ "atT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/storage/tech) "atU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/storage/tech) "atV" = (/obj/effect/sign/securearea,/turf/simulated/wall/r_wall,/area/storage/tech) -"atW" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) +"atW" = (/obj/structure/table/reinforced,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "atX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/storage/tech) "atY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/tech) "atZ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -1623,7 +1623,7 @@ "aFk" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aFl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry) "aFm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry) -"aFn" = (/obj/machinery/door/firedoor/border_only{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry) +"aFn" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central) "aFo" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "bot"},/area/hallway/secondary/entry) "aFp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "bot"},/area/hallway/secondary/entry) "aFq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/camera{c_tag = "Arrivals Lounge"; dir = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/hallway/secondary/entry) @@ -1702,7 +1702,7 @@ "aGL" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aGM" = (/obj/machinery/requests_console{department = "Arrival shuttle"; pixel_y = -30},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aGN" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (WEST)"; icon_state = "burst_l"; dir = 8},/turf/space,/area/shuttle/arrival/station) -"aGO" = (/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor,/area/hallway/secondary/entry) +"aGO" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central) "aGP" = (/turf/simulated/floor{icon_state = "neutral"},/area/hallway/secondary/entry) "aGQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/secondary/entry) "aGR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/maintenance/fpmaint2) @@ -1779,7 +1779,7 @@ "aIk" = (/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry) "aIl" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry) "aIm" = (/obj/machinery/vending/cigarette,/turf/simulated/floor,/area/hallway/secondary/entry) -"aIn" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor,/area/hallway/secondary/entry) +"aIn" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/secondary/entry) "aIo" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor,/area/hallway/primary/port) "aIp" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/primary/port) "aIq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/hallway/primary/port) @@ -1992,7 +1992,7 @@ "aMp" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/bridge) "aMq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central) "aMr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central) -"aMs" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central) +"aMs" = (/obj/machinery/door/firedoor/border_only{dir = 8},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/secondary/entry) "aMt" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/primary/central) "aMu" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) "aMv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) @@ -2052,8 +2052,8 @@ "aNx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/camera{c_tag = "Port Emergency Storage"},/turf/simulated/floor/plating,/area/storage/emergency2) "aNy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/storage/tools) "aNz" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access_txt = "12"},/turf/simulated/floor,/area/storage/tools) -"aNA" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/hallway/primary/central) -"aNB" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central) +"aNA" = (/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/hallway/primary/central) +"aNB" = (/obj/machinery/door/firedoor/border_only{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/secondary/entry) "aNC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central) "aND" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 10},/area/bridge) "aNE" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "red"},/area/bridge) @@ -2165,8 +2165,8 @@ "aPG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/effect/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "aPH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry) "aPI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry) -"aPJ" = (/obj/machinery/camera{c_tag = "Arrivals Center"; dir = 4; network = "SS13"},/obj/machinery/door/firedoor/border_only{dir = 1},/turf/simulated/floor,/area/hallway/secondary/entry) -"aPK" = (/obj/machinery/door/firedoor/border_only{dir = 1},/turf/simulated/floor,/area/hallway/secondary/entry) +"aPJ" = (/obj/machinery/door/firedoor/border_only{dir = 4},/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/secondary/entry) +"aPK" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/research/station) "aPL" = (/turf/simulated/wall,/area/security/vacantoffice) "aPM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/security/vacantoffice) "aPN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/security/vacantoffice) @@ -2627,7 +2627,7 @@ "aYA" = (/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor,/area/hallway/secondary/exit) "aYB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/hallway/secondary/exit) "aYC" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/exit) -"aYD" = (/obj/structure/table/reinforced,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) +"aYD" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) "aYE" = (/turf/space,/area/shuttle/specops/station) "aYF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry) "aYG" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/hallway/secondary/entry) @@ -3737,7 +3737,7 @@ "btS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "btT" = (/obj/structure/stool/bed/roller,/turf/simulated/floor{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/medical/medbay) "btU" = (/turf/simulated/wall/r_wall,/area/medical/genetics) -"btV" = (/obj/structure/table,/obj/item/device/flashlight/pen{pixel_x = 4; pixel_y = 3},/obj/item/device/flashlight/pen{pixel_x = 0},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/medical/genetics) +"btV" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) "btW" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "btX" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/medical/genetics) "btY" = (/obj/machinery/dna_scannernew,/turf/simulated/floor,/area/medical/genetics) @@ -3928,7 +3928,7 @@ "bxB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bxC" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "bxD" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/stamp/cmo,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) -"bxE" = (/obj/structure/table,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/item/clothing/tie/stethoscope,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) +"bxE" = (/obj/structure/window/reinforced,/obj/structure/closet/crate,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) "bxF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/cmo) "bxG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bxH" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) @@ -4247,7 +4247,7 @@ "bDI" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 4; pixel_y = -6},/obj/structure/table,/turf/simulated/floor,/area/medical/cryo) "bDJ" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor,/area/medical/cryo) "bDK" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor,/area/medical/cryo) -"bDL" = (/obj/machinery/camera{c_tag = "Genetics Cloning"; dir = 4; network = "SS13"},/obj/structure/table,/obj/item/weapon/book/manual/medical_cloning{pixel_y = 6},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) +"bDL" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/research/station) "bDM" = (/obj/effect/landmark/start{name = "Geneticist"},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bDN" = (/obj/machinery/computer/cloning,/turf/simulated/floor,/area/medical/genetics) "bDO" = (/turf/simulated/wall/r_wall,/area/crew_quarters/hor) @@ -4591,7 +4591,7 @@ "bKo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bKp" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/medical/medbay) "bKq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bKr" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 5; pixel_y = -2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bKr" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/research/station) "bKs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bKt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bKu" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/cryo) @@ -4781,7 +4781,7 @@ "bNW" = (/turf/simulated/floor,/area/medical/surgery) "bNX" = (/obj/machinery/computer/operating,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/medical/surgery) "bNY" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/medical/surgery) -"bNZ" = (/obj/structure/table,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor,/area/medical/surgery) +"bNZ" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/research/station) "bOa" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall,/area/toxins/server) "bOb" = (/turf/simulated/wall,/area/toxins/server) "bOc" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_command{name = "Server Room"; req_access_txt = "30"},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) @@ -5151,7 +5151,7 @@ "bVc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/atmos) "bVd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/atmos) "bVe" = (/obj/structure/closet/firecloset,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/atmos) -"bVf" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) +"bVf" = (/obj/structure/shuttle/window,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) "bVg" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) "bVh" = (/obj/machinery/atmospherics/pipe/manifold{color = "yellow"; dir = 8; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos) "bVi" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; icon_state = "intact_off"; name = "Plasma to Pure"; on = 0},/turf/simulated/floor,/area/atmos) @@ -5197,7 +5197,7 @@ "bVW" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "caution"; dir = 5},/area/hallway/primary/aft) "bVX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/atmos) "bVY" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/atmos) -"bVZ" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor,/area/atmos) +"bVZ" = (/obj/machinery/camera{c_tag = "Arrivals Center"; dir = 4; network = "SS13"},/obj/machinery/door/firedoor/border_only{dir = 1},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/secondary/entry) "bWa" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Toxin Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/atmos) "bWb" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "tox_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) "bWc" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) @@ -5233,7 +5233,7 @@ "bWG" = (/turf/simulated/floor{icon_state = "cautioncorner"; dir = 2},/area/hallway/primary/aft) "bWH" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/atmos) "bWI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/atmos) -"bWJ" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/obj/item/weapon/wrench,/turf/simulated/floor,/area/atmos) +"bWJ" = (/obj/machinery/door/firedoor/border_only{dir = 1},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/secondary/entry) "bWK" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/machinery/meter,/turf/simulated/floor,/area/atmos) "bWL" = (/obj/machinery/atmospherics/trinary/filter{dir = 1; icon_state = "intact_on"; name = "Gas filter (Toxins tank)"; on = 1},/turf/simulated/floor,/area/atmos) "bWM" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/atmos) @@ -5743,7 +5743,7 @@ "cgw" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "cgx" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "cgy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/airless{icon_state = "circuit"},/area) -"cgz" = (/obj/structure/table,/obj/machinery/requests_console{department = "Virology"; name = "Virology Requests Console"; pixel_x = -32},/obj/item/weapon/storage/beakerbox{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/syringes,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cgz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "cgA" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cgB" = (/obj/machinery/disease2/incubator,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cgC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology) @@ -5780,7 +5780,7 @@ "chh" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "chi" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "chj" = (/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) -"chk" = (/obj/structure/table,/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/camera{c_tag = "Virlogy West"; dir = 4; network = "SS13"},/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"chk" = (/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) "chl" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "chm" = (/obj/machinery/disease2/isolator,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "chn" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -6655,7 +6655,7 @@ "cxY" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living) "cxZ" = (/obj/machinery/computer/card/centcom,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living) "cya" = (/obj/structure/table,/obj/item/weapon/storage/donkpocket_kit{pixel_x = 3; pixel_y = 3},/obj/item/weapon/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) -"cyb" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 8; id = "QMLoad"},/turf/simulated/shuttle/plating,/area/supply/dock) +"cyb" = (/obj/machinery/door/airlock/highsecurity{name = "High Tech Storage"; req_access_txt = "19"},/turf/simulated/floor/plating,/area/storage/tech) "cyc" = (/obj/machinery/vending/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "cyd" = (/obj/machinery/chem_master,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "cye" = (/obj/machinery/chem_dispenser,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) @@ -8766,10 +8766,10 @@ "dmD" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass_mining{name = "Mining Station EVA"; req_access_txt = "54"},/turf/simulated/floor,/area/mine/eva) "dmE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/mine/eva) "dmF" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "mining_maineast_airlock"; name = "interior access button"; pixel_x = 21; pixel_y = -21; req_access_txt = "48"},/turf/simulated/floor,/area/mine/eva) -"dmG" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_maineast_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor,/area/mine/eva) +"dmG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "dmH" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/eva) "dmI" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/mine/eva) -"dmJ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_maineast_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/eva) +"dmJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "dmK" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "mining_maineast_airlock"; name = "exterior access button"; pixel_x = -23; pixel_y = 21; req_access_txt = "48"},/turf/simulated/floor/airless{tag = "icon-asteroidwarning (EAST)"; icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) "dmL" = (/turf/simulated/wall/r_wall,/area/mine/west_outpost) "dmM" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall/r_wall,/area/mine/west_outpost) @@ -8889,10 +8889,10 @@ "doW" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "doX" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "doY" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/structure/plasticflaps/mining,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) -"doZ" = (/turf/simulated/floor,/area/mine/explored) -"dpa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor,/area/mine/explored) -"dpb" = (/turf/simulated/wall/r_wall,/area/mine/unexplored) -"dpc" = (/turf/simulated/wall,/area/mine/unexplored) +"doZ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 5; pixel_y = -2},/obj/item/weapon/storage/pill_bottle/tramadol,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"dpa" = (/obj/structure/table,/obj/item/weapon/autopsy_scanner,/turf/simulated/floor,/area/medical/surgery) +"dpb" = (/obj/structure/table,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/item/clothing/tie/stethoscope,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) +"dpc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "dpd" = (/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/mine/living_quarters) "dpe" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/living_quarters) "dpf" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/mine/living_quarters) @@ -8903,13 +8903,13 @@ "dpk" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4},/obj/machinery/camera{c_tag = "Shuttle Airlock"; dir = 8; network = "MINE"},/obj/machinery/conveyor_switch/oneway{id = "mining_internal"; name = "mining convayor"},/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/mine/production) "dpl" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/mine/production) "dpm" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) -"dpn" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor,/area/mine/unexplored) -"dpo" = (/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/pipe/manifold,/turf/simulated/floor,/area/mine/unexplored) -"dpp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/unexplored) -"dpq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; frequency = 1379; id_tag = "mining_maineast_pump"; on = 1},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_maineast_sensor"; pixel_x = -8; pixel_y = 22},/obj/machinery/embedded_controller/radio/airlock_controller{airpump_tag = "mining_maineast_pump"; exterior_door_tag = "mining_maineast_outer"; frequency = 1379; id_tag = "mining_maineast_airlock"; interior_door_tag = "mining_maineast_inner"; pixel_x = 6; pixel_y = 25; req_access_txt = "10;13"; sensor_tag = "mining_maineast_sensor"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/unexplored) -"dpr" = (/obj/effect/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/mine/unexplored) -"dps" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mine/unexplored) -"dpt" = (/turf/simulated/floor/airless{tag = "icon-asteroidwarning (NORTHEAST)"; icon_state = "asteroidwarning"; dir = 5},/area/mine/unexplored) +"dpn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dpo" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dpp" = (/obj/machinery/camera{c_tag = "Genetics Cloning"; dir = 4; network = "SS13"},/obj/structure/table,/obj/item/weapon/book/manual/medical_cloning{pixel_y = 6},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/paper/genetics_side_effects,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) +"dpq" = (/obj/structure/table,/obj/item/device/flashlight/pen{pixel_x = 4; pixel_y = 3},/obj/item/device/flashlight/pen{pixel_x = 0},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/item/weapon/reagent_containers/pill/antitox,/obj/item/weapon/reagent_containers/pill/antitox,/obj/item/weapon/reagent_containers/pill/bicaridine,/obj/item/weapon/reagent_containers/pill/bicaridine,/obj/item/weapon/reagent_containers/pill/dexalin,/obj/item/weapon/reagent_containers/pill/dexalin,/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/medical/genetics) +"dpr" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/research/station) +"dps" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/research/station) +"dpt" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/research/station) "dpu" = (/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/explored) "dpv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "mining_mainwest_airlock"; name = "exterior access button"; pixel_x = 20; pixel_y = 20; req_access_txt = "48"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/explored) "dpw" = (/turf/simulated/floor/airless{tag = "icon-asteroidwarning (EAST)"; icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) @@ -8924,13 +8924,13 @@ "dpF" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/mine/production) "dpG" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/mine/production) "dpH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/mine/production) -"dpI" = (/turf/simulated/floor,/area/mine/unexplored) -"dpJ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "mining_maineast_airlock"; name = "interior access button"; pixel_x = 21; pixel_y = -21},/turf/simulated/floor,/area/mine/unexplored) -"dpK" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_maineast_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor,/area/mine/unexplored) -"dpL" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/unexplored) -"dpM" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/mine/unexplored) -"dpN" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_maineast_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/unexplored) -"dpO" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "mining_maineast_airlock"; name = "exterior access button"; pixel_x = -23; pixel_y = 21},/turf/simulated/floor/airless{tag = "icon-asteroidwarning (EAST)"; icon_state = "asteroidwarning"; dir = 4},/area/mine/unexplored) +"dpI" = (/obj/structure/ore_box,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) +"dpJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/port) +"dpK" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/research/station) +"dpL" = (/obj/machinery/computer/research_shuttle,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) +"dpM" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) +"dpN" = (/obj/structure/table,/obj/machinery/requests_console{department = "Virology"; name = "Virology Requests Console"; pixel_x = -32},/obj/item/weapon/storage/beakerbox{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/syringes,/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"dpO" = (/obj/structure/table,/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/camera{c_tag = "Virlogy West"; dir = 4; network = "SS13"},/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/device/antibody_scanner,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "dpP" = (/obj/machinery/power/apc{dir = 1; name = "Mining Station External APC"; pixel_x = 1; pixel_y = 25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/airless{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "dpQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "dpR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/airless{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) @@ -8939,11 +8939,11 @@ "dpU" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/camera{c_tag = "Production Room"; dir = 8; network = "MINE"},/turf/simulated/floor,/area/mine/production) "dpV" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/mine/production) "dpW" = (/obj/machinery/mineral/input,/turf/simulated/floor{icon_state = "loadingarea"; tag = "loading"},/area/mine/production) -"dpX" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/mech_bay_recharge_floor,/area/mine/unexplored) -"dpY" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor,/area/mine/unexplored) -"dpZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/unexplored) -"dqa" = (/obj/structure/closet/emcloset,/obj/machinery/light/small,/turf/simulated/floor,/area/mine/unexplored) -"dqb" = (/obj/structure/ore_box,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/mine/unexplored) +"dpX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft) +"dpY" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/atmos) +"dpZ" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/atmos) +"dqa" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/turf/simulated/floor,/area/atmos) +"dqb" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) "dqc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/production) "dqd" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/mine/production) "dqe" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8},/turf/simulated/floor,/area/mine/production) @@ -8951,7 +8951,7 @@ "dqg" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact-f"},/turf/simulated/floor,/area/mine/production) "dqh" = (/obj/machinery/mineral/processing_unit_console,/turf/simulated/wall/r_wall,/area/mine/production) "dqi" = (/obj/machinery/mineral/processing_unit,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) -"dqj" = (/obj/machinery/driver_button{id = "mining_external_door"; name = "Production Line Input"; pixel_x = -22},/obj/machinery/camera{c_tag = "Production Line External"; dir = 4; network = "MINE"},/turf/simulated/floor/airless{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2},/area/mine/unexplored) +"dqj" = (/obj/structure/closet/firecloset,/turf/simulated/floor,/area/atmos) "dqk" = (/obj/machinery/computer/mining_shuttle,/turf/simulated/floor,/area/mine/production) "dql" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/crate,/turf/simulated/floor,/area/mine/production) "dqm" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) @@ -8975,22 +8975,14 @@ "dqE" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "dqF" = (/obj/machinery/mineral/stacking_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "dqG" = (/obj/machinery/conveyor{tag = "icon-conveyor0 (SOUTHWEST)"; icon_state = "conveyor0"; dir = 10; id = "mining_internal"},/obj/machinery/mineral/input,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/mine/production) -"dqH" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/research/station) -"dqI" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) -"dqJ" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) -"dqK" = (/obj/structure/window/reinforced,/obj/structure/closet/crate,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) -"dqL" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/research/station) -"dqM" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/research/station) -"dqN" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/research/station) -"dqO" = (/obj/structure/shuttle/window,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) -"dqP" = (/obj/machinery/door/airlock/highsecurity{name = "High Tech Storage"; req_access_txt = "19"},/turf/simulated/floor/plating,/area/storage/tech) -"dqQ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/research/station) -"dqR" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/research/station) -"dqS" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/research/station) -"dqT" = (/obj/structure/ore_box,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) -"dqU" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/research/station) -"dqV" = (/obj/machinery/computer/research_shuttle,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) -"dqW" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/research/station) +"dqH" = (/obj/structure/closet/firecloset,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/atmos) +"dqI" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath{pixel_x = -2; pixel_y = 0},/obj/item/clothing/head/helmet/space/rig/atmos,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/atmos) +"dqJ" = (/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/turf/simulated/floor,/area/atmos) +"dqK" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath{pixel_x = -2; pixel_y = 0},/obj/item/clothing/head/helmet/space/rig/atmos,/turf/simulated/floor,/area/atmos) +"dqL" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath{pixel_x = -2; pixel_y = 0},/obj/item/clothing/head/helmet/space/rig/atmos,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/atmos) +"dqM" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/plating,/area/supply/dock) +"dqN" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_maineast_outer"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = "48"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/eva) +"dqO" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_maineast_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = "48"},/turf/simulated/floor,/area/mine/eva) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9060,7 +9052,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaayaazaamaaAaamaamaaBaaCaaDaamaaEaaFaahaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaxaaGaaHaaIaaxaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaalaamaaJaaKaaLaazaaMaaNaaOaamaavaawaahaafaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaafaaxaaPaaQaaRaaxaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahaaSaaSaaSaaSaaTaaUaaVaaCaaWaaXaaSaaSabtabtabtabtabtabtabtabtabtaaaaafaaaaafaaaaafaaaaafaaxaaYaaRaaZaaxaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaafaahabaabbabcabdabeabfabgaamaaDaamabhabiabtaYDatWatWabXabYabJabKabtaaaaafaaaaafaaaaafaaaaafabjaaRaaPaaRabjaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaafaahabaabbabcabdabeabfabgaamaaDaamabhabiabtatWaoCaoCabXabYabJabKabtaaaaafaaaaafaaaaafaaaaafabjaaRaaPaaRabjaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahabkablaazaaBabmabnaboabpaaDabqabrabsabtabWabWabWacpacqabZacaabtabuaafaafaafaafaafaafaafabvaaPaaRaaPabwaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahabxaaSabyabzabAabBabCabDabEaaSaaSabFabtabGabGabGacpacqacracsabtabLabMabNabOabPabPabPabPaaxaaPaaPaaRaaxaafaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagaahabQaaSabRabSaaSabTaaaabUaaaaaaaaSabVabtabWabWabWacpacqabHabIabtacbaccacdaceacfacgachabPaaxaciaaPacjaaxaaxaaxaaxaaxaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9088,41 +9080,41 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajmaaaaaaaaaaafaaaaaaaafamraaaaaaaaaaafaaaaaaaaaajXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafamvanaamvamvamvamSamSanbamSamSancamSamSamSamSamSamSamSamSandamSamSamSaneamSamSamSamSamSanfakmakmakmanganhanianjankanlanmannanoanpanpanqairaaaaaaajkajkajkajkajkaaaaaaaaaaaaaaaaaaajlaafalLalLalLalLalLaafamkaafalLalLalLalLalLaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafalNalNalNalNalNaafamraafalNalNalNalNalNaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvanransantanuanvanvanwanxanxanyanzanxanxanxanAanBanBanBanCanDanEanEanFanGanHanIanEanEamVanJanKanLajhajhajhanMajhanNajhanOanPairanQanRairaaaaaaaaaajkajkajkaaaaaaaaaaaaaaaaaaaaaajlaafamhamiamiamiamiamjamkamlammammammammamnaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafamoampampampampamqamramsamtamtamtamtamuaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamvanSanTanUanVanVanWanXanWanVanVanYanZanZanZaoaanZanZaobaocaodairairaoeairairairairairajhajhajhajhajhaofaogaohaoiaiRaiSaojaokaolaomaonairaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafamHamHamHamHamHaafamkaafamHamHamHamHamHaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafamIamIamIamIamIaafamraafamIamIamIamIamIaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaafamvamvanTanUanVaooaopaoqaoraosanVanUanZaotaouaovaowanZaoxamSaoyairaogaozaoAaoAaoAaoAaoAaoBaoAaoAaoAaoCaoDaoEaoFaoGaoHaoIaoJaoKaoLaoMaoNairaafaoOaoPaoPaoQaoPaoPaoRaaaaaaaaaaaaaaaajmaaaaaaaaaaafaaaaaaaaaamkaaaaaaaaaaafaaaaaaaaaajmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafamIamIamIamIamIaafamraafamIamIamIamIamIaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaafamvamvanTanUanVaooaopaoqaoraosanVanUanZaotaouaovaowanZaoxamSaoyairaogaozaoAaoAaoAaoAaoAaoBaoAaoAaoAdmGaoDaoEaoFaoGaoHaoIaoJaoKaoLaoMaoNairaafaoOaoPaoPaoQaoPaoPaoRaaaaaaaaaaaaaaaajmaaaaaaaaaaafaaaaaaaaaamkaaaaaaaaaaafaaaaaaaaaajmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoSaoTaoUaaaaoVaoWaoXaaaaafaoYaoZaoYaaaaaaaaaaaaaaaaaaaaaajmaaaaaaaaaaafaaaaaaaaaamraaaaaaaaaaafaaaaaaaaaajmaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafapaanTapbanVapcapdapeapfapganVanUanZaphapiapjapkaplamRamSaoyairapmapnapoappapoapoapqapnapoappapoapnapoapoappapoaprapsaptapuapvapwapxapxapxapyapzapzapzapzapzapyapxaaaaaaaaaaaaajlaafalLalLalLalLalLaafamkaafalLalLalLalLalLaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapAapBapAaaaapCapDapCaaaaafapEapFapGaaaaaaaaaaaaaaaaaaaaaajlaafalNalNalNalNalNaafamraafalNalNalNalNalNaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagaafaafaafapHanTanUanVapIapdapJapKapLanVanUanZapMapiapNapOapPamRamSapQairajiapRapSapTapUapVapWapXapVapYapZaqaapVaqbaqcaqdaqeaqfaqgaqhaqiaqjaqkaqlapxapyapzapzapzapzapzapyapxaafaaaaaaaaaajmaafamhamiamiamiamiamjamkamlammammammammamnaafajlaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqmapAaqnapAaqmapCaqoapCaqmaqpaqqaoZaqraqsaqsaqtaqpaqpaafaaaajlaafamoampampampampamqamramsamtamtamtamtamuaafajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaagaagamvamvamvanTaquaqvaqwapdaqxapdaqyanVanUanZaqzaqAaqBaqCaqDamRamSaoyairajiaqEaqFaqGaqHaqIaqJaqKapVaqLaqMaqNapVaqOaqMaqPapxaqQaqRaqSaqTaqUaqVaqWaqXaqYapzapzapzapzapzaqZapxapxapxaaaaaaajmaaaamHamHamHamHamHaafamkaafamHamHamHamHamHaaaajXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaraarbarcardaraarearfargaraapFapFapFarhariarjarkarlaqpaaaaaaajXaaaamIamIamIamIamIaafamraafamIamIamIamIamIaaaajlaaaaaaaaaaaaaaaaaaaaaaaaarmarmarnarmarmaaaaaaaafaafaagaagaagaroarparoanTarqarrarsaorartaruarvanVanUanZanZarwarxaryarzarAarBarCarDajUarEarFaqHarFapVaqJaqKapVapVarGapVapVapVarHapVapxarIarJarKarLarMarNaqUarOarPapzapzapzapzapzarQarRarSarTaaaaaaajmaaaaafaaaaafaafaaaaaaamkaaaaaaaafaaaaaaaafaaaajlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaraarUarVarWaraarUarVarWaraarXarYarZarZarZarZasaasbaoYaaaaaaajlaaaaafaaaaafaafaaaaaaascaaaaaaaafaaaaaaaafaaaajlaafaaaaaaaaaaaaaaaaaaaaaasdaseasfasgasdaaaaaaaafaafaagaagaagamvamvamvamvarqashasiasiasjasiasiasiaskaslasmasnasmasoaspasqamSasrairassapnastaqHasuapVasvaswasxasyaszaszasAasBaszasCasDasEarJasFasGasHasIasJasKasLapzapzapzapzapzasLasMasNasOaaaaaaajmajmajlaaaaaaaafaaaaaaamkaaaaafaafaafaafajlajlajlaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaraarUarVarWaraarUarVarWaraarXarYarZarZarZarZasaasbaoYaaaaaaajlaaaaafaaaaafaafaaaaaaascaaaaaaaafaaaaaaaafaaaajlaafaaaaaaaaaaaaaaaaaaaaaasdaseasfasgasdaaaaaaaafaafaagaagaagamvamvamvamvcgzashasiasiasjasiasiasiaskaslasmasnasmasoaspasqamSasrairassapnastaqHasuapVasvaswasxasyaszaszasAasBaszasCasDasEarJasFasGasHasIasJasKasLapzapzapzapzapzasLasMasNasOaaaaaaajmajmajlaaaaaaaafaaaaaaamkaaaaafaafaafaafajlajlajlaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaqmaraasPasQaqmaraasPasQaqmaqpasRaqpaqpaqpaqpaqpasSapGaaaaaaajlajlajlaaaaaaaafaaaasTasUasTaafaafaafaafajlajlajlaafaafaaaaaaaafaaaaaaaaaasVasWasXasYasZaaaamvamvataatbatcamvamvatdateatfatgathathathatiathathatjatkathathatlatmatmatnatoatpatqanpatraqEatsattaqHatuaqJatvatvatwatxatyatzatwatvatvatAatBatCasFasGasHasIasJatDatEapzapzapzapzapzatEatFasNasOaaaaaaaaaaaaaafaafaaaaafaaaaaaatGaaaaaaaafaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatHatIatIatIatJatIatIatIatKatLatMatNatNatNatNaqpatOapGaaaaafaafaaaaaaaaaaaaaafaaaatPatQatRaafaaaaafaaaaaaaaaaaaaaaaafaafaaaaafaafatSatTatUatVdqPatVatXatYatSatZauaauaauaauaauaauaaubaucaudaueaueaueaufaueaueaueaueaueaueaueaueaueaueaugauhauiaujaukarEapVapVapVapVaulaumatvatwatyaunatyauoaupauqaurausaqRautauuauvauwauxauyauzapzapzapzapzapzauAauBauCauDaaaaaaaaaaaaaaaaafaaaaafaaaauEauFauEaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatHatIatIatIatJchkatIatIatKatLatMatNatNatNatNaqpatOapGaaaaafaafaaaaaaaaaaaaaafaaaatPatQatRaafaaaaafaaaaaaaaaaaaaaaaafaafaaaaafaafatSatTatUatVcybatVatXatYatSatZauaauaauaauaauaauaaubaucaudaueaueaueaufaueaueaueaueaueaueaueaueaueaueaugauhauiaujaukarEapVapVapVapVaulaumatvatwatyaunatyauoaupauqaurausaqRautauuauvauwauxauyauzapzapzapzapzapzauAauBauCauDaaaaaaaaaaaaaaaaafaaaaafaaaauEauFauEaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauGauHatNauIauJatNatNauKauIatNauLauMauNauNauOaqpatOauPaafaafaaaaaaaaaaaaaaaaafauQauRauSauTauUaaaaafaaaaaaaaaaaaaqpaqpaqpaqpaqpaqpatSauVauWauXauYauZavaavbatSavcavdavdavdavdavdavdavdaveavfaueavgavhaviavjavkavlavmavnavoavpavqavraueavsamSavtairavuapnastarFavvapVaqJavwavxauqauqavyavzavAavBavCasDavDavEavFavGavHavIavJavKavLapzapzapzapzapzavMapxapxapxaaaaaaaaaaaaaafaafaafaafaaaavNavOavPaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaraatHavQatHavRatNatNavSatHavQatHavTauHauJavUaqpatOaqpaqpavVaqsaqsaqsaqsaqtaqpavWavXavYavZavWaqpaqpavVaqsawaaqpaqparlawbawcapFawdatSauYauYauYaweauYawfauYatSavcavdawgawhawiawjawgavdaveanrawkawlawmawnawoawpawpawqawrawsawtawtawuawvavsamSawwairawxaqEaqFaqHaqHawyaqJawzawAavBawBawCawDawEawEawFawEapxawGawHawIawJawKawLapxawMapzapzapzapzapzawMapxaafaaaaaaaaaaaaaaaaafaafaaaaafawNawOawPawQawRaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaraatHavQatHavRatNatNavSatHavQatHavTauHauJavUaqpdmJaqpaqpavVaqsaqsaqsaqsaqtaqpavWavXavYavZavWaqpaqpavVaqsawaaqpaqparlawbawcapFawdatSauYauYauYaweauYawfauYatSavcavdawgawhawiawjawgavdaveanrawkawlawmawnawoawpawpawqawrawsawtawtawuawvavsamSawwairawxaqEaqFaqHaqHawyaqJawzawAavBawBawCawDawEawEawFawEapxawGawHawIawJawKawLapxawMapzapzapzapzapzawMapxaafaaaaaaaaaaaaaaaaafaafaaaaafawNawOawPawQawRaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafawSaqmawTarVawUawVawWawXawYawUarVawZaxaaqmaxbaxcaqpaxdaxeaxeaxeaxeaxeaxeasbaxfaxgavWaxhaxiaxjavWaxkapFapFapFapFapFapFapFapFapFapFapFatSaxlauYaxmaxnaxoaxpaxqatSavcavdawgaxraxsaxtawgavdaveaxuaueaxvaxwaxxaxyawtaxzaxAaxBaxCawtawtaxDaxEavsamSaxFairawxapRarFaqHarFapVasvaxGawEawEawEawEawEawEaxHaxIaxJawEapxapxapxapxaxKapxapxawMapzapzapzapzapzawMapxaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaxLaxMaxNaxOaxLaafaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafauGavQaxPaxQaxQaxQaxQaxRavQauGaxSaqmaxTatMaxUaxUaxUaxUaxUaxUaxUaxUasSaxVaxgavWaxWaxXaxYavWaxZayaaxZaxZaxZaxZaxZaxZaxZaxZaxZapFatSaybauYaycauYaydawfayeatSavcavdayfaygayhayiawgavdaveamvaueayjaykaylaymaynawlayoaypawlayqayraysaytavsamSavtairavuapnastaqHayuapVaqJaxGawEayvaxIaywaywawEaxHayxaxJawEayyayzayyayAayBayCaafayDayEayEayEayEayEayFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaxLayGayHayIaxLaafaaaaaaayJayKayKayKayLayKayKayMayNayNayNayOaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaayPayQayRayQayQaySayTayQayQayRayUayVaqmavRayWayXayYayZazaazbazcazdaxUasSazeaqpavWavWazfazgazhaziazjazkazlazmaznazoazpazqazraxZapFatSazsauYaztauYazuawfazvatSavcavdazwazxazyazzazAavdaveazBaueazCazDaxxazEaxxazFazGaueazHazIazJazKawvavsamSavtairawxaqEatsazLaqHazMaqJaxGawEazNaxIaxIaxIawFazOazPazQawEazRazSazSazTayBayCaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaxLazUazVazWaxLayCazXazYazZaAaaAbaAbaAcaAbaAdaAbaAeaAfaAgaAhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayPayUayQaAiaAjaAjaAkaAlaAmaAnaAoaAjaAjaApaAqatHavRaAraxUaAsaAtaAuaAvaAuaAwaAxaAyaAzapFaAAapFaABaxeaACaADaAEaAFaAFaAFaAGaAFaAFaAHaAIaxZapFatSaAJauYaAKaALaAMaANaAOatSavcavdaAPaAQaARaASaATavdaveaAUaueaueaAVazIaAWazIawvaueaueaAXaAYaueaAZaueavsamSavtairawxaBaaBbaBbaBbaBbaBcaBdaBeaBfaBgaBhaBhaBhaBiaBhaBjaBhaBkaBlaBmaBnaBoayCayCayCayCayCayCayCayCayCayCazXazYayCayCayCazXaBpaBqayCayCaxLaxLaBraBsaxLaBtaBuaBvaBwaBxaByaByaBzaByaBAaByaByaBBaBCaBDaBEaBFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaApaBGaBHaBIaAjaBJaAjaBJaAjaBJaAjaBJaAjaBKaBLawUavRatNaxUaBMaBNaBOaBPaBQaBRaxUaBSaBTaBUaBVaxeaBWapFaxZaBXaAHaAFaAFaAFaAFaAFaAFaAHaBYaxZapFatSaBZaCaaCbaCcatSatSaCdaCeaCfaCgaChaCiaCjaCkaClaCgaCmaCnaCoaCpaCqaCraCsaCrawsaCtaueaCuaCuaueaAXaueaCvaocaCwairaCxaCyaCyaCyaCzaCAaCBaCCaCDaCEaCFaCDaCGaCDaCHaCDaCIaCJaCKazSaCLayAaCMaCNaCOaCPaCQaCNaCRaCSaCSaCSaCSaCSaCTaCUaCSaCVaCWaCXaCYaCZaDaaDbaDcaDdaDeaDeaDeaDfaDgaDhaDiaByaDjaDkaDlaDmaDnaDoaDpaDqaDraDsaDtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDvaAjaAjayRaAjaBJaAjaBJaDwaBJaAjaBJaAjaBKaBLawUavRaDxaxUaDyaDzaDAaDBaDAayXayXaDCaDDaDEaDFaDGaDFaDFaDHaDIaDJaDKaDKaDKaDLaDKaDKaDMaDNaDOaDPaqpaDQaDRaDSaDTaDUaDVaDWaslaDXaDYaDZaEaaEbaEcaEdaDYaEeaEfaEgaEhaykaEiaAXaEiaEjaEkaueaElaEmazJazKaueaEnaEoaEpairaEqairairairaErairaEsaEtawEaEuaxIawEaEvawEaEwawEaExaEyaEzaEAaEBaECaEDaEEaEFaEGaEHaEIaEJaEHaEHaEKayKaEGaELaEGaEMaEGaEGaENaEOaEPaEQaEQaERaESaETaEUaEQaEVaEWaEXaEYaByaEZaFaaFbaFcaDnaFdaFeaFfaFgaFhaFiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaApaFjaFkaBIaAjaBJaAjaBJaAjaBJaAjaBJaAjaBKaBLawUaFlaFmaFnaFoaFpaFpaFpaFmaFqaFraFmaFsaFtapFaFuarlarlaxZaFvaFwazjaFxaFyaFzaFAaFBaFCaFDaxZaxVaFEaFFaFFaFGaFHaFIaFJaFKaFLaFMavdaFNaFOaARaFPaFQavdaFRanTaueaFSaFTaEiaAXaEiaFUaFVaueaaaaaaaFWaFXaFYaFZaGaaGbaGcaGdaFWaaaaaaaGeaGfaGgaGhawEaxIaxIaxIaxIazPaxIaxIaGiaGjayAaGkayAaGlaGmaGnaGoaGnaGnaGpaGqaGraGnaGsaGtaGtaGuaGtaGvaGtaGwaGxaGxaGyaGxaGxaGzaGxaGxaGxaGxaGAaBzaGBaGCaByaGDaGEaGFaFcaDnaFdaFeaDqaGGaFeaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGJaGKayQaAiaAjaAjaAjaGLaAjaAjaGMaAjaAjaApaGNauGavRatNaGOaGPaGPaGPaGPaGPaGPatNatNaGQaqpaqpaGRaqpaqpaxZaGSaGTaGUaGVaGVaGVaGVaGWaGXaGYaxZaGZaqpaHaaHbaHcaHdaHaamvamvamvamvavdavdavdaHeaHfavdavdaHgaHhaueaueawvaHiaHjaHkazJaueaueaHlaHmaHnaHoaGaaGaaGaaGaaGaaHpaHqaHmaHraGeaHsaGgaHtawEawEawEawEawEawEawEawEawEaGjaHuaHvaHwaHxaHyaHzaHAaHBaGnaHCaHDaHEaHFaHGaGtaHHaHIaGtaHJaGtaHKaHLaHMaHNaHOaHPaHQaHRaHSaHTaGxaHUaHVaHWaHXaHYaHZaIaaFcaFcaIbaByaFeaDqaIcaIdaGHaaaaaaaaaaaaaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGJayQayRayQayQaIeayTayQayQayRaGKaIfaqmaIgatNatHaIhaIiaIjaIkaIlaraaImatNaGQaInaIoaIpaIqaIraIsaHaaItaHaaHaaHaaHaaHaaHaaHaaIuaIvaIwaIxaHaaHaaIyaIzaHaaHaaIAaHaaIBaICaIDaIEaIFaIEaIGaEoaIHaGaaIIaIJaGbaGcaGcaGcaFZaIKaILaIMaGaaINaIOaIPaIQaIRaISaITaIUaGaaGaaIVaIWaIXaIYaIXaIZaJaaJbaJcaGaaGaaGaayAaJdaJeaJfaJgaJgaJgaJhaJiaJjaJkaGnaJlaJmaHGaJnaJoaGtaJpaJqaJraJsaGtaGxaJtaHLaJuaJvaJwaJxaJyaJzaJAaGxaGAaBzaJBaJCaByaJDaFcaJEaFcaFcaByaFeaDqaIcaIdaGHaaaaaaaaaaaeaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatHavQaJFaxQaxQaxQaxQaJGavQatHaxSaqmaxTaJHawUaJIaJJaJKaJKaIiaraaJLatNaJMaJNaJOaJPaJQaJRaJSaJTaJUaHaaHaaHaaHaaHaaHaaHaaIuaHaaIwaHaaHaaHaaJVaJWaHaaHaaHaaHaaJXaHaaHaaHaaItaHaaJYaEoaGaaGaaGaaGaaGaaGaaGaaGaaGaaGaaGaaIMaGaaJZaKaaKbaKcaKdaKeaKfaKgaGaaGaaIVaGaaGaaGaaGaaGaaGaaGaaGaaGaaKhaGaayAaKiaKjaKkaHvaKlaHvaKmaKnaJkaKoaGnaKpaKqaKraGnaGnaGtaKsaHIaKtaJsaKuaGtaGxaGxaKvaGxaGxaGxaKwaKxaKwaGxaGAaKyaKzaKAaByaByaByaByaKBaByaByaFeaDqaFeaKCaKDaaaaaaaaaaaaaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafawSaqmawUarVawUaKEaKFaKGaKHawUarVaKIaKJaqmavRatNawUaJIaJJaJKaJKaIiaraaKKatNaGQaJNaJOaKLaKMaKNaKNaKNaKOaKPaKQaKNaKRaKNaKNaKSaKTaKUaKVaKNaKWaKXaKYaKZaLaaLbaLcaLdaLeaLdaLdaLfaJUaHaaJYaEoaGaaLgaGaaLhaLhaLhaLhaLhaLhaLhaLhaLiaLhaLhaLhaLhaLhaLjaLhaLhaLhaLhaLhaLkaLhaLhaLhaLhaLhaLhaLhaLhaGaaGaaLlayAaLmaLnaLmaLmaLmaLoaLpaKnaKnaJkaGnaGnaLqaGnaGnaLraGtaLsaHIaLtaLuaLvaGtaGxaLwaLxaLyaLzaLyaLyaLAaLBaGxaGAaLCaLDaLEaFeaFeaLFaFeaFeaFeaLGaFeaDqaLHaLIaLJaLKaLKaaaaaaaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaraauGavQauGavRatNatNavSauGavQauGaLLaLMatKatNauGaIiaIiaIjaIkaIlaraaLNatNaGQaLOaLOaLPaLQaLOaLRaLRaLRaLRaLRaLSaLTaLRaLRaLRaLRaLRaLUaLVaLWaLVaLXaLYaLZaLZaMaaLZaMbaMcaHaaItaHaaHaaMcaMcaGaaGaaGbaMdaHmaHmaMeaMeaMeaMeaMfaMgaMhaMiaMjaMkaMkaMlaMmaMkaMnaMoaMpaMgaMqaMeaMeaMeaMeaHmaHmaMraMsaMtaMtaGnaMuaMvaKnaKnaKnaKnaMwaMxaMyaKnaGnaMzaMAaMBaGtaGtaGtaGtaMCaGtaMDaGtaGtaGxaMEaMFaMGaMGaMGaMGaMHaMIaGxaMJaMKaMLaLIaMMaMNaMOaFeaFeaFeaMNaMOaMPaLIaLIaMQaMRaLKaMSaMTaMUaafaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatHaMVatNaMWatKatNatNaMXaMWatNaMVatKaJNatNatNaGOaMYaMYaMYaMYaMYaMYatNatNaGQaLOaMZaNaaNbaNcaNdaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaNpaNqaNraNsaLXaNtaLZaNuaNvaNwaNxaMcaMcaNyaNzaMcaMcaMcaNAaMtaNBaNCaaaaaaaaaaaaaaaaaaaaaaMgaNDaNEaNFaNGaNHaNIaNHaNJaNKaNLaNMaMgaaaaaaaaaaaaaaaaaaaaaaNNaFZaGaaNOaNPaNQaMvaNRaKnaKnaKnaNRaKnaNSaJkaNTaKnaNUaNVaGtaNWaNXaNYaNZaOaaObaOcaOdaGtaLyaOeaOfaOfaOfaOfaOgaLyaGxaGAaFgaOhaLIaOiaOjaOkaOlaOlaOlaOjaOkaOmaLIaOnaOoaOpaOqaOraOsaOtaafaafaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaauGatNaOuatNatNatNatNatNatNaOuatNatNaJNatNatNaGOatNatNaOvatNaOwaOxaOyaOuaOzaLOaMZaOAaOBaLRaOCaNiaNiaNiaNiaNiaNjaODaNiaNiaNiaNoaLUaOEaOFaOGaLXaNtaLZaOHaOIaOJaOKaMcaOLaOMaONaOOaOPaOQaGaaGaaGbaNCaaaaaaaaaaaaaMgaMgaMgaMgaORaOSaOTaOUaOVaOWaOXaOYaOZaPaaPbaMgaMgaMgaMgaaaaaaaaaaaaaNNaFZaGaaGaaPcaKnaPdaPeaPfaKnaPgaPhaPfaNSaJkaPiaKnaPjaKnaPkaPlaPmaPnaPoaPpaPqaPraPlaPsaPtaPuaOfaPvaPwaOfaPxaLyaGxaHUaMKaPyaPzaFeaMNaMOaPAaPBaPAaMNaMOaDqaLIaPCaPDaOpaOpaOpaPEaPFaMTaMTaPGaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqmaqmaPHaPIaPIaPIaPIaPIaPIaPIaxaaqmaraaPJaPKaPLaPLaPLaPMaPLaPLaPLaPNaPLaPNaLOaMZaPOaPPaLRaPQaNiaNiaPRaPSaPTaPUaPRaNiaNiaNiaPVaLUaOEaPWaPXaLXaPYaLZaLZaLZaLZaMbaMcaPZaQaaQbaONaQcaQdaGaaGaaGbaHqaMfaQeaMgaMgaMgaQfaQgaQhaQiaQjaQjaQkaQlaQjaQkaQlaQjaQmaQnaQoaQpaQqaMgaMgaMgaQeaHlaQraFZaGaaGaaGnaQsaMvaQtaKnaKnaKnaQtaKnaNSaJkaQuaQvaKnaQwaGtaPlaQxaQyaQzaQAaQBaQCaPlaQDaQEaQFaOfaQGaQHaOfaQIaQJaGxaGAaLCaQKaLIaQLaQMaQNaPBaPBaPBaQMaQNaQOaLIaQPaPDaOpaOpaOpaOpaQQaQRaQSaQTaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaApaFjaFkaBIaAjaBJaAjaBJaAjaBJaAjaBJaAjaBKaBLawUaFlaFmaNBaFoaFpaFpaFpaFmaFqaFraFmaFsaFtapFaFuarlarlaxZaFvaFwazjaFxaFyaFzaFAaFBaFCaFDaxZaxVaFEaFFaFFaFGaFHaFIaFJaFKaFLaFMavdaFNaFOaARaFPaFQavdaFRanTaueaFSaFTaEiaAXaEiaFUaFVaueaaaaaaaFWaFXaFYaFZaGaaGbaGcaGdaFWaaaaaaaGeaGfaGgaGhawEaxIaxIaxIaxIazPaxIaxIaGiaGjayAaGkayAaGlaGmaGnaGoaGnaGnaGpaGqaGraGnaGsaGtaGtaGuaGtaGvaGtaGwaGxaGxaGyaGxaGxaGzaGxaGxaGxaGxaGAaBzaGBaGCaByaGDaGEaGFaFcaDnaFdaFeaDqaGGaFeaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGJaGKayQaAiaAjaAjaAjaGLaAjaAjaGMaAjaAjaApaGNauGavRatNaMsaGPaGPaGPaGPaGPaGPatNatNaGQaqpaqpaGRaqpaqpaxZaGSaGTaGUaGVaGVaGVaGVaGWaGXaGYaxZaGZaqpaHaaHbaHcaHdaHaamvamvamvamvavdavdavdaHeaHfavdavdaHgaHhaueaueawvaHiaHjaHkazJaueaueaHlaHmaHnaHoaGaaGaaGaaGaaGaaHpaHqaHmaHraGeaHsaGgaHtawEawEawEawEawEawEawEawEawEaGjaHuaHvaHwaHxaHyaHzaHAaHBaGnaHCaHDaHEaHFaHGaGtaHHaHIaGtaHJaGtaHKaHLaHMaHNaHOaHPaHQaHRaHSaHTaGxaHUaHVaHWaHXaHYaHZaIaaFcaFcaIbaByaFeaDqaIcaIdaGHaaaaaaaaaaaaaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGJayQayRayQayQaIeayTayQayQayRaGKaIfaqmaIgatNatHaIhaIiaIjaIkaIlaraaImatNaGQaPJaIoaIpaIqaIraIsaHaaItaHaaHaaHaaHaaHaaHaaHaaIuaIvaIwaIxaHaaHaaIyaIzaHaaHaaIAaHaaIBaICaIDaIEaIFaIEaIGaEoaIHaGaaIIaIJaGbaGcaGcaGcaFZaIKaILaIMaGaaINaIOaIPaIQaIRaISaITaIUaGaaGaaIVaIWaIXaIYaIXaIZaJaaJbaJcaGaaGaaGaayAaJdaJeaJfaJgaJgaJgaJhaJiaJjaJkaGnaJlaJmaHGaJnaJoaGtaJpaJqaJraJsaGtaGxaJtaHLaJuaJvaJwaJxaJyaJzaJAaGxaGAaBzaJBaJCaByaJDaFcaJEaFcaFcaByaFeaDqaIcaIdaGHaaaaaaaaaaaeaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatHavQaJFaxQaxQaxQaxQaJGavQatHaxSaqmaxTaJHawUaJIaJJaJKaJKaIiaraaJLatNaJMaInaJOaJPaJQaJRaJSaJTaJUaHaaHaaHaaHaaHaaHaaHaaIuaHaaIwaHaaHaaHaaJVaJWaHaaHaaHaaHaaJXaHaaHaaHaaItaHaaJYaEoaGaaGaaGaaGaaGaaGaaGaaGaaGaaGaaGaaIMaGaaJZaKaaKbaKcaKdaKeaKfaKgaGaaGaaIVaGaaGaaGaaGaaGaaGaaGaaGaaGaaKhaGaayAaKiaKjaKkaHvaKlaHvaKmaKnaJkaKoaGnaKpaKqaKraGnaGnaGtaKsaHIaKtaJsaKuaGtaGxaGxaKvaGxaGxaGxaKwaKxaKwaGxaGAaKyaKzaKAaByaByaByaByaKBaByaByaFeaDqaFeaKCaKDaaaaaaaaaaaaaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafawSaqmawUarVawUaKEaKFaKGaKHawUarVaKIaKJaqmavRatNawUaJIaJJaJKaJKaIiaraaKKatNaGQaInaJOaKLaKMaKNaKNaKNaKOaKPaKQaKNaKRaKNaKNaKSaKTaKUaKVaKNaKWaKXaKYaKZaLaaLbaLcaLdaLeaLdaLdaLfaJUaHaaJYaEoaGaaLgaGaaLhaLhaLhaLhaLhaLhaLhaLhaLiaLhaLhaLhaLhaLhaLjaLhaLhaLhaLhaLhaLkaLhaLhaLhaLhaLhaLhaLhaLhaGaaGaaLlayAaLmaLnaLmaLmaLmaLoaLpaKnaKnaJkaGnaGnaLqaGnaGnaLraGtaLsaHIaLtaLuaLvaGtaGxaLwaLxaLyaLzaLyaLyaLAaLBaGxaGAaLCaLDaLEaFeaFeaLFaFeaFeaFeaLGaFeaDqaLHaLIaLJaLKaLKaaaaaaaaaaaaaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaraauGavQauGavRatNatNavSauGavQauGaLLaLMatKatNauGaIiaIiaIjaIkaIlaraaLNatNaGQaLOaLOaLPaLQaLOaLRaLRaLRaLRaLRaLSaLTaLRaLRaLRaLRaLRaLUaLVaLWaLVaLXaLYaLZaLZaMaaLZaMbaMcaHaaItaHaaHaaMcaMcaEoaEoaGOaMdaHmaHmaMeaMeaMeaMeaMfaMgaMhaMiaMjaMkaMkaMlaMmaMkaMnaMoaMpaMgaMqaMeaMeaMeaMeaHmaHmaMraFnaEoaEoaGnaMuaMvaKnaKnaKnaKnaMwaMxaMyaKnaGnaMzaMAaMBaGtaGtaGtaGtaMCaGtaMDaGtaGtaGxaMEaMFaMGaMGaMGaMGaMHaMIaGxaMJaMKaMLaLIaMMaMNaMOaFeaFeaFeaMNaMOaMPaLIaLIaMQaMRaLKaMSaMTaMUaafaaaaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatHaMVatNaMWatKatNatNaMXaMWatNaMVatKaJNatNatNaMsaMYaMYaMYaMYaMYaMYatNatNaGQaLOaMZaNaaNbaNcaNdaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaNpaNqaNraNsaLXaNtaLZaNuaNvaNwaNxaMcaMcaNyaNzaMcaMcaMcaNAaGaaGbaNCaaaaaaaaaaaaaaaaaaaaaaMgaNDaNEaNFaNGaNHaNIaNHaNJaNKaNLaNMaMgaaaaaaaaaaaaaaaaaaaaaaNNaFZaGaaNOaNPaNQaMvaNRaKnaKnaKnaNRaKnaNSaJkaNTaKnaNUaNVaGtaNWaNXaNYaNZaOaaObaOcaOdaGtaLyaOeaOfaOfaOfaOfaOgaLyaGxaGAaFgaOhaLIaOiaOjaOkaOlaOlaOlaOjaOkaOmaLIaOnaOoaOpaOqaOraOsaOtaafaafaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaauGatNaOuatNatNatNatNatNatNaOuatNatNaJNatNatNaMsatNatNaOvatNaOwaOxaOyaOuaOzaLOaMZaOAaOBaLRaOCaNiaNiaNiaNiaNiaNjaODaNiaNiaNiaNoaLUaOEaOFaOGaLXaNtaLZaOHaOIaOJaOKaMcaOLaOMaONaOOaOPaOQaGaaGaaGbaNCaaaaaaaaaaaaaMgaMgaMgaMgaORaOSaOTaOUaOVaOWaOXaOYaOZaPaaPbaMgaMgaMgaMgaaaaaaaaaaaaaNNaFZaGaaGaaPcaKnaPdaPeaPfaKnaPgaPhaPfaNSaJkaPiaKnaPjaKnaPkaPlaPmaPnaPoaPpaPqaPraPlaPsaPtaPuaOfaPvaPwaOfaPxaLyaGxaHUaMKaPyaPzaFeaMNaMOaPAaPBaPAaMNaMOaDqaLIaPCaPDaOpaOpaOpaPEaPFaMTaMTaPGaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqmaqmaPHaPIaPIaPIaPIaPIaPIaPIaxaaqmarabVZbWJaPLaPLaPLaPMaPLaPLaPLaPNaPLaPNaLOaMZaPOaPPaLRaPQaNiaNiaPRaPSaPTaPUaPRaNiaNiaNiaPVaLUaOEaPWaPXaLXaPYaLZaLZaLZaLZaMbaMcaPZaQaaQbaONaQcaQdaGaaGaaGbaHqaMfaQeaMgaMgaMgaQfaQgaQhaQiaQjaQjaQkaQlaQjaQkaQlaQjaQmaQnaQoaQpaQqaMgaMgaMgaQeaHlaQraFZaGaaGaaGnaQsaMvaQtaKnaKnaKnaQtaKnaNSaJkaQuaQvaKnaQwaGtaPlaQxaQyaQzaQAaQBaQCaPlaQDaQEaQFaOfaQGaQHaOfaQIaQJaGxaGAaLCaQKaLIaQLaQMaQNaPBaPBaPBaQMaQNaQOaLIaQPaPDaOpaOpaOpaOpaQQaQRaQSaQTaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaafaQVawVauJatNaQWaQXaQYaQZaRaaRbaRcaRdaReaRfaRgaRhaRiaRjaLRaRkaNiaNiaPRaPTaRlaRmaPRaNiaNiaNiaNoaLUaLXaLXaRnaLXaRoaRpaRpaRqaRraRsaRtaRuaONaONaONaONaQdaGaaGaaGbaGcaRvaRwaRxaRyaMgaRzaOWaQjaRAaQjaQjaQjaQjaRBaQjaQjaQjaRCaRDaRDaREaRFaMgaRGaRxaRHaRIaGcaFZaGaaGaaPcaKnaMvaNRaKnaRJaKnaNRaKnaNSaJkaRKaKnaKnaKnaRLaPlaRMaRNaROaRPaRQaQCaRRaGtaLyaQFaRSaOfaOfaOfaQIaLyaGxaRTaFgaLIaLIaRUaRVaRWaRXaRXaRXaRYaRZaSaaSbaScaPDaOpaOpaOpaPEaSdaMTaMTaSeaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaSfaSgaShavRaSiaSjaSkaSlaSmaSnaSoaSpaSqaSlaSraSsaStaSuaSvaLRaSwaNiaSxaSyaSzaSzaSAaSzaSzaSzaSBaSCaSDaMZaSEaSFaRpaSGaSHaMZaSIaLOaSJaMcaSKaSLaSMaSNaSNaSOaGaaGaaGaaGaaGaaSPaSQaSRaSSaSTaSUaQjaSVaSWaSXaSYaSZaTaaTbaTcaTdaTeaTfaSTaTgaRDaSSaSRaThaTiaTjaGaaGaaGaaTkaGnaNQaPdaPhaPfaKnaPgaPeaPfaNSaJkaQuaQuaTlaTmaGtaPlaRMaPlaTnaPlaToaQCaTpaGtaMEaQFaOfaOfaOfaOfaQIaMIaGxaTqaTraTsaTtaFeaOjaPBaPBaPBaPBaPBaOkaDqaTuaTvaPDaOpaOpaOpaTwaOtaaaaafaafaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUavQarVavQatNaTxaPNaTyaTzaTAaTAaTAaTzaTBaTCaPLaTDaTEaTFaTGaTHaTHaTHaTIaTHaTJaTKaTLaTMaTNaTNaTOaNoaTPaTQaTRaTSaTTaTUaTVaTWaTXaTYaTZaUaaUbaUcaUcaUcaUdaMcaGaaGaaUeaUfaUgaUhaUiaUjaUkaUlaUmaUnaUoaMgaMgaMgaMgaMgaMgaUpaUqaUraUsaSWaUtaUuaMgaUjaUiaUvaUwaUfaLhaGaaGaaPcaKnaUxaQtaKnaKnaKnaQtaKnaNSaKnaJkaJkaKnaKnaUyaUzaUAaPlaPlaPlaUBaUCaUDaGtaUEaUFaOfaUGaUGaUHaUFaUIaGxaUJaUKaTsaTtaFeaMNaPBaPBaPBaPBaPBaMOaULaUMaUNaUOaUPaUQaUPaURaOtaafaafaaaaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaUSaUTaShavRaUUaUVaUWaUXaUWaUYaTzaTzaUZaTAaPLaVaaVbaTFaTGaVcaVdaVeaVfaTHaVgaVhaViaLRaVjaVkaVlaVmaLRaVnaVoaVpaVpaVpaVpaVqaVpaVraVsaVtaVsaVsaVuaVsaVvaVraGaaGaaVwaVxaVyaVyaVyaVyaVzaVAaVBaVAaVAaVCaVCaVCaVCaVCaVDaVEaVEaVFaVGaVHaVIaVHaVHaVHaVHaVHaQeaQeaLhaGaaVJaGnaVKaVLaVMaVNaKnaKnaKnaVOaVPaVQaKnaVRaVSaVTaGtaGtaGtaVUaVVaVVaVVaGtaGtaGtaVWaOfaOfaVXaVYaVZaWaaKwaGxaWbaUKaTsaLIaWcaOjaOkaPAaPBaPAaOjaOkaWdaFgaWeaOpaOpaOpaOpaWfaOtaaaaafaafaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaQUaafauGaWgatKatMaPNaWhaWhaWiaWjaWkaWiaWlaWhaPLaWmaWnaWoaWpaWqaWqaWraWsaWqaWtaVhaWuaLRaVjaVkaWvaWwaLRaVnaVoaVpaWxaWyaWyaWyaWzaVraWAaWBaWCaWDaVraVraVraVraGaaGaaUeaWEaWFaWGaWHaWIaWJaWKaWLaWMaVAaVCaWNaWOaWPaWQaWRaWSaWTaWUaVHaWVaWWaWXaWYaWZaXaaVHaXbaXbaHoaGaaGaaGnaGnaGnaGnaGnaXcaPcaXcaXdaXeaGnaNPaGnaGnaGnaXfaXgaXhaXgaXgaXgaXgaXiaXgaXfaKwaXjaXjaXkaXlaXlaXlaXlaXfaXmaXnaXoaXpaXqaXraXraXsaXraXraXraXraXtaXuaXvaOpaOpaOpaOpaXwaPFaMTaMTaSeaGIaGIaGIaGIaGIaGIaGIaGIaGIaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawSaqmaXxaxQaSharaaraaraaraaraaraaXyaXzaPNaPLaPLaPLaPLaPLaPLaPLaPLaPLaXAaMZaTFaTGaVcaXBaXCaXDaTHaXEaXFaXGaLRaVjaVkaXHaXIaLRaVnaVoaVpaWyaXJaXJaWyaXJaVraWAaXKaXLaXLaXMaXNaXOaVraXPaGaaUeaXQaXRaXSaXTaXTaXTaXTaXUaXVaVAaVCaXWaXXaXYaXZaWNaYaaYbaYcaYdaYeaWWaYfaYgaYhaYiaVHaYjaYkaFZaYlaGaaYmaYnaTsaTsaYoaTsaTsaTsaYoaTsaYpaTsaTsaYqaTsaYraTsaYsaTsaTsaTsaTsaTsaTsaYnaTsaTsaTsaTsaTsaTsaTsaTsaYtaYuaYvaYwaYxaYvaYvaYvaYyaYvaYvaYzaTsaYnaYAaOpaOpaOpaOpaOpaYBaQTaYCaQSaQTaGIaGIaGIaGIaGIaGIaGIaGIaGIaaadqLdqNdqOdqNdqOdqNdqMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaaaaafaYFawVauJaYGaYHaYIaYIaYIaYIaYIaYIaYJaYKaLOaSIaMZaTFaTGaTHaTHaYLaYMaTHaLRaLRaYNaLRaVjaYOaXHaYPaLRaVnaVoaVpaYQaYRaWyaXJaYSaVraYTaVraYUaXLaXLaYVaYWaVraGaaGaaYXaWEaYYaYZaXTaXTaZaaXTaXUaZbaVAaVCaZcaZdaZeaZeaZeaYaaZfaVCaZgaZhaWWaYfaZiaYeaZjaVHaXbaNNaZkaGaaGaaYmaYnaTsaTsaTsaTsaTsaTsaTsaTsaTsaTsaTsaZlaZmaZmaZnaZoaTsaTsaTsaTsaTsaTsaYnaTsaTsaTsaTsaTsaTsaTsaTsaTsaZpaTsaYsaTsaTsaTsaTsaTsaTsaTsaZqaTsaYnaYAaOpaOpaOpaOpaOpaZraSdaMTaMTaPGaGIaGIaGIaGIaGIaGIaGIaGIaGIaaadqHdqKdqJdqIdqJdqIdqHaafaZsagQagQaZsaafaZsagQagQaZsaafaZsagQagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaSfaSgaShavRaZtaZuaZvaZvaZwaZvaZvaZvaZxaLOaLOaLOaLOaTFaTGaVcaZyaZzaZAaTHaZBaZCaZDaLRaLRaLRaLRaZEaLRaVnaVoaVpaZFaWyaXJaZGaZHaVraWAaVraZIaXLaXLaZJaZKaVraZLaGaaZMaWEaZNaZOaZPaZQaYZaYZaZRaZSaVAaZTaZUaZVaZeaZWaZeaXXaZXaZYaZgaZZbaaaYeaYeaYebabbacaXbbadbaebafaGaaYmaYnaTsaTsaTsaTsaTsaTsaTsaTsaTsaTsbagbahaTsaTsbaibajaTsbagbakbalaTsaTsaYnbambanbanbanbanbanbanbaoaTsaZpaTsaYsaTsbapaTsbagaTsbaqaTsbaraTsaYnaYAaOpaOpaOpaOpbasaXwbataafaaaaafaGIaGIaGIaGIaGIaGIaGIaGIaGIaaadqUdqWdqJdqIdqJdqVdqOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEavQarVavQatNbauaZvbavbawbaxbaxbaybazbaAbaBbaBbaBbaBbaCbaDbaEbaEbaFbaGbaEbaHbaHbaIbaHbaJbaKaRhbaLbaKbaMbaNbaObaPbaQbaQbaRbaSbaTbaUbaVbaWaXLaXLaZJbaXbaYaZLaGabaZaWEaYZbbabbbbbcbbdaYZbbeaVAaVAaVCbbfbbgbbhbbibbjbbgbbkaVCaZgbblbbmbbnbbobbpbbqbbrbbsbbtbbuaGabbvbbwbbxbbybbybbybbybbybbzbbwbbAbbAbbwbbBbbCbbBbbBbbDbbEbbFbbFbbFbbFbbGbbFbbFbbHbbIbbJbbKbbKbbIbbJbbLbanbbMbanbbNbanbbObbPbbQbbQbbQbanbbRbanbbSbbTbbUbbVbbVbbWaLKbbXbbYaafaafaafaGIaGIaGIaGIaGIaGIaGIaGIaGIaaadqHdqTdqJdqIdqIdqIdqHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaUSaUTaShavRbbZaZvbcaaZvbcbbccaZvaZvaZvaMZbcdaSHaSHbceaTHaVcbcfaXCbcgaTHbchbciaRpaRpbcjbckbclbcmbcnbcobcpbcqbcrbcsbcrbctbcubcvbcwbcxbcyaXLaXLbczbcAbcBaZLaGabcCaWEbcDaYZbcEbcFaYZaYZbcGaVAaVAaVCbcHbcIbcJbcKbcLbcMbcNaVCaZgbcObcPbcQbcQbcRbcSaVHbcTbcTbcUaGaaGabcVbcWbcWbcXbcXbcXbcXbcXbbwbcWbcWbbwbcYbcZbdabbBbdbbdcbddbdebdfbdgbdgbdhbdibdjbdkbdlbdlbdlbdlbdmbbPbdnbdobdnbdpbdnbbPbbPbdqbdrbbQbdsbdtbdubbQbbQbdvbdwbdxbdvbdvbdybbYaafaaaaafaGIaGIaGIaGIaGIaGIaGIaGIaGIaaadqQdqNdqOdqRdqOdqNdqSaafaafbdzbdzbdzbdzbdzbdzbdzbdzaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawSaqmaXxaxQaSharaaraaraaraaraaraaXyaXzaPNaPLaPLaPLaPLaPLaPLaPLaPLaPLaXAaMZaTFaTGaVcaXBaXCaXDaTHaXEaXFaXGaLRaVjaVkaXHaXIaLRaVnaVoaVpaWyaXJaXJaWyaXJaVraWAaXKaXLaXLaXMaXNaXOaVraXPaGaaUeaXQaXRaXSaXTaXTaXTaXTaXUaXVaVAaVCaXWaXXaXYaXZaWNaYaaYbaYcaYdaYeaWWaYfaYgaYhaYiaVHaYjaYkaFZaYlaGaaYmaYnaTsaTsaYoaTsaTsaTsaYoaTsaYpaTsaTsaYqaTsaYraTsaYsaTsaTsaTsaTsaTsaTsaYnaTsaTsaTsaTsaTsaTsaTsaTsaYtaYuaYvaYwaYxaYvaYvaYvaYyaYvaYvaYzaTsaYnaYAaOpaOpaOpaOpaOpaYBaQTaYCaQSaQTaGIaGIaGIaGIaGIaGIaGIaGIaGIaaabDLbNZbVfbNZbVfbNZbKraafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaaaaafaYFawVauJaYGaYHaYIaYIaYIaYIaYIaYIaYJaYKaLOaSIaMZaTFaTGaTHaTHaYLaYMaTHaLRaLRaYNaLRaVjaYOaXHaYPaLRaVnaVoaVpaYQaYRaWyaXJaYSaVraYTaVraYUaXLaXLaYVaYWaVraGaaGaaYXaWEaYYaYZaXTaXTaZaaXTaXUaZbaVAaVCaZcaZdaZeaZeaZeaYaaZfaVCaZgaZhaWWaYfaZiaYeaZjaVHaXbaNNaZkaGaaGaaYmaYnaTsaTsaTsaTsaTsaTsaTsaTsaTsaTsaTsaZlaZmaZmaZnaZoaTsaTsaTsaTsaTsaTsaYnaTsaTsaTsaTsaTsaTsaTsaTsaTsaZpaTsaYsaTsaTsaTsaTsaTsaTsaTsaZqaTsaYnaYAaOpaOpaOpaOpaOpaZraSdaMTaMTaPGaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaPKbxEbtVaYDbtVaYDaPKaafaZsagQagQaZsaafaZsagQagQaZsaafaZsagQagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaSfaSgaShavRaZtaZuaZvaZvaZwaZvaZvaZvaZxaLOaLOaLOaLOdpJaTGaVcaZyaZzaZAaTHaZBaZCaZDaLRaLRaLRaLRaZEaLRaVnaVoaVpaZFaWyaXJaZGaZHaVraWAaVraZIaXLaXLaZJaZKaVraZLaGaaZMaWEaZNaZOaZPaZQaYZaYZaZRaZSaVAaZTaZUaZVaZeaZWaZeaXXaZXaZYaZgaZZbaaaYeaYeaYebabbacaXbbadbaebafaGaaYmaYnaTsaTsaTsaTsaTsaTsaTsaTsaTsaTsbagbahaTsaTsbaibajaTsbagbakbalaTsaTsaYnbambanbanbanbanbanbanbaoaTsaZpaTsaYsaTsbapaTsbagaTsbaqaTsbaraTsaYnaYAaOpaOpaOpaOpbasaXwbataafaaaaafaGIaGIaGIaGIaGIaGIaGIaGIaGIaaadpKdpMbtVaYDbtVdpLbVfaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEavQarVavQatNbauaZvbavbawbaxbaxbaybazbaAbaBbaBbaBbaBbaCbaDbaEbaEbaFbaGbaEbaHbaHbaIbaHbaJbaKaRhbaLbaKbaMbaNbaObaPbaQbaQbaRbaSbaTbaUbaVbaWaXLaXLaZJbaXbaYaZLaGabaZaWEaYZbbabbbbbcbbdaYZbbeaVAaVAaVCbbfbbgbbhbbibbjbbgbbkaVCaZgbblbbmbbnbbobbpbbqbbrbbsbbtbbuaGabbvbbwbbxbbybbybbybbybbybbzbbwbbAbbAbbwbbBbbCbbBbbBbbDbbEbbFbbFbbFbbFbbGbbFbbFbbHbbIbbJbbKbbKbbIbbJbbLbanbbMbanbbNbanbbObbPbbQbbQbbQbanbbRbanbbSbbTbbUbbVbbVbbWaLKbbXbbYaafaafaafaGIaGIaGIaGIaGIaGIaGIaGIaGIaaaaPKdpIbtVaYDaYDaYDaPKaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaUSaUTaShavRbbZaZvbcaaZvbcbbccaZvaZvaZvaMZbcdaSHaSHbceaTHaVcbcfaXCbcgaTHbchbciaRpaRpbcjbckbclbcmbcnbcobcpbcqbcrbcsbcrbctbcubcvbcwbcxbcyaXLaXLbczbcAbcBaZLaGabcCaWEbcDaYZbcEbcFaYZaYZbcGaVAaVAaVCbcHbcIbcJbcKbcLbcMbcNaVCaZgbcObcPbcQbcQbcRbcSaVHbcTbcTbcUaGaaGabcVbcWbcWbcXbcXbcXbcXbcXbbwbcWbcWbbwbcYbcZbdabbBbdbbdcbddbdebdfbdgbdgbdhbdibdjbdkbdlbdlbdlbdlbdmbbPbdnbdobdnbdpbdnbbPbbPbdqbdrbbQbdsbdtbdubbQbbQbdvbdwbdxbdvbdvbdybbYaafaaaaafaGIaGIaGIaGIaGIaGIaGIaGIaGIaaadprbNZbVfdpsbVfbNZdptaafaafbdzbdzbdzbdzbdzbdzbdzbdzaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYEaYEaYEaYEaYEaYEaYEaYEaYEaYEaaaaaaawUaWgatKbdAaZvbcaaZvbdBbdCbdDbdEaZvbdFaMZbdGaMZbdHaTHaTHaTHaTHaTHaTHbdIbdJbdKaMZbdLaVpbdMaVpbdNaVpaVpaVpaVpaVpbdObdNaVpbdPbdQbdRbdSaXLaXLaZJbdTbaYaZLaGaaUeaWEbdUbdVbdWbdXbbdbdYaZRaVAbdZbeabebbecaWNbedaWNbeebefbegbehbeibejbekbelbembenaVHbeobcTbepaMtaMtbeqberberbcXbesbcXbetbetbbwbcWbeubbwbevbewbexbbBbeybezbbFbeAbdgbeAbdgbeAbeBbdjbeCbdlbeDbdlbdlbeEbbPbeFbeGbeHbeIbeFbeJbbPbeKbeLbeMbeNbeObeNbePbbQbeQbeRbeSbeTbdvbdybbYaafaaaaafaGIaGIaGIaGIaGIaGIaGIaGIaGIaafbeUbeVbeWbeXbeYbeZbdzbdzbdzbdzbfabfbbfcbfdbfebfcbdzaafaaaaaaaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawSaqmaXxaxQaUTaPIaPIaPIaPIbffavRatNatNaZvbfgbfhbfibdDbfjbfkbflbfmbfmbfmbfmbfnbfobfobfobcobcobcobfpbfqbfqbfqbfraVpbfsbftbfubfvbfwbfxbfybfxbfxbfzbfAbfBbfCbfDbfEbfFbfGbfHbaTbaTbfIbfJbfKbfLbfMbfMbfMbfMbfMbfNbfObfPbfLbegbegbegbegbfQbegbegbegbegbfRaYdbfSaVHaZgbfTaVHaVHbcTbcTbfUaGaaGabfVbfWbfWbfXbcXbcXbcXbfYbbwbcWbcWbbwbfZbewbgabbBbgbbezbbFbeAbdgbeAbdgbeAbgcbdjbgdbgebgfbgfbgfbgfbggbghbgibgjbgkbglbgmbggbgnbgobgpbgqbgrbeNbgsbbQbgtbeRbgubgvbdvbdybbYbbYaafaafajmaGIaGIaGIaGIaGIaGIaGIajmaafbgwbgxbgxbgybgxbeZbgzbgAbgzbdzbgBbgCbgDbgDbgDbgDbdzaafaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgEbgFarVavQatIatIatKatNatNaZvbgGbgHbdDbgIaZvaZvaZvaLObgJbgKbgLbgMbgLbgLbgLbgMbgLaLOaLOaVpaVpaVpbgNaVpbgObfxbgPbfxbfxbfxbgQbgRbgSbgSbgTbgUbgVbgWbgWbgWbgXbgYbgZbhabhbbhcbhdbhebhfbhfbhgbhhbhibhjbhkbhjbhlbhmbhnbhobhpbhqbhrbhobhsbhmbhtbhubhvbhwbhxbhybhzbhAbhAbhBbfUaGaaGabhCbhDbhDbcXbhEbcWbhFbcXbhGbcXbhHbbwbhIbhJbhKbbBbhLbezbbFbeAbdgbeAbdgbeAbeBbdjbhMbhNbhObhPbdlbhQbhRbhSbhTbhTbhUbhVbhWbhXbhYbhZbiabibbicbeNbidbbQbiebifbgubigbihbdybiibbYaaaaafajmajmajmajmajmajmajmajmajmaafbijbgxbikbilbgxbeZbimbgzbinbdzbiobgCbipbiqbgDbirbdzaafaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9133,32 +9125,32 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaeaaaaaaaaabiubiubiubiubiubiubiuboEboFboEboGboHbfxbfxbfxbfxbfxbjUbjVboIblAboJbfxbfxbfxbfxboKbjXboLbfxboMboNboOboPboQboRboSboTboUboUboUboVboWboUboXboYboZbpabpbbpcbpdblJbpdbnubpebpfbpfbkubpgbphbpibpjbpkbnybplbpmbpnaGaaGabpobcWbcWbppbcXbpqbprbpsbptbpubpvbbwbpwbpxbpybbwbpzbpAbpBbpCbnLbpDbpEbpFbpGbgfbpHbpIbgfbpJbgfbgfbgfbpKbpLbpMbpNbpObpPbpMbpQbpRbpSbpTbpUbpVbpWbpXbpXbpYbpZbpXbqabqbbqcbqdbqebqfbqcbqgbqhbqibqjbqkbqjbqlbqjbqkbqjbqmbqjbqkbqjbqnbqjbqkbqobqpbqqbqrbqsbqtbqubqvbdzbdzaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiubiubiubqwblsbqxbqybfxbfxbfxbfxbfxbfxbjUbfxbfxaVpbqzbfxbfxbfxbfxbqAblAbfxbfxbkcbfxblzbjXaZLaGabqBbkgbqCbnnbnnbnnbnnbnnbqDbqEbqFbqGbqHbqIbnvbqJbqKbqLbqMbqNbqObkubqPbphbqQbqRbpkbnybqSbqTbpnaGaaGabqUbbwbbwbbwbqVbqWbqVbbwbbwbbwbbwbbwbbwbbwbbwbbwbqXbqYbqZbrabrbbrbbrcbrdbrebrfbrgbrhbribrjbrkbrkbrlbrmbrnbbPbrobrpbrqbbPbrrbrsbrtbkZbrubrvbrwbrxbrxbrybrybrybrzbrzbrzbrzbrzbrwbrwbrwbrAbrBbrCbeVbeWbjEbrCbeVbeWbjEbrCbeVbeWbjEbrCbeVbeWbdzbdzbdzbdzbdzbdzbdzbdzaafaaaaaaaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiubiubiuboEboFboEbnhbrDbfxbfxbfxbfxbrDbjUbfxbfxbrEbrFbfxbfxbfxbfxbfxbrGbfxbfxbkcbfxblzbjSaZLaGaaNObkgbrHbrIbrJbrKbrLbrLbrMbqEbrNbrObrPbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZbnybsabsabnybnybsbbscbpnaGaaGabqUbsdbsebsfbsfbsgbcXbshbbwbsibsibsjbskbslbslbsmbsnbkHbdjbsobspbsqbsrbssbstbnSbsubdjbsvbswbsxbsybszbsAbsBbbPbbPbbPbbPbbPbkZbkZbkZbkZbsCbsDbrybrybrybrybsEbsFbsFbsGbsHbsIbrzaafaafbjDbsJbjDaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiubiubiubsKbsLbsKbsMbsMbsMbsMbsMbsNbsMbsObsPbsQbsRbsSbsTbsUbsVbsWbfxbsXbsYboObsZbtablzblAbtbaMtaMtbkgbrHbrIbtcbtdbtebtfbtgbqEbthbtibtjbtkbtlbtmbtnbtobtpbtqbtrbkubtsbttbtubtvbtwbtxbtybtzbtAbtBbtCbtDbtEbtFbcXbtGbtGbcXbcXbbwbtHbtHbtHbslbtIbslbsmbtJbkHbtKbtKbtKbtKbtLbtKbtMbtNbtMbtObtObtPbtQbtObtObtRbtSbtTbtUbtVbtWbtXbtYbtZbuabubbucbudbrybuebufbugbsEbsFbsFbsGbsHbsIbrzaafaafblfbsJblfaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiubiubiubsKbsLbsKbsMbsMbsMbsMbsMbsNbsMbsObsPbsQbsRbsSbsTbsUbsVbsWbfxbsXbsYboObsZbtablzblAbtbaMtaMtbkgbrHbrIbtcbtdbtebtfbtgbqEbthbtibtjbtkbtlbtmbtnbtobtpbtqbtrbkubtsbttbtubtvbtwbtxbtybtzbtAbtBbtCbtDbtEbtFbcXbtGbtGbcXbcXbbwbtHbtHbtHbslbtIbslbsmbtJbkHbtKbtKbtKbtKbtLbtKbtMbtNbtMbtObtObtPbtQbtObtObtRbtSbtTbtUdpqbtWbtXbtYbtZbuabubbucbudbrybuebufbugbsEbsFbsFbsGbsHbsIbrzaafaafblfbsJblfaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiubiubiubuhbuibujbukbulblsblsblsblsbumaVpaVpaVpaVpbunaVpbuobupbuqburbusbutbuubuvbuwbuqbuqbuxbuybuybkgbkgbkgbuzbuAbuBbuBbuBbuCbuDbuEbuFbuDbuGbuHbuIbuJbuKbuKbuKbuLbuMbkwbkwbuNbuObuPbkwbkxbuQbuybuybqUbuRbuSbuTbuUbuVbuWbcXbbwbuXbtHbsibtHbslbslbuYbuZbvabvbbvcbvdbvebvfbvgbstbnSbstbvhbvibvjbvkbvlbtObvmbvnbtTbtUbvobvpbvqbvrbvsbvtbvubvvbvwbvxbvybvzbvAbvAbvBbvAbvCbvDbvEbrzaafaafblfbsJblfaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiubiubiuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvFbvGbvHbvIbvJbvKbvLbvMbvNbvObvPbvQbvRbvSbuqbvTbvUbvUbvUbvVbvWbvUbvXbvUbvUbvUbvUbvYbvZbvWbwabwbbwcbwdbwebwfbvUbwgbwhbvUbvUbvUbwibvUbvUbvUbwjbwkbvUbvUbwlbwmbwnbuTbuUbuUbuWbwobbwbtHbtHbtHbtHbtHbwpbsmbwqbkHbwrbwsbwtbwubwvbwwbstbnSbstbwxbwybwzbwAbwBbvhbwCbwDbwEbwFbwGbwHbwHbwHbwIbwJbubbsCbwKbrybrybwLbwMbwNbwNbwNbwObwNbwPbrzaafaafblfbsJblfaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiubiubiuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvFbwQbwRbwRbwSbwTbwUbvMbvMbwVbwWbwXbwYbwZbuqbxabxbbvUbvUbvUbvWbvUbvUbvUbvUbvUbvUbvUbvZbvWbvUbxcbxdbxebvUbvUbvUbvUbwhbvUbvUbvUbwibvUbvUbxfbxgbwkbxhbxibxjbxkbxlbcXbxmbxnbcXbcXbbwbxobxpbxqbxrbxsbxtbsmbwqbxubtLbxvbxwbxxbxybxzbxAbxBbstbwxbwybxCbxDbxEbxFbxGbxHbxIbxJbxKbxLbxMbxNbxObxPbubbxQbxRbxSbxTbxUbxVbxWbxXbxYbxZbyabybbrzaafaafblfbsJblfaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvFbvFbvFbvFbwSbwTbycbydbvMbyebyfbygbyhbyibuqbvTbvTbvTbvTbvTbyjbykbykbykbykbykbykbylbymbynbyobypbypbypbypbypbyqbypbyrbysbypbypbytbvUbyubyvbywbyxbvUbvUbqUbbwbyybbwbbwbbwbbwbbwbbwbsmbyzbsmbsmbsmbsmbsmbwqbyAbtLbyBbyCbyDbyEbyFbstbnSbstbyGbwybyHbyHbyIbtUbubbyJbyKbtUbyLbyMbyNbtYbtZbuabubbyObyPbyQbrybyRbySbyTbyUbyVbyWbyabybbrzaafaafbyXbsJbyXaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabvFbyYbwSbwTbuqbuqbyZbzabzbbzbbzcbuqbuqbzdbzebzfbzgbzgbzhbzibzjbzjbzkbzlbzmbzjbzjbznbzobzpbzpbzpbzqbzrbzrbzrbzsbztbzrbzrbzrbzrbzubzvbyAbzwbzxbzybbDbzzbzAbzBbzCbzCbzBbzDbzEbzFbzGbzHbzubzIbzJbzKbwqbzLbtLbzMbzNbyEbzObvgbstbzPbzQbzRbzSbzTbzUbzVbtUbzWbzXbzYbzZbAabzYbAbbAcbAcbAcbAdbAebAfbAgbAgbAgbAgbAgbAgbAhbAibAhbAhbAhbAhaafbbYbAjbbYaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbAkbAlbAlbAmbAnbAnbAobAobAobAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiubiubiuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvFbwQbwRbwRbwSbwTbwUbvMbvMbwVbwWbwXbwYbwZbuqbxabxbbvUbvUbvUbvWbvUbvUbvUbvUbvUbvUbvUbvZbvWbvUbxcbxdbxebvUbvUbvUbvUbwhbvUbvUbvUbwibvUbvUbxfbxgbwkbxhbxibxjbxkbxlbcXbxmbxnbcXbcXbbwbxobxpbxqbxrbxsbxtbsmbwqbxubtLbxvbxwbxxbxybxzbxAbxBbstbwxbwybxCbxDdpbbxFbxGbxHbxIbxJbxKbxLbxMbxNbxObxPbubbxQbxRbxSbxTbxUbxVbxWbxXbxYbxZbyabybbrzaafaafblfbsJblfaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiubiubiubiubiuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvFbvFbvFbvFbwSbwTbycbydbvMbyebyfbygbyhbyibuqbvTbvTbvTbvTbvTbyjbykbykbykbykbykbykbylbymbynbyobypbypbypbypbypbyqbypbyrbysbypbypbytbvUbyubyvbywbyxbvUbvUbqUbbwbyybbwbbwbbwbbwbbwbbwbsmbyzbsmbsmbsmbsmbsmdpcbyAbtLbyBbyCbyDbyEbyFbstbnSbstbyGbwybyHbyHbyIbtUbubbyJbyKbtUbyLbyMbyNbtYbtZbuabubbyObyPbyQbrybyRbySbyTbyUbyVbyWbyabybbrzaafaafbyXbsJbyXaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabvFbyYbwSbwTbuqbuqbyZbzabzbbzbbzcbuqbuqbzdbzebzfbzgbzgbzhbzibzjbzjbzkbzlbzmbzjbzjbznbzobuybuybuybzqbzrbzrbzrbzsbztbzrbzrbzrbzrbzubzvbyAbzwbzxbzybbDbzzbzAbzBbzCbzCbzBbzDbzEbzFbzGbzHbzubzIbzJbzKbwqbzLbtLbzMbzNbyEbzObvgbstbzPbzQbzRbzSbzTbzUbzVbtUbzWbzXbzYbzZbAabzYbAbbAcbAcbAcbAdbAebAfbAgbAgbAgbAgbAgbAgbAhbAibAhbAhbAhbAhaafbbYbAjbbYaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbAkbAlbAlbAmbAnbAnbAobAobAobAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabvFbwRbwSbApbAqbArbAsbAtbAubAvbAwbuqaaaaaaaaabAxbAybAzbAAaaaaafaaabABbACbADaaaaafaaabAEbAFbvUbvUbzxbzrbAGbAHbAIbAJbAKbALbAMbANbAObAPbAQbARbARbARbASbATbAUbAVbAWbAXbAYbAZbBabBbbAWbAWbAWbBcbBdbBebwqbkHbtLbtKbBfbyEbBgbBhbstbdlbdlbBibBjbBkbBlbBmbtUbBnbBobBpbBpbBqbBrbwHbBsbwHbwHbBtbsCbBubAgbBvbBwbBxbBybBzbBAbBBbBAbBCbBDbBEaafbbYbsJbjDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbBFbBGbBHbBGbAnbAobAobBIbBJbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbvFbvFbvFbBKbBLbBMbuqbBNbBObBPbBQbBRbuqaaaaaaaaabAxbAybBSbBTaafbBUbBUbBUbBVbBUbBUbBUaafbBWbAFbvUbvUbzwbzrbBXbBYbBZbCabCbbCcbzrbzrbCdbCebCfbCgbChbzBbzBbCibCjbkHbzubzubzubzubCkbClbzCbzCbzCbCmbzIbCnbwqbpAbCobCpbCqbCrbCsbwwbstbdlbCtbtObtObtObtObtObtUbCubCvbyNbtYbtUbCwbCxbubbCybCzbubbCAbCBbCCbCDbCEbCFbCGbCEbCHbCIbCJbCKbCKbBEaafbbYbsJblfaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagbCLbBGbBGbCMbAobAobBIbBIbCNbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaabCObCPbCQbCPbCRaaaaaaaaaaaabvFbAybCSbCTbCUbCVbuqbCWbCXbuqbCYbCZbuqbDabDbbDbbDcbAybDdbBTaaabBUbDebDfbDgbDhbDibBUaaabBWbAFbvUbvUbzybzrbDjbDkbDlbDmbDnbDobDpbAYbDqbDrbDsbDtbDubAWbAYbDvbDwbDxbzuaafaafbDybDzbzubzubzubzubDAbDBbDCbDDbDEbtLbtKbtKbtKbtKbtKbDFbdlbDGbDHbDIbDJbDJbDKbubbDLbCvbDMbDNbtUbDObDObDObDObDObDObsCbDPbDQbDRbDSbDTbDUbDVbBAbDWbBAbDXbCKbBEaafbbYbsJbyXaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabDYbAobCLbAobAobBIbBIbBIbBIbBIbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbvFbvFbvFbBKbBLbBMbuqbBNbBObBPbBQbBRbuqaaaaaaaaabAxbAybBSbBTaafbBUbBUbBUbBVbBUbBUbBUaafbBWbAFbvUbvUbzwbzrbBXbBYbBZbCabCbbCcbzrbzrbCdbCebCfbCgbChdpobzBbCibCjbkHbzubzubzubzubCkbClbzCbzCdpnbCmbzIbCnbwqbpAbCobCpbCqbCrbCsbwwbstbdlbCtbtObtObtObtObtObtUbCubCvbyNbtYbtUbCwbCxbubbCybCzbubbCAbCBbCCbCDbCEbCFbCGbCEbCHbCIbCJbCKbCKbBEaafbbYbsJblfaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagbCLbBGbBGbCMbAobAobBIbBIbCNbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaabCObCPbCQbCPbCRaaaaaaaaaaaabvFbAybCSbCTbCUbCVbuqbCWbCXbuqbCYbCZbuqbDabDbbDbbDcbAybDdbBTaaabBUbDebDfbDgbDhbDibBUaaabBWbAFbvUbvUbzybzrbDjbDkbDlbDmbDnbDobDpbAYbDqbDrbDsbDtbDubAWbAYbDvbDwbDxbzuaafaafbDybDzbzubzubzubzubDAbDBbDCbDDbDEbtLbtKbtKbtKbtKbtKbDFbdlbDGbDHbDIbDJbDJbDKbubdppbCvbDMbDNbtUbDObDObDObDObDObDObsCbDPbDQbDRbDSbDTbDUbDVbBAbDWbBAbDXbCKbBEaafbbYbsJbyXaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabDYbAobCLbAobAobBIbBIbBIbBIbBIbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablqblqblqblqblqblqblqblqblqblqblqblqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbEabEbbEbbDZbEcbDbbEdbvFbvFbEebEfbEfbEgbEhbEibEjbEkbElbEmbEnbEobEpbEqbErbEsbEtbEubEvaafbBUbEwbExbDgbDhbEybBUaafbBWbAFbvUbEzbzqbzrbzrbEAbzrbzrbEBbzrbzrbzIbECbEDbEEbEFbzubzubEGbEHbEIbEJbzuaafaafbEKaafaafbELbEMbELbzIbzIbENbEObEPbEQbERbESbETbEUbdjbEVbdlbdlbDHbEWbEXbEXbEYbubbEZbFabyNbFbbtUbFcbFdbFebFfbFgbFhbFibFjbFkbFlbFmbFnbFobFpbFqbFrbAhbAhbAhbAhbAhbbYbFsbbYbAhbAhbAhbAhbAhaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbAnbAobFtbFubFubBIbBIbBIbBIbBIbBIbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCQbFvbFvbEbbCQbFwbFxbFybvFbFzbAybAybAybAybAybFAbAybFBbFCbFDbFEbFFbFGbFHbFIbFJbFKbDdbFLaaabBUbFMbExbFNbDhbFObBUaaabBWbFPbFQbFRbFSbFTbFUbFVbzCbzCbzCbzCbzCbzCbFWbzCbFXbFYbzuaaaaaabhtbFZaaaaaaaaaaaabEKaaaaaabzubzubzubzubzubzubzubEPbGabGbbgfbGcbGdbGebGfbGgbdlbGhbGibGjbGkbGlbubbGmbGnbGmbtUbtUbGobGpbGqbGrbGrbGsbGtbgubGubGvbGwbGxbGybGybGzbGzbGAbGBbGzbGCbGDbGEbGFbGGbGHbGIbGJbGKbGLaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabAobAobGMbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbEbbEbbEbbGNbGObAybAybGPbAybAybAybAybFAbAybAybAybGQbvFbvFbvFbvFbvFbGRbGSbGTbGUbGVbGWbGXbGYbGZbHabHbbHcbHdbGYbGXbHebHfbHgbHhbHibHjbHibHibHkbHlbHmbHnbzHbzIbzIbHobHpbHqbARbHrbHrbHsbHtbHubHubHubHubHvbHubHubHubHubHubHubHubHubHwbHxbHybHzbdlbdlbHAbnObdlbHBbHCbxzbHDbHEbHDbHFbHGbGibGibHHbDObHIbHJbHKbHLbHMbHNbHObHPbgubHQbHRbHRbHRbHRbHRbCEbCEbCEbCEbCEbHSbHTbHUbHVbHWbGHbCEbHXbGKbHYaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbAobBIbBIbBIbBIbBIbBIbHZbBIbIabBIbBIbBIbBIbBIbAobAoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCQbFvbFvbFvbCQbIbbIcbIdbvFbIebAybIfbAybAybAybAybAybIgbvFbIhbIibIibIjbIkbIlbImbInbIobBUaaabBUbIpbBUbBUbBUbBUbBUaaabIqbIrbIsbItbHlbIubIvbIwbIxbIybIybIybIybIybIybIzbIAbIybIybIBbICbIDbIEbIEbIEbIEbIFbEKaaaaaaaaaaaaaaaaafaafaafbjDbIGbIHbIIbIJbIKbILbIMbIKbINbIJbIObIPbIQbIRbISbITbGibIUbIVbDObIWbGrbGrbIXbIYbIZbJabJbbJcbAgbJdbJdbJdbJebJfbJgbJhbJibJjbJkbAhbAhbbYbFsbbYbAhbJlbJmbJnbAhaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaafaaaaaabAobJobJobJobJobJobJobJpbBIbJqbJobIabBIbBIbBIbBIbAoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbJrbJsbJtbDZbJubDbbEdbvFbvFbJvbJwbJxbJybJzbJAbJAbJAbvFbJBbJCbJDbJEbJFbJGbJHbJIbJEbBUaaaaafbJJbJKbJLbJMbJNbJObJObJPbJQbJRbJSbHlbIubIvbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnaaaaaaaaaaaeaaaaafaaaaaablfbKobEQbKpbKqbdlbKrbKsbdlbKtbKqbGhbGibKubKvbKwbKxbKybGibHHbDObKzbKAbGrbKBbKCbKDbDObGtbKEbKFbKFbKFbKFbKFbKFbKFbKFbKFbKFbKGbKHbKIbKJbKKbKLbAhbKMbKNbKObKPaagaagaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKQbBGbBGbBGbBGbBGbBGbBGbKRbBJbBIbBIbBIbBIbKSbBJbAoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbJrbJsbJtbDZbJubDbbEdbvFbvFbJvbJwbJxbJybJzbJAbJAbJAbvFbJBbJCbJDbJEbJFbJGbJHbJIbJEbBUaaaaafbJJbJKbJLbJMbJNbJObJObJPbJQbJRbJSbHlbIubIvbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnaaaaaaaaaaaeaaaaafaaaaaablfbKobEQbKpbKqbdldoZbKsbdlbKtbKqbGhbGibKubKvbKwbKxbKybGibHHbDObKzbKAbGrbKBbKCbKDbDObGtbKEbKFbKFbKFbKFbKFbKFbKFbKFbKFbKFbKGbKHbKIbKJbKKbKLbAhbKMbKNbKObKPaagaagaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKQbBGbBGbBGbBGbBGbBGbBGbKRbBJbBIbBIbBIbBIbKSbBJbAoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKTbCPbKUbCPbKVaaaaafaaaaafbvFbvFbKWbKXbKXbKXbKXbKYbvFbvFbKZbLabLbbJEbLcbLdbLebLfbLgbLhbLibLibLjbLkbLlbLibLmbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbJVbLxbLybLzbLzbLybLAbKcbLBbLCbLDbLAbLzbLEbLzbLFbLGbLHaafbLIbLIbLIbLIbLIaafaaaaaablfbKobEQbLJbLKbdlbdlbLLbdlbKtbLMbDHbLNbLObLObLPbKxbGibLQbHHbDObLRbLSbLTbLUbLVbLWbLRbLXbLYbLZbMabMbbMcbMdbMebMfbMgbMhbMibMjbKHbjCbsJbbYbbYbAhbAhbAhbAhbAhaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabAobFubFubFubFubFubFubMkbBIbFtbFubMlbBIbBIbBIbBIbAoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaafaafaaaaafaaaaaaaaaaafbJEbLcbMmbJEbJIbJEbBUbBUbBUbJMbMnbMobJMbJMbMpbMqbMrbMsbMtbMubMvbMwbMxbLzbMybMzbLzbLzbLzbLzbMAbMBbMCbMDbLCbMEbLzbMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbLIaafaafaafblfbKobEQbMQbMRbMSbMTbdjbdlbKtbKqbMUbMUbMUbMUbMUbMVbMWbMUbMUbMUbLRbMXbMYbMZbNabNbbLRbGtbNcbNdbNebNfbNgbNfbNfbNhbNibMibNibMibKHbNjbsJbNkaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbAobBIbBIbBIbBIbBIbBIbHZbBIbMlbBIbBIbBIbBIbBIbAobAoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaaafaaaaaaaaaaafbJEbLcbNlbNmbNnbNmbNmbNobzhbNpbNqbNrbNsbNtbMpbNubNvbvUbMtbNwbNxbNybNzbLzbNAbJVbNBbLzbLzbLzbNCbLzbLzbLzbNDbKfbNEbNFbNGbNHbNIbNJbNKaafbNLbNMbMPbNNbLIaafaaaaaabNObKobEQbdjbdjbdjbdjbdjbyFbNPbNQbMUbNRbNSbNTbNUbNVbNWbNXbNYbNZbLRbOabObbOcbObbOabLRbGtbvwbOdbOebOfbNfbNfbOgbNdbOhbOibOibOjbKHbKHbsJbOkaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabAobAobGMbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaaafaaaaaaaaaaafbJEbLcbNlbNmbNnbNmbNmbNobzhbNpbNqbNrbNsbNtbMpbNubNvbvUbMtbNwbNxbNybNzbLzbNAbJVbNBbLzbLzbLzbNCbLzbLzbLzbNDbKfbNEbNFbNGbNHbNIbNJbNKaafbNLbNMbMPbNNbLIaafaaaaaabNObKobEQbdjbdjbdjbdjbdjbyFbNPbNQbMUbNRbNSbNTbNUbNVbNWbNXbNYdpabLRbOabObbOcbObbOabLRbGtbvwbOdbOebOfbNfbNfbOgbNdbOhbOibOibOjbKHbKHbsJbOkaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabAobAobGMbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaafaafaafbJEbLcbOlbOmbOnbOobOobOpbOqbOqbOrbOsbIibIibOtbOubNvbzpbOvbOwbHlbHlbNzbLzbOxbJVbOybOzbOAbLzbNCbOBbOCbOCbODbOEbMFbOFbOGbOHbOIbOJbOKbOLbMMbOMbMPbMPbLIaafaaaaaabbYbKobONbOObOPbOQbORbOSbOTbOUbOVbOWbOXbOYbOZbPabPbbPcbPdbPebPfbLRbPgbPhbPibPjbPkbLRbPlbxRbLZbPmbPnbPobPobPobPpbPobPqbPrbPsbPtbKHbsJbbYbbYaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbAnbAobJqbJobJobBIbBIbBIbBIbBIbBIbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaafaafaaaaaaaaabPubLcbPvbJEbJEbJEbOtbOtbOtbOtbOtbPwbOtbOtbOtbPxbPybvUbMtbvUbPzbPAbNzbKlbPBbPCbHlbHlbHlbHlbPDbPEbPFbLzbPGbPHbPIbPJbPKbPLbPMbPLbPNaafbLIbLIbLIbLIbLIaafaafaafbjDbPObpBbIJbPPbPQbdlbPRbmsbPSbPTbPUbPVbPWbPXbPYbPZbQabQbbQabQcbLRbQdbQebQfbQgbQdbLRbQhbQibNdbQjbQkbQlbQmbQlbQnbQlbQobQpbQpbQqbQrbQsbQtbbYbbYbbYaaaaaaaafaaaaaaaafagQagQagQaaaaaaaaaaafaaaaaaaafaaaaaaaafaaaaaabDYbAobCLbAobAobBIbBIbBIbBIbBIbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaaabQubLcbPvbJEaafaaabOtbQvbQwbQxbQybQzbQAbQBbOtbOtbQCbQDbJRbvUbPzbQEbQFbMwbQGbQHbQIbQJbQKbHlbQLbPEbLzbQMbLGbQNbQObQPbQQbQRbQSbQTbQUbMLbMMbQVbQWbQWbLIaafaaaaaablfbKobdjbQXbEQbdjbdjbdjbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibRjbRkbLRbLRbLRbLRbLRbLRbLRbRlbRmbNdbRnbRobRpbRqbRrbRsbRtbRubRvbRwbRxbKHbRybRzbRAbRBbRCbRDbREbREbREbREbREbREbREbREbREbREbREbREbREbREbREbREbREbREbREbRFbRGbRHbRHbRIbAobAobBIbBIbRJbBIbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabJEbJEbJEbJEbJEbLcbRKbRLbRMbRNbRObRPbRQbRRbRSbRTbQBbQBbRUbRVbRWbvUbMtbvUbRXbRYbLGbLGbRZbSabSbbLGbScbSdbSebSfbLGbSgbShbSibSjbSkbLzbSlbSmbSnbNKaafbNLbSobSpbSqbLIaafaaaaaablfbKobdjbSrbSsbStbSubSvbdlbQZbSwbMUbSxbSybPXbSzbSAbSBbSCbSDbRkbSEbSFbSGbSHbSIbSJbSKbSLbSMbNdbSNbSObSPbSQbSRbSSbSTbSUbSQbSVbSNbKHbSWbSXbbYbSYbbYaaaaaabSZaaaaaaaafagQagQagQaaaaaaaaaaafaaaaaaaafaaaaaaaafaafaafbTabTbbBGbCMbAnbAobAobBIbBJbBIbAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaabPubTcbTdbTebTfbTgbThbTfbTibTjbTkbTlbQBbQBbQBbQBbQBbQBbRUbRVbRWbvUbMtbvUbTmbTnbOCbTobOCbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbLzbSlbTCbTDbTEbOLbMMbTFbQWbQWbLIaafaafaafblfbKobdjbTGbTHbTIbTJbTKbdlbQZbTLbMUbMUbMUbMVbMUbMUbTMbMUbMUbRkbTNbTObTNbTPbTQbTRbTSbTSbTTbNdbNdbKHbTUbTVbTVbTVbTWbTVbTXbKHbKHbKHbTYbTZbUabUbaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbUcbAlbAlbAmbAnbAnbAobAobAobAobAoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaabQubUdbUebUfbIibIibJEbKZbUgbLbbOtbUhbQBbQxbQxbQxbQBbUibOtbOtbQCbUjbMtbvUbTmbUkbUlbHlbUmbQHbUnbUobUpbHlbUqbUrbHlbHlbHlbUsbLzbUtbLzbSlbSmbUubNKaafbLIbLIbLIbLIbLIaafaaaaaabNObKobdjbdjbdjbdjbdjbdjbUvbUwbdlbsybUxbUybUzbUAbUBbUCbUDbUEbRkbUFbTNbUGbTPbUHbUIbUJbUJbUKbULbUMbKHbUNbUObTVbUPbUQbUObTVbKHbURbUSbUTbUUbbYaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaabJEbJEbJEbJEbIibUfbIibIibJEaaabUVaaabOtbUWbQBbRRbRSbRTbQBbQBbQBbQBbUXbvUbMtbUYbzqbHlbHlbHlbUZbVabVbbVcbVdbJVbNCbPEbVebHlbVfbTBbLzbTzbVgbVhbVibVjbQUbMLbMMbVkbVlbVmbLIaafaaaaaabbYbVnbVobVobVobVobVpbdjbVqbQZbdlbdlbVrbQabVsbQabQabVtbQabVubRkbVvbVwbVxbVybVzbVwbVAbVBbVCbVDbVDbKHbTVbVEbTVbTVbTVbVEbTVbKHbSWbbYbVFbVGbbYaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaabJEbVHbVIbVJbVJbVKbVLbVMbVLaaabUVaaabOtbVNbQBbQBbQBbVObQBbVPbVQbQBbVRbVSbLqbVSbVTbVUbVVbVUbVWbVXbVYbMybLzbJVbNCbPEbVebHlbVfbVZbLzbTzbVgbSlbSmbWabNKaafbNLbWbbWcbWdbLIaafaafaafbbYbbYbWebWfbVGbbYbWgbpBbPQbWhbWibWjbUxbWkbWkbWlbWkbQabWmbWnbRkbWobVwbVwbWpbVwbVwbWqbWrbWsbWtbWubKHbKHbKHbKHbKHbKHbKHbKHbKHbSWbbYaafaafaafaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaeaaaaaaaaaaaabWvbIibWwbVLbVLbWxbVLbWybVLbVLbWzbWAbVLbVLbWBbWCbWDbVLbWEbVLbVLbOtbQCbWFbMtbvUbzpbvUbRWbWGbNwbMzbLAbWHbWIbMzbNCbPEbVebHlbVfbWJbLzbWKbVgbSlbWLbWMbTEbOLbMMbWNbVlbVlbLIaafaaaaaaaafaafaafaafaaabbYbsJbdjbdjbWObdjbdjbMUbMUbMUbMUbMUbWPbMUbMUbRkbWQbVwbWRbWpbWSbWTbWUbWVbWWbWtbWtbWXbWYbWZbUSbUSbUSbUSbUSbXabUTbbYaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaabJEbJEbJEbJEbIibUfbIibIibJEaaabUVaaabOtbUWbQBbRRbRSbRTbQBbQBbQBbQBbUXbvUbMtbUYbzqbHlbHlbHlbUZbVabVbbVcbVdbJVbNCbPEbVedqjdqHbTzdqbbTzbVgbVhbVibVjbQUbMLbMMbVkbVlbVmbLIaafaaaaaabbYbVnbVobVobVobVobVpbdjbVqbQZbdlbdlbVrbQabVsbQabQabVtbQabVubRkbVvbVwbVxbVybVzbVwbVAbVBbVCbVDbVDbKHbTVbVEbTVbTVbTVbVEbTVbKHbSWbbYbVFbVGbbYaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaabJEbVHbVIdpXbVJbVKbVLbVMbVLaaabUVaaabOtbVNbQBbQBbQBbVObQBbVPbVQbQBbVRbVSbLqbVSbVTbVUbVVbVUbVWbVXbVYbMybLzbJVbNCbPEdpYbLzdpZdqadqbbTzbVgbSlbSmbWabNKaafbNLbWbbWcbWdbLIaafaafaafbbYbbYbWebWfbVGbbYbWgbpBbPQbWhbWibWjbUxbWkbWkbWlbWkbQabWmbWnbRkbWobVwbVwbWpbVwbVwbWqbWrbWsbWtbWubKHbKHbKHbKHbKHbKHbKHbKHbKHbSWbbYaafaafaafaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaeaaaaaaaaaaaabWvbIibWwbVLbVLbWxbVLbWybVLbVLbWzbWAbVLbVLbWBbWCbWDbVLbWEbVLbVLbOtbQCbWFbMtbvUbzpbvUbRWbWGbNwbMzbLAbWHbWIbMzbNCbPEdqIdqKdqLdqJdqbbWKbVgbSlbWLbWMbTEbOLbMMbWNbVlbVlbLIaafaaaaaaaafaafaafaafaaabbYbsJbdjbdjbWObdjbdjbMUbMUbMUbMUbMUbWPbMUbMUbRkbWQbVwbWRbWpbWSbWTbWUbWVbWWbWtbWtbWXbWYbWZbUSbUSbUSbUSbUSbXabUTbbYaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajmajmajmajlajlajmajlajlajlajXajlajlajlajmajmaaaaaaaafaafaaaaaaaaaaaaaaaaaabXbbIibWwbXcbXdbXebXebXebXfbXgbXhbXibXjbVLbXkbXlbXmbXnbXebXebXobvUbXpbvUbMtbXqbzqbXrbXsbXrbXtbJVbJVbQHbJVbJVbXubXvbHlbHlbHlbXwbLzbXxbXybSlbSmbLzbNKaafbLIbLIbLIbLIbLIaafaaaaaaaaaaaaaaaaafaafbbYbldbXzbXAbXBbXCbXDbXEbXEbXEbXEbXEbXEbXFbQtbWXbWXbWXbWXbWXbWXbWXbWXbWXbXGbWXbWXbWXbsJbXHbXIbXIbXIbXIbXIbXIbXIbXIaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajmaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaajmaaaaafaafaaaaaaaaaaaaaaaaaaaaabXbbIibXJbXKbXLbXebXebXebXebXebXebXMbXebXNbXObXPbXObXObXQbXebXRbvUbXSbXTbMtbXUbXVbXWbXXbXWbXWbXYbXZbYabJVbYbbYcbPEbYdbYebYfbKfbYgbYhbYibVhbYjbYkbQUbMLbMMbYlbYmbYmbLIaafaaaaaaaaaaaaaaaaaaaafbbYbbYbbYbYnbYobYnbbYbYpbYqbjCbYrbjCbjCbYsbXEbXEbUSbUSbUSbUSbUSbUSbXabYtbYubYvbXabUSbYwbYxbXIbYybYzbYAbYBbYCbYDbYEbYEbYEbYEbYEaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajmaaabYFbYGbYHaaabYFbYGbYHaaabYFbYGbYHaafbYIaafaafaaaaaaaaaaaaaaaaaaaaaaaabXbbIibWwbYJbYKbXebXebXebXebXebXebXebYLbXebXebXebXebXebYMbYNbYObvUbRWbvUbYPbXqbYQbYRbYSbYTbYUbYVbYVbYWbYXbYYbYZbZabZbbOCbOCbOEbQMbZcbQRbOFbSmbZdbNKaafbNLbZebZfbZgbLIaafaaaaaaaaaaaaaaaaaaaaaaafaaabZhbZibZjbZkbZhbZhbZhbZhbZhbZhbZhbZlbZmbjCbjCbjCbZnbZobZpbZpbbYbZqbjCbsJbjCbjCbldbZrbZsbZtbZubZvbZwbZxbZybZzbZAbZzbZBbZCaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9169,8 +9161,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajmaaaaafaaaaafaafcdbaafaafaafcdbaafaaaaafcdbaafaaaaaaaaaaaaaaacdccddcdecdfcdgcdhcdibIibIibWwbVLbVLcdjcdkbVLbVLcdlcdmcdmcdmcdmcdmcdmcdmcdmcdncdocdocdocdpcdqcdrcdscdtcducdvcdwcdxcdycdzcdAcdBcdAcdCcdDcdEcdFcdEcdDcdEcdFcdEcdGcdEcdGcdHaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaccLcdIcdJcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdUcdVbZhaaaaaaaaaaaaaafaaaaaaaaaaaaaaacdWcdXcdYcdZceaaaaaaaaaaaafaafcebaafcecaaaaafaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafcedceeceecefcegcegcegcegcegcegcegcegcegcegcegcegcegcegcehceicejcekcelcemcenceoccmccmcepbIibVLbVLbVLbVLbIicdlcdmceqceqcercdmcescetceucevcewcexceycezceAceBceCceDcdmceEcdAceFceGceHceIceJcdAaafceKaafceLaafceKaafceLaafceMaafceMaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaceNceOcePceQceRceSceTceUceVceVceWceXceVceYceZbZhaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafcfacfbcfcaafaaaaaaaafaafaaacfdaafcecaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajmaaaaafaaaaafaafcfeaafaaaaafcfeaafaaaaafcfeaafaaaaaaaaaaaaaaacdccffcfgcfhcficfjcchcfkbIicflbVJbVJbVJbVJbVJbVJcfmcdmcfncfocfpcfqcfrcfscftcftcfucfvcfwcfxcdmcfycdmceDcfzcfAcfBcfCcfDcfEcfFcfGcdAbLIcfHbNLcfHbLIcfHbNLcfHbLIcfIbNLcfJbLIaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaabZkcfKbZhbZhbZhcfLceXcfMcfNcbLcfOccTcfPcfQcfRbZhaaaaaaaaaaaaaafaafaafaafaafaafaafcfScfTcfSaafaaaaafaafaaaaaaaaaaaacfUaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajmajmajlaafaafbYFcfVbYHaaabYFcfVbYHaaabYFcfVbYHaafaaaaaaaaaaaaaafaafcfWcchcchcchcchbJEbTcbUdbIicfXbIibIibIibIibLccdmcfYcfpcfpcfqcfZcgacgbcgbcgbcgccgdcgecgfcggcgfcghcgicfAcgjcgkcglcgmcgncgocdAbLIcgpcgqcgrbLIcgscgtcgubLIcgvcgwcgxbLIaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaafaafcgyaafaafbZhcgzcbWcgAcgBcgCceTcgDcgCcgDceTbZhaaaaaaaaeaaaaafaaaaaaaaaaaaaaaaafaaacgEaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYFcfVbYHaafbYFcfVbYHaaabYFcfVbYHaaaaaaaaaaafaaaaafaafaafaaaaaaaaaaaabJEcgFcgGcgGcgHbJEbJEbIicgIbLccdmcgJcgJcgKcdmcgLcgMcgNcgNcgOcgPcgQcgRcgScgTcgUcgVcgWcgTcgXcgYcgZchachbchccdAbLIchdchechdbLIchfchgchfbLIchhchichjbLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgyaaaaaabZhchkcbWchlchmcgCcafcbWcgCcbWchnbZhaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaachoaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajmajmajlaafaafbYFcfVbYHaaabYFcfVbYHaaabYFcfVbYHaafaaaaaaaaaaaaaafaafcfWcchcchcchcchbJEbTcbUdbIicfXbIibIibIibIibLccdmcfYcfpcfpcfqcfZcgacgbcgbcgbcgccgdcgecgfcggcgfcghcgicfAcgjcgkcglcgmcgncgocdAbLIcgpcgqcgrbLIcgscgtcgubLIcgvcgwcgxbLIaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaafaafcgyaafaafbZhdpNcbWcgAcgBcgCceTcgDcgCcgDceTbZhaaaaaaaaeaaaaafaaaaaaaaaaaaaaaaafaaacgEaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYFcfVbYHaafbYFcfVbYHaaabYFcfVbYHaaaaaaaaaaafaaaaafaafaafaaaaaaaaaaaabJEcgFcgGcgGcgHbJEbJEbIicgIbLccdmcgJcgJcgKcdmcgLcgMcgNcgNcgOcgPcgQcgRcgScgTcgUcgVcgWcgTcgXcgYcgZchachbchccdAbLIchdchechdbLIchfchgchfbLIchhchichjbLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgyaaaaaabZhdpOcbWchlchmcgCcafcbWcgCcbWchnbZhaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaachoaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafbYFcfVbYHaaabYFcfVbYHaaabYFcfVbYHaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabJEbIichpbLccdmcgJcgJcgKcdmchqchqchrchschtchuchvchwchxchychzchAchBchCcdwchDchEchFcdAcdAcdAbLIchdchGchdbLIchfchHchfbLIchjchIchjbLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachJaaaaaabZhchKchLchMchNchOchPchQchOchQchPbZhaaaaaaaaaaaaaZsaZsaZschRaafaafaafaafchoaafaafaafaafaafajXaZsaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafbYFcfVbYHaaabYFcfVbYHaafbYFcfVbYHaafaafaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacdmchScdmchTcdmcgJcgKcgKcdmchUchVchWchXcgOchYchZciacibcfAchYciccidcfAchYcibciecifcigcihcdmbLIbLIbLIbLIbLIbLIbLIbLIbLIbLIbLIbLIbLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZhbZhciicijbZhbZhbZhbZhbZhbZhbZhbZhaaaaaaaaaaaaaZsaaaaafaaaaafaaaaaaaaacikaaaaafaafaaaaaaaaaaaaaZsaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajXaafbYFcilbYHaaabYFcilbYHaaabYFcilbYHaafajlaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacdmcimcdmcincdmcdmcdmcdmciocipciqcircircirciqcisciqcitciucivciwcixciyciqciqcizciqciAciBcdmaaaaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbZhbZhbZhbZhaaaaafaafaafaafaafaaaaaaaaaaaaaaaaZsaaaciCciCciCciCciCaafciDaafciCciCciCciCciCaaaaZsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9374,7 +9366,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuScuTcvPcvQcxlcxlcxlcxlcxlcvEcvscvscvccvccvccvccvccvccvccvecuUcvwcvHcvIcvJcvwcwccwccwdcwycxmcwdcwccwbcwbcvwcxncxncxncxncvwcxocxgcxpcvNcwjcwNcwOcwOcwOcwOcwOcxqcvNcwlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoPctTcxrcxscxtctTaaactTcxucxucxuctTaaactTcuacxvcxwctTcoPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuScuTcwwcvQcxxcxlcxlcxlcxlcvccvscvscvscvscvscvccvscxycxzcvccuUcvwcvZcvIcvIcwacwccwccwccwccwccwccwccwccwccvwcxncxAcxBcxBcvwcvwcxCcvwcvNcwjcwNcwOcwOcwOcwOcxDcwNcvNcwlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoPctTcxucxucxuctTaaacuncxEcxFcxGcupaaactTcxucxucxuctTcoPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuScuTcwJcvccvccxHcxIcxIcxIcvccvscxJcxKcxLcvscvEcvscxMcxNcvccuUcvwcvwcvwcvwcvwcvwcvwcxOcvwcvwcvwcwccwccwccxPcxncxQcxQcxncxncxncxncxRcvNcwjcwNcwOcwOcwOcwOcwOcxqcvNcwlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoPcuncxEcxFcxGcxSaaaaaaaaaaaaaaaaaaaaacuncxEcxFcxGcupcoPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuScuTcuUcwJcvccxlcxlcxlcxlcvccvscxKcxTcxKcvscvccwKcvccvccwxcuUcvwcxUcxVcxWcvwcxXcxYcxYcxYcxZcvwcwccwccwccwccxncxncxncxncyacxncxncxBcvNcwjcwNcwOcwOcwOcwOcwOcybcvNcwlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuScuTcuUcwJcvccxlcxlcxlcxlcvccvscxKcxTcxKcvscvccwKcvccvccwxcuUcvwcxUcxVcxWcvwcxXcxYcxYcxYcxZcvwcwccwccwccwccxncxncxncxncyacxncxncxBcvNcwjcwNcwOcwOcwOcwOcwOdqMcvNcwlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPcoPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuScuTcuUcuUcwJcvccyccydcyecvccvscvscvscvscvscvccvccvccwxcuUcuUcvwcyfcygcyhcyicxYcxYcxYcxYcyjcvwcwccwccwccxPcykcxncxncxncylcxncxncymcvNcwjcwNcwOcwOcwOcwOcwOcwNcvNcwlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuScuTcuUcuUcuUcwJcvccvccvccvccvccvccvccvccvccvccwxcuUcuUcuUcuUcvwcvwcyncyocvwcvwcvwcyncypcyocvwcwccwccwccvwcyqcyrcyrcyrcyrcyrcyscvwcvNcwjcytcyucwOcwOcwOcyvcywcwkcwlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuScuTcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcuUcvwcyxcyxcyxcyxcyxcyxcyxcyxcyxcvwcvwcyycvwcvwcyxcyxcyxcyxcyxcyxcyxcvwcvNcwjcyzcyAcyBcyBcyBcyAcyCcwkcwlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10204,17 +10196,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiqdiqdiqdiJdiJdiJdiqdiqdiqdiqdiqdiqdiqdiqdiJdiJdiJdiqdiqdefdeCdgudgudgudkedkNdkqdkOdkPdkqdkQdkqdkqdkRdkSdkTdkUdkVdkWdgudgudgudgudgudeCdeCdeCdefdefdefdefdefdefdefdegdegdegdegdegdegdegdegdegdegdegdegdefdefdeCdeCdhjdgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudeCdeCdefdefdefdefdefdefdjFdkXdkCdkYdkZdladlbdjFdjFdjFdjFdjLdjFdkGdlcdlcdlcdlddjYdgudgudgudgudgudgudguaaaaaaaaaaaaaaaaaaaaaaaaaaadgudgudgudgudgudgudgudgudgudgudgudkJdledledledlfdkKdgudlgdgudgudgudhBdhjdeCdefdefdegdegdegdegdegdegdegdegdegdegdefdefdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiqdiqdiJdiJdiJdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdefdeCdgudgudgudkedlhdkqdkqdlidkqdkQdkqdkqdkqdljdlkdlldkAdizdgudgudgudgudgudgudgudeCdeCdeCdeCdefdefdefdefdefdefdegdegdegdegdegdegdegdegdegdefdefdeCdeCdgudjVdgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudeCdeCdeCdeCdefdefdefdjFdlmdkCdlndkCdlodkCdlpdlddlqdlrdlsdjFdkGdlcdltdlcdludkddgudgudgudgudgudguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgudgudgudgudgudlvdlvdlwdlxdkJdlydlzdlzdlAdkKdlBdlBdlBdgudgudgudgudeCdeCdefdegdegdegdegdegdegdegdegdegdegdefdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdegdegdeCdeCdgudgudkedlCdkqdlDdlEdlFdlGdlHdkqdlIdkedkedkedkedkediSdiCdgudgudgudgudgudgudgudgudeCdeCdeCdefdefdefdefdefdegdegdegdegdegdegdegdefdefdefdeCdgudgudgudgudgudgudgudgudgudgudgudiSdiCdgudgudgudgudgudgudgudgudgudeCdeCdefdefdjFdjFdjFdjFdjFdjFdjFdlJdlKdlLdlJdlKdjFdjFdjFdjFdjFdlMdjFdjFdlNdlOdgudguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgudgudlPdlxdlQdlRdlSdlTdlUdlVdlVdlWdlXdlYdlZdmadiCdgudgudgudhkdeCdefdegdegdegdegdegdegdegdegdefdefdefdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdegdegdefdeCdgudgudkedmbdkqdmcdkPdmddmedmfdkqdmgdmhdmidmjdmkdmldiYdiZdiQdiQdiQdiQdiQdiPdgudgudgudgudeCdeCdeCdefdefdefdefdefdegdegdegdefdefdefdefdeCdeCdgudgudiVdiQdiQdiQdiQdiQdiQdiQdiQdiYdiZdiQdiQdiQdiQdiPdgudgudgudgudgudeCdefdefdefdefdefdjFdmmdmndmodlcdludmpdlddludlpdmqdmrdmsdlddludlcdlcdmtdmudkndkodmvdmwdmwdmwdmwdmwdmwdmwdmxdmxdmxdmxdmxdmxdmxdlwdmydmzdmAdlRdmBdmCdmDdmEdlzdlzdmFdmGdmHdmIdmJdmKdgudgudgudhkdeCdefdefdegdegdegdegdegdegdefdefdefdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdiqdegdegdefdeCdgudgudkedmbdkqdmcdkPdmddmedmfdkqdmgdmhdmidmjdmkdmldiYdiZdiQdiQdiQdiQdiQdiPdgudgudgudgudeCdeCdeCdefdefdefdefdefdegdegdegdefdefdefdefdeCdeCdgudgudiVdiQdiQdiQdiQdiQdiQdiQdiQdiYdiZdiQdiQdiQdiQdiPdgudgudgudgudgudeCdefdefdefdefdefdjFdmmdmndmodlcdludmpdlddludlpdmqdmrdmsdlddludlcdlcdmtdmudkndkodmvdmwdmwdmwdmwdmwdmwdmwdmxdmxdmxdmxdmxdmxdmxdlwdmydmzdmAdlRdmBdmCdmDdmEdlzdlzdmFdqOdmHdmIdqNdmKdgudgudgudhkdeCdefdefdegdegdegdegdegdegdefdefdefdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiqdiqdiqdiqdegdegdefdeCdgudgudkedkedkedkedmLdmMdmNdmOdmLdmLdmPdkedkedkedkedixdizdgudgudgudgudgudiGdgudgudgudgudeCdgudeCdeCdefdefdefdefdefdefdefdefdefdefdeCdeCdgudgudgudiGdgudgudgudgudgudgudgudgudixdizdgudgudgudgudiGdgudgudgudgudgudeCdeCdhjdeCdeCdefdjFdjFdjFdjFdmQdludmRdmSdmTdlrdmUdmVdmVdmWdmWdmXdmVdmYdmZdmVdmZdnadnadnadnadnadnadnadnadnbdnbdnbdnbdnbdnbdnbdncdnddncdnednddnfdngdnhdnidnjdnkdnldnmdnndnodmadizdgudgudgudgudeCdeCdefdefdegdegdegdegdegdefdefdefdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiqdiqdegdegdefdeCdeCdgudgudgudgudgudmLdnpdnqdnrdnsdmLdhsdntdjCdgudgudgudgudgudiIdgudgudgudiOdiQdiQdiPdgudgudgudgudeCdefdefdefdefdefdefdefdefdefdefdeCdgudgudiVdiQdiWdgudgudgudgudeCdgudgudiIdgudgudgudgudgudgudiGdgudgudgudgudgudgudgudjVdgudeCdeCdeCdeCdeCdjFdlcdnudnvdnwdnwdnvdnxdnydnzdnwdnwdnAdnydnBdnCdnDdnEdnFdnFdnFdnFdnFdnFdnFdnFdnGdnGdnGdnGdnGdnGdnHdnIdnJdnKdnLdnMdnNdnOdnPdnQdnQdnQdnQdnQdnQdnQdnQdnRdnSdnTdnSdjCdhkdeCdefdefdegdegdegdegdefdefdefdefdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdefdeCdeCdgudgudgudgudmLdnUdnVdnWdnXdmLdgudgudgudgudgudgudeCdeCdhjdeCdgudgudgudgudgudiGdgudgudgudgudgudeCdefdefdefdefdefdeCdeCdeCdeCdeCdgudiVdiWdgudgudgudeCdeCdeCdeCdeCdeCdhjdgudgudgudgudgudgudiGdgudgudgudgudgudgudgudgudgudgudgudeCdeCdjFdjFdnYdnZdnYdoadoadobdocdoddoadoadnYdoedofdjFdogdgudgudguaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaadohdlxdlRdoidojdokdoldomdomdondnQdoodopdoqdordordordordjCdgudeCdefdefdegdegdegdegdefdefdefdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdefdeCdeCdgudgudgudmLdmLdmLdmLdmLdmLdgudgudeCdeCdeCdeCdeCdefdefdeCdeCdgudgudgudgudiGdgudgudgudgudgudgudeCdeCdeCdeCdeCdeCdgudgudgudgudgudiGdgudgudeCdeCdeCdefdefdefdefdefdeCdgudgudgudgudgudgudiGdgudgudgudiSdiCdgudgudgudgudgudgudgudeCdjFdosdotdoudotdoadovdowdoxdoydozdoadoAdoBdoCdjFdgudgudgudgudgudguaaaaaaaafaaaaaaaaaaafaafaafaafaafaafaafaafaafdlvdoDdoEdngdnQdnQdnQdnQdoFdnQdoGdnQdnQdoHdjCdjCdjCdjCdgudeCdefdefdegdegdegdefdefdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdefdefdeCdgudgudgudgudgudgudgudgudgudgudgudeCdefdefdefdefdefdefdefdeCdeCdgudgudgudiOdiQdiQdiQdiPdgudgudgudgudgudgudgudgudgudgudgudgudgudiGdgudeCdeCdefdefdefdefdefdefdefdeCdeCdgudgudgudgudgudiOdiQdiQdiQdiYdiZdiQdiQdiQdiPdgudgudgudgudjFdoIdoJdoKdoLdoadoMdozdozdoNdoOdoadoPdoQdoRdjFdgudgudgudgudgudguaafaafaafaafaafaafaafdoSdoSdoSdoSdoSaafaaaaaadlvdoTdoUdngdoVdoWdoXdomdomdoYdomdondnQdgudgudgudgudgudeCdeCdefdefdegdegdefdefdefdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdefdeCdgudgudgudgudgudgudgudgudgudeCdoZdpadpbdpcdpcdpcdhUdefdefdefdeCdeCdeCdgudgudgudgudgudiOdiPdgudgudiSdiCdgudgudiVdiQdiQdiQdiQdiQdiWdgudeCdefdefdefdefdegdegdegdefdefdeCdeCdeCdgudgudgudgudgudgudgudixdizdgudgudgudiGdgudgudgudgudjFdjFdjFdjFdjFdoadpddpedpfdpgdoOdoadnYdphdnYdjFdgudgudgudgudgudguaaaaaaaafaaaaaaaaaaafdoSdoSdoSdoSdoSaafaaadlPdlxdpidpjdpkdnQdnQdnQdnQdnQdnQdpldpmdnQdgudgudgudgudgudeCdefdefdegdegdegdefdefdefdefdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdeCdeCdeCdeCdgudgudgudgudeCdeCdeCdpndpodppdpqdprdpsdptdefdefdefdefdefdeCdeCdeCdgudiIdgudgudiOdiQdiQdiYdiZdiQdiQdiWdgudgudgudgudgudgudgudeCdefdefdefdegdegdegdegdegdefdefdefdeCdeCdeCdeCdgudgudgudgudgudgudgudgudgudiOdiQdiQdiPdgudgudgudgudgudgudoadoadoadoadoadoadoadpudpvdpwdpxdgudgudgudgudguaaaaaaaaaaafaaaaaaaaaaafdoSdoSdoSdoSdoSdpydmydpzdpAdlRdpBdngdpCdpCdpDdpEdpFdpGdpHdpmdnQdgudgudgudgudeCdeCdefdefdegdegdefdefdefdefdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdegdefdeCdeCdeCdeCdeCdeCdefdefdpIdpJdpKdpLdpMdpNdpOdegdegdefdefdefdefdefdeCdeCdhjdeCdgudgudgudgudixdizdgudgudgudgudiIdgudeCdeCdeCdeCdeCdefdefdegdegdegdegdegdegdegdefdefdefdefdefdeCdeCdeCdeCdeCdeCdeCdeCdgudgudgudgudgudiGdgudgudgudgudgudgudgudgudixdpPdpQdpQdpQdpQdpRdizdgudgudgudgudgudguaafaafaafaafaafaafaafaafdoSdoSdoSdoSdoSdpSdlRdpSdlRdlRdpBdngdlRdlRdpTdlRdlRdpUdpVdpWdnQdgudgudgudgudeCdefdefdefdegdegdefdefdefdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdegdegdefdefdefdefdefdefdefdpXdpYdpZdqadqbdpsdiMdegdegdegdegdefdefdefdefdefdefdeCdeCdgudgudgudgudgudgudgudgudgudhjdeCdeCdefdefdefdefdefdegdegdegdegdegdegdegdegdefdefdefdefdefdefdefdefdefdefdefdefdeCdeCdgudgudgudgudiGdgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudguaaaaaaaaaaaaaaaaaaaafdoSdoSdoSdoSdoSdlwdmydqcdqddlRdpBdqednMdnMdqfdnMdnMdqgdqhdqidnQdgudgudgudiRdhjdefdefdefdegdefdefdefdefdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdefdegdegdefdefdefdefdegdegdpbdpbdpbdpbdpbdpbdqjdegdegdegdegdegdefdefdefdefdefdefdeCdeCdeCdgudgudgudeCdeCdeCdeCdeCdefdefdefdefdefdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdefdefdefdefdefdeCdgudgudgudgudiOdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiPdgudgudgudgudgudguaaaaaaaaaaaaaaaaafdoSdoSdoSdoSdoSaafaaadohdlxdqkdpBdngdlRdlRdqldpCdlRdlRdpldqmdnQdgudgudgudgudeCdefdefdefdefdefdefdefdegdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdefdeCdgudgudgudgudgudgudgudgudgudeCdeCdeCdefdefdefdefdefdefdefdefdeCdeCdeCdgudgudgudgudgudiOdiPdgudgudiSdiCdgudgudiVdiQdiQdiQdiQdiQdiWdgudeCdefdefdefdefdegdegdegdefdefdeCdeCdeCdgudgudgudgudgudgudgudixdizdgudgudgudiGdgudgudgudgudjFdjFdjFdjFdjFdoadpddpedpfdpgdoOdoadnYdphdnYdjFdgudgudgudgudgudguaaaaaaaafaaaaaaaaaaafdoSdoSdoSdoSdoSaafaaadlPdlxdpidpjdpkdnQdnQdnQdnQdnQdnQdpldpmdnQdgudgudgudgudgudeCdefdefdegdegdegdefdefdefdefdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdeCdeCdeCdeCdgudgudgudgudeCdeCdeCdefdefdefdefdefdefdefdefdefdefdefdefdeCdeCdeCdgudiIdgudgudiOdiQdiQdiYdiZdiQdiQdiWdgudgudgudgudgudgudgudeCdefdefdefdegdegdegdegdegdefdefdefdeCdeCdeCdeCdgudgudgudgudgudgudgudgudgudiOdiQdiQdiPdgudgudgudgudgudgudoadoadoadoadoadoadoadpudpvdpwdpxdgudgudgudgudguaaaaaaaaaaafaaaaaaaaaaafdoSdoSdoSdoSdoSdpydmydpzdpAdlRdpBdngdpCdpCdpDdpEdpFdpGdpHdpmdnQdgudgudgudgudeCdeCdefdefdegdegdefdefdefdefdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdegdefdeCdeCdeCdeCdeCdeCdefdefdefdefdefdefdefdefdefdegdegdefdefdefdefdefdeCdeCdhjdeCdgudgudgudgudixdizdgudgudgudgudiIdgudeCdeCdeCdeCdeCdefdefdegdegdegdegdegdegdegdefdefdefdefdefdeCdeCdeCdeCdeCdeCdeCdeCdgudgudgudgudgudiGdgudgudgudgudgudgudgudgudixdpPdpQdpQdpQdpQdpRdizdgudgudgudgudgudguaafaafaafaafaafaafaafaafdoSdoSdoSdoSdoSdpSdlRdpSdlRdlRdpBdngdlRdlRdpTdlRdlRdpUdpVdpWdnQdgudgudgudgudeCdefdefdefdegdegdefdefdefdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdegdegdefdefdefdefdefdefdefdefdefdefdefdefdefdefdegdegdegdegdefdefdefdefdefdefdeCdeCdgudgudgudgudgudgudgudgudgudhjdeCdeCdefdefdefdefdefdegdegdegdegdegdegdegdegdefdefdefdefdefdefdefdefdefdefdefdefdeCdeCdgudgudgudgudiGdgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudguaaaaaaaaaaaaaaaaaaaafdoSdoSdoSdoSdoSdlwdmydqcdqddlRdpBdqednMdnMdqfdnMdnMdqgdqhdqidnQdgudgudgudiRdhjdefdefdefdegdefdefdefdefdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdefdegdegdefdefdefdefdegdegdefdefdefdefdefdefdefdegdegdegdegdegdefdefdefdefdefdefdeCdeCdeCdgudgudgudeCdeCdeCdeCdeCdefdefdefdefdefdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdefdefdefdefdefdeCdgudgudgudgudiOdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiQdiPdgudgudgudgudgudguaaaaaaaaaaaaaaaaafdoSdoSdoSdoSdoSaafaaadohdlxdqkdpBdngdlRdlRdqldpCdlRdlRdpldqmdnQdgudgudgudgudeCdefdefdefdefdefdefdefdegdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdefdefdefdefdefdefdeCdeCdeCdeCdeCdefdefdefdefdefdefdefdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdefdefdefdefdefdeCdeCdeCdgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudiGdgudiSdiCdgudgudgudqndqnaaaaaaaaaaafdoSdoSdoSdoSdoSaafaaaaaadnQdnQdqodqpdnMdqqdqrdqsdqtdqudpVdpmdnQdgudgudgudgudeCdefdefdefdefdegdefdefdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdefdefdefdefdefdefdeCdeCdeCdgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudgudiOdiQdiYdiZdiQdiQdiQdqvdqwdqxdqxdqxdqxdqxdqxdqxdqxdqxdqxdqxdqxdqydqzdqAdlRdlRdlRdqBdqCdqDdqEdqFdqGdnQdgudgudeCdeCdeCdefdefdegdegdegdefdegdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdefdefdefdefdefdefdefdefdefdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdegdefdefdefdefdefdefdeCdeCdeCdgudgudgudgudgudgudgudeCdeCdgudgudgudgudgudgudgudgudgudixdizdgudgudgudqndqnaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnQdnQdlvdlwdlxdlvdnQdnQdnQdnQdnQdnQdnQdgudgudeCdefdefdefdegdegdegdegdegdegdegdegdegdegaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maptools/MapPatcher.jar b/maptools/MapPatcher.jar new file mode 100644 index 00000000000..5cbaad488c1 Binary files /dev/null and b/maptools/MapPatcher.jar differ diff --git a/maptools/clean_map.bat b/maptools/clean_map.bat new file mode 100644 index 00000000000..8ce90510b2e --- /dev/null +++ b/maptools/clean_map.bat @@ -0,0 +1,2 @@ +java -jar MapPatcher.jar -clean ../maps/tgstation.2.0.9.1.dmm.backup ../maps/tgstation.2.0.9.1.dmm ../maps/tgstation.2.0.9.1.dmm +del ../maps/tgstation.2.0.9.1.dmm.backup diff --git a/maptools/mapmerge.sh b/maptools/mapmerge.sh new file mode 100755 index 00000000000..bddb60100e0 --- /dev/null +++ b/maptools/mapmerge.sh @@ -0,0 +1,9 @@ +java -jar maptools/MapPatcher.jar -merge $1 $2 $3 $2 +if [ "$?" -gt 0 ] +then + echo "Unable to automatically resolve map conflicts, please merge manually." + exit 1 +fi +java -jar maptools/MapPatcher.jar -clean $1 $2 $2 + +exit 0 diff --git a/maptools/prepare_map.bat b/maptools/prepare_map.bat new file mode 100644 index 00000000000..92a1aa44f7e --- /dev/null +++ b/maptools/prepare_map.bat @@ -0,0 +1,2 @@ +cd ../maps +copy tgstation.2.0.9.1.dmm tgstation.2.0.9.1.dmm.backup